Add shared ERP sync core and Optima adapter

This commit is contained in:
2026-09-08 02:07:42 +00:00
parent a040a91d1f
commit 6c4e50f7a6
366 changed files with 4707 additions and 478 deletions

6
.gitignore vendored
View File

@@ -8,5 +8,7 @@ NuGet/
# Lokalne konfiguracje wdrożeniowe; repozytorium zawiera wyłącznie wzorzec. # Lokalne konfiguracje wdrożeniowe; repozytorium zawiera wyłącznie wzorzec.
src/SmartB2B.Enova.Service/config/enova.json src/SmartB2B.Enova.Service/config/enova.json
release/config/enova.json release-enova/config/enova.json
release/config/enova.local.json release-enova/config/enova.local.json
src/SmartB2B.Optima.Service/config/optima.json
release-optima/config/optima.json

View File

@@ -0,0 +1,48 @@
# Testy integracyjne Comarch ERP Optima
Testy z bazą są celowo wykonywane dopiero po ręcznym przygotowaniu i zarejestrowaniu firmy w Optimie. Narzędzia w tym repozytorium nie odtwarzają, nie tworzą ani nie modyfikują konfiguracji baz Optimy.
## Przygotowanie
1. Skopiuj `src/SmartB2B.Optima.Service/config/optima.json.sample` do lokalnego, ignorowanego przez Git pliku `src/SmartB2B.Optima.Service/config/optima.json`.
2. Uzupełnij nazwę firmy widoczną podczas logowania, operatora, hasło, identyfikator magazynu i connection string SQL.
3. Nie dodawaj pliku `optima.json` do repozytorium ani paczki wdrożeniowej.
4. W przygotowanej firmie zapewnij kontrolowane dane testowe: kontrahenta, towar, magazyn, walutę oraz definicje RO liczone netto i brutto.
## Kontrola bez zapisu
Uruchom opublikowaną wersję x64:
```powershell
.\release-optima\SmartB2B.Optima.Service.exe --config .\src\SmartB2B.Optima.Service\config\optima.json --check-config
```
Polecenie sprawdza JSON, zgodność architektury procesu z `op_base.dll`, rejestrację COM, wersję Optimy, połączenie SQL, logowanie operatora i utworzenie sesji. Nie zapisuje dokumentu.
## Scenariusze zapisu przez WAMP
Pierwszy kontrolowany zapis adaptera można wykonać runnerem, który wymaga jawnego
parametru `--write-order` i domyślnie zapisuje wyłącznie w trybie `Buffer`:
```powershell
dotnet run --project .\tests\SmartB2B.Optima.IntegrationTests -- --config .\src\SmartB2B.Optima.Service\config\optima.json --negative-tests --write-order --customer-id 2 --product-code SMARTB2B_TEST_TWR
```
Zatwierdzenie dokumentu wymaga dodatkowej flagi `--approved` i powinno być wykonywane
wyłącznie w firmie testowej:
```powershell
dotnet run --project .\tests\SmartB2B.Optima.IntegrationTests -- --config .\src\SmartB2B.Optima.Service\config\optima.json --write-order --approved --customer-id 2 --product-code SMARTB2B_TEST_TWR
```
Po pomyślnym `--check-config` uruchom usługę z tym samym plikiem konfiguracji i sprawdź kolejno:
- RO w buforze (`saveMode: Buffer`) i zatwierdzone (`saveMode: Approved`);
- definicję liczoną netto z `price_netto` i brutto z `price_brutto`;
- rabat, uwagi, numer obcy, magazyn oraz walutę;
- zgodność `order_erp_id`, `order_erp_symbol`, `value_netto` i `value_brutto` z dokumentem zapisanym w Optimie;
- błędy dla brakującego kontrahenta, produktu, magazynu, waluty i wymaganej ceny;
- parametryzowane `sql_raw`, wiele recordsetów, dane binarne oraz błąd SQL;
- dwa równoczesne wywołania `place_order` — dokumenty mają zostać utworzone kolejno na jednym wątku COM.
Przed testami trybu `Approved` wykonaj kopię bezpieczeństwa bazy lub użyj firmy przeznaczonej wyłącznie do testów.

View File

@@ -1,6 +1,13 @@
# SmartB2B SYNC dla enova365 # SmartB2B SYNC dla enova365 i Comarch ERP Optima
Dedykowana usługa Windows zastępująca proces Node na stanowiskach z enova365. Utrzymuje połączenie WAMP, dodaje zamówienia przez oficjalne API Enovy i wykonuje `eu.smartb2b.sql_raw` na osobnym połączeniu SQL. Dedykowane usługi Windows zastępujące proces Node na stanowiskach z enova365 albo
Comarch ERP Optima. Wspólny rdzeń utrzymuje połączenie WAMP, udostępnia diagnostykę
i wykonuje `eu.smartb2b.sql_raw`. Osobne adaptery zapisują zamówienia przez API ERP.
Rozwiązanie składa się z bibliotek `SmartB2B.Sync.Contracts` i
`SmartB2B.Sync.Service` oraz osobnych hostów i adapterów Enovy i Optimy. Usług dla
tego samego portalu nie należy uruchamiać jednocześnie, ponieważ rejestrują te same
procedury WAMP.
## Najważniejsze właściwości ## Najważniejsze właściwości
@@ -15,6 +22,13 @@ Dedykowana usługa Windows zastępująca proces Node na stanowiskach z enova365.
Plik `config/enova.json` zawiera portal WAMP, ścieżkę instalacji, alias bazy używany wewnątrz procesu, operatora wraz z hasłem, connection string SQL, definicję dokumentu, magazyn domyślny, tryb zapisu oraz DSN Sentry. Repozytorium oraz paczka zawierają tylko `config/enova.json.sample`. Skrypt instalacyjny kopiuje wzorzec do `config/enova.json` wyłącznie wtedy, gdy lokalna konfiguracja jeszcze nie istnieje. Plik `config/enova.json` zawiera portal WAMP, ścieżkę instalacji, alias bazy używany wewnątrz procesu, operatora wraz z hasłem, connection string SQL, definicję dokumentu, magazyn domyślny, tryb zapisu oraz DSN Sentry. Repozytorium oraz paczka zawierają tylko `config/enova.json.sample`. Skrypt instalacyjny kopiuje wzorzec do `config/enova.json` wyłącznie wtedy, gdy lokalna konfiguracja jeszcze nie istnieje.
Dla Optimy odpowiednikiem jest `config/optima.json`. Sekcja `optima` zawiera
ścieżkę instalacji, nazwę firmy widoczną podczas logowania, operatora, hasło,
symbol definicji dokumentu (domyślnie `RO`), liczbowy identyfikator magazynu i tryb
`Buffer` albo `Approved`. `companyErpId` jest liczbowym `Knt_KntId`, a
`warehouseErpId` liczbowym identyfikatorem magazynu. Paczka zawiera wyłącznie
`optima.json.sample`.
Uzupełnij pola `enova.operator`, `enova.password` i `sql.connectionString` bezpośrednio w lokalnym pliku `config/enova.json`. Adapter rejestruje bazę Enovy tylko w pamięci procesu na podstawie `sql.connectionString`; baza nie musi być wcześniej dodana do listy baz w profilu użytkownika Windows, a dane połączenia nie są przez usługę zapisywane w plikach Enovy. Pole `enova.database` jest nazwą tego wpisu w procesie i może odpowiadać nazwie bazy z connection stringa. Parametr `sentry.dsn` wskazuje projekt Sentry; pusty lub pominięty DSN wyłącza wysyłanie błędów. Jeżeli operator lub hasło Enovy nie są podane, usługa nie loguje się do bazy Enovy i nie rejestruje endpointu `eu.smartb2b.place_order`; endpoint SQL oraz diagnostyka pozostają dostępne. Po zmianie konfiguracji trzeba zrestartować usługę. Konto z `sql.connectionString` musi mieć uprawnienia wymagane do pracy Enovy oraz do zapytań `sql_raw`; `sql_raw` celowo dopuszcza również polecenia modyfikujące dane dla zgodności z obecną usługą. Uzupełnij pola `enova.operator`, `enova.password` i `sql.connectionString` bezpośrednio w lokalnym pliku `config/enova.json`. Adapter rejestruje bazę Enovy tylko w pamięci procesu na podstawie `sql.connectionString`; baza nie musi być wcześniej dodana do listy baz w profilu użytkownika Windows, a dane połączenia nie są przez usługę zapisywane w plikach Enovy. Pole `enova.database` jest nazwą tego wpisu w procesie i może odpowiadać nazwie bazy z connection stringa. Parametr `sentry.dsn` wskazuje projekt Sentry; pusty lub pominięty DSN wyłącza wysyłanie błędów. Jeżeli operator lub hasło Enovy nie są podane, usługa nie loguje się do bazy Enovy i nie rejestruje endpointu `eu.smartb2b.place_order`; endpoint SQL oraz diagnostyka pozostają dostępne. Po zmianie konfiguracji trzeba zrestartować usługę. Konto z `sql.connectionString` musi mieć uprawnienia wymagane do pracy Enovy oraz do zapytań `sql_raw`; `sql_raw` celowo dopuszcza również polecenia modyfikujące dane dla zgodności z obecną usługą.
## Budowanie i testy ## Budowanie i testy
@@ -22,9 +36,10 @@ Uzupełnij pola `enova.operator`, `enova.password` i `sql.connectionString` bezp
Z katalogu głównego repozytorium, przy zainstalowanym SDK .NET 8: Z katalogu głównego repozytorium, przy zainstalowanym SDK .NET 8:
```powershell ```powershell
dotnet restore .\SmartB2B.EnovaSync.sln --configfile .\NuGet.Config dotnet restore .\SmartB2B.Sync.sln --configfile .\NuGet.Config
dotnet build .\SmartB2B.EnovaSync.sln --no-restore dotnet build .\SmartB2B.Sync.sln --no-restore
dotnet run --project .\tests\SmartB2B.Enova.Tests --no-build --no-restore dotnet run --project .\tests\SmartB2B.Enova.Tests --no-build --no-restore
dotnet run --project .\tests\SmartB2B.Optima.Tests --no-build --no-restore
``` ```
Ostrzeżenie `NU1603` dotyczące `Soneta.Generator` jest takie samo jak w działającym prototypie `test1` i nie blokuje kompilacji. Ostrzeżenie `NU1603` dotyczące `Soneta.Generator` jest takie samo jak w działającym prototypie `test1` i nie blokuje kompilacji.
@@ -35,11 +50,20 @@ Kontrola konfiguracji i dynamicznego ładowania, bez zapisu do bazy:
.\src\SmartB2B.Enova.Service\bin\Debug\net8.0\SmartB2B.Enova.Service.exe --config .\src\SmartB2B.Enova.Service\bin\Debug\net8.0\config\enova.json.sample --check-config .\src\SmartB2B.Enova.Service\bin\Debug\net8.0\SmartB2B.Enova.Service.exe --config .\src\SmartB2B.Enova.Service\bin\Debug\net8.0\config\enova.json.sample --check-config
``` ```
Dla Optimy `--check-config` sprawdza zgodność architektury procesu z `op_base.dll`, rejestrację COM
`CDNBase.Application`, wersję instalacji, połączenie SQL oraz logowanie i utworzenie
sesji. Nie zapisuje dokumentu. Pełne sprawdzenie wymaga gotowej bazy i prawdziwego
operatora:
```powershell
.\release-optima\SmartB2B.Optima.Service.exe --config .\release-optima\config\optima.json --check-config
```
Szczegółowe logowanie włącza parametr `/debug` albo `/verbose` (obsługiwane są też Szczegółowe logowanie włącza parametr `/debug` albo `/verbose` (obsługiwane są też
warianty `--debug` i `--verbose`). Wyłącza je brak parametru lub jawny parametr warianty `--debug` i `--verbose`). Wyłącza je brak parametru lub jawny parametr
`/nodebug` albo `/noverbose`. Błędy są zapisywane do `stderr` niezależnie od tego `/nodebug` albo `/noverbose`. Błędy są zapisywane do `stderr` niezależnie od tego
ustawienia. W usłudze Windows parametr można włączyć przez odkomentowanie elementu ustawienia. W usłudze Windows parametr można włączyć przez odkomentowanie elementu
`<arguments>/verbose</arguments>` w `daemon/smartb2bsync-enova.xml` i restart usługi. `<arguments>/verbose</arguments>` w `daemon-enova/smartb2bsync-enova.xml` i restart usługi.
W trybie szczegółowym zapis ZO raportuje kolejne etapy: walidację żądania, logowanie W trybie szczegółowym zapis ZO raportuje kolejne etapy: walidację żądania, logowanie
do Enovy, wyszukanie definicji, kontrahenta, magazynu i towarów, commit transakcji do Enovy, wyszukanie definicji, kontrahenta, magazynu i towarów, commit transakcji
@@ -52,24 +76,35 @@ nie kopiuje tej wartości automatycznie z `enova.json.sample` do istniejącej ko
## Publikacja i instalacja ## Publikacja i instalacja
```powershell ```powershell
.\publish.ps1 .\publish-enova.ps1
``` ```
Skrypt odtwarza katalog `release` z hostem, adapterem, wzorcem konfiguracji i WinSW. Repozytorium zawiera również gotowy, skompilowany katalog `release`, więc na komputerze produkcyjnym nie trzeba instalować SDK. Przed instalacją: Paczka Optimy jest samodzielnym buildem `win-x64`, zgodnym z Optimą 2026.5.1,
i nie wymaga instalowania runtime .NET x64. Nie zawiera bibliotek ani licencji Comarch:
1. Skopiuj katalog `release` na komputer produkcyjny. Możesz skopiować `release/config/enova.json.sample` do `release/config/enova.json` i uzupełnić go przed instalacją; jeżeli tego nie zrobisz, `install.cmd` utworzy plik automatycznie. ```powershell
2. Uzupełnij w `release/config/enova.json` hasło operatora i connection string SQL. .\publish-optima.ps1
```
Wynik trafia do `release-optima`. Po uzupełnieniu `config/optima.json` instalację
wykonuje `release-optima/daemon/install.cmd`. Usługa ma identyfikator
`smartb2bsync-optima`.
Skrypt odtwarza katalog `release-enova` z hostem, adapterem, wzorcem konfiguracji i WinSW. Repozytorium zawiera również gotowy, skompilowany katalog `release-enova`, więc na komputerze produkcyjnym nie trzeba instalować SDK. Przed instalacją:
1. Skopiuj katalog `release-enova` na komputer produkcyjny. Możesz skopiować `release-enova/config/enova.json.sample` do `release-enova/config/enova.json` i uzupełnić go przed instalacją; jeżeli tego nie zrobisz, `install.cmd` utworzy plik automatycznie.
2. Uzupełnij w `release-enova/config/enova.json` hasło operatora i connection string SQL.
3. Zatrzymaj starą usługę Node dla tego samego portalu WAMP. 3. Zatrzymaj starą usługę Node dla tego samego portalu WAMP.
4. Skonfiguruj usługę do pracy pod dedykowanym kontem Windows, które potrafi uruchomić Enovę i ma dostęp do jej licencji. Lista baz zapisana w profilu tego konta nie jest wymagana. 4. Skonfiguruj usługę do pracy pod dedykowanym kontem Windows, które potrafi uruchomić Enovę i ma dostęp do jej licencji. Lista baz zapisana w profilu tego konta nie jest wymagana.
5. Jako administrator uruchom `release/daemon/install.cmd`. 5. Jako administrator uruchom `release-enova/daemon/install.cmd`.
Jeżeli usługa ma działać pod innym kontem niż `LocalSystem`, po instalacji ustaw je w `services.msc` albo poleceniem administracyjnym `sc.exe config smartb2bsync-enova obj= "DOMENA\\Użytkownik" password= "..."`, a następnie uruchom usługę ponownie. Jeżeli usługa ma działać pod innym kontem niż `LocalSystem`, po instalacji ustaw je w `services.msc` albo poleceniem administracyjnym `sc.exe config smartb2bsync-enova obj= "DOMENA\\Użytkownik" password= "..."`, a następnie uruchom usługę ponownie.
Wycofanie polega na uruchomieniu `daemon/uninstall.cmd` i ponownym uruchomieniu dotychczasowej usługi Node. Nie ma migracji schematu bazy. Wycofanie polega na uruchomieniu `release-enova/daemon/uninstall.cmd` i ponownym uruchomieniu dotychczasowej usługi Node. Nie ma migracji schematu bazy.
## Procedury WAMP ## Procedury WAMP
- `eu.smartb2b.place_order` przyjmuje `currency_iso`, `companyErpId`, `warehouseErpId`, `purchase_order_number`, `notes` i `lines[]` z polami `symbol`, `quantity`, `price_netto`, `discount`. Wynik jest zwracany jako kwargs: `order_erp_id`, `order_erp_symbol`, `value_netto`, `value_brutto`, `stocks`. - `eu.smartb2b.place_order` przyjmuje `currency_iso`, `companyErpId`, `warehouseErpId`, `purchase_order_number`, `notes` i `lines[]` z polami `symbol`, `quantity`, opcjonalnymi `price_netto` i `price_brutto` oraz `discount`. Enova wymaga `price_netto`; Optima wybiera cenę zgodnie z `TypNB` definicji dokumentu. Wynik jest zwracany jako kwargs: `order_erp_id`, `order_erp_symbol`, `value_netto`, `value_brutto`, `stocks`.
- `eu.smartb2b.sql_raw` przyjmuje `query` i opcjonalne `params`; parametry odpowiadają kolejno `@1`, `@2`, itd. Wynik ma pola `recordsets`, `recordset`, `output`, `rowsAffected`. - `eu.smartb2b.sql_raw` przyjmuje `query` i opcjonalne `params`; parametry odpowiadają kolejno `@1`, `@2`, itd. Wynik ma pola `recordsets`, `recordset`, `output`, `rowsAffected`.
- Diagnostyka: `eu.smartb2b.sync.get_version`, `get_info`, `get_log`, `get_error_log`. - Diagnostyka: `eu.smartb2b.sync.get_version`, `get_info`, `get_log`, `get_error_log`.
@@ -77,4 +112,4 @@ Kod produkcyjny, testy oraz gotowa wersja instalacyjna znajdują się w tym repo
## Automatyczne aktualizacje ## Automatyczne aktualizacje
Przy starcie WinSW pobiera pliki aplikacji z `https://demo.smartb2b.eu/files/smartb2b-sync-enova/` zgodnie z listą `<download>` w `daemon/smartb2bsync-enova.xml`. Aktualizowane są program, biblioteki, adapter Enovy, skrypty, manifest usługi i `config/enova.json.sample`. Lokalny `config/enova.json` nie występuje na liście i nie jest nadpisywany. Sam `smartb2bsync-enova.exe` jest programem rozruchowym WinSW, dlatego nie aktualizuje samego siebie podczas pracy. `publish.ps1` porównuje zawartość gotowej paczki z manifestem i przerywa publikowanie, jeżeli którejkolwiek pozycji brakuje po jednej ze stron. Przy starcie WinSW pobiera pliki aplikacji z `https://demo.smartb2b.eu/files/smartb2b-sync-enova/` zgodnie z listą `<download>` w `daemon-enova/smartb2bsync-enova.xml`. Aktualizowane są program, biblioteki, adapter Enovy, skrypty, manifest usługi i `config/enova.json.sample`. Lokalny `config/enova.json` nie występuje na liście i nie jest nadpisywany. Sam `smartb2bsync-enova.exe` jest programem rozruchowym WinSW, dlatego nie aktualizuje samego siebie podczas pracy. `publish-enova.ps1` porównuje zawartość gotowej paczki z manifestem i przerywa publikowanie, jeżeli którejkolwiek pozycji brakuje po jednej ze stron.

View File

@@ -1,36 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Contracts", "src\SmartB2B.Enova.Contracts\SmartB2B.Enova.Contracts.csproj", "{83EEA218-71A0-4E45-9572-B53767A3BC26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Adapter", "src\SmartB2B.Enova.Adapter\SmartB2B.Enova.Adapter.csproj", "{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Service", "src\SmartB2B.Enova.Service\SmartB2B.Enova.Service.csproj", "{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Tests", "tests\SmartB2B.Enova.Tests\SmartB2B.Enova.Tests.csproj", "{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Release|Any CPU.Build.0 = Release|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Release|Any CPU.Build.0 = Release|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Release|Any CPU.Build.0 = Release|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

71
SmartB2B.Sync.sln Normal file
View File

@@ -0,0 +1,71 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Sync.Contracts", "src\SmartB2B.Sync.Contracts\SmartB2B.Sync.Contracts.csproj", "{83EEA218-71A0-4E45-9572-B53767A3BC26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Sync.Service", "src\SmartB2B.Sync.Service\SmartB2B.Sync.Service.csproj", "{D52B9C80-C6F4-4E0B-B3B8-17F6A8FD88E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Adapter", "src\SmartB2B.Enova.Adapter\SmartB2B.Enova.Adapter.csproj", "{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Service", "src\SmartB2B.Enova.Service\SmartB2B.Enova.Service.csproj", "{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Optima.Adapter", "src\SmartB2B.Optima.Adapter\SmartB2B.Optima.Adapter.csproj", "{7C9A4077-0EB1-4E87-A202-99219EBE9BDF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Optima.Service", "src\SmartB2B.Optima.Service\SmartB2B.Optima.Service.csproj", "{A0DA9C63-98D1-47AA-B491-E101D6131B0B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Enova.Tests", "tests\SmartB2B.Enova.Tests\SmartB2B.Enova.Tests.csproj", "{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Optima.Tests", "tests\SmartB2B.Optima.Tests\SmartB2B.Optima.Tests.csproj", "{1F6B3CB3-141D-4438-B43B-B3B6CA80A483}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{83B01DA9-7F49-48C8-AB20-E9814B7093DA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartB2B.Optima.IntegrationTests", "tests\SmartB2B.Optima.IntegrationTests\SmartB2B.Optima.IntegrationTests.csproj", "{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83EEA218-71A0-4E45-9572-B53767A3BC26}.Release|Any CPU.Build.0 = Release|Any CPU
{D52B9C80-C6F4-4E0B-B3B8-17F6A8FD88E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D52B9C80-C6F4-4E0B-B3B8-17F6A8FD88E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D52B9C80-C6F4-4E0B-B3B8-17F6A8FD88E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D52B9C80-C6F4-4E0B-B3B8-17F6A8FD88E5}.Release|Any CPU.Build.0 = Release|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64C5439F-00AA-48F9-9A9B-DAE69DB0BC57}.Release|Any CPU.Build.0 = Release|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3473BD53-A2B9-46A8-AEE8-F087F373DF2B}.Release|Any CPU.Build.0 = Release|Any CPU
{7C9A4077-0EB1-4E87-A202-99219EBE9BDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C9A4077-0EB1-4E87-A202-99219EBE9BDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C9A4077-0EB1-4E87-A202-99219EBE9BDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C9A4077-0EB1-4E87-A202-99219EBE9BDF}.Release|Any CPU.Build.0 = Release|Any CPU
{A0DA9C63-98D1-47AA-B491-E101D6131B0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0DA9C63-98D1-47AA-B491-E101D6131B0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A0DA9C63-98D1-47AA-B491-E101D6131B0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0DA9C63-98D1-47AA-B491-E101D6131B0B}.Release|Any CPU.Build.0 = Release|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{842D10FD-D5FC-4AF9-8D72-619BF6EE10C2}.Release|Any CPU.Build.0 = Release|Any CPU
{1F6B3CB3-141D-4438-B43B-B3B6CA80A483}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F6B3CB3-141D-4438-B43B-B3B6CA80A483}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F6B3CB3-141D-4438-B43B-B3B6CA80A483}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F6B3CB3-141D-4438-B43B-B3B6CA80A483}.Release|Any CPU.Build.0 = Release|Any CPU
{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9BDCCB4C-12DD-4CCF-A628-F30721ACC2C9} = {83B01DA9-7F49-48C8-AB20-E9814B7093DA}
EndGlobalSection
EndGlobal

View File

@@ -3,7 +3,7 @@ setlocal
cd /d "%~dp0" cd /d "%~dp0"
if not exist "smartb2bsync-enova.exe" ( if not exist "smartb2bsync-enova.exe" (
echo Brak smartb2bsync-enova.exe. Najpierw uruchom publish.ps1. echo Brak smartb2bsync-enova.exe. Najpierw uruchom publish-enova.ps1.
exit /b 1 exit /b 1
) )

View File

@@ -28,8 +28,10 @@
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.deps.json" to="%BASE%\..\SmartB2B.Enova.Service.deps.json" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.deps.json" to="%BASE%\..\SmartB2B.Enova.Service.deps.json" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.runtimeconfig.json" to="%BASE%\..\SmartB2B.Enova.Service.runtimeconfig.json" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.runtimeconfig.json" to="%BASE%\..\SmartB2B.Enova.Service.runtimeconfig.json" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.pdb" to="%BASE%\..\SmartB2B.Enova.Service.pdb" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.pdb" to="%BASE%\..\SmartB2B.Enova.Service.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Contracts.dll" to="%BASE%\..\SmartB2B.Enova.Contracts.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Contracts.dll" to="%BASE%\..\SmartB2B.Sync.Contracts.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Contracts.pdb" to="%BASE%\..\SmartB2B.Enova.Contracts.pdb" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Contracts.pdb" to="%BASE%\..\SmartB2B.Sync.Contracts.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Service.dll" to="%BASE%\..\SmartB2B.Sync.Service.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Service.pdb" to="%BASE%\..\SmartB2B.Sync.Service.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/adapters/SmartB2B.Enova.Adapter.dll" to="%BASE%\..\adapters\SmartB2B.Enova.Adapter.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/adapters/SmartB2B.Enova.Adapter.dll" to="%BASE%\..\adapters\SmartB2B.Enova.Adapter.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/Azure.Core.dll" to="%BASE%\..\Azure.Core.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/Azure.Core.dll" to="%BASE%\..\Azure.Core.dll" failOnError="false" />

24
daemon-optima/install.cmd Normal file
View File

@@ -0,0 +1,24 @@
@echo off
setlocal
cd /d "%~dp0"
if not exist "smartb2bsync-optima.exe" (
echo Brak smartb2bsync-optima.exe. Najpierw uruchom publish-optima.ps1.
exit /b 1
)
if not exist "..\config" mkdir "..\config"
if not exist "..\config\optima.json" (
if not exist "..\config\optima.json.sample" (
echo Brak ..\config\optima.json.sample.
exit /b 1
)
copy /Y "..\config\optima.json.sample" "..\config\optima.json" >nul
echo Utworzono lokalna konfiguracje ..\config\optima.json.
)
smartb2bsync-optima.exe install
if errorlevel 1 exit /b %errorlevel%
smartb2bsync-optima.exe start
exit /b %errorlevel%

View File

@@ -0,0 +1,14 @@
<service>
<id>smartb2bsync-optima</id>
<name>SmartB2B SYNC - Comarch ERP Optima</name>
<description>Synchronizuje Comarch ERP Optima z portalem SmartB2B.</description>
<executable>%BASE%\..\SmartB2B.Optima.Service.exe</executable>
<workingdirectory>%BASE%\..</workingdirectory>
<!-- <arguments>/verbose</arguments> -->
<stoptimeout>45sec</stoptimeout>
<log mode="roll-by-time">
<pattern>yyyyMMdd</pattern>
</log>
<onfailure action="restart" delay="10 sec" />
<delayedAutoStart />
</service>

View File

@@ -0,0 +1,7 @@
@echo off
setlocal
cd /d "%~dp0"
smartb2bsync-optima.exe stop
smartb2bsync-optima.exe uninstall
exit /b %errorlevel%

View File

@@ -1,5 +1,5 @@
param( param(
[string]$OutputPath = (Join-Path $PSScriptRoot "release"), [string]$OutputPath = (Join-Path $PSScriptRoot "release-enova"),
[ValidateSet("Debug", "Release")] [ValidateSet("Debug", "Release")]
[string]$Configuration = "Release" [string]$Configuration = "Release"
) )
@@ -10,19 +10,18 @@ $env:APPDATA = $PSScriptRoot
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = "1" $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = "1"
$env:DOTNET_CLI_TELEMETRY_OPTOUT = "1" $env:DOTNET_CLI_TELEMETRY_OPTOUT = "1"
$bundledDotnet = Join-Path $PSScriptRoot "..\..\..\test1\.dotnet\dotnet.exe" $dotnet = (Get-Command dotnet -ErrorAction Stop).Source
$dotnet = if (Test-Path -LiteralPath $bundledDotnet) {
(Resolve-Path $bundledDotnet).Path
} else {
(Get-Command dotnet -ErrorAction Stop).Source
}
$project = Join-Path $PSScriptRoot "src\SmartB2B.Enova.Service\SmartB2B.Enova.Service.csproj" $project = Join-Path $PSScriptRoot "src\SmartB2B.Enova.Service\SmartB2B.Enova.Service.csproj"
$daemonSource = Join-Path $PSScriptRoot "daemon" $adapterProject = Join-Path $PSScriptRoot "src\SmartB2B.Enova.Adapter\SmartB2B.Enova.Adapter.csproj"
$daemonSource = Join-Path $PSScriptRoot "daemon-enova"
$winSwSource = Resolve-Path (Join-Path $daemonSource "smartb2bsync-enova.exe") $winSwSource = Resolve-Path (Join-Path $daemonSource "smartb2bsync-enova.exe")
$output = [System.IO.Path]::GetFullPath($OutputPath) $output = [System.IO.Path]::GetFullPath($OutputPath)
$workspace = [System.IO.Path]::GetFullPath($PSScriptRoot)
$daemonOutput = Join-Path $output "daemon" $daemonOutput = Join-Path $output "daemon"
if ($output -eq [System.IO.Path]::GetPathRoot($output) -or $output.Length -lt 10) { if (-not $output.StartsWith($workspace, [StringComparison]::OrdinalIgnoreCase) -or
$output -eq $workspace -or
$output.Length -lt 10) {
throw "Niebezpieczna ścieżka wyjściowa: $output" throw "Niebezpieczna ścieżka wyjściowa: $output"
} }
@@ -33,7 +32,12 @@ if (Test-Path -LiteralPath $output) {
New-Item -ItemType Directory -Force -Path $output | Out-Null New-Item -ItemType Directory -Force -Path $output | Out-Null
New-Item -ItemType Directory -Force -Path $daemonOutput | Out-Null New-Item -ItemType Directory -Force -Path $daemonOutput | Out-Null
& $dotnet publish $project -c $Configuration --no-restore -o $output & $dotnet restore $adapterProject
if ($LASTEXITCODE -ne 0) {
throw "Przywracanie pakietów adaptera Enovy nie powiodło się."
}
& $dotnet publish $project -c $Configuration -o $output
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
throw "Publikowanie usługi nie powiodło się." throw "Publikowanie usługi nie powiodło się."
} }

79
publish-optima.ps1 Normal file
View File

@@ -0,0 +1,79 @@
param(
[string]$OutputPath = (Join-Path $PSScriptRoot "release-optima"),
[ValidateSet("Debug", "Release")]
[string]$Configuration = "Release"
)
$ErrorActionPreference = "Stop"
$env:DOTNET_CLI_HOME = $PSScriptRoot
$env:APPDATA = $PSScriptRoot
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = "1"
$env:DOTNET_CLI_TELEMETRY_OPTOUT = "1"
$dotnet = (Get-Command dotnet -ErrorAction Stop).Source
$project = Join-Path $PSScriptRoot "src\SmartB2B.Optima.Service\SmartB2B.Optima.Service.csproj"
$daemonSource = Join-Path $PSScriptRoot "daemon-optima"
$winSwSource = Resolve-Path (Join-Path $daemonSource "smartb2bsync-optima.exe")
$output = [System.IO.Path]::GetFullPath($OutputPath)
$workspace = [System.IO.Path]::GetFullPath($PSScriptRoot)
$daemonOutput = Join-Path $output "daemon"
if (-not $output.StartsWith($workspace, [StringComparison]::OrdinalIgnoreCase) -or
$output -eq $workspace -or
$output.Length -lt 10) {
throw "Niebezpieczna ścieżka wyjściowa: $output"
}
if (Test-Path -LiteralPath $output) {
Remove-Item -LiteralPath $output -Recurse -Force
}
New-Item -ItemType Directory -Force -Path $output | Out-Null
New-Item -ItemType Directory -Force -Path $daemonOutput | Out-Null
& $dotnet publish $project -c $Configuration -r win-x64 --self-contained true -o $output
if ($LASTEXITCODE -ne 0) {
throw "Publikowanie usługi Optimy nie powiodło się."
}
Copy-Item $winSwSource (Join-Path $daemonOutput "smartb2bsync-optima.exe") -Force
Copy-Item (Join-Path $daemonSource "smartb2bsync-optima.xml") $daemonOutput -Force
Copy-Item (Join-Path $daemonSource "install.cmd") $daemonOutput -Force
Copy-Item (Join-Path $daemonSource "uninstall.cmd") $daemonOutput -Force
$downloadBaseUrl = "https://demo.smartb2b.eu/files/smartb2b-sync-optima/"
$manifestPath = Join-Path $daemonOutput "smartb2bsync-optima.xml"
[xml]$manifest = Get-Content -Raw $manifestPath
$packagedFiles = @(
Get-ChildItem -Recurse -File $output |
ForEach-Object { $_.FullName.Substring($output.Length).TrimStart('\') } |
Where-Object { $_ -ne "daemon\smartb2bsync-optima.exe" } |
Sort-Object
)
foreach ($relativePath in $packagedFiles) {
$download = $manifest.CreateElement("download")
$urlPath = $relativePath.Replace('\', '/')
$destination = if ($relativePath.StartsWith("daemon\", [StringComparison]::OrdinalIgnoreCase)) {
"%BASE%\" + $relativePath.Substring("daemon\".Length)
} else {
"%BASE%\..\" + $relativePath
}
$download.SetAttribute("from", $downloadBaseUrl + $urlPath)
$download.SetAttribute("to", $destination)
$download.SetAttribute("failOnError", "false")
[void]$manifest.service.AppendChild($download)
}
$settings = [System.Xml.XmlWriterSettings]::new()
$settings.Indent = $true
$settings.Encoding = [System.Text.UTF8Encoding]::new($false)
$writer = [System.Xml.XmlWriter]::Create($manifestPath, $settings)
try {
$manifest.Save($writer)
} finally {
$writer.Dispose()
}
Write-Host "Gotowa usługa Optimy (self-contained win-x64): $output"

View File

@@ -8,14 +8,8 @@
".NETCoreApp,Version=v8.0": { ".NETCoreApp,Version=v8.0": {
"SmartB2B.Enova.Service/1.0.0": { "SmartB2B.Enova.Service/1.0.0": {
"dependencies": { "dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0", "SmartB2B.Sync.Contracts": "1.0.0",
"Microsoft.Data.SqlClient": "5.2.2", "SmartB2B.Sync.Service": "1.0.0"
"Microsoft.Identity.Client": "4.73.1",
"Newtonsoft.Json": "13.0.3",
"Sentry": "6.9.0",
"SmartB2B.Enova.Contracts": "1.0.0",
"System.IdentityModel.Tokens.Jwt": "8.3.1",
"WampSharp.Default.Client": "23.8.1"
}, },
"runtime": { "runtime": {
"SmartB2B.Enova.Service.dll": {} "SmartB2B.Enova.Service.dll": {}
@@ -180,22 +174,22 @@
} }
} }
}, },
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": { "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": {
"runtime": { "runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "8.0.0.0", "assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610" "fileVersion": "8.0.23.53103"
} }
} }
}, },
"Microsoft.Extensions.Logging.Abstractions/8.0.2": { "Microsoft.Extensions.Logging.Abstractions/8.0.0": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0"
}, },
"runtime": { "runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "8.0.0.0", "assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610" "fileVersion": "8.0.23.53103"
} }
} }
}, },
@@ -280,7 +274,7 @@
"Microsoft.IdentityModel.Tokens/8.3.1": { "Microsoft.IdentityModel.Tokens/8.3.1": {
"dependencies": { "dependencies": {
"Microsoft.Bcl.Memory": "9.0.0", "Microsoft.Bcl.Memory": "9.0.0",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2", "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
"Microsoft.IdentityModel.Logging": "8.3.1" "Microsoft.IdentityModel.Logging": "8.3.1"
}, },
"runtime": { "runtime": {
@@ -722,9 +716,27 @@
} }
} }
}, },
"SmartB2B.Enova.Contracts/1.0.0": { "SmartB2B.Sync.Contracts/1.0.0": {
"runtime": { "runtime": {
"SmartB2B.Enova.Contracts.dll": { "SmartB2B.Sync.Contracts.dll": {
"assemblyVersion": "1.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"SmartB2B.Sync.Service/1.0.0": {
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"Microsoft.Data.SqlClient": "5.2.2",
"Microsoft.Identity.Client": "4.73.1",
"Newtonsoft.Json": "13.0.3",
"Sentry": "6.9.0",
"SmartB2B.Sync.Contracts": "1.0.0",
"System.IdentityModel.Tokens.Jwt": "8.3.1",
"WampSharp.Default.Client": "23.8.1"
},
"runtime": {
"SmartB2B.Sync.Service.dll": {
"assemblyVersion": "1.0.0", "assemblyVersion": "1.0.0",
"fileVersion": "1.0.0.0" "fileVersion": "1.0.0.0"
} }
@@ -787,19 +799,19 @@
"path": "microsoft.data.sqlclient.sni.runtime/5.2.0", "path": "microsoft.data.sqlclient.sni.runtime/5.2.0",
"hashPath": "microsoft.data.sqlclient.sni.runtime.5.2.0.nupkg.sha512" "hashPath": "microsoft.data.sqlclient.sni.runtime.5.2.0.nupkg.sha512"
}, },
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": { "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==", "sha512": "sha512-cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2", "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512" "hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512"
}, },
"Microsoft.Extensions.Logging.Abstractions/8.0.2": { "Microsoft.Extensions.Logging.Abstractions/8.0.0": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", "sha512": "sha512-arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==",
"path": "microsoft.extensions.logging.abstractions/8.0.2", "path": "microsoft.extensions.logging.abstractions/8.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512" "hashPath": "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512"
}, },
"Microsoft.Identity.Client/4.73.1": { "Microsoft.Identity.Client/4.73.1": {
"type": "package", "type": "package",
@@ -1221,7 +1233,12 @@
"path": "wampsharp.websockets/23.8.1", "path": "wampsharp.websockets/23.8.1",
"hashPath": "wampsharp.websockets.23.8.1.nupkg.sha512" "hashPath": "wampsharp.websockets.23.8.1.nupkg.sha512"
}, },
"SmartB2B.Enova.Contracts/1.0.0": { "SmartB2B.Sync.Contracts/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"SmartB2B.Sync.Service/1.0.0": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@ setlocal
cd /d "%~dp0" cd /d "%~dp0"
if not exist "smartb2bsync-enova.exe" ( if not exist "smartb2bsync-enova.exe" (
echo Brak smartb2bsync-enova.exe. Najpierw uruchom publish.ps1. echo Brak smartb2bsync-enova.exe. Najpierw uruchom publish-enova.ps1.
exit /b 1 exit /b 1
) )

Binary file not shown.

View File

@@ -28,8 +28,10 @@
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.deps.json" to="%BASE%\..\SmartB2B.Enova.Service.deps.json" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.deps.json" to="%BASE%\..\SmartB2B.Enova.Service.deps.json" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.runtimeconfig.json" to="%BASE%\..\SmartB2B.Enova.Service.runtimeconfig.json" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.runtimeconfig.json" to="%BASE%\..\SmartB2B.Enova.Service.runtimeconfig.json" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.pdb" to="%BASE%\..\SmartB2B.Enova.Service.pdb" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Service.pdb" to="%BASE%\..\SmartB2B.Enova.Service.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Contracts.dll" to="%BASE%\..\SmartB2B.Enova.Contracts.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Contracts.dll" to="%BASE%\..\SmartB2B.Sync.Contracts.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Enova.Contracts.pdb" to="%BASE%\..\SmartB2B.Enova.Contracts.pdb" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Contracts.pdb" to="%BASE%\..\SmartB2B.Sync.Contracts.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Service.dll" to="%BASE%\..\SmartB2B.Sync.Service.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/SmartB2B.Sync.Service.pdb" to="%BASE%\..\SmartB2B.Sync.Service.pdb" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/adapters/SmartB2B.Enova.Adapter.dll" to="%BASE%\..\adapters\SmartB2B.Enova.Adapter.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/adapters/SmartB2B.Enova.Adapter.dll" to="%BASE%\..\adapters\SmartB2B.Enova.Adapter.dll" failOnError="false" />
<download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/Azure.Core.dll" to="%BASE%\..\Azure.Core.dll" failOnError="false" /> <download from="https://demo.smartb2b.eu/files/smartb2b-sync-enova/Azure.Core.dll" to="%BASE%\..\Azure.Core.dll" failOnError="false" />

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More