Jednolity Park Komtrolny (JPK), Standard Audit File, is a new requirement of Polish Ministry of Finance to improve efficiency in tax control and to narrow the space for tax evasion.
The protocol for sending finance data to tax office via REST gateway is described here (in Polish).
The taxpayer should send tax reports using the specified format and procedure. Unfortunately, although the protocol comprises of well-known encrypting and signing methods, Ministry of Finance does not share any code sample how to accomplish the task.
Solution
In order to alleviate the burden, because creating everything from scratch could be a painstaking process, I decided to develop a simple Open Source project in Java, covering all area of encoding and data sending via REST protocol. The source code is available here.
The project can be utilized in two ways. As an API, Javadoc will be available soon, for Java solutions, or as a command line for a non-Java solution.
Installation
The project requires preparing a property file containing a set of parameters. The sample property file is available here. Following parameters should be defined.
- conf Directory containing a set of artifacts necessary to run the solution. Sample directory is available here.
- JPKMFTest-klucz publiczny do szyfrowania.pem : Public key to encode the symmetric key
- initupload-enveloped-pattern.xml : Pattern for creating InitUpload XML file used to initiate the data transmition. The file contains a number of position markers to be replaced by current values. I found this solution more applicable then creating XML file on the fly.
- log.conf : JUL logging configuration. FileHandler is added automatically, only ConsoleLogger should be defined here.
- test-e-dokumenty.mf.gov.pl_ssl.crt : Certificate used to authorize access to the public gateway.
- workdir : Working directory to keep temporary data between different phases of data transmission. It is also a place to keep a log file. This directory is cleaned at the beginning of the first phase, so it is a responsibility of solution user to backup this directory.
- publickey : The name of the file with a public key in conf directory.
- cert : The name of the certificate file (X.509) in conf directory.
- url : The URL to send InitUpload.xml file, transfer initialization.
- finish: The URL to signal the transmission completion.
- get: The URL to receive UPO (Urzędowe Potwierdzenie Odbioru), Official Receipt Confirmation.
Solution structure
The solution is developed as several static API methods and corresponding main methods for command line application.
Sending financial data to gateway comprises several steps described in manual.
1. Preparing initial dataSending financial data to gateway comprises several steps described in manual.
During this step InitUpload.xml file is created and input financial data are zipped and encrypted. Preparing UnitUpload.xml requires several steps like generating the symmetric key, making MD5 and HASH-256 hash for symmetric key and input data. The procedure is described in comments embedded in source code.
API method : JPK.Prepare method.
Command line: Transform.main method.
2. Signing Initupload.xml
This step should be done manually. There are several public certification authorities in Poland and every one provides its own application for signing documents.
3. Uploading data to gateway
This step uses InitUploadSigned, PutBlob and FinishUpload REST API methods.
API method: UPLOAD.upload method.
Command line: Upload.main method.
4. Receiving UPO, Official Receipt Confirmation
This step uses Status REST API method. UPO is available for download after some time, so the method should be launched is some time intervals untill UPO is received.
API method : UPLAOD.getUpo method.
Command line: GetUPO.main method.