Wprowadzenie weryfikacji istnienia dokumentu KSeF w Comarch ERP XL w kontrolce typu Dokument ERP XL

Zmiany funkcjonalne w wersji 2026.0.0

W wersji 2026.0.0 wprowadzono weryfikację istnienia dokumentu KSeF w Comarch ERP XL w przypadku, kiedy na zakładce „Dokument” znajdującej się na formatce „Dokument ERP XL” w kontrolce typu Dokument ERP XL w ramach kontrolki „Numer KSeF” wprowadzono numer faktury KSeF, a następnie operator kliknął w przycisk [Generuj dokument] (desktop)/ [Generuj dokument] (web)/ [Generuj dokument] (Android)/ [Generuj dokument] (iOS)

Jeśli dokument o podanym numerze KSeF istnieje w Comarch ERP XL, wówczas próba wygenerowania dokumentu zakończy się niepowodzeniem i zostanie wyświetlony komunikat: „Dokument o podanym numerze KSeF już istnieje w systemie ERP”.

 

Komunikat informujący o tym, że dokument o podanym numerze KSeF znajduje się już w Comarch ERP XL – aplikacja desktop

 

Komunikat informujący o tym, że dokument o podanym numerze KSeF znajduje się już w Comarch ERP XL – aplikacja na Android

 

Komunikat informujący o tym, że dokument o podanym numerze KSeF znajduje się już w Comarch ERP XL – aplikacja iOS




Pobieranie danych z KSeF do kontrolki tabelarycznej Elementy na Fakturze zakupu XL

Zastosowanie

Dzięki zastosowaniu tej zintegrowanej konfiguracji, proces obiegu faktur zakupu w Comarch BPM zyskuje pełną automatyzację i spójność danych. Dane są pobierane bezpośrednio z systemu KSeF (poprzez BPM), a kontrolka tabelaryczna jest automatycznie wypełniana.

Głównym celem jest:

  • Eliminacja ręcznego wprowadzania pozycji dokumentów: Dane z faktury KSeF (pobrane do tabeli do.KS_DocumentItems) są automatycznie mapowane i wypełniają kontrolkę tabelaryczną na karcie obiegu.
  • Automatyczne kalkulowanie wartości: Kontrolka tabelaryczna uzyskuje zdolność automatycznego przeliczania wartości przy zmianie ceny, ilości lub stawki VAT.
  • Minimalizacja błędów i skrócenie czasu obsługi faktury: Proces akceptacji bazuje na poprawnych i spójnych danych, które są weryfikowane przed zaksięgowaniem w systemie Comarch ERPXL.

 

Zawartość przykładu

  • Definicja Typu Obiegu (Workflow): Wzorcowa ścieżka obiegu dokumentu zakupu z krokami akceptacji, konfiguracją kontrolki Dane tabelaryczne i wygenerowaniem dokumentu do Comarch ERPXL
  • Punkt konfiguracyjny ACD: Wzorcowa konfiguracja, która jest odpowiedzialna za pobranie ID dokumentu KSeF, Załącznika oraz wszystkich kluczowych danych nagłówkowych (Numer dokumentu, Kontrahent, Data zakupu, Data wystawienia, Data wpływu Termin płatności, Forma płatności, Waluta, Wartość Netto, Wartość Brutto, Numer KSeF, Data przyjęcia z KSeF) oraz utworzenie dokumentu obiegowego. W przypadku kontrolki Kontrahent w zapytaniu przed nazwą tabeli CDN.KntKarty należy wskazać właściwą nazwę bazy Comarch ERXL.

 

Kliknij tutaj, aby pobrać przykład

 

Zasada działania

Mechanizm opiera się na dwóch trybach działania zintegrowanych w jednej kontrolce Dane Tabelaryczne (Elementy), wykorzystując dane z bazy Comarch BPM, które zostały zapisane po przetworzeniu faktury z KSeF w punkcie ACD.

  • Konfiguracja wykorzystuje ID dokumentu KSeF (zapisane w dedykowanej kontrolce typu Liczba całkowita o nazwie np. ID_KSeF) jako identyfikator do pobrania danych.
  • Kontrolka tabelaryczna obserwuje to pole (ID_KSeF), reagując na jego wypełnienie.
  • Kluczowym elementem jest zapytanie SQL umieszczone na zakładce Inicjowanie Wartości kontrolki tabelarycznej.
  • Zapytanie jest filtrowane za pomocą parametru @ID_KSeF@, dzięki czemu pobiera ono wiersze z właściwego dokumentu KSeF z tabeli do.KS_DocumentItems w bazie BPM.
  • W zapytaniu SQL zawarta jest niezbędna logika konwersji (CTE z ROW_NUMBER), która mapuje stawki VAT z KSeF na identyfikatory liczbowe (Naz_GIDLp) z tabeli CDN.Nazwy, których BPM wymaga do poprawnego wyświetlania danych w kolumnie typu Lista (Stawka VAT).
  • Dodatkowo, kontrolka Dane Tabelaryczne (Elementy) obserwuje sama siebie (@^SenderControlName@ = ’Elementy’), co aktywuje logikę automatycznego przeliczania wartości w trybie edycji:
  • Zapytanie monitoruje zmiany w kolumnach wejściowych, takich jak Cena lub Ilość (oraz Stawka VAT).
  • W przypadku edycji tych pól, skrypt automatycznie pobiera stawkę VAT, a następnie przelicza i aktualizuje wartości Netto (Ilość * Cena) oraz Brutto (Netto * (1 + VAT)) w bieżącym wierszu.

 

Konfiguracja przykładu

1. Utworzono kontrolkę ID_KSeF: Na karcie obiegu dodano kontrolkę typu Liczba całkowita o nazwie (identyfikatorze) ID_KSeF, do której będzie zapisywane ID dokumentu KSeF.

 

Kontrolka Liczba całkowita ID_KSeF

 

2. Utworzono kontrolkę Tabelaryczną: Dodano kontrolkę typu Dane tabelaryczne o nazwie (identyfikatorze) Elementy i skonfigurowano w niej następujące kolumny:

  • ”Towar” (identyfikator kolumny: Towar) – typ Towar
  • ”Nazwa” (identyfikator kolumny: Nazwa) – typ Tekst
  • ”Cena” (identyfikator kolumny: Cena) – typ Liczba stałoprzecinkowa
  • ”Ilość” (identyfikator kolumny: Ilosc) – typ Liczba stałoprzecinkowa
  • ”Netto” (identyfikator kolumny: Netto) – typ Liczba stałoprzecinkowa
  • ”Stawka VAT” (identyfikator kolumny: StawkaVAT) – typ Lista
  • ”Brutto” (identyfikator kolumny: Brutto) – typ Liczba stałoprzecinkowa

 

Kolumny w kontrolce Dane tabelaryczne

 

3. W kontrolce typu Dane tabelaryczne  na zakładce Listy zdefiniowano zapytanie pobierające:

 

  • Stawki VAT:
 select Naz_gidLp as Id,  
 CASE  
  WHEN Naz_Nazwa='A 23.00' THEN '23%' 
  WHEN Naz_Nazwa='B 8.00' THEN '8%' 
  WHEN Naz_Nazwa='C 0.00' THEN '0%' 
  WHEN Naz_Nazwa='D 0.00' THEN 'ZW' 
  WHEN Naz_Nazwa='E 0.00' THEN 'NP' 
  WHEN Naz_Nazwa='F 7.00' THEN '7%' 
  WHEN Naz_Nazwa='G 5.00' THEN '5%' 
 END  
 from CDN.Nazwy  
 where Naz_GIDTyp = 624  AND trim(substring(Naz_Nazwa,9,2))=''

 

Lista Stawka VAT w kontrolce Dane tabelaryczne

 

4. Dodano obserwację kontrolki: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości, dodano powiązanie do kontrolki ID_KSeF oraz do samej siebie.

 

Dane tabelaryczna, zakładka Inicjowanie wartości

 

5. Dodano zapytanie SQL: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości w sekcji Wzór na wartość SQL ERP dodano zapytanie, które pobiera dane z tabeli do.KS_DocumentItems na podstawie przekazanego parametru @ID_KSeF@ (ID dokumentu KSeF). Zapytanie inicjuje kolumnę Towar jako wartość NULL, którą użytkownik powinien uzupełnić ręcznie.

 

W zapytaniu przed nazwą tabeli do.KS_DocumentItems należy wskazać właściwą nazwę bazy Comarch BPM.

 

Ta sekcja jest wywoływana tylko raz, podczas inicjowania obiegu:

 

IF @^SenderControlName@ = 'ID_KSeF' /*Identyfikator kontrolki do której pobierane jest ID dokumentu KSeF */ 
BEGIN 
    /* Tryb 1: Inicjowanie wierszy z dokumentu KSeF */ 
     
    WITH ProcessedDocumentItems AS ( 
        /* CTE 1: Ujednolicenie stawek VAT, tabela KSI_ElementStawkaVAT */ 
        SELECT 
              
            KSI_ElementNazwa, 
            KSI_ElementCenaNetto,     
            KSI_ElementIlosc,        
            KSI_ElementWartoscNetto, 
            KSI_ElementStawkaVAT,   
            CASE 
                WHEN di.KSI_ElementStawkaVAT LIKE 'Stawka%' THEN LTRIM(RTRIM(SUBSTRING(di.KSI_ElementStawkaVAT, 7, LEN(di.KSI_ElementStawkaVAT) - 6))) 
                WHEN di.KSI_ElementStawkaVAT = 'zw' THEN 'ZW' 
                WHEN di.KSI_ElementStawkaVAT = 'np' THEN 'NP' 
                ELSE di.KSI_ElementStawkaVAT 
            END AS StandardizedStawkaVAT 
        FROM 
            [BPM_Przyklady].do.KS_DocumentItems AS di  /*Należy wskazać nazwę bazy BPM*/ 
        WHERE KSI_DocumentId = @ID_KSeF@  /*Identyfikator kontrolki liczba całkowita, do której pobierane jest ID dokumentu KSeF*/ 
    ), 
    ProcessedNazwyRanked AS ( 
        /* CTE 2: Porządkowanie stawek VAT z tabeli słownikowej (CDN.Nazwy), w celu zapewnienia unikalności */ 
        SELECT 
            Naz_GIDLp, 
            Naz_Nazwa1, 
            CASE 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' THEN 'ZW' 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 'NP' 
                WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
            END AS StandardizedNazwa1_ForJoin, 
            CASE 
                WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' OR LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 0.00 
                WHEN ISNUMERIC( 
                    CASE 
                        WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                        ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                    END 
                ) = 1 THEN CAST( 
                    CASE 
                        WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                        ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                    END 
                AS DECIMAL(5, 2)) / 100.0 
                ELSE 0.00 
            END AS CalculatedVATRate, 
            /* Numerujemy rekordy dla tego samego klucza łączenia. */ 
            ROW_NUMBER() OVER (PARTITION BY 
                CASE 
                    WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%ZW%' THEN 'ZW' 
                    WHEN LTRIM(RTRIM(n.Naz_Nazwa1)) LIKE '%NP%' THEN 'NP' 
                    WHEN CHARINDEX(' ', LTRIM(RTRIM(n.Naz_Nazwa1))) > 0 THEN LTRIM(RTRIM(SUBSTRING(n.Naz_Nazwa1, 1, CHARINDEX(' ', n.Naz_Nazwa1) - 1))) 
                    ELSE LTRIM(RTRIM(n.Naz_Nazwa1)) 
                END 
            ORDER BY n.Naz_GIDLp ASC) as RN 
        FROM 
            CDN.Nazwy AS n 
        WHERE Naz_GIDTyp = 624  
    ), 
    ProcessedNazwy AS ( 
        /* CTE 3: Finalne, unikalne stawki */ 
        SELECT 
            Naz_GIDLp, 
            StandardizedNazwa1_ForJoin, 
            CalculatedVATRate 
        FROM 
            ProcessedNazwyRanked 
        WHERE RN = 1 /* Wybieramy tylko jeden (pierwszy) rekord dla każdej unikalnej stawki */ 
    ) 
    /* Końcowy SELECT: Zwraca żądany zestaw kolumn */ 
    SELECT 
         NULL AS 'Towar', 
        pi.KSI_ElementNazwa, 
        pi.KSI_ElementCenaNetto, 
        pi.KSI_ElementIlosc, 
        pi.KSI_ElementWartoscNetto, 
        pn.Naz_GIDLp AS 'stawka VAT', /* ID stawki z drugiej tabeli */ 
        pi.KSI_ElementWartoscNetto * (1 + pn.CalculatedVATRate) AS 'Wartość brutto' 
      
    FROM 
        ProcessedDocumentItems AS pi 
    JOIN 
        ProcessedNazwy AS pn 
    ON 
        pi.StandardizedStawkaVAT = pn.StandardizedNazwa1_ForJoin; 

END 

 

Ta sekcja jest wywoływana przy każdej modyfikacji danych w kontrolce „Elementy” i wymaga użycia ELSE po sekcji KSeF:

ELSE 
IF @^SenderControlName@ = 'Elementy'  /*Identyfikator kontrolki Dane tabelaryczne*/ 
BEGIN 
    /* Tryb 2: Automatyczne przeliczanie wartości w trybie edycji */ 
     
    /* Kolumny 3-Cena, 4-Ilość, 6-Stawka VAT */ 
    IF @Elementy_Column@=3 OR @Elementy_Column@=4 OR @Elementy_Column@=6 
    BEGIN 
         
        DECLARE @VAT as decimal (4,2) 
           
         
        /* Pobranie stawki VAT  */ 
        SELECT @VAT=CAST(SUBSTRING (Naz_Nazwa1, 0, CHARINDEX (' ', Naz_Nazwa1)) as decimal (4,2))/100  
        FROM CDN.Nazwy  
        WHERE Naz_GIDTyp=624 AND Naz_GIDLp= 
            (SELECT [Stawka VAT]  
            FROM @Elementy@  
            WHERE POS=@Elementy_Row@) 

             
        UPDATE @Elementy@  
        /* Aktualizacja wartości Netto */ 
        SET [Netto] = (Ilosc * Cena), 
         
        /* Aktualizacja wartości Brutto */ 
        [Brutto] = (Ilosc * Cena) * (@VAT + 1)  
        WHERE POS=@Elementy_Row@ 

        /* Zwrócenie zaktualizowanej tabeli - Obowiązkowy select */ 
        SELECT * FROM @Elementy@  

    END 
     
END

 

Zapytanie SQL w kontrolce Dane tabelaryczne na zakładce Inicjowanie wartości

 

Kolumna Netto i Brutto w trybie „Do odczytu”

 

6. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscNetto, w której dodano powiązanie do kontrolki Elementy i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Netto z kontrolki tabelarycznej:

 

select sum (Netto) from  @Elementy@

 

Kontrolka Liczbowa Wartość Netto

 

7. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscBrutto, w której dodano powiązanie do kontrolki Elementy i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Brutto z kontrolki tabelarycznej:

 

select sum (Brutto) from  @Elementy@

 

Kontrolka Liczbowa Wartość Brutto

 

8. Punkt ACD: W punkcie konfiguracyjnym ACD (Współpraca z KSeF), na zakładce Kontrolki, dodano kontrolkę ID_KSeF i przypisano jej zapytanie, które pobiera ID dokumentu KSeF: select @Id1@

Zdefiniowano również odpowiednie zapytania SQL do poszczególnych kontrolek, do których będą pobierane dane z KSeF.

 

Kontrolka ID_KSeF w punkcie ACD

 

Uzupełnione dane w punkcie ACD

Po pomyślnym pobraniu dokumentu z KSeF w punkcie ACD (Import dokumentów zakupu z KSeF), dane nagłówkowe oraz identyfikator dokumentu uzupełniły się automatycznie w kontrolkach na podstawie danych odczytanych z pliku XML.

 

Dane pobrane z KSeF w punkcie ACD

 

Uzupełniona Kontrolka Dane Tabelaryczne

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, kontrolka Dane Tabelaryczne została automatycznie wypełniona pozycjami odczytanymi z KSeF. Dla każdej pozycji, system automatycznie przeliczył i uzupełnił wartości w kolumnach Netto i Brutto w tym samym wierszu. W przypadku nieprawidłowości w kwotach możliwe jest przeliczanie wartości Netto/Brutto poprzez zmianę Ceny/Ilości lub Stawki VAT. Kolumna Netto oraz Brutto jest zablokowana do ręcznej edycji (tryb „Do odczytu”), co gwarantuje poprawność danych. Kontrolka Wartość Netto wyświetla poprawną sumę końcową z kolumny Netto kontrolki Dane tabelaryczne. Kontrolka Wartość Brutto wyświetla poprawną sumę końcową z kolumny Brutto kontrolki Dane tabelaryczne.

 

Uwaga
Kolumna „Towar” w kontrolce dane tabelaryczne jest inicjowana wartością null , ponieważ nazewnictwo na fakturach dostawców w KSeF często odbiega od kartotek w systemie ERP, co wymaga od użytkownika świadomego, ręcznego dopasowania pozycji do odpowiedniego indeksu towarowego przed zaksięgowaniem.

 

Kontrolka Dane tabelaryczne uzupełniona pozycjami odczytanymi z KSeF oraz podsumowanie kwot

 

Pozostałe dane uzupełnione na karcie obiegu

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, pozostałe dane na karcie obiegu zostały prawidłowo uzupełnione.

 

Uzupełnione dane na karcie obiegu pobrane z KSeF

 

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

Sprawdź Szkolenia Comarch BPM!

 




Pobieranie danych z KSeF – Tabela VAT przy współpracy z Comarch ERP XL

Zastosowanie

Dzięki zastosowaniu tej zintegrowanej konfiguracji, proces obiegu faktur kosztowych w Comarch BPM zyskuje pełną automatyzację i spójność danych.

Głównym celem jest:

  • Pobranie i wyświetlenie podsumowania VAT: Dane są pobierane bezpośrednio z systemu KSeF (poprzez BPM), a kontrolka tabelaryczna Tabela VAT jest automatycznie wypełniana, prezentując zagregowane wartości dla każdej stawki.
  • Eliminacja Ręcznego Wprowadzania Danych: Dane z faktury KSeF (pobrane do tabeli do.KS_DocumentItems) są automatycznie mapowane i wypełniają kontrolkę tabelaryczną, eliminując potrzebę przepisywania.
  • Ujednolicenie Stawki VAT: Zapewnienie, że stawki VAT z KSeF zostaną poprawnie zmapowane na identyfikatory liczbowe (Naz_GIDLp) używane w Comarch ERP XL, co jest kluczowe dla poprawnego księgowania.
  • Minimalizacja błędów i skrócenie czasu obsługi faktury: Proces akceptacji bazuje na poprawnych i spójnych danych, co skraca czas obsługi faktury.

 

Zawartość przykładu

  • Definicja Typu Obiegu (Workflow): Wzorcowa ścieżka obiegu dokumentu kosztowego z krokami akceptacji, konfiguracją kontrolki Dane tabelaryczne i wygenerowaniem dokumentu do Comarch ERPXL
  • Punkt konfiguracyjny ACD: Wzorcowa konfiguracja, która jest odpowiedzialna za pobranie ID dokumentu KSeF, Załącznika oraz wszystkich kluczowych danych nagłówkowych (Numer dokumentu, Kontrahent, Data zakupu, Data wystawienia, Data wpływu Termin płatności, Forma płatności, Waluta, Wartość Netto, Wartość Brutto, Numer KSeF, Data przyjęcia KSeF) oraz inicjację dokumentu obiegowego.

W przypadku kontrolki Kontrahent w zapytaniu przed nazwą tabeli CDN.KntKarty należy wskazać właściwą nazwę bazy Comarch ERXL.

 

Kliknij tutaj, aby pobrać przykład

 

Zasada działania

Mechanizm opiera się na inicjowaniu wartości w kontrolce Tabela VAT, która jest wypełniana danymi z bazy Comarch BPM, zapisanymi po przetworzeniu faktury z KSeF w punkcie ACD.

  • Konfiguracja wykorzystuje ID dokumentu KSeF (zapisane w dedykowanej kontrolce typu Liczba całkowita o nazwie np. ID_KSeF) jako identyfikator do pobrania danych.
  • Kontrolka tabelaryczna Tabela VAT obserwuje pole ID_KSeF, reagując na jego wypełnienie.
  • Kluczowym elementem jest zapytanie SQL umieszczone na zakładce Inicjowanie Wartości kontrolki tabelarycznej.
  • Zapytanie jest filtrowane za pomocą parametru @ID_KSeF@, dzięki czemu pobiera ono wiersze z właściwego dokumentu KSeF z tabeli do.KS_DocumentItems w bazie BPM.
  • Zapytanie zawiera logikę CASE, która rozpoznaje specyficzne oznaczenia stawek z KSeF (np. Stawka0KR, StawkanpI, zw) i mapuje je na standardowe klucze (np. 0%, NP, ZW).
  • Dane z tabeli do.KS_DocumentItems są natychmiast grupowane i sumowane według ujednoliconego klucza VAT. Dzięki temu, nawet przy wielu pozycjach na fakturze, Tabela VAT wyświetla tylko jeden zbiorczy wiersz dla każdej stawki.
  • Następuje mapowanie kluczy na identyfikatory liczbowe (Naz_GIDLp) z tabeli CDN.Nazwy (dla Naz_GIDTyp = 624). W konfiguracji wykorzystano kolumnę Naz_Nazwa, co zapewnia precyzyjne dopasowanie do stawek systemowych (np. 'A 23.00′).
  • Końcowy SELECT zwraca już zagregowane kwoty Netto, oblicza Wartość VAT oraz Wartość Brutto, używając mapowanego ID stawki (Naz_GIDLp)
  • Kontrolki podsumowujące (WartoscNetto i WartoscBrutto) obserwują kontrolkę Tabela VAT
  • i automatycznie zliczają całkowitą sumę z kolumn Wartość Netto i Wartość Brutto w całej tabeli, wyświetlając poprawne podsumowanie kwot.
  • Na podstawie zagregowanej sumy Netto i zmapowanej stawki procentowej, zapytanie automatycznie oblicza i zwraca Wartość VAT oraz Wartość Brutto

 

Konfiguracja przykładu

1. Utworzono kontrolkę ID_KSeF: Na karcie obiegu dodano kontrolkę typu Liczba całkowita o nazwie (identyfikatorze) ID_KSeF, do której będzie zapisywane ID dokumentu KSeF.

 

Kontrolka Liczba całkowita ID_KSeF

 

2. Utworzono kontrolkę Tabelaryczną: Dodano kontrolkę typu Dane tabelaryczne o nazwie (identyfikatorze) Tabela VAT i skonfigurowano w niej następujące kolumny:

  • ”Wartość Netto” (identyfikator kolumny: WartoscNetto) – typ Liczba stałoprzecinkowa
  • ”Stawka VAT” (identyfikator kolumny: StawkaVAT) – typ Lista
  • ”Wartość VAT” (identyfikator kolumny: WartoscVAT) – typ Liczba stałoprzecinkowa
  • ”Wartość Brutto” (identyfikator kolumny: WartoscBrutto)– typ Liczba stałoprzecinkowa

 

Kolumny w kontrolce Dane tabelaryczne

 

3. W kontrolce typu Dane tabelaryczne  na zakładce Listy zdefiniowano zapytanie pobierające:

 

  • Stawki VAT:
 select Naz_gidLp as Id,  
 CASE  
  WHEN Naz_Nazwa='A 23.00' THEN '23%' 
  WHEN Naz_Nazwa='B 8.00' THEN '8%' 
  WHEN Naz_Nazwa='C 0.00' THEN '0%' 
  WHEN Naz_Nazwa='D 0.00' THEN 'ZW' 
  WHEN Naz_Nazwa='E 0.00' THEN 'NP' 
  WHEN Naz_Nazwa='F 7.00' THEN '7%' 
  WHEN Naz_Nazwa='G 5.00' THEN '5%' 
 END  
 from CDN.Nazwy  
 where Naz_GIDTyp = 624  AND trim(substring(Naz_Nazwa,9,2))=''

 

Lista Stawka VAT w kontrolce Dane tabelaryczne

 

4. Dodano obserwację kontrolki: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości, dodano powiązanie do kontrolki ID_KSeF.

 

Dane tabelaryczna, zakładka Inicjowanie wartości

 

5. Dodano zapytanie SQL: W kontrolce Dane tabelaryczne, na zakładce Inicjowanie wartości w sekcji Wzór na wartość SQL ERP dodano zapytanie, które pobiera dane z tabel do.KS_DocumentItems na podstawie przekazanego parametru @ID_KSeF@ (ID dokumentu KSeF). Zapytanie od razu grupuje i sumuje wartości Netto dla wszystkich pozycji, które mają tę samą stawkę VAT, co pozwala na wygenerowanie zbiorczego podsumowania zamiast listy pojedynczych towarów.

 

Uwaga
W zapytaniu przed nazwą tabeli do.KS_DocumentItems należy wskazać właściwą nazwę bazy Comarch BPM.

 

Ta sekcja jest wywoływana tylko raz, podczas inicjowania obiegu:

 

IF @^SenderControlName@ = 'ID_KSeF' /* Identyfikator kontrolki do której pobierane jest ID dokumentu KSeF */ 
BEGIN 
   /* Tryb 1: Inicjowanie wierszy z dokumentu KSeF */ 


WITH KSeF_Parsed AS ( 
   
    SELECT 
        CASE 
            WHEN di.KSI_ElementStawkaVAT = 'Stawka23' THEN '23%' 
            WHEN di.KSI_ElementStawkaVAT = 'Stawka8'  THEN '8%' 
            WHEN di.KSI_ElementStawkaVAT = 'Stawka0KR' THEN '0%' 
            WHEN di.KSI_ElementStawkaVAT = 'zw'        THEN 'ZW' 
            WHEN di.KSI_ElementStawkaVAT = 'StawkanpI' THEN 'NP' 
            ELSE di.KSI_ElementStawkaVAT  
        END AS KluczMapowania, 
        di.KSI_ElementWartoscNetto 
    FROM 
       [Nazwa_Bazy_ComarchBPM].do.KS_DocumentItems AS di /*Uzupełnić nazwę bazy Comarch BPM */ 

    WHERE  
        di.KSI_DocumentId =  @ID_KSeF@  
), 
KSeF_Aggregated AS ( 
    /* Sumujemy netto dla każdej rozpoznanej grupy stawek */ 
    SELECT  
        KluczMapowania, 
        SUM(KSI_ElementWartoscNetto) AS SumaNetto 
    FROM KSeF_Parsed 
    GROUP BY KluczMapowania 
), 
XL_Stawki AS ( 
    /* Pobieramy ID stawek  */ 
    SELECT  
        Naz_gidLp AS Id,  
        CASE  
            WHEN Naz_Nazwa = 'A 23.00' THEN '23%' 
            WHEN Naz_Nazwa = 'B 8.00' THEN '8%' 
            WHEN Naz_Nazwa = 'C 0.00' THEN '0%' 
            WHEN Naz_Nazwa = 'D 0.00' THEN 'ZW' 
            WHEN Naz_Nazwa = 'E 0.00' THEN 'NP' 
        END AS NazwaMapowana, 
        CASE  
            WHEN Naz_Nazwa = 'A 23.00' THEN 0.23 
            WHEN Naz_Nazwa = 'B 8.00' THEN 0.08 
            ELSE 0.00 
        END AS Procent 
    FROM CDN.Nazwy  
    WHERE Naz_GIDTyp = 624  
) 

/* Finalne połączenie danych */ 
SELECT 
    ka.SumaNetto AS 'Wartość netto', 
    xl.Id AS 'Stawka VAT ID', 
    CAST(ka.SumaNetto * xl.Procent AS DECIMAL(18, 2)) AS 'Wartość VAT', 
    CAST(ka.SumaNetto * (1 + xl.Procent) AS DECIMAL(18, 2)) AS 'Wartość brutto' 
FROM 
    KSeF_Aggregated ka 
INNER JOIN 
    XL_Stawki xl ON ka.KluczMapowania = xl.NazwaMapowana 
ORDER BY  
    xl.Id ASC; 

END

 

Zapytanie SQL w kontrolce Dane tabelaryczne na zakładce Inicjowanie wartości

 

6. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscNetto, w której dodano powiązanie do kontrolki Tabela VAT i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Netto z kontrolki tabelarycznej:

 

select sum (WartoscNetto) from  @Tabela_VAT@

 

Kontrolka Liczbowa WartoscNetto

 

7. Utworzono kontrolkę liczbową: Dodano kontrolkę typu Liczba stałoprzecinkowa o identyfikatorze WartoscBrutto, w której dodano powiązanie do kontrolki Tabela VAT i skonfigurowano w niej zapytanie, które zlicza wartość z kolumny Brutto z kontrolki tabelarycznej:

 

SELECT SUM (WartoscBrutto) FROM  @Tabela_VAT@

 

Kontrolka Liczbowa WartoscBrutto

8. Punkt ACD: W punkcie konfiguracyjnym ACD (Import dokumentów zakupu z KSeF), na zakładce Kontrolki, dodano kontrolkę ID_KSeF i przypisano jej zapytanie, które pobiera ID dokumentu KSeF:

 

select @Id1@

 

9. Zdefiniowano również odpowiednie zapytania SQL do poszczególnych kontrolek, do których będą pobierane dane z KSeF.

 

Kontrolka ID_KSeF w punkcie ACD

 

Uzupełnione dane w punkcie ACD

Po pomyślnym pobraniu dokumentu z KSeF w punkcie ACD (Import dokumentów zakupu z KSeF), dane nagłówkowe oraz identyfikator dokumentu uzupełniły się automatycznie w kontrolkach na podstawie danych odczytanych z pliku XML.

 

Dane pobrane z KSeF w punkcie ACD

 

Uzupełniona Kontrolka Dane Tabelaryczne

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, kontrolka Dane Tabelaryczne (Tabela VAT) została automatycznie wypełniona zagregowanymi wierszami VAT odczytanymi z KSeF.

Dla każdej stawki VAT, system automatycznie obliczył i uzupełnił wartości w kolumnach Wartość Netto, Wartość VAT i Wartość Brutto na podstawie sumy netto dla danej stawki, pobranej z KSeF i zmapowanej stawki procentowej XL.

Kontrolka Wartość Netto wyświetla poprawną sumę końcową z kolumny Netto kontrolki Dane tabelaryczne. Kontrolka Wartość Brutto wyświetla poprawną sumę końcową z kolumny Brutto kontrolki Dane tabelaryczne.

 

Kontrolka Dane tabelaryczne prezentująca zagregowane kwoty VAT dla poszczególnych stawek oraz podsumowanie kwot

 

Pozostałe dane uzupełnione na karcie obiegu

Po pomyślnym zainicjowaniu dokumentu z punktu ACD, pozostałe dane na karcie obiegu zostały prawidłowo uzupełnione.

 

Uzupełnione dane na dokumencie pobranym z KSeF

 

 

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

Sprawdź Szkolenia Comarch BPM!

 




Udostępnienie mechanizmu do pobierania listy pracowników, działów i struktury organizacyjnej dla spółek połączonych z bazami Comarch BPM Standalone

W wersji 2025.2.0 umożliwiono pobieranie listy pracowników, działów i struktury organizacyjnej dla spółek połączonych z bazami Comarch ERP Optima oraz Comarch BPM Standalone. W tym celu na zakładce [Struktura organizacyjna] w górnej części okna została dodana ikona [Importuj], analogiczna do ikony dotychczas dostępnej tylko dla współpracy z Comarch ERP XL.

 

Widok zakładki „Struktura organizacyjna” dla spółki Comarch BPM Standalone przed importem danych – widoczny jest przycisk „Importuj”

Po kliknięciu w przycisk [Importuj] zostaje otwarte okno importu danych.

W ramach okna importu danych w zakładkach: „Pracownicy”, „Działy” i „Struktura organizacyjna” można za pomocą zapytania SQL pobrać odpowiednio: listę pracowników, listę działów oraz strukturę organizacyjną. Zapytanie SQL należy wprowadzić w oknie „Procedura SQL”, otwartym po kliknięciu w przycisk [SQL] w ramach danej zakładki.

Dla Comarch BPM Standalone okno „Procedura SQL” jest puste – operator może w nim wprowadzić ręcznie zapytanie SQL potrzebne do pobrania z bazy danych pracowników, działów lub struktury organizacyjnej, w zależności od wybranej zakładki.

 

Okno importu danych z bazy Comarch BPM Standalone, zakładka „Pracownicy” – widok po kliknięciu w przycisk „Importuj”

 

Po zapisaniu zmian w oknie „Procedura SQL” na zakładce „Pracownicy” należy zaznaczyć checkboxy obok tych pracowników, którzy mają zostać zaimportowani do Comarch BPM, a następnie nacisnąć przycisk [Zapisz]. Wówczas wybrani pracownicy pojawią się w sekcji „Stan Aktualny” w oknie importu danych, a po zamknięciu okna widoczni będą na zakładce „Pracownicy” w ramach zakładki [Struktura organizacyjna].

Analogicznie należy postępować na zakładkach „Działy” i „Struktura organizacyjna” w ramach okna importu danych.

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Pracownicy”– zaznaczanie pracowników ze spółki Comarch BPM Standalone do zaimportowania

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Pracownicy”– Widok listy pracowników zaimportowanych ze spółki Comarch BPM Standalone na liście w sekcji „Stan Aktualny”

 

Widok zakładki „Pracownicy” na zakładce „Struktura organizacyjna” po zaimportowaniu pracowników

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Działy”– zaznaczanie działów ze spółki Comarch BPM Standalone do zaimportowania

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Działy”– Widok listy działów zaimportowanych ze spółki Comarch BPM Standalone na liście w sekcji „Stan Aktualny”

 

Widok zakładki „Działy” na zakładce „Struktura organizacyjna” po zaimportowaniu działów

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Struktura organizacyjnay”– zaznaczanie elementów struktury organizacyjnej ze spółki Comarch BPM Standalone do zaimportowania

 

Okno importu danych z bazy Comarch BPM Standalone na zakładce „Struktura organizacyjna”–widok struktury organizacyjnej zaimportowanej ze spółki Comarch BPM Standalone na liście w sekcji „Stan Aktualny”

 

Widok drzewa struktury organizacyjnej na zakładce „Struktura organizacyjna” po zaimportowaniu struktury organizacyjnej




Udostępnienie mechanizmu do pobierania listy pracowników, działów i struktury organizacyjnej dla spółek połączonych z bazami Comarch ERP Optima

W wersji 2025.2.0 umożliwiono pobieranie listy pracowników, działów i struktury organizacyjnej dla spółek połączonych z bazami Comarch ERP Optima oraz Comarch BPM Standalone. W tym celu na zakładce [Struktura organizacyjna] w górnej części okna została dodana ikona [Importuj], analogiczna do ikony dotychczas dostępnej tylko dla współpracy z Comarch ERP XL.

 

Widok zakładki „Struktura organizacyjna” dla spółki współpracującej z Comarch ERP Optima przed importem danych – widoczny jest przycisk „Importuj”

 

Po kliknięciu w przycisk [Importuj] zostaje otwarte okno importu danych.

W ramach okna importu danych w zakładkach: „Pracownicy”, „Działy” i „Struktura organizacyjna” można za pomocą zapytania SQL pobrać odpowiednio: listę pracowników, listę działów oraz strukturę organizacyjną. Zapytanie SQL należy wprowadzić w oknie „Procedura SQL”, otwartym po kliknięciu w przycisk [SQL] w ramach danej zakładki.

 

 

Okno importu danych z bazy Comarch ERP Optima, zakładka „Pracownicy” – widok po kliknięciu w przycisk „Importuj”

 

 

Po  zapisaniu zmian w oknie „Procedura SQL” na zakładce „Pracownicy” należy zaznaczyć checkboxy obok tych pracowników, którzy mają zostać zaimportowani do Comarch BPM, a następnie nacisnąć przycisk [Zapisz]. Wówczas wybrani pracownicy pojawią się w sekcji „Stan Aktualny” w oknie importu danych, a po zamknięciu okna widoczni będą na zakładce „Pracownicy” w ramach zakładki [Struktura organizacyjna].

Analogicznie należy postępować na zakładkach „Działy” i „Struktura organizacyjna” w ramach okna importu danych.

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Pracownicy”– zaznaczanie pracowników ze spółki Comarch ERP Optima do zaimportowania

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Pracownicy”– Widok listy pracowników zaimportowanych ze spółki Comarch ERP Optima na liście w sekcji „Stan Aktualny”

 

Widok zakładki „Pracownicy” na zakładce „Struktura organizacyjna” po zaimportowaniu pracowników

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Działy”– zaznaczanie działów ze spółki Comarch ERP Optima do zaimportowania

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Działy”– Widok listy działów zaimportowanych ze spółki Comarch ERP Optima na liście w sekcji „Stan Aktualny”

 

Widok zakładki „Działy” na zakładce „Struktura organizacyjna” po zaimportowaniu działów

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Struktura organizacyjnay”– zaznaczanie elementów struktury organizacyjnej ze spółki Comarch ERP Optima do zaimportowania

 

Okno importu danych z bazy Comarch ERP Optima na zakładce „Struktura organizacyjna”–widok struktury organizacyjnej zaimportowanej ze spółki Comarch ERP Optima na liście w sekcji „Stan Aktualny”

 

Widok drzewa struktury organizacyjnej na zakładce „Struktura organizacyjna” po zaimportowaniu struktury organizacyjnej




Schemat Mapowania Danych z Plików XML (struktura KSeF) do Konkretnych Tabel w Comarch BPM

Udostępniono dokumentację przedstawiającą zależności pomiędzy danymi z plików XML faktur zakupowych KSeF a odpowiadającymi im polami w tabelach w bazie Comarch BPM.

Po kliknięciu w przycisk znajdujący się poniżej zostanie pobrany plik dotyczący tej kwestii:

 

Pobierz dokument




Zestawienie Powiązań (Relacji) Tabel KSeF w Comarch BPM




Współpraca Comarch BPM z usługą Comarch OCR

Do współpracy z Comarch BPM (dawniej DMS) szczególnie zaleca się usługę Comarch OCR.

Aktualnie  każdy użytkownik Comarch BPM (dawniej DMS) ma jednorazowy bezpłatny dostęp do pakietu DEMO 50  – wówczas przez miesiąc możliwe jest wprowadzenie 50 stron.

Szczegółowe informacje dotyczące współpracy Comarch BPM (dawniej DMS) z usługą OCR można znaleźć w artykułach Przetwarzanie dokumentów przez usługę Comarch OCR  oraz Definiowanie punktu konfiguracyjnego




Czy wiesz, że wykorzystując procedurę On.AfterDocumentDeleted możesz zapisywać do bazy dane o usunięciu dokumentu, rejestrując ID usuniętego dokumentu, ID operatora oraz dokładną datę i czas tej akcji w Comarch BPM?

Zastosowanie

Poniższy przykład przedstawia, jak za pomocą procedury On.AfterDocumentDeleted w bazie danych Comarch BPM zapisywać informacje o tym, kto, kiedy i jaki dokument usunął z obiegu.

 

Zawartość przykładu

  • Zmodyfikowana procedura do.OnAfterDocumentDeleted, która jest wywoływana automatycznie podczas usuwania dokumentu.
  • Tabelka wdrożeniowa do.WDR_DeletedDocumentsLog, w której są zapisywane informacje kto i kiedy usunął dany dokument.

 

Kliknij tutaj, aby pobrać przykład

 

Zasada działania

Procedura do.OnAfterDocumentDeleted dodaje do tabelki wdrożeniowej do.WDR_DeletedDocumentsLog informacje o usunięciu dokumentu (ID dokumentu, ID użytkownika usuwającego oraz datę i czas operacji).

  • Parametry wejściowe: Procedura wykorzystuje dwa parametry wejściowe:
    • @documentId: Zawiera ID dokumentu (DWD_ID) z tabeli do.DF_Work.
    • @userId: Zawiera ID operatora (DCD_ID) z tabeli do.DF_ConfOSDictionary.
  • Pobieranie Pełnego Numeru Dokumentu: Mimo że pełny numer dokumentu (DWD_FullNumber) nie jest parametrem wejściowym, procedura pobiera go bezpośrednio z tabeli nagłówkowej dokumentu do.DF_Work, używając jako klucza przekazanego @documentId.
  • Tabela do.DF_ConfOSDictionary: Używamy jej do pobrania loginu operatora (DCD_Login), co czyni log bardziej czytelnym niż samo ID.
  • Funkcja GETDATE(): Zapewnia dokładną datę i czas, kiedy operacja usunięcia została wykonana.
  • Instrukcja INSERT INTO: Wstawia zebrane dane do tabeli wdrożeniowej do.WDR_DeletedDocumentsLog.

 

Konfiguracja przykładu

1.

Utworzono w bazie danych BPM w schemacie do. własną tabelę o nazwie do.WDR_DeletedDocumentsLog, w ktorej będą zapisywane informacje dotyczące usunięć dokumentów.

 

Przyklad

Przykład tabeli:

CREATE TABLE do.WDR_DeletedDocumentsLog (
DDL_Id INT IDENTITY(1,1) PRIMARY KEY,
DDL_DocumentId INT NOT NULL, /*ID usuniętego dokumentu (DWD_ID z do.DF_Work)*/
DDL_FullNumber VARCHAR(50) NULL, /*Numer dokumentu (DWD_FullNumber z do.DF_Work)*/
DDL_DeletedByUserId INT NULL, /*ID użytkownika, który usunął dokument (DCD_ID z do.DF_ConfOSDictionary)*/
DDL_UserName VARCHAR(255) NULL, /*Login użytkownika*/
DDL_DeleteDate DATETIME NOT NULL /*Data i czas operacji*/
);

 

2. W procedurze do.OnAfterDocumentDeleted dodano kod:

 

/* Deklaracja zmiennych */
DECLARE @userLogin VARCHAR(100);
DECLARE @fullNumber VARCHAR(50); --z do.DF_Work (DWD_FullNumber)

/* 1. Pobranie loginu użytkownika z tabeli do.DF_ConfOSDictionary - Tabela słownika działów i pracowników */
IF @userId IS NOT NULL
BEGIN
SELECT @userLogin = DCD_Login
FROM do.DF_ConfOSDictionary
WHERE DCD_ID = @userId;
END

/* 2. Pobranie pełnego numeru dokumentu z tabeli do.DF_Work (Tabela nagłówkowa dokumentu) */
IF @documentId IS NOT NULL
BEGIN
SELECT @fullNumber = DWD_FullNumber
FROM do.DF_Work
WHERE DWD_ID = @documentId;
END

/* 3. Dodanie informacji o usunięciu dokumentu do tabeli wdrożeniowej */
INSERT INTO do.WDR_DeletedDocumentsLog (
DDL_DocumentId,
DDL_FullNumber,
DDL_DeletedByUserId,
DDL_UserName,
DDL_DeleteDate
)
VALUES (
@documentId,
@fullNumber,
@userId,
@userLogin,
GETDATE()
);



 

3. Zmodyfikowana procedura wygląda następująco:

ALTER PROCEDURE [do].[OnAfterDocumentDeleted]
@documentId as int = NULL,  -- DWD_ID from DF_Work table
@userId as int = NULL -- DCD_ID from DF_ConfOSDictionary table, the user who deleted the document
AS
BEGIN
begin try

/* Deklaracja zmiennych */

    DECLARE @userLogin VARCHAR(100);
    DECLARE @fullNumber VARCHAR(50); --z do.DF_Work (DWD_FullNumber)

    /* 1. Pobranie loginu użytkownika z tabeli do.DF_ConfOSDictionary - Tabela słownika działów i pracowników */

    IF @userId IS NOT NULL
    BEGIN
        SELECT @userLogin = DCD_Login
        FROM do.DF_ConfOSDictionary
        WHERE DCD_ID = @userId;
    END

    /* 2. Pobranie pełnego numeru dokumentu z tabeli do.DF_Work (Tabela nagłówkowa dokumentu) */

    IF @documentId IS NOT NULL
    BEGIN
        SELECT @fullNumber = DWD_FullNumber
        FROM do.DF_Work
        WHERE DWD_ID = @documentId;
    END

    /* 3. Dodanie informacji o usunięciu dokumentu do tabeli wdrożeniowej */

    INSERT INTO do.WDR_DeletedDocumentsLog (
        DDL_DocumentId,
        DDL_FullNumber,
        DDL_DeletedByUserId,
        DDL_UserName,
        DDL_DeleteDate
    )
    VALUES (
        @documentId,
        @fullNumber,
        @userId,
        @userLogin,
        GETDATE()
    );
end try
begin catch
 DECLARE @ErrorMessage varchar(max) = 'W procedurze do.OnAfterDocumentDeleted wystąpił błąd: ' + ERROR_MESSAGE();
 --THROW 50001,  @ErrorMessage ,1;   
 declare  @ErrorSeverity int =  ERROR_SEVERITY(), @ErrorState int = ERROR_STATE()
 raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
end catch
END

 

Uzupełniona tabela do.WDR_DeletedDocumentsLog

Po usunięciu dokumentu w Comarch BPM za pomocą ikony kosza, w tabeli wdrożeniowej pojawia się wpis:

 

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

Sprawdź Szkolenia Comarch BPM!

 




Obsługa KSeF w Comarch BPM – informacje