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)
Funkcja znajduje się w Menu/JPK/Import API
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
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.
Ostatni krok kreatora po załadowaniu danych. Generujemy plik JPK_V7M.
Po wykonaniu [Generuj JPK] dostępne są funkcje opisane stronie JPK_V7M:
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.
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