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

image_pdfimage_print

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 KSeFpunkcie 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 NettoBrutto 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!

 

Czy ten artykuł był pomocny?