Aktualna wersja: 20.04.30


JPK_V7M - Import danych z własnego systemu ERP za pomocą Plugin

Połączenie użytkowanego systemu ERP z Program-JPK PRO, dedykujemy każdej firmie dysponującej odpowiednim wsparciem informatycznym. Z rozwiązania może skorzystać wewnętrzny zespół informatyków lub zewnętrzna firma wdrożeniowa. Wystarczy podstawowa wiedza na temat programowania.

Jeżeli posiadacie już państwo rozwiązania informatyczne, które pobierają dane z użytkowanego systemu ERP do wypełniania tabel Excel, to jesteście gotowi do skorzystania z tej funkcji.

Nowe rozwiązanie umożliwi bezpośrednią współpracę aplikacji Program-JPK z użytkowanym systemem ERP, generowanie plików JPK bez potrzeby wypełniania i importowania tabel (plików) pośredniczących. Całość opiera się na dedykowanych kreatorach w aplikacji Program-JPK, użytkownik nie musi wykonywać żadnych dodatkowych czynności.

Udostępniamy pełny kod źródłowy biblioteki .NET wykonanej w Visual Studio Community. Programista zobowiązany jest tylko do wykonania kilku prostych kroków:

  • Zmodyfikowania połączenia z własną bazą danych (ConnectionString)
  • Zmodyfikowania własnych zapytań do bazy SQL w module JpkV7.cs (oddzielnie dla sprzedaży i zakupów)
  • Mapowanie pól danych w metodach FillSpTable() oraz FillZaTable()
  • Do programu opcjonalnie można przesłać dodatkowe informacje i kwoty w części opisowej zintegrowanej deklaracji podatkowej VAT7. Służy do tego metoda SetVAT7Fields()
  • Po skompilowaniu biblioteki, kopiujemy plik wynikowy TGSoft.JpkPlugin.dll do katalogu z aplikacją Program-JPK (zmieniamy istniejący plik)

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
Funkcja znajduje się w Menu/JPK/Import API

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
Początkowy ekran Generatora JPK_V7M za pomocą plugin

Użytkownik podaje parametry wejściowe: Rok, Miesiąc i Cel złożenia. Następnie zatwierdza przyciskiem [Załaduj dane]. Program komunikuje się z biblioteką tworząc instancję klasy JpkV7. Do klasy przesłane są parametry (publiczne właściwości):

  • Year
  • Month
  • Scope
  • CompanyNumber
  • CompanyNip
  • SelectedIndex
  • JpkPluginConnectionString

Parametry Year i Month wykorzystuje się w zapytaniach SQL do pobrania odpowiedniego zakresu danych. Scope informuje o wybranym typie formularza: 1.Złożenie, 2.Korekta.

CompanyNumber oraz CompanyNip zawierają numer kolejny firmy oraz NIP aktualnie otwartej bazy danych w aplikacji Program-JPK, gdzie każda firma ma oddzielną bazę danych. Można to wykorzystać do dynamicznego budowania połączenia z własnymi bazami danych (ConnectionString), jeżeli podobnie jak w naszym programie bazy są oddzielne dla poszczególnych firm.

SelectedIndex można wykorzystać po zdefiniowaniu dodatkowej metody np.:

            public override string[] GetItems()
            {
                return new string[] { "Dodatkowa opcja JEDEN", "Dodatkowa opcja DWA" };
            }
        

W takim przypadku w kreatorze zostanie wyświetlona dodatkowa lista wyboru dla użytkownika. SelectedIndex zwraca numer wybranej pozycji (licząc od 0).

JpkPluginConnectionString zawiera zdefiniowany w programie Menu/JPK-PRO/Połączenia SQL własny (użytkownika) ConnectionString niezależny od kodu pisanej biblioteki. Programista może napisać i wdrożyć jedną uniwersalną bibliotekę dla różnych klientów, pobierając połączenia z bazami danych ERP, bezpośrednio z aplikacji Program-JPK.

UWAGA! Program zwraca definicję połączenia dla zapisu, w którym pole [Nazwa] zawiera wartość: JpkPlugin

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
Widok po wykonaniu obliczeń przez własną bibliotekę użytkownika

Program wykonuje publiczną metodę Execute() z klasy JpkV7, w której wypełniane są tabele sprzedaży i zakupów, opcjonalnie zwracane są parametry zintegrowanej deklaracji VAT7.


            public void Execute()
            {
                CreateADOClient();
                FillSpTable();
                FillZaTable();
                SetVAT7Fields();
            }
        

Aplikacja podaje liczbę załadowanych rekordów w odpowiednich Rejestrach VAT oraz przedstawia dane przesłane do deklaracji VAT7. Parametry deklaracji VAT7 można na tym etapie jeszcze edytować. Własne zmiany zostaną uwzględnione w generowanym pliku JPK_V7M. Metoda SetVAT7Fields() może być pusta. W takim przypadku niezbędne dane zintegrowanej deklaracji VAT7 użytkownik poda ręcznie.

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
Ostatni krok kreatora po załadowaniu danych. Generujemy plik JPK_V7M.

Po wykonaniu [Generuj JPK] dostępne są funkcje opisane stronie JPK_V7M:

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
Widok projektu w środowisku Visual Studio

Dostarczamy gotowy projekt biblioteki z pełnym kodem źródłowym, który można zmodyfikować i skompilować za pomocą bezpłatnej wersji Visual Studio Community, lub starszej wersji Visual Studio Express. Celowo stosujemy zgodność dla platformy .NET Framework 2.0. Na potrzeby przesłania danych z własnej bazy SQL to wystarczy, a pozwoli na wykorzystanie starszych wersji Visual Studio. Oczywiście można zmienić docelową platformę, jeżeli jest to wymagane przez własne biblioteki użytkownika. Należy jednak pamiętać, że Program-JPK korzysta aktualnie z .NET Framework 4.5.2.


UWAGA!

W rozwiązaniu możesz stosować własne biblioteki w tym licencjonowane przez siebie biblioteki firm trzecich. Jednak ze względów licencyjnych, NIE MOŻNA użyć żadnej komercyjnej biblioteki (ani biblioteki TGSoft) z wersji instalacyjnej naszej aplikacji, które znajdują się w katalogu Program-JPK.

Generowanie pliku JPK_V7M z danych ERP za pomocą Plugin C#
W module JpkV7.cs należy zdefiniować połączenie z własną bazą danych SQL, lub skorzystać z JpkPluginConnectionString

Na potrzeby przykładu zastosowaliśmy bezpośrednie połączenie z bazą danych MS SQL SERVER. Dostęp do danych uzyskujemy poprzez Client = new MsSql(MsSqlConnectionString());

W tym przypadku program korzysta z ConnectionString zdefiniowanego w procedurze użytkownika protected override string MsSqlConnectionString().

Jeżeli korzystasz z innej bazy SQL, można skorzystać ze sterowników ODBC lub OLEDB i naszego rozwiązania:

  • dla ODBC : Client = new Odbc(OdbcConnectionString());
  • dla OLEDB: Client = new OleDb(OleDbConnectionString());

Zastosowanie ODBC lub OLEDB wymaga zainstalowania w systemie operacyjnym odpowiednich sterowników do konkretnej bazy danych. Należy zwrócić uwagę, że w zależności od systemu operacyjnego, nasza aplikacja pracuje jako 64 BIT i takie sterowniki mogą być wymagane.

Oczywiście to są tylko nasze propozycje i podpowiedzi. Doświadczony programista może skorzystać z dowolnego sposobu importu własnych danych.

Przykładowy kod do tworzenia pliku JPK_V7M.

using System.Collections.Generic;
using System.Data;

namespace TGSoft.JpkPlugin
{
    public class JpkV7 : JpkBase
    {
        //Input fields
        public int Year { get; set; }
        public int Month { get; set; }
        public int Scope { get; set; }

        // Output fields
        public decimal P_39 { get; set; }
        public decimal P_49 { get; set; }
        public decimal P_50 { get; set; }
        public decimal P_52 { get; set; }

        public bool P_63 { get; set; }
        public bool P_64 { get; set; }
        public bool P_65 { get; set; }
        public bool P_66 { get; set; }
        public bool P_67 { get; set; }
        public decimal P_68 { get; set; }
        public decimal P_69 { get; set; }
        public string P_ORDZU { get; set; }

        public List<JpkV7SpItem> SpItems { get; set; }
        public List<JpkV7ZaItem> ZaItems { get; set; }

        public JpkV7()
        {
            SpItems = new List<JpkV7SpItem>();
            ZaItems = new List<JpkV7ZaItem>();
        }

        public void Execute()
        {
            CreateADOClient();
            FillSpTable();
            FillZaTable();
            SetVAT7Fields();
        }


        #region User Code       
        public override string[] GetItems()
        {
            return new string[] { "Dodatkowa opcja JEDEN", "Dodatkowa opcja DWA" };
        }

        protected override string MsSqlConnectionString()
        {
            return string.Format(
                @"Data Source=localhost\SQLExpress;Initial Catalog=tgsoft{0};Integrated Security=True",
                CompanyNumber);
        }

        private void CreateADOClient()
        {
            //Client = new OleDb(OleDbConnectionString());
            //Client = new Odbc(OdbcConnectionString());
            //Client = new MsSql(JpkPluginConnectionString);

            Client = new MsSql(MsSqlConnectionString());
        }

        private void FillSpTable()
        {
            if (Client == null) return;
            var dt = Client.GetSQLTable(
                string.Format("SELECT * FROM ke_ksiega WHERE Year(data) = {0} AND Month(data) = {1} AND pw='P'", Year, Month));
            if (dt == null) return;
            
            foreach (DataRow row in dt.Rows)
            {
                SpItems.Add(new JpkV7SpItem()
                {
                    TypDokumentu = JpkV7SpItem.TypDowodu.FP,
                    DataWystawienia = Tools.ToDateTime(row["data"]),
                    DowodSprzedazy = Tools.ToStr(row["dokument"]),
                    KodKraju = "PL",
                    NIP = Tools.ToStr(row["id_kontrahenci"]),
                    K_19 = Tools.ToDecimal(row["sprzedaz"]),
                    K_20 = Tools.ToDecimal(row["sprzedaz"]) * 23/100,
                });
            }
        }

        private void FillZaTable()
        {
            if (Client == null) return;
            var dt = Client.GetSQLTable
                (string.Format("SELECT * FROM ke_ksiega WHERE Year(data) = {0} AND Month(data) = {1} AND pw='W'", Year, Month));
            if (dt == null) return;

            foreach (DataRow row in dt.Rows)
            {
                ZaItems.Add(new JpkV7ZaItem()
                {
                    DataZakupu= Tools.ToDateTime(row["data"]),
                    DowodZakupu = Tools.ToStr(row["dokument"]),
                    KodKraju = "PL",
                    NIP = Tools.ToStr(row["id_kontrahenci"]),
                    K_40 = Tools.ToDecimal(row["zakup_towarow"]),
                    K_41 = Tools.ToDecimal(row["zakup_towarow"]) * 23 / 100,
                    MPP = true,
                });
            }
        }

        private void SetVAT7Fields()
        {
            P_39 = 1500;

            P_64 = true;
            P_65 = true;
            P_69 = 69;

            if (Scope == 2)
                P_ORDZU = "TEST Korekty !";
        }
        #endregion
    }
}
        

Pełny kod źródłowy biblioteki do pobrania ze strony: https://tgsoft.pl/programy/TGSoft.JpkPlugin.zip