Modelowanie procesów za pomocą C# – wprowadzenie

Informacje ogólne

Uwaga
W wersji 2020.0.0 Comarch DMS mechanizm modelowania procesów metodą C# jest wersją beta.

Od wersji 2021.1.0 modelowanie procesów w języku C# jest objęte licencją Premium.

Od wersji 2023.1.0 za pomocą C# można tworzyć skrypty do pracy automatycznej (zob. Konfiguracja automatycznego trybu pracy (robotyzacja procesów).

Comarch DMS został wyposażony w mechanizm wspomagający modelowanie procesów oparty
o kompilator C#. Wersja kompilatora jak również wersja języka C# jest uzależniona od Microsoft .NET Framework. Zalecana jest aktualizacja Microsoft .NET Framework do najnowszej dostępnej wersji.

Wskazówka
Kod C# ma zastosowanie w Comarch DMS m. in. przy weryfikacji kontrahenta na białej liście podatników (zob. Weryfikacja kontrahenta na białej liście podatników

 

Środowisko kompilacji C#

Wynikowymi bibliotekami kompilatora Comarch DMS są zawsze biblioteki dll.

Po skompilowaniu, biblioteki są automatycznie konfigurowane do pracy na serwerze IIS. Dzięki temu funkcjonalność jest dostępna dla wszystkich platform (aplikacji stacjonarnej, webowej, mobilnych iOS i Android).

Miejsca przechowywania bibliotek:

1. {Apl. www (serwerowa)}\bin\.scriptcs_cache – katalog do którego są kopiowane biblioteki po kompilacji kodu C#.

2. {Apl. www(serwerowa)}\bin\Scriptcs_bin – miejsce na biblioteki dll używane przez kod C# jako referencje.

Przed kompilacją skryptów C# na komputerze z IIS należy nadać użytkownikowi IIS_IUSRS prawo zapisu do katalogu .scriptcs_cache

Okno kompilacji języka C# jest dostępne z poziomu właściwości wybranych kontrolek. Kontrolki
obsługują poniższe zdarzenia:

1. Init (zdarzenie OnInit)

2. Obserwator (zdarzenie OnChange)

3. Wciśnięcie przycisku (zdarzenie OnClick)

Jeżeli zaistnieje potrzeba skorzystania z biblioteki referencyjnej w której znajdują się funkcje do
wywołania w kodzie C#, bibliotekę należy wgrać do katalogu bin\Scriptcs_bin. Nazwę tej biblioteki
należy podać w oknie „Referencje”( zob. poniżej punkt Język C# na definicjach kontrolek).

Istnieje możliwość skorzystania z referencji bibliotek com (.NET) zarejestrowanych na serwerze IIS. W takim przypadku, w oknie „Referencje” należy wpisać nazwę biblioteki bez rozszerzenia dll.

Kompilacja kodu C# odbywa się po naciśnięciu ikony lub kliknięciu przycisku „Kompiluj i zapisz”. Elementy te znajdują się w oknie edycji kodu C#. ( zob. poniżej punkt Język C# na definicjach kontrolek)

Jeżeli skompilowane biblioteki dll zostaną usunięte z katalogu .scriptcs_cache, to przed pierwszym użyciem funkcjonalności (podniesienie dokumentu DMS) zamodelowanej metodą C# nastąpi automatyczne skompilowanie bibliotek.

Włączenie funkcjonalności

Aby włączyć funkcjonalność należy:

  • przy instalacji lub aktualizacji systemu zaznaczyć parametr „Wersja Premium”

 

Wybór opcji „Wersja Premium” podczas instalacji Comarch DMS

lub

  • w pliku Web.config wartość klucza PremiumFunctionality ustawić na „True” i wprowadzić odpowiedni klucz licencji

 

Parametr „PremiumFunctionality”

 

Jeżeli operator nie posiada odpowiedniej licencji, a zaznaczył parametr „PremiumFunctionality”, wówczas przy próbie logowania w oknie logowania zostanie wyświetlona na czerwono informacja o braku licencji Premium, a dostęp do Comarch DMS nie będzie możliwy.

 

Okno logowania do aplikacji desktop z informacją o braku licencji Premium

 

Włączenie edytora C# skutkuje pojawieniem się dodatkowych opcji na definicjach kontrolek.

 

Zasady pisania kodu C#

Kod C# dzięki któremu można programować inicjowanie wartości w poszczególnych kontrolkach programuje się w udostępnianych przez kontrolki edytorach na zasadzie skryptu. Można przyjąć, że obszar edytora to „wnętrze” metody obsługującej określone zdarzenie.

W zależności od edytora kontrolki (wybranego zdarzenia), administrator ma dostęp do listy właściwości, które można przywołać wpisując nazwę „Global”.

Obiekt „Global” skupia w sobie wszystkie inne obiekty, które można wykorzystać podczas pisania obsługi zdarzenia. Poprzez ten obiekt użytkownik ma również dostęp do wartości kontrolek znajdujących się na karcie obiegu.

W przypadku zdarzeń „Inicjowanie”, każda kontrolka posiada obiekt „Common” z następującymi właściwościami:

  • Globals.Common.DocumentCompanyId – Id spółki powiązanej z kontrolką, np. DocumentCompanyId (typu int)
  • Globals.Common.DocumentId – Id dokumentu DMS, np. DocumentId (typu int?)
  • Globals.Common.ParentDocumentId – Id właściciela dokumentu, np. ParentDocumentId (typu int?)
  • Globals.Common.StageId – Id etapu w którym znajduje się dokument, StageId (typu int?)
  • Globals.Common.UserId – Id zalogowanego operatora, np.  UserId (typu int)
  • Globals.Common.WorkflowId – Id typu obiegu, np. WorkflowId (typu int)

Typ zakończony „?” (int?) oznacza, że oprócz wartości numerycznych zmienna może przechowywać również wartość NULL (pustą). Przykładowa sytuacja to brak wpisanej wartości w kontrolce typu liczba całkowita

W przypadku zdarzeń „Obserwacja”, każda z kontrolek posiada dodatkowo właściwość:

  • Globals.Common.SenderControlName – Identyfikator kontrolki inicjującej zdarzenie

Uwaga
Wszystkie właściwości udostępniane przez obiekt „Common” są tylko do odczytu.

Obiekt „Global” posiada również obiekt „MainFrame”.

Po nazwie „MainFrame” występują nazwy identyfikatorów kontrolek, następnie właściwości lub metody.

Elementy udostępniane przez obiekt „MainFrame” zależą od kontrolki, dla której pisze się obsługę zdarzenia, zdarzeń oraz od innych zdefiniowanych na karcie obiegu kontrolek.

 

W przypadku obiektu „MainFrame”, dostęp do właściwości odbywa się w oparciu o następującą ścieżkę:

Globals.MainFrame.Identyfikator kontrolki.Nazwa właściwości lub nazwa metody

Przyklad

Przykładowa linia kontrolki o identyfikatorze „Pole1” pozwalająca na wprowadzenie lub zmianę wartości kontrolki za pomocą właściwości „Text”:

Globals.MainFrame.Pole1.Text = „NR/123/2020”;

 

Język C# na definicjach kontrolek

Oprogramowano funkcjonalność tworzenia własnych zdarzeń w języku C#. W aktualnej wersji możliwość modelowania zdarzeń w języku C# dostępna jest w kontrolkach:

  • Dane tabelaryczne,
  • Dane tabelaryczne, kolumna typu lista,
  • Data i godzina,
  • Dokument elektroniczny,
  • Komunikat,
  • Kontrahent,
  • Liczba całkowita,
  • Liczba rzeczywista,
  • Liczba stałoprzecinkowa,
  • Lista,
  • Tekst,
  • Towar,
  • Własna akcja.

 

W większości kontrolek możliwe jest tworzenie skryptów służących zarówno inicjowaniu wartości w kontrolkach, jak i obserwowaniu wartości innych kontrolek. Obserwowanie wartości umożliwia „reagowanie” na zmiany. Dla kontrolek typu dane tabelaryczne oraz własna akcja możliwa jest również „obserwacja samej siebie”.

 

Pozycja C# Script w opcjach inicjowania wartości kontrolki typu tekst

 

Pozycja C# Script w kontrolce typu Własna akcja

 

Po wskazaniu inicjowania wartości za pomocą C# Script i kliknięciu
uruchamiana jest formatka, w której należy wpisać kod C#.

 

Okno Skrypt C#

 

Okno Skrypt C# składa się z pola, w którym należy wpisać kod, a następnie skompilować i zapisać przyciskiem [Kompiluj i zapisz].

Kod po skompilowaniu zapisywany jest w formie biblioteki w lokalizacji …\bin\.scriptsc_cache w katalogu, w którym zainstalowano aplikację serwerową (dawna web) Comarch DMS.

W polu Referencje należy wpisać nazwy bibliotek, z których będzie korzystał kod C#. Domyślną lokalizacją, w której należy umieścić biblioteki jest …\bin\scripts_bin w katalogu, w którym zainstalowano aplikację serwerową (dawna web)Comarch DMS.

Warunkiem koniecznym do poprawnego działania jest nadanie operatorowi IIS_USER uprawnień pełnej kontroli do katalogu .scriptsc_cache, pozwoli to na dynamiczny zapis skompilowanych plików.

W edytorze skryptów C# wyświetlane są podpowiedzi zawierające obiekty kontrolek karty obiegu (Globals.MainFrame.*) oraz zmienne (Globals.Common.*).

 

Podpowiedzi wyświetlane w edytorze skryptów C#

 

W kontrolce typu Dane tabelaryczne dostępne są następujące funkcje i właściwości:

  • MainFrame.<nazwaDT>.Items[Index]… – odwołanie do wartości kontrolki
    • Funkcje
      • MainFrame.<nazwaDT>.AddRow()dodaj kolejny wiersz.
      • MainFrame.<nazwaDT>.AddRows(count)dodaj wiersze, gdzie „count” oznacza ile wierszy ma zostać dodane.
      • MainFrame.<nazwaDT>.RemoveRow(index)usuń wiersz, gdzie „index” to wiersz, który ma zostać usunięty.
      • MainFrame.<nazwaDT>.Clear()usuwa wszystkie wiersze.
    • Właściwości
      • MainFrame.<nazwaDT>.Column – informacja o modyfikowanej komórce – numer kolumny.
      • MainFrame.<nazwaDT>.Row – informacja o modyfikowanej komórce – numer wiersza.
      • MainFrame.<nazwaDT>.RowCount – informacja o ilości wierszy w DT
.

 

Wskazówka
W tablicach C# – pierwszy wiersz to 0

 

Uwaga

Podczas pierwszego uruchomienia operacji zamodelowanej mechanizmem C# może nastąpić opóźnienie działania mechanizmu. Wynika to z konieczności załadowania biblioteki dll do pamięci komputera.

Ze względu na konieczność zachowania nomenklatury nazewniczej języka C# nie jest możliwe używanie polskich znaków diakrytycznych oraz spacji w identyfikatorach kontrolek.

 

Użytkownik może modyfikować wartości kontrolek poprzez modyfikację właściwości „Value” lub „Text”. Np. Globals.MainFrame.Liczba.Value = 10;

Możliwe jest to jednak tylko dla kontrolek, dla których został wprowadzony kod C#, czyli zostało wywołane zdarzenie OnInit lub OnChange (obserwacja). Pozostałe właściwości są tylko do odczytu.

 

Przyklad
Przepisanie wartości z kontrolki typu liczba całkowita o nazwie (identyfikatorze) Liczba do kontrolki typu tekst o nazwie (identyfikatorze) Tekst:

Globals.MainFrame.Tekst.Text = Globals.MainFrame.Liczba.Value.ToString();

 

Przyklad

Pobranie wartości z kontrolki skladnik i zapisanie tej wartości w kontrolce suma powiększonej o 1.

var a = Globals.MainFrame.skladnik.Value ?? 0; // jeżeli pusta wartość zapisz 0
a = a + 1;
Globals.MainFrame.suma.Value = a;

 

Przyklad

Przepisanie wartości z kontrolki typu tekst do kontrolki typu liczba całkowita, pod warunkiem, że wpisana wartość jest liczbą.

 

if (IsNumeric (Globals.MainFrame.Wartosc_tekst.Text))
{
Globals.MainFrame.Liczba.Value = Int32.Parse(Globals.MainFrame.Wartosc_tekst.Text);
}

public static bool IsNumeric(string value)
{
return value.All(char.IsNumber);
}

 

Przyklad

Przykład pobrania informacji o identyfikatorze operatora i wyświetlenia jej w kontrolce typu tekst.

var info = „Identyfikator operatora: ” + Globals.Common.UserId;
Globals.MainFrame.Informacja.Text = info;

 

Dla kontrolki „Własna akcja” został oprogramowany przełącznik, dzięki któremu można wskazać miejsce uruchomienia skompilowanego kodu C#. Istnieje możliwość uruchomienia kodu w ramach procesu IIS lub w ramach niezależnego procesu (jednowątkowego).

Uruchomienie na niezależnym procesie zalecane jest w przypadku obsługi API, które nie powinno działać na procesach wielowątkowych, jakim jest proces IIS.

 

Ustawienie miejsca uruchomienia kodu C# dla kontrolki „Własna akcja”

 




Weryfikacja kontrahenta na białej liście podatników

Od wersji 2022.0 w Comarch DMS Premium dostępna jest funkcjonalność weryfikacji kontrahentów na białej liście podatników.

Uwaga
Funkcjonalność dostępna jest tylko w przypadku, jeśli Comarch DMS jest na gwarancji. Okres gwarancji jest sprawdzany za każdym razem podczas weryfikacji kontrahenta na białej liście.

 

Kontrahent jest weryfikowany według numeru NIP. Wedle tej informacji można także sprawdzić, czy kontrahent był zarejestrowany na białej liście podatników w danym dniu.

Aby zweryfikować kontrahenta, w konfiguracji kontrolki używa się metody C#:

  • GetStatusVAT(string nip) – aby sprawdzić, czy kontrahent jest na białej liście podatników;
  • GetStatusVATForDate(string nip, DateTime date) – aby sprawdzić, czy kontrahent w danym dniu był na białej liście podatników

Przyklad

Metoda GetStatusVAT(string nip) – przykład

1. Użytkownik w ramach obiegu dokumentów tworzy dwie kontrolki typu tekst.

Są to:

  • Kontrolka Czy kontrahent zweryfikowany? (identyfikator kontrolki: weryfikacja_kontrolka)
  • Kontrolka NIP (identyfikator kontrolki: nip_kontrolka)

Kontrolka „Czy kontrahent zweryfikowany?”

 

Kontrolka „NIP”

2. Następnie we właściwościach kontrolki Czy kontrahent zweryfikowany? użytkownik dodaje w ramach pola Kontrolki powiązane kontrolkę NIP, a jako Wzór na wartość wybiera C# Script i klika Ustaw. Następnie wpisuje następujący wzór:

var nip = Globals.MainFrame.nip_kontrolka.Text;

if (!string.IsNullOrEmpty(nip))
Globals.MainFrame.weryfikacja_kontrolka.Text = Globals.Common.GetStatusVAT(nip).ToString();
else
Globals.MainFrame.weryfikacja_kontrolka.Text = „”;

 

i wybiera przycisk , aby skompilować wzór i zapisać.

3. Następnie zamyka okno Skrypt C#, zapisuje obieg i sprawdza działanie kontrolek.

 

Wprowadzanie kodu C# do weryfikacji kontrahenta

 

Możliwe wartości zwrócone po weryfikacji do kontrolki „Czy kontrahent zweryfikowany?” to:

  • No – podatnik nie jest VATowcem
  • Yes – podatnik jest czynnym VATowcem
  • Free – podatnik jest zwolniony z VAT
  • None – wystąpił błąd podczas weryfikacji
  • NIPErrorniepoprawny numer NIP

 

Weryfikacja kontrahenta – kontrahent jest czynnym VATowcem

 

Weryfikacja kontrahenta – niepoprawny numer NIP

Przyklad

Metoda GetStatusVATForDate(string nip, DateTime date) – przykład

1. Użytkownik w ramach obiegu dokumentów tworzy dwie kontrolki typu tekst i jedną kontrolkę typu data. Są to:

  • Kontrolka typu tekst Czy kontrahent był danego dnia na białej liście? (identyfikator kontrolki: kontrahent_dzien)
  • Kontrolka typu tekst NIP (identyfikator kontrolki: NIP)
  • Kontrolka typu data Data (identyfikator kontrolki: Data)

 

Kontrolka „Czy kontrahent był danego dnia na białej liście?”

 

Kontrolka „NIP”

 

Kontrolka „Data”

2. Następnie we właściwościach kontrolki Czy kontrahent był danego dnia na białej liście? użytkownik dodaje w ramach pola Kontrolki powiązane kontrolki: NIP i Data, a jako Wzór na wartość wybiera C# Script i klika Ustaw. Następnie wpisuje następujący wzór:

var nip = Globals.MainFrame.NIP.Text;
var data1 = Convert.ToDateTime(Globals.MainFrame.Data.Value);

if (!string.IsNullOrEmpty(nip))
Globals.MainFrame.kontrahent_dzien.Text = Globals.Common.GetStatusVATForDate(nip, data1).ToString();
else
Globals.MainFrame.kontrahent_dzien.Text = „”;

 

i wybiera przycisk , aby skompilować wzór i zapisać.

 

3. Następnie użytkownik zamyka okno Skrypt C#, zapisuje obieg i sprawdza działanie kontrolek.

 

Wprowadzanie kodu C# do weryfikacji kontrahenta w danym dniu

 

Możliwe wartości zwrócone po weryfikacji do kontrolki „Czy kontrahent był danego dnia na białej liście?” to:

  • No – podatnik nie był w danym dniu VATowcem
  • Yes – podatnik był w danym dniu czynnym VATowcem
  • Free – podatnik był w danym dniu zwolniony z VAT
  • None – wystąpił błąd podczas weryfikacji
  • NIPErrorniepoprawny numer NIP

 

Weryfikacja kontrahenta według stanu na 7 kwietnia 2022 – kontrahent był wtedy czynnym VATowcem




Konfiguracja automatycznego trybu pracy (robotyzacja procesów) – przykład zastosowania kodu C#

Informacje ogólne

W wersji 2023.1.0 w aplikacji desktop Comarch DMS udostępniono funkcjonalność robotyzacji procesów.

Uwaga
Robotyzacja procesów jest dostępna jedynie w aplikacji desktop Comarch DMS .

W ramach mechanizmu robotyzacji użytkownik korzysta ze skryptów C#, z zastosowaniem predefiniowanych klas. W tym celu został udostępniony lokalny kompilator C#.

Skrypty mogą korzystać z referencji.

Skrypty są aktywowane ręcznie

 

Uwaga
Aby możliwe było uruchomienie skryptów, operator musi być zalogowany do aplikacji desktop Comarch DMS.

 

Zakładka „Konfiguracja automatycznego trybu pracy” – nadawanie uprawnień do zakładki i elementy okna

W wersji 2023.1.0 została dodana nowa zakładka [Konfiguracja automatycznego trybu pracy] , dostępna w menu głównym aplikacji desktop Comarch DMS nad ikoną panelu użytkownika .

 

Zakładka [Konfiguracja automatycznego trybu pracy] jest dostępna w menu głównym aplikacji desktop Comarch DMS jedynie wtedy, gdy danemu operatorowi nadano uprawnienie do tej zakładki na karcie pracownika.

Aby przyznać uprawnienie do zakładki [Konfiguracja automatycznego trybu pracy] pracownikowi należy przejść na zakładkę [Struktura organizacyjna], następnie kliknąć na sekcje „Pracownicy”, na danego pracownika i na zakładkę „Uprawnienia”. Następnie należy wybrać sekcję „Funkcjonalności” i w ramach pola „Konfiguracja automatycznego trybu pracy” wybrać wartość „Tak”, a następnie zapisać zmiany znakiem dyskietki. Wówczas pracownik będzie mógł tworzyć skrypty do pracy automatycznej.

Jeżeli w polu „Konfiguracja automatycznego trybu pracy” ustawiona jest wartość „Nie”, wówczas zakładka nie jest widoczna dla pracownika i nie ma on uprawnień do tworzenia skryptów do pracy automatycznej.

 

Uwaga
Jeżeli operator nadaje uprawnienie „Konfiguracja automatycznego trybu pracy” samemu sobie, wówczas zakładka będzie widoczna dopiero po ponownym zalogowaniu .

 

Nadawanie pracownikowi uprawnień do zakładki „Konfiguracja automatycznego trybu pracy”

Po pierwszym przejściu na zakładkę [Konfiguracja automatycznego trybu pracy] widoczne jest puste okno ze zwiniętym panelem „Skrypty” . W górnej części okna dostępne są następujące przyciski:

  • [Dodaj] – po naciśnięciu przycisku zostaje dodany nowy skrypt
  • [Usuń] – przycisk pozwala na usunięcie programu z listy programów w oknie „Konfiguracja automatycznego trybu pracy” oraz z listy programów, które mogą być uruchomione przez użytkownika
  • [Zapisz] – przycisk służy do zapisywania zmian w programie
  • [Uruchom] – przycisk otwiera okno „Automatyczny tryb pracy”; przycisk widoczny jedynie dla użytkowników, którym nadano uprawnienie do danego programu na zakładce „Uprawnienia” w ramach okna „Konfiguracja automatycznego trybu pracy” (zob. Uruchamianie i zatrzymywanie programu).

 

Okno „Konfiguracja automatycznego trybu pracy” po pierwszym otwarciu zakładki

Aby dodać nową pozycję, należy nacisnąć przycisk [Dodaj]. Wówczas zostanie dodany nowy program z predefiniowaną nazwą „Nazwa programu 1”. W ramach okna widoczne są dwie zakładki:

  • Edytor skryptów
  • Uprawnienia

 

Zakładka „Edytor skryptów”

W wersji 2023.1.0 została dodana nowa zakładka [Konfiguracja automatycznego trybu pracy] , dostępna w menu głównym aplikacji desktop Comarch DMS nad ikoną panelu użytkownika .

 

Zakładka [Konfiguracja automatycznego trybu pracy] jest dostępna w menu głównym aplikacji desktop Comarch DMS jedynie wtedy, gdy danemu operatorowi nadano uprawnienie do tej zakładki na karcie pracownika.

Aby przyznać uprawnienie do zakładki [Konfiguracja automatycznego trybu pracy] pracownikowi należy przejść na zakładkę [Struktura organizacyjna], następnie kliknąć na sekcje „Pracownicy”, na danego pracownika i na zakładkę „Uprawnienia”. Następnie należy wybrać sekcję „Funkcjonalności” i w ramach pola „Konfiguracja automatycznego trybu pracy” wybrać wartość „Tak”, a następnie zapisać zmiany znakiem dyskietki. Wówczas pracownik będzie mógł tworzyć skrypty do pracy automatycznej.

Jeżeli w polu „Konfiguracja automatycznego trybu pracy” ustawiona jest wartość „Nie”, wówczas zakładka nie jest widoczna dla pracownika i nie ma on uprawnień do tworzenia skryptów do pracy automatycznej.

 

Uwaga
Jeżeli operator nadaje uprawnienie „Konfiguracja automatycznego trybu pracy” samemu sobie, wówczas zakładka będzie widoczna dopiero po ponownym zalogowaniu .

 

Nadawanie pracownikowi uprawnień do zakładki „Konfiguracja automatycznego trybu pracy”

Po pierwszym przejściu na zakładkę [Konfiguracja automatycznego trybu pracy] widoczne jest puste okno ze zwiniętym panelem „Skrypty” . W górnej części okna dostępne są następujące przyciski:

  • [Dodaj] – po naciśnięciu przycisku zostaje dodany nowy skrypt
  • [Usuń] – przycisk pozwala na usunięcie programu z listy programów w oknie „Konfiguracja automatycznego trybu pracy” oraz z listy programów, które mogą być uruchomione przez użytkownika
  • [Zapisz] – przycisk służy do zapisywania zmian w programie
  • [Uruchom] – przycisk otwiera okno „Automatyczny tryb pracy”; przycisk widoczny jedynie dla użytkowników, którym nadano uprawnienie do danego programu na zakładce „Uprawnienia” w ramach okna „Konfiguracja automatycznego trybu pracy” (zob. Uruchamianie i zatrzymywanie programu).

 

Okno „Konfiguracja automatycznego trybu pracy” po pierwszym otwarciu zakładki

Aby dodać nową pozycję, należy nacisnąć przycisk [Dodaj]. Wówczas zostanie dodany nowy program z predefiniowaną nazwą „Nazwa programu 1”. W ramach okna widoczne są dwie zakładki:

  • Edytor skryptów
  • Uprawnienia

 

Zakładka „Uprawnienia”

W ramach zakładki „Uprawnienia” zostają zdefiniowane uprawnienia operatorów do uruchamiania skryptów.

Uprawnienia dla każdego utworzonego programu są nadawane oddzielnie.

 

Zakładka „Uprawnienia” w ramach okna „Konfiguracja automatycznego trybu pracy” przed dodaniem uprawnień

 

Na zakładce dostępne są następujące pola:

  • Nazwa spółki – pole dostępne jedynie w trybie wielospółkowym Comarch DMS; należy w nim dokonać wyboru spółki, z której pochodzi operator, któremu mają zostać nadane uprawnienia
  • Typ – w ramach tego pola możliwy jest wybór pracownika, działu lub stanowiska, dla którego mają zostać przyznane uprawnienia do danego programu
  • Wartość – w zależności od wyboru dokonanego w polu „Typ” w ramach tego pola można wybrać danego pracownika/dział/ stanowisko, któremu zostaną przyznane uprawnienia do danego programu
  • Po nadaniu uprawnień należy zapisać zmiany, klikając na przycisk [Zapisz]. Wówczas operator zostaje przeniesiony na zakładkę „Edytor skryptów”, a w prawym górnym rogu okna „Konfiguracja automatycznego trybu pracy” pojawia się przycisk [Uruchom], służący do uruchomienia programu.

 

Zakładka „Uprawnienia” w ramach okna „Konfiguracja automatycznego trybu pracy” z dodanymi uprawnieniami – przed zapisaniem zmian

 

Uruchamianie i zatrzymywanie programu

Okno „Uruchom program”

Aby uruchomić program, należy kliknąć w ikonę  [Uruchom], która jest widoczna:

  • na zakładce [Dokumenty] – dla każdego użytkownika, któremu przyznano uprawnienia do co najmniej jednego programu

 

Widok listy dokumentów dla użytkownika, któremu nadano uprawnienia do programu – w prawym górnym rogu widoczna jest ikona „Uruchom”

  • W ramach okna „Konfiguracja automatycznego trybu pracy”, dla operatora, któremu przyznano uprawnienia do tego okna oraz do co najmniej jednego programu

 

Widok okna „Konfiguracja automatycznego trybu pracy” dla użytkownika, któremu nadano uprawnienia do programu – w prawym górnym rogu widoczna jest ikona „Uruchom”

Po naciśnięciu ikony [Uruchom] zostaje otwarte okno „Uruchom program”. W ramach tego okna operator może uruchomić program. W oknie znajdują się dwa pola:

  • Uruchom program – w ramach tego pola użytkownik może wybrać program, który chce uruchomić, z rozwijanej listy

Uwaga
W ramach pola „Uruchom program” widoczne są tylko te programy, do których przyznano danemu operatorowi uprawnienia na zakładce „Uprawnienia” w oknie „Konfiguracja automatycznego trybu pracy”  (zob. Zakładka „Uprawnienia”).

 

Wybór z listy programu, który ma zostać uruchomiony

  • Zabezpiecz hasłem – pole domyślnie odznaczone; jeżeli zostanie zaznaczone, wówczas zatrzymanie pracy programu będzie wymagało podania hasła zalogowanego operatora w oknie „Automatyczny tryb pracy”.

 

Okno „Uruchom program” z zaznaczonym checkboxem „Zabezpiecz hasłem”

  • Po wyborze programu operator powinien nacisnąć przycisk [Uruchom] – wówczas okno „Uruchom program” zostanie zamknięte, a otworzy się okno „Automatyczny tryb pracy” i wybrany program rozpocznie działanie.
  • Natomiast jeżeli operator nie chce jednak uruchomić programu, powinien kliknąć przycisk [Anuluj] – wtedy okno „Uruchom program” zostanie zamknięte, a program się nie uruchomi.

 

Okno „Automatyczny tryb pracy”

Po naciśnięciu w oknie „Uruchom program” przycisku [Uruchom] zostaje otwarte okno „Automatyczny tryb pracy”.

W ramach okna „Automatyczny tryb pracy” znajduje się nazwa programu, który został uruchomiony, jest również podawany czas, który zajęło dotychczas wykonywanie programu.

Aby zakończyć działania programu, należy kliknąć przycisk [Zatrzymaj program], znajdujący się w dolnej części okna.

 

Uwaga
Jeśli okno „Automatyczny tryb pracy” jest włączone, użytkownik nie może pracować z Comarch DMS.

 

Okno „Automatyczny tryb pracy”

Kiedy operator naciśnie przycisk [Zatrzymaj program]:

  • jeśli w oknie „Uruchom program” nie zaznaczono checkboxa „Zabezpiecz hasłem” – wykonywanie skryptu zostanie przerwane, okno „Automatyczny tryb pracy” – zamknięte, a operator może znowu pracować z Comarch DMS;
  • jeśli w oknie „Uruchom program” zaznaczono checkbox „Zabezpiecz hasłem” – wyświetlone zostaje okno, w ramach którego należy wprowadzić hasło zalogowanego operatora.

 

Okno, w którym należy wpisać hasło zalogowanego operatora, aby zatrzymać program

 

W oknie dostępne są następujące przyciski:

  • [Zatrzymaj program] – kiedy operator wybierze tn przycisk, wówczas wykonywanie skryptu zostanie zatrzymane, okno „Automatyczny tryb pracy” – zamknięte, zostanie również wyświetlone okno informujące o zakończeniu działania programu, w którym należy kliknąć przycisk „Ok”. Operator będzie mógł znowu pracować z Comarch DMS;

 

Okno wyświetlane po podaniu hasła operatora i zatrzymaniu programu

 

  • [Zamknij aplikację] – po naciśnięciu tego przycisku zostaje wyświetlone następujące okno:

 

Okno wyświetlone po wyborze przycisku „Zamknij aplikację”

 

W ramach okna znajdują się dwa przyciski:

    • Tak – aplikacja Comarch DMS zostanie zamknięta
    • Nie – jeżeli operator wybierze tę opcję, wówczas aplikacja Comarch DMS pozostaje otwarta, a skrypt nadal jest wykonywany
  • [Anuluj] – jeśli użytkownik kliknie ten przycisk, wówczas okno do wprowadzenia hasła zostanie zamknięte, a skrypt będzie nadal wykonywany;
  • Jeżeli operator nie wprowadzi hasła lub wprowadzi błędne hasło, a następnie kliknie w przycisk [Zatrzymaj program], wówczas zostanie wyświetlona informacja o nieprawidłowym haśle, a skrypt nadal będzie wykonywany.

Informacja wyświetlana, jeśli nie wprowadzono hasła lub wprowadzono błędne hasło

 

Klasa ACD

W obiekcie Globals dodano klasę ACD, która określa grupę metod wykonywanych jedynie w kontekście okna ACD. W klasie ACD udostępniono następujące metody:

GenerateDMSDocuments (int) – metoda umożliwia wciśnięcie przycisku „Generuj” na zakładce „Automatyczne generowanie dokumentów”.

  • zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – kiedy wystąpił błąd

Int GenerateDMSDocuments()

Return: 0 – ok, -1 – error

 

GetDocumentList – metoda umożliwia pobranie informacji o zaczytanych dokumentach

  • Zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – wystąpił błąd

Int GetDocumentList(ref ACDDocument[])

Struct ACDDocument

(

string Name,

byte Status

)

Name: document name

Status: 0 – correct, 1 – incorrect

Return: 0 – ok, -1 – error

 

GetNumberItems (ref long) – metoda, która sprawdza liczbę pobranych dokumentów w punkcie ACD

  • brak parametrów wejściowych
  • zwraca wyniki:
    • Liczba pobranych dokumentów
    • 0 – operacja została wykonana poprawnie
    • -1 – kiedy metoda została wywołana w niewłaściwym kontekście

int GetNumberItems(ref long)

long: number of documents

return: 0 – ok, -1 – error

 

RefreshList() – metoda umożliwia wciśnięcie przycisku „Odśwież” na zakładce „Automatyczne generowanie dokumentów”

  • brak parametrów wejściowych
  • zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – kiedy wystąpił błąd

Int RefreshList()

return: 0 – ok, -1 – error

 

SelectDocument (int) – metoda, która umożliwia podświetlenie dokumentu na liście (jeżeli lista prezentuje dokumenty z checkboxami – zaznaczenie checkboxa).

  • Parametry wejściowe:
    • Identyfikator dokumentu
  • Zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – wystąpił błąd

int SelectDocument(int)

int: document index

return: 0 – ok, -1 – error

 

SetPoint (string,byte) – metoda, która odpowiada za wskazanie punktu ACD i włączenie lub wyłączenie automatycznego wysyłania dokumentów do Comarch OCR

  • Parametry wejściowe:
    • Pierwszy parametr jest wymagany, należy wprowadzić w nim nazwę punktu ACD, w ramach którego będzie się odbywało przetwarzanie dokumentów
    • Drugi parametr jest opcjonalny, dotyczy kwestii włączenia procesowania dokumentów w punkcie ACD, przyjmuje następujące wartości:

0 – procesowanie dokumentów jest wyłączone (dotyczy punktów ACD, które nie obsługują OCR)

1 – procesowanie dokumentów jest włączone

  • Zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – kiedy wystąpił błąd
    • -2 – kiedy punkt ACD o podanej nazwie nie istnieje

int SetPoint(string,byte)

string: ACD point name

byte:1 -turn on ACD proces, 0 – turn off ACD proces

return: 0 – ok, – 1 – error, -2 – ACD point not exists

 

SetViewMode (byte) – metoda, która odpowiada za tryb filtrowania pobranych dokumentów

  • Parametry wejściowe:
    • 0 – generowanie wszystkich dokumentów;
    • 1 – generowanie jedynie wypełnionych dokumentów;
    • 2 – generowanie wybranych dokumentów;
  • Zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • -1 – wystąpił błąd

int SetViewMode(byte)

byte: 0 – all documents, 1 – correct documents, 2 – selected documents

return: 0 – ok, – 1 – error

 

Show – metoda, która otwiera obszar ACD

  • brak parametrów wejściowych
  • zwraca wyniki:
    • 0 – operacja została wykonana poprawnie
    • 1 – operator nie jest uprawniony do okna ACD – jeśli ta wartość została zwrócona, w aplikacji zostaje wyświetlony komunikat „Operator nie posiada uprawnień do automatycznego generowania dokumentów”

int Show()

return: 0 – ok, -1 – error

 

Klasa Common

W ramach klasy Comon udostępniono następującą metodę:

  • Trace(string) – metoda umożliwia wyświetlanie dodatkowych informacji na oknie „Automatyczny tryb pracy”,

void Trace(string)

string:message

 

Przykład:

Globals.Common.Trace("Trwa procesowanie dokumentów dla punktu: \"Faktury od Firmy C\"");

 

Okno „Automatyczny tryb pracy” z przykładowym zastosowaniem metody Trace

 

Konfiguracja i uruchamianie automatycznego trybu pracy – przykład

  • Administrator otworzył do edycji plik DMS.exe.config, znajdujący się w folderze z aplikacją desktop Comarch DMS i w ramach klucza „RPAFolderPath” wprowadził ścieżkę do aplikacji desktop Comarch DMS – w tym przypadku <add key=”RPAFolderPath” value=”C:\dms202310″/> – a później zapisał zmianę.

 

  • Administrator dodał na zakładce [Automatyczne generowanie dokumentów] trzy punkty ACD należące do typu „Współpraca z Comarch OCR” o następujących nazwach:

 

    • Faktury od Firmy A (zgodnie z ustawieniami punktu dokumenty wygenerowane w tym punkcie mają trafiać do obiegu „Faktury – firma A”)

 

    • Faktury od Firmy B (zgodnie z ustawieniami punktu dokumenty wygenerowane w tym punkcie mają trafiać do obiegu „Faktury – firma B”)

 

    • Faktury od Firmy C (zgodnie z ustawieniami punktu dokumenty wygenerowane w tym punkcie mają trafiać do obiegu „Faktury – firma C”)

 

Ustawienia punktu ACD „Faktury od Firmy A” – zakładka „Ogólne”

 

Ustawienia punktu ACD „Faktury od Firmy A” – zakładka „Kontrolki”

 

  • następnie administrator przeszedł na zakładkę [Konfiguracja automatycznego trybu pracy] i kliknął przycisk [Dodaj].

 

Wskazówka
Aby zobaczyć przykład, kliknij na film poniżej.

 

 

 

  • Na zakładce „Edytor skryptów” w ramach pola „Nazwa programu” wpisał „Faktury z firm A,B,C”, później na zakładce „Uprawnienia” nadał uprawnienia do programu dla siebie i kilku innych operatorów i kliknął [Zapisz].

 

Wskazówka
Aby zobaczyć przykład, kliknij na filmy poniżej.

 

 

 

 

  • Na zakładce „Edytor skryptów” w polu edytora administrator wprowadził następujący kod:
Globals.ACD.Show();

while (1==1)
{
Globals.ACD.SetPoint("Faktury od Firmy A",1);
Globals.ACD.RefreshList();
Globals.ACD.GenerateDMSDocuments();

Globals.ACD.SetPoint("Faktury od Firmy B",1);
Globals.ACD.RefreshList();
Globals.ACD.GenerateDMSDocuments();

Globals.ACD.SetPoint("Faktury od Firmy C",1);
Globals.ACD.RefreshList();
Globals.ACD.GenerateDMSDocuments();
}

 

Wprowadzanie kodu do edytora skryptów

 

  • Następnie administrator nacisnął przycisk [Kompiluj i zapisz]. Kompilacja przebiegła pomyślnie, więc w dolnej części okna wyświetlona została informacja „Kompilacja skryptu zakończyła się sukcesem”.

 

Wskazówka
Aby zobaczyć przykład, kliknij na film poniżej.

 

 

  • Następnie administrator zapisał zmiany, klikając przycisk [Zapisz]. Później nacisnął przycisk [Uruchom] i w ramach otwartego okna „Uruchom program” wybrał w polu „Uruchom program” program „Faktury z firm A,B,C” i (nie zaznaczając checkboxa „Zabezpiecz hasłem”), a później kliknął przycisk [Uruchom].

 

Wskazówka
Aby zobaczyć przykład, kliknij na film poniżej.

 

 

  • wówczas administrator został przeniesiony na zakładkę „Automatyczne generowanie dokumentów”, gdzie otworzyło się okno „Automatyczny tryb pracy”, a w tle odbywało się inicjowanie dokumentów.

 

Wskazówka
Aby zobaczyć przykład, kliknij na film poniżej.

 

 

  • Gdy wszystkie dokumenty zostały wygenerowane, administrator kliknął przycisk [Zatrzymaj program]. Okno „Automatyczny tryb pracy” zostało zamknięte.

 

 

  • Następnie administrator przeszedł na zakładkę [Dokumenty w obiegu] – na liście dokumentów widoczne były wszystkie dokumenty wygenerowane w wyniku działania programu „Faktury z firm A,B,C”. Po wejściu do przykładowego dokumentu można zauważyć, że na dokument zmapowano również wartości odczytane przez OCR, zgodnie z ustawieniami punktów ACD.

 

 

Przykładowy dokument wygenerowany w automatycznym trybie pracy

 

Film
W artykule Automatyczne generowanie dokumentów dzięki mechanizmom RPA. Prezentacja funkcjonalności dostępny jest również film z lektorem przedstawiający funkcjonalność.




Generowanie faktury zakupu w Comarch ERP XL z wykorzystaniem skryptów C#

 

Informacje podstawowe

Uwaga
Aby przyklad działał poprawnie, konieczne jest spełnienie następujących warunków:

1. Instalacja systemu Comarch ERP XL na serwerze IIS

2. Poprawna konfiguracja współpracy pomiędzy systemami Comarch ERP XL oraz Comarch DMS

3. Nadanie użytkownikowi IISUSER uprawnień do zapisu w katalogu bin\Scriptcs_bin oraz katalogu bin\.scriptcs_cache, które znajdują się w plikach aplikacji serwerowej Comarch DMS

4. Skopiowanie biblioteki cdn_api[wersja].net.dll do katalogu bin\Scriptcs_bin, biblioteka znajduje się w katalogu, w którym zainstalowano Comarch ERP XL, w przykładach wykorzystano cdn_api20232.net.dll

5. Należy sprawdzić, czy w katalogu bin aplikacji web Comarch DMS znajduje się plik cdn_sys.dll, jeżeli jest należy usunąć go z tej lokalizacji.

Skrypty C# zostały wykorzystane w kontrolkach typu Własna akcja i Komunikat. Skrypt dla kontrolki typu własna akcja utworzono na podstawie wzorca API XL

 

Wskazówka
Rekomendujemy wykorzystanie wzorca API XL jako elementu bazowego na potrzeby własnych rozwiązań.

Wzorzec API XL dostępny jest na indywidualnych stronach dla Partnerów w obszarze Comarch DMS\Przykłady\ERP XL: Wzorzec API XL

 

 

Konfiguracja typu obiegu

Przykład pokazuje, w jaki sposób administrator Comarch DMS może skonfigurować definicję obiegu, aby generować dokument „Faktura zakupu” do systemu Comarch ERP XL, bez pomocy kontrolki typu Dokument ERP XL. W tym celu należy:

1. dodać nowy typ obiegu w ramach zakladki  [Definicje obiegów dokumentów] 

2. nadać nazwę typowi obiegu – np. Generowanie faktury zakupu i prefix – np. GEN

3. nadać danemu administratorowi uprawnienie do inicjowania dokumentu na zakładce „Ustawienia obiegu” w sekcji „Uprawnienia do inicjowania dokumentu”

 

Nadawanie uprawniń do inicjowania dokumentu dla administratora – przykład

 

4. W ramach zakładki „Schemat obiegu” utworzyć etap początkowy „Generuj dokument” i etap końcowy „Koniec” oraz dodać uprawnienie dla danego administratora do etapów.

 

Dodawanie etapów i uprawnień

5. W ramach zakładki „Karta obiegu” dodać następujące kontrolki:

 A Kontrolka typu Kontrahent„Kontrahent” (identyfikator: Kontrahent)

Kontrolka „Kontrahent”

 

B  Kontrolka typu Dane tabelaryczne„Elementy” (identyfikator: Elementy) – w ramach kontrolki należy:

    • w zakładce „Listy” dodać następujące listy:
      • „Jm” z wartością „Jednostki miary” w polu „Inicjowanie”
      • „VAT” z wartością „Stawki VAT” w polu „Inicjowanie”

 

Kontrolka „Elementy”, zakładka „Listy”

    • w zakładce „Ogólne” dodać następujące kolumny:
      • kolumna typu Towar„Towar” (identyfikator: Towar)
      • kolumna typu Liczba stałoprzecinkowa„Ilość” (identyfikator: Ilosc)
      • kolumna typu Lista„Jm.” (identyfikator: Jm) z wartością „Jm” wybraną w polu „Listy”
      • kolumna typu Lista„VAT” (identyfikator: VAT) z wartością „VAT” wybraną w polu „Listy”
      • kolumna typu Liczba stałoprzecinkowa –  „Cena netto” (identyfikator: CenaNetto)
      • kolumna typu  Liczba stałoprzecinkowa„Cena brutto” (identyfikator: CenaBrutto)
      • kolumna typu  Liczba stałoprzecinkowa„Wartość Netto” (identyfikator: WartoscNetto)
      • kolumna typu  Liczba stałoprzecinkowa„Wartość Brutto” (identyfikator: WartoscBrutto)

 

Kontrolka „Elementy”, zakładka „Ogólne” – widok kolumn 1-3

 

Kontrolka „Elementy”, zakladka „Ogólne” – widok kolumn 4-8

    • w zakładce „Inicjowanie wartości” :
      • w ramach pola „Kontrolki powiązane” kliknąć przycisk „Dodaj” i wybrac kontrolkę „Elementy”
      • w ramach pola „Wzór na wartość” wybrać opcję „SQL OD”, kliknąć „Ustaw”, a następnie wprowadzić następujące zapytanie:
 if  @^InitSenderControlName@ = 'Elementy'
Begin
    
    declare @vat decimal(22,4) = 0.0
    declare @netto decimal (22,4) = 0.0
    declare @brutto decimal (22,4) = 0.0
    declare @ilosc decimal (22,4) = 0.0
    
    if  @Elementy_Column@ in (2,4,5)
    Begin
        select @netto = CenaNetto, @ilosc = Ilosc from  @Elementy@ 
where POS = @Elementy_Row@ 
        select @vat = case 
            when VAT = 1 then 23
            when VAT = 2 then 8
            when VAT = 3 then 0
            when VAT = 4 then 0
            when VAT = 5 then 0
            when VAT = 6 then 7
            when VAT = 7 then 5
            else 0 end
        from  @Elementy@ where POS = @Elementy_Row@ 
        set @brutto = ((@netto*@vat)/100)+@netto
        
        update @Elementy@ set CenaBrutto = @brutto, WartoscBrutto = @ilosc * @brutto, 
        WartoscNetto = @ilosc * @netto where POS = @Elementy_Row@  
        select * from  @Elementy@ 
    End

    if @Elementy_Column@  = -1
    Begin
        update @Elementy@ set Ilosc = 1, JM = 1, VAT = 1 
        where POS = @Elementy_Row@  
        select * from  @Elementy@ 
    End
End

 

Wprowadzone zapytanie należy zapisać, klikając w przycisk „Zapisz” w oknie „Wyrażenie kontrolki”

 

Kontrolka „Elementy”, zakładka „Inicjowanie wartości”

 

Okno „Wyrażenie kontrolki” z wprowadzonym zapytaniem

 

    • w zakładce „Ograniczenie Edycji” zaznaczyć checkboxy na obydwóch etapach dla kolumn: „Cena netto”, „Cena brutto”, „Wartość Netto”, „Wartość Brutto”

Kontrolka „Elementy”, zakladka „Ograniczenie Edycji”

 

C kontrolka typu Własna akcja„Generuj dokument” (identyfikator: GenerujDokument) – w ramach definicji kontrolki należy kliknąć w link „Ustaw” w polu „C# Script”, następnie w otwartym oknie „Skrypt C#” w polu „Miejsce wykonania skryptu” wybrać „Proces (exe)” i wprowadzić następujący kod:

using System.Threading;
using System.Runtime.InteropServices;
using cdn_api;


static ThreadLocal<bool> threadToClarionAttached = new ThreadLocal<bool>(() => false);

[DllImport("ClaRUN.dll")]
private static extern void AttachThreadToClarion(int flag);
public void AttachThreadToClarion()
{
    try
    {
        if (!threadToClarionAttached.Value)
        {
            AttachThreadToClarion(1); // C8
            threadToClarionAttached.Value = true;
        }
    }
    catch (DllNotFoundException ex)
    {
    // -----------------------------------------------------------------
    // Tu przekaż informacje o statusie działania skryptu
    // -----------------------------------------------------------------
    Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = ex.Message;
    }
}


AttachThreadToClarion();

int _lSesjaID = 0;
string blad = "";

try
{
    int documentId = 0;
    int wersjaApi = odpowiedniawersjaapi;
    
    var loginInfo = new XLLoginInfo_odpowiedniawersjaapi()
    {
        Wersja = odpowiedniawersjaapi,
        ProgramID = "Comarch DMS",
        Winieta = -1,
        TrybWsadowy = 1,
        Baza = "nazwafirmy",
        OpeIdent = "Login",
        OpeHaslo = "hasło",
        SerwerKlucza = @"serwerklucza"
    };
    
    var XLLoginResult = cdn_api.cdn_api.XLLogin(loginInfo, ref _lSesjaID);
    if (XLLoginResult != 0)
    {
        blad = "Funkcja XLLogin zwróciła bład nr: " + XLLoginResult;
        throw new Exception();
    }
    
    // -----------------------------------------------------------------
    // Tu dodaj kod obsługi API
    // -----------------------------------------------------------------
    
    var dokumentNagInfo = new XLDokumentNagInfo_odpowiedniawersjaapi
    {
        Wersja = odpowiedniawersjaapi,
        Typ = 1521,//FZ
        KntTyp = 32,
        KntNumer = Globals.MainFrame.Kontrahent.Id ?? 0, // Pobierz GidNumer kontrahenta
        RodzajZakupu = 1,
        //Avista = 1
    };

    var XLNowyDokumentResult = cdn_api.cdn_api.XLNowyDokument (_lSesjaID, ref documentId, dokumentNagInfo);
    if (XLNowyDokumentResult != 0)
    {
        blad = "Funkcja XLNowyDokument zwróciła bład nr: " + XLNowyDokumentResult;
        throw new Exception();
    }
    
    //var element;
    
    for (int i=0; i<Globals.MainFrame.Elementy.RowCount; i++)
    {

        var element = new XLDokumentElemInfo_odpowiedniawersjaapi();
        
        element.Wersja = odpowiedniawersjaapi;
        element.TwrTyp = 16;
        element.Ilosc = Globals.MainFrame.Elementy.Items[i].Ilosc.Value.ToString();
        element.TwrNumer = Globals.MainFrame.Elementy.Items[i].Towar.Id;
        element.JmZ = Globals.MainFrame.Elementy.Items[i].Jm.Text;
        element.Cena = Globals.MainFrame.Elementy.Items[i].CenaNetto.Value.ToString();
    
        
        var XLDodajPozycjeResult = cdn_api.cdn_api.XLDodajPozycje(documentId, element);
        if (XLDodajPozycjeResult != 0)
        {
            blad = "Funkcja XLDodajPozycje zwróciła bład nr: " + XLDodajPozycjeResult;
            throw new Exception();
        }        
    }
    
    var zamkniecieDokumentuInfo = new XLZamkniecieDokumentuInfo_odpowiedniawersjaapi
    {
        Wersja = odpowiedniawersjaapi,
        Tryb = 1
    };
    
    var XLZamknijDokumentResult = cdn_api.cdn_api.XLZamknijDokument(documentId, zamkniecieDokumentuInfo);
    if (XLZamknijDokumentResult != 0)
    {
        blad = "Funkcja XLZamknijDokument zwróciła bład nr: " + XLZamknijDokumentResult;
        throw new Exception();
    }    
    
}
catch (Exception ex)
{
    if (blad == "")
        blad = "Nieokreślony błąd: " + ex.Message;
}
finally
{
    var XLLogoutResult = cdn_api.cdn_api.XLLogout(_lSesjaID);
    if (XLLogoutResult != 0)
    {
        blad = "Funkcja XLLogout zwróciła bład nr: " + XLLogoutResult;
    }
    // -----------------------------------------------------------------
    // Tu przekaż informacje o statusie działania skryptu
    // -----------------------------------------------------------------
    if ( blad == "")
        Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = "Operacja zakończona sukcesem.";
    else
        Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = blad;
}

gdzie należy zmienić następujące wartości:

odpowiedniawersjaapiwersja API ERP XL zgodna z wersją pliku cdn_api[wersja].net.dll

nazwafirmynazwa Firmy Comarch ERP XL (nazwę firmy można sprawdzić w managerze baz Comarch ERP XL)

Login login operatora Comarch ERP XL

hasłohasło operatora Comarch ERP XL

serwerkluczaserwer klucza licencji

 

Po wprowadzeniu kodu należy nacisnąć przycisk [Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

 

Widok okna „Skrypt C#” po skompilowaniu skryptu

 

D Kontrolka typu Komunikat – należy w ramach pola:

    • „Nazwa (identyfikator)” wprowadzić nazwę „Msg1”
    • „Tytuł” wprowadzić tekst „Status wykonania API ERP XL”
    • „Kontrolki powiązane” kliknąć w link „Dodaj” i wybrać kontrolkę „Generuj dokument”
    • „Wzór na wartość” wybrać wartość „C# Script”, kliknąć „Ustaw”, a następnie wprowadzić następujący kod:
 Globals.MainFrame.Msg1.Message = Globals.MainFrame.GenerujDokument_CSSCRIPT.Text;

Po wprowadzeniu kodu należy nacisnąć przycisk [Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

 

Widok okna „Skrypt C#” po skompilowaniu skryptu

 

6. zapisać typ obiegu za pomocą przycisku zapisz32 [Zapisz]

 

Zapisywanie typu obiegu

 

Generowanie dokumentu FZ do Comarch ERP XL – jak działa

Po zdefiniowaniu typu obiegu operator przechodzi na zakładkę [Dokumenty], klika na typ obiegu „Generowanie faktury zakupu” i naciska przycisk [Dodaj]. Następnie kolejno:

1. zapisuje nowy dokument, naciskając zapisz32 [Zapisz]

2. wybiera kontrahenta w ramach kontrolki „Kontrahent”

3. w ramach kontrolki „Elementy” dodaje towar w kolumnie „Towar”, wybiera opcję w kolumnach „Jm.” i „VAT” oraz wpisuje wartość w kolumnie „Cena netto” (jeśli poprawnie skonfigurowano obieg, wówczas kolumny „Cena brutto”, „Wartość Netto” i „Wartość Brutto” powinny zostać uzupełnione automatycznie)

 

Uwaga
Należy zwrócić uwagę, aby wartość  wybrana w kolumnie „VAT” dla danego towaru była zgodna ze stawką przypisaną do tego towaru w Comarch ERP XL.

 

4. naciska przycisk „Generuj dokument” – wówczas następuje generowanie dokumentu – poniżej przycisku widoczne są poruszające się punkty

5. Jeśli generowanie dokumentu zakończyło się powodzeniem, wówczas na środku ekranu wyświetlany jest następujący komunikat:

 

Komunikat wyświetlany, jeśli generowanie dokumentu zakończyło się powodzeniem

 

Film

Aby zobaczyć przebieg generowania dokumentu do Comarch ERP XL, kliknij w poniższy film:

 

 

Wygenerowany dokument jest już widoczny w Comarch ERP XL:

 

Dokument wygenerowany z Comarch DMS do Comarch ERP XL

Rozpoczynasz pracę z Comarch DMS i chcesz dowiedzieć się, jak korzystać z programu? A może masz już podstawową wiedzę o Comarch DMS i chcesz dowiedzieć się więcej?

Sprawdź Szkolenia Comarch DMS!

 




Zatwierdzanie faktury zakupu w Comarch ERP XL z wykorzystaniem skryptów C#

 

Informacje podstawowe

Uwaga
Aby przyklad działał poprawnie, konieczne jest spełnienie następujących warunków:

1. Instalacja systemu Comarch ERP XL na serwerze IIS

2. Poprawna konfiguracja współpracy pomiędzy systemami Comarch ERP XL oraz Comarch DMS

3. Nadanie użytkownikowi IISUSER uprawnień do zapisu w katalogu bin\Scriptcs_bin oraz katalogu bin\.scriptcs_cache, które znajdują się w plikach aplikacji serwerowej Comarch DMS

4. Skopiowanie biblioteki cdn_api[wersja].net.dll do katalogu bin\Scriptcs_bin, biblioteka znajduje się w katalogu, w którym zainstalowano Comarch ERP XL, w przykładach wykorzystano cdn_api20232.net.dll

5. Należy sprawdzić, czy w katalogu bin aplikacji web Comarch DMS znajduje się plik cdn_sys.dll, jeżeli jest należy usunąć go z tej lokalizacji.

Skrypty C# zostały wykorzystane w kontrolkach typu Własna akcja i Komunikat. Skrypt dla kontrolki typu własna akcja utworzono na podstawie wzorca API XL

 

Wskazówka
Rekomendujemy wykorzystanie wzorca API XL jako elementu bazowego na potrzeby własnych rozwiązań.

Wzorzec API XL dostępny jest na indywidualnych stronach dla Partnerów w obszarze Comarch DMS\Przykłady\ERP XL: Wzorzec API XL

 

 

Konfiguracja typu obiegu

Przykład pokazuje, w jaki sposób administrator Comarch DMS może skonfigurować definicję obiegu, aby zatwierdzić dokument „Faktura zakupu” w systemie Comarch RP XL z poziomu Comarch DMS. W tym celu należy:

1. dodać nowy typ obiegu w ramach zakladki  [Definicje obiegów dokumentów] 

2. nadać nazwę typowi obiegu – np. Zatwierdzanie faktury zakupu i prefix – np. ZAT

3. nadać danemu administratorowi uprawnienie do inicjowania dokumentu na zakładce „Ustawienia obiegu” w sekcji „Uprawnienia do inicjowania dokumentu”.

 

Nadawanie uprawniń do inicjowania dokumentu dla administratora – przykład

 

4. W ramach zakładki „Schemat obiegu” utworzyć etap początkowy „Zatwierdzanie dokumentu” i etap końcowy „Koniec” oraz dodać uprawnienie dla danego administratora do etapów.

 

Dodawanie etapów i uprawnień

5. W ramach zakładki „Karta obiegu” dodać następujące kontrolki:

 A Kontrolka typu Dokument elektroniczny„Faktura zakupu” (identyfikator: FakturaZakupu) – w polu „Typ” należy wybrać „Faktura zakupu”

 

Kontrolka „Faktura zakupu”

B kontrolka typu Własna akcja„Zatwierdź dokument” (identyfikator: ZatwierdzDokument) – w ramach definicji kontrolki należy kliknąć w link „Ustaw” w polu „C# Script”, następnie w otwartym oknie „Skrypt C#” w polu „Miejsce wykonania skryptu” wybrać „Proces (exe)” i wprowadzić następujący kod:

using System.Threading;
using System.Runtime.InteropServices;
using cdn_api;


static ThreadLocal<bool> threadToClarionAttached = new ThreadLocal<bool>(() => false);

[DllImport("ClaRUN.dll")]
private static extern void AttachThreadToClarion(int flag);
public void AttachThreadToClarion()
{
    try
    {
        if (!threadToClarionAttached.Value)
        {
            AttachThreadToClarion(1); // C8
            threadToClarionAttached.Value = true;
        }
    }
    catch (DllNotFoundException ex)
    {
    // -----------------------------------------------------------------
    // Tu przekaż informacje o statusie działania skryptu
    // -----------------------------------------------------------------
    //Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text = ex.Message;
    Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text=ex.Message;
    }
}


AttachThreadToClarion();

int _lSesjaID = 0;
string blad = "";

try
{
    int documentId = 0;
    int wersjaApi = odpowiedniawersjaapi;
    
    var loginInfo = new XLLoginInfo_odpowiedniawersjaapi()
    {
        Wersja = odpowiedniawersjaapi,
        ProgramID = "Comarch DMS",
        Winieta = -1,
        TrybWsadowy = 1,
        Baza = "nazwafirmy",
        OpeIdent = "Login",
        OpeHaslo = "hasło",
        SerwerKlucza = @"serwerklucza"
    };
    
    var XLLoginResult = cdn_api.cdn_api.XLLogin(loginInfo, ref _lSesjaID);
    if (XLLoginResult != 0)
    {
        blad = "Funkcja XLLogin zwróciła bład nr: " + XLLoginResult;
        throw new Exception();
    }
    
    // -----------------------------------------------------------------
    // Tu dodaj kod obsługi API
    
                var otworzDocumentInfo = new XLOtwarcieNagInfo_odpowiedniawersjaapi
                {
                    Wersja = odpowiedniawersjaapi,
                    GIDTyp = 1521,
                    GIDNumer = Globals.MainFrame.FakturaZakupu.Id ?? 0,
                    Tryb = 2

                };

                var XLOtwarcieInfoResult = cdn_api.cdn_api.XLOtworzDokument(_lSesjaID, ref documentId, otworzDocumentInfo);
                if (XLOtwarcieInfoResult != 0)
                {
                    blad = "Funkcja XLOtworzDokument zwróciła bład nr: " + XLOtwarcieInfoResult;
                    throw new Exception();
                }


                var zamkniecieDokumentuInfo = new XLZamkniecieDokumentuInfo_odpowiedniawersjaapi
                {
                    Wersja = odpowiedniawersjaapi,
                    Tryb = 0
                };

                               
                var XLZamknijDokumentResult = cdn_api.cdn_api.XLZamknijDokument(documentId, zamkniecieDokumentuInfo);
                if (XLZamknijDokumentResult != 0)
                {
                    blad = "Funkcja XLZamknijDokument zwróciła bład nr: " + XLZamknijDokumentResult;
                    throw new Exception();
                }
    // -----------------------------------------------------------------
}
catch (Exception ex)
{
    if (blad == "")
        blad = "Nieokreślony błąd: " + ex.Message;
}
finally
{
    var XLLogoutResult = cdn_api.cdn_api.XLLogout(_lSesjaID);
    if (XLLogoutResult != 0)
    {
        blad = "Funkcja XLLogout zwróciła bład nr: " + XLLogoutResult;
    }
    // -----------------------------------------------------------------
    // Tu przekaż informacje o statusie działania skryptu
    // -----------------------------------------------------------------
    
    //Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text = blad; 
    if (blad == "")
        Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text = "Operacja zakończona sukcesem";
    else 
        Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text = blad;
    
}

gdzie należy zmienić następujące wartości:

odpowiedniawersjaapiwersja API ERP XL zgodna z wersją pliku cdn_api[wersja].net.dll

nazwafirmynazwa Firmy Comarch ERP XL (nazwę firmy można sprawdzić w managerze baz Comarch ERP XL)

Login login operatora Comarch ERP XL

hasłohasło operatora Comarch ERP XL

serwerkluczaserwer klucza licencji

 

Następnie należy kliknąć w przycisk [Referencje], znajdujący się w prawym górnym rogu okna „Skrypt C#”, w wpisać tam nazwę odpowiedniego pliku dll:

 cdn_api[odpowiedni numer wersji].net.dll

Następnie należy nacisnąć przycisk  [Zapisz].

 

Fragment okna „Skrypt C#” z otwartym oknem „Referencje”

Po wprowadzeniu kodu do edytora i nazwy dll w oknie „Referencje”  należy nacisnąć przycisk [Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

Uwaga
Jeśli w ramach okna „Referencje” po kliknięciu przycisku [Referencje] wprowadzono niewłaściwą nazwę pliku dll, wówczas po naciśnięciu przycisku [Kompiluj i zapisz] w dolnej części okna wyświetlana jest informacja „Assembly not found”.

 

Widok okna „Skrypt C#” po skompilowaniu skryptu

 

C Kontrolka typu Komunikat – należy w ramach pola:

    • „Nazwa (identyfikator)” wprowadzić nazwę „Message1”
    • „Tytuł” wprowadzić tekst „Status działania API ERP XL”
    • „Kontrolki powiązane” kliknąć w link „Dodaj” i wybrać kontrolkę „Zatwierdź dokument”
    • „Wzór na wartość” wybrać wartość „C# Script”, kliknąć „Ustaw”, a następnie wprowadzić następujący kod:

 

 Globals.MainFrame.Message1.Message = Globals.MainFrame.ZatwierdzDokument_CSSCRIPT.Text

 

Po wprowadzeniu kodu należy nacisnąć przycisk [Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

 

Kontrolka „Message1”

 

Widok okna „Skrypt C#” po skompilowaniu skryptu

 

6. zapisać typ obiegu za pomocą przycisku zapisz32 [Zapisz].

 

Zapisywanie typu obiegu

 

Zatwierdzanie dokumentu FZ w Comarch ERP XL – jak działa

Po zdefiniowaniu typu obiegu operator przechodzi na zakładkę [Dokumenty], klika na typ obiegu „Zatwierdzanie faktury zakupu” i naciska przycisk [Dodaj]. Następnie kolejno:

1. zapisuje nowy dokument, naciskając zapisz32 [Zapisz]

2. dodaje dokument z Comarch ERP XL w ramach kontrolki „Faktura zakupu”

3. naciska przycisk „Zatwierdź dokument” – wówczas następuje zatwierdzanie dokumentu – poniżej przycisku widoczne są poruszające się punkty

4. Jeśli zatwierdzanie dokumentu zakończyło się powodzeniem, wówczas na środku ekranu wyświetlany jest następujący komunikat:

Komunikat wyświetlany, jeśli zatwierdzanie dokumentu zakończyło się powodzeniem

 

Widok szczegółów dokumentu z komunikatem o udanym zatwierdzeniu dokumentu

 

Widok listy dokumentów w Comarch ERP XL z dokumentem FZ-2/24 zatwierdzonym z poziomu Comarch DMS

 

Uwaga

Jeśli operator w kontrolce „Faktura zakupu” wybierze dokument, który już został zatwierdzony w Comarch ERP XL, i kliknie przycisk „Zatwierdź dokument”, wówczas zostaje wyświetlony następujący komunikat:

 

Komunikat wyświetlany przy próbie zatwierdzenia zatwierdzonego dokumentu

 

Rozpoczynasz pracę z Comarch DMS i chcesz dowiedzieć się, jak korzystać z programu? A może masz już podstawową wiedzę o Comarch DMS i chcesz dowiedzieć się więcej?

Sprawdź Szkolenia Comarch DMS!

 




Wskazanie identyfikatora connection stringa za pomocą kodu C#

Od wersji 2024.0.2 możliwe jest wskazanie identyfikatora connection stringa za pomocą kodu C#, aby określić  connection string, na podstawie którego będzie następowało połączenie do bazy danych. Jeżeli:

  • <add key=”MultiCompany” value=”false” /> – wówczas connection stringi strConnectERPComp i strConnectERPConf1 są przechowywane w pliku Web.config
  • <add key=”MultiCompany” value=”true” /> – wówczas connection stringi są przechowywane  w pliku Web.config i w tabeli do.DF_ConfCMDictionary – w tym przypadku connection stringi do baz: konfiguracyjnej i firmowej są zapisywane pod jednym ID połączenia, zastosowano zatem nastepujące identyfikatory:
    • nazwa_spółki_Comp – pobiera connection string zapisany w kolumnie CMD_ConnectionStringERP / CMD_ConnectionStringERPEncrypted
    • nazwa_spółki_Conf – pobiera connection string zapisany w kolumnie CMD_ConnectionStringERPConf / CMD_ConnectionStringERPConfEncrypted

 

gdzie nazwa_spółki – wartość wprowadzona w polu „Nazwa spólki” / „Nazwa spółki (baza)” na zakładce  „Połączenia z ERP” na zakładce [Ustawienia]

 

Wartość wprowadzona w polu „Nazwa spółki (baza)”, która wchodzi w skład identyfikatorów connection stringów

 

Przykład wykorzystania identyfikatorów connection stringów dla bazy Comarch ERP Optima w ramach kontrolki typu Własna akcja

 

Identyfikatory connection stringów są wykorzystywane w kodzie C#:

    • dla MS SQL:
      • connection = new DmsSqlConnection(Globals.Common.ConnectionStrings.strConnectDMS)
      • DmsSqlCommand command = new DmsSqlCommand(connection, sqlQuery)
    • dla PostgreSQL:
      • connection = new DmsNpgsqlConnection(„pgStrConnectDMS”)
      • DmsNpgsqlCommand command = new DmsNpgsqlCommand(connection, sqlQuery)