"http://jpk.mf.gov.pl/wzor/2016/10/26/10261/",
'JPK_VAT (3)' => "http://jpk.mf.gov.pl/wzor/2017/11/13/1113/",
'JPK_V7M (1)' => "http://crd.gov.pl/wzor/2020/05/08/9393/",
'JPK_V7K (1)' => "http://crd.gov.pl/wzor/2020/05/08/9394/",
'JPK_V7M (2)' => "http://crd.gov.pl/wzor/2021/12/27/11148/",
'JPK_V7K (2)' => "http://crd.gov.pl/wzor/2021/12/27/11149/",
'JPK_V7M (3)' => "http://crd.gov.pl/wzor/2025/12/19/14090/",
'JPK_V7K (3)' => "http://crd.gov.pl/wzor/2025/12/19/14089/",
];
private $JPK_Wariant = [
'1-0' => [2],
'1-1' => [3],
'1-2E' => [1],
'1-0E' => [2,3],
];
private $kodySystemowe = [
'JPK_VAT (2)' => '1-0',
'JPK_VAT (3)' => '1-1',
'JPK_V7M (1)' => '1-2E',
'JPK_V7K (1)' => '1-2E',
'JPK_V7M (2)' => '1-0E',
'JPK_V7K (2)' => '1-0E',
'JPK_V7M (3)' => '1-0E',
'JPK_V7K (3)' => '1-0E',
];
private $xsd = [
'JPK_VAT (2)' => 'Schemat_JPK_VAT(2)_v1-0.xsd',
'JPK_VAT (3)' => 'Schemat_JPK_VAT(3)_v1-1.xsd',
'JPK_V7M (1)' => 'Schemat_JPK_V7M(1)_v1-2E.xsd',
'JPK_V7K (1)' => 'Schemat_JPK_V7K(1)_v1-2E.xsd',
'JPK_V7M (2)' => 'Schemat_JPK_V7M(2)_v1-0E.xsd',
'JPK_V7K (2)' => 'Schemat_JPK_V7K(2)_v1-0E.xsd',
'JPK_V7M (3)' => 'Schemat_JPK_V7M(3)_v1-0E.xsd',
'JPK_V7K (3)' => 'Schemat_JPK_V7M(3)_v1-0E.xsd',
];
public function handleAuth() {
if (!User::logged()) {
throw new HttpException('Unauthorized', 401);
}
$this->LAST_REFERER = $_SERVER['HTTP_REFERER'];
if (($this->REFERER=V::get('REFERER','',$_POST))=='') $this->REFERER = $_SERVER['HTTP_REFERER'];
try {
if (!($ID_JPK = V::get('ID_JPK',0,$_GET,'int'))) throw new Exception("Błąd parametru");
if ($result = DB::getPDO()->fetchall("select * from JPK where ID='{$ID_JPK}'")) $this->JPK = $result[0];
else throw new Exception("Dostęp zabroniony");
if ($result = DB::getPDO()->fetchall("select * from BILLING_OWNER where ID='{$this->JPK['ID_BILLING_OWNER']}'")) $this->BO = $result[0];
else throw new Exception("Błąd spójności danych");
if ($this->JPK['A_STATUS'] != 'WAITING') {
if (!$this->JPK['MONTH']) throw new Exception("Błąd daty w rekordzie JPK_VAT");
$this->JPK_wersjaSchemy = self::getWersjaSchemy($this->JPK['MONTH']);
$this->JPK_kodSystemowy = self::getKodSystemowy($this->JPK['MONTH']);
}
} catch (Exception $e) {
SE_Layout::gora();
SE_Layout::menu();
SE_Layout::alert('danger',$e->getMessage());
?>
fetchValue("select max(MONTH) from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}'
and (((MONTH < '2018-01' or MONTH >= '2020-10') and PURPOSE='1') or (MONTH >= '2018-01' and MONTH < '2020-10' and PURPOSE = '0'))");
// if (strtotime($month) <= strtotime($lastMonth)) throw new Exception("błędny miesiąc (deklaracja z tego okresu lub późniejszego już istnieje)");
break;
case "2":
$JPKexists = DB::getPDO()->fetchValue("select ID from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}' and MONTH='{$month}'
and (((MONTH < '2018-01' or MONTH >= '2020-10') and PURPOSE='1') or (MONTH >= '2018-01' and MONTH < '2020-10' and PURPOSE = 0))");
if (!$JPKexists) throw new Exception("brak deklaracji z tego okresu - nie ma czego korygować");
break;
default:
throw new Exception("błędne określenie celu złożenia deklaracji");
}
if (self::getWersjaSchemy($month) == '1-1') {
if ($purpose == 1) $purpose = (int) 0;
else $purpose = DB::getPDO()->fetchValue("select max(PURPOSE) + 1 from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}' and MONTH='{$month}'");
}
$sqlObj = new stdClass();
$sqlObj->ID = $this->JPK['ID'];
$sqlObj->A_STATUS = 'NORMAL';
$sqlObj->A_STATUS_INFO = 'W trakcie tworzenia';
$sqlObj->MONTH = $month;
$sqlObj->PURPOSE = $purpose;
$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
if ($affected) {
SE_Layout::alert('success','Pomyślnie zainicjalizowano deklarację JPK.');
?>
getMessage());
?>
[
"KodFormularza" => "Kod formularza",
"kodSystemowy" => "Kod systemowy",
"WariantFormularza" => "Wariant formularza",
"CelZlozenia" => "Cel złożenia",
"DataWytworzeniaJPK" => "Data wytworzenia JPK",
"DataOd" => "Data od",
"DataDo" => "Data do",
"DomyslnyKodWaluty" => "Waluta",
"KodUrzedu" => "Kod urzędu skarbowego",
"NIP" => "NIP",
"PelnaNazwa" => "Nazwa podmiotu",
"REGON" => "Regon",
"KodKraju" => "Kod kraju",
"Wojewodztwo" => "Województwo",
"Powiat" => "Powiat",
"Gmina" => "Gmina",
"Miejscowosc" => "Miejscowość",
"Ulica" => "Ulica",
"NrDomu" => "Nr domu",
"NrLokalu" => "Nr lokalu",
"KodPocztowy" => "Kod pocztowy",
"Poczta" => "Poczta",
"LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
"PodatekNalezny" => "Podatek należny",
"LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
"PodatekNaliczony" => "Podatek naliczony",
],
'1-1' => [
"KodFormularza" => "Kod formularza",
"kodSystemowy" => "Kod systemowy",
"WariantFormularza" => "Wariant formularza",
"CelZlozenia" => "Cel złożenia",
"DataWytworzeniaJPK" => "Data wytworzenia JPK",
"DataOd" => "Data od",
"DataDo" => "Data do",
"NazwaSystemu" => "Nazwa systemu",
"NIP" => "NIP",
"PelnaNazwa" => "Nazwa podmiotu",
"Email" => "Adres email",
"LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
"PodatekNalezny" => "Podatek należny",
"LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
"PodatekNaliczony" => "Podatek naliczony",
],
'1-2E' => [
"KodFormularza" => "Kod formularza",
"kodSystemowy" => "Kod systemowy",
"WariantFormularza" => "Wariant formularza",
"DataWytworzeniaJPK" => "Data wytworzenia JPK",
"NazwaSystemu" => "Nazwa systemu",
"CelZlozenia" => "Cel złożenia",
"KodUrzedu" => "Kod urzędu",
"Rok" => "Rok",
"Miesiac" => "Miesiąc",
"NIP" => "NIP",
"PelnaNazwa" => "Pełna nazwa",
"Email" => "Adres email",
"Deklaracja" => "Deklaracja VAT",
"P_38" => "Deklaracja - Podatek należny",
"P_48-P_39" => "Deklaracja - Podatek naliczony
(pomniejszony o nadwyżkę z poprzedniej deklaracji)",
"LiczbaWierszySprzedazy" => "Ewidencja - Liczba dokumenów sprzedaży",
"PodatekNalezny" => "Ewidencja - Podatek należny",
"LiczbaWierszyZakupow" => "Ewidencja - Liczba dokumentów zakupu",
"PodatekNaliczony" => "Ewidencja - Podatek naliczony",
],
'1-0E' => [
"KodFormularza" => "Kod formularza",
"kodSystemowy" => "Kod systemowy",
"WariantFormularza" => "Wariant formularza",
"DataWytworzeniaJPK" => "Data wytworzenia JPK",
"NazwaSystemu" => "Nazwa systemu",
"CelZlozenia" => "Cel złożenia",
"KodUrzedu" => "Kod urzędu",
"Rok" => "Rok",
"Miesiac" => "Miesiąc",
"NIP" => "NIP",
"PelnaNazwa" => "Pełna nazwa",
"Email" => "Adres email",
"Deklaracja" => "Deklaracja VAT",
"P_38" => "Deklaracja - Podatek należny",
"P_48-P_39" => "Deklaracja - Podatek naliczony
(pomniejszony o nadwyżkę z poprzedniej deklaracji)",
"LiczbaWierszySprzedazy" => "Ewidencja - Liczba dokumenów sprzedaży",
"PodatekNalezny" => "Ewidencja - Podatek należny",
"LiczbaWierszyZakupow" => "Ewidencja - Liczba dokumentów zakupu",
"PodatekNaliczony" => "Ewidencja - Podatek naliczony",
],
];
private static function getNamespaces($xml) {
$ns = $xml->getNamespaces(true);
if (!isset($ns['tns'])) {
if (isset($ns[''])) {
$ns['tns'] = $ns[''];
unset($ns['']);
} else throw new Exception('Błędna struktura namespace');
}
foreach ($ns as $k => $v) $xml->registerXPathNamespace($k, $v);
return $ns;
}
private function showJPK_VAT($xml) {
$ns = self::getNamespaces($xml);
$summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
$result['KodFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0];
$result['kodSystemowy'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza/@kodSystemowy')[0];
$result['WariantFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0];
$result['CelZlozenia'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0];
$result['DataWytworzeniaJPK'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataWytworzeniaJPK')[0];
if ($this->JPK_wersjaSchemy == '1-0') {
$result['DataOd'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0];
$result['DataDo'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0];
$result['DomyslnyKodWaluty'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0];
$result['KodUrzedu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodUrzedu')[0];
$result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:NIP')[0];
$result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:PelnaNazwa')[0];
$result['REGON'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:REGON')[0];
$result['KodKraju'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodKraju')[0];
$result['Wojewodztwo'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Wojewodztwo')[0];
$result['Powiat'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Powiat')[0];
$result['Gmina'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Gmina')[0];
$result['Ulica'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Ulica')[0];
$result['NrDomu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrDomu')[0];
$result['NrLokalu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrLokalu')[0];
$result['Miejscowosc'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Miejscowosc')[0];
$result['KodPocztowy'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodPocztowy')[0];
$result['Poczta'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Poczta')[0];
$result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ?: "";
$result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
$result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ?: "";
$result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
} elseif ($this->JPK_wersjaSchemy == '1-1') {
$result['DataOd'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0];
$result['DataDo'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0];
$result['NazwaSystemu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:NazwaSystemu')[0];
$result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:NIP')[0];
$result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:PelnaNazwa')[0];
$result['Email'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:Email')[0];
$result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ?: "";
$result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
$result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ?: "";
$result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
} elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
$result['KodUrzedu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodUrzedu')[0];
$result['Rok'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:Rok')[0];
$result['Miesiac'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:Miesiac')[0];
$result['NazwaSystemu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:NazwaSystemu')[0];
$result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:NIP')[0];
$result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:PelnaNazwa')[0];
$result['Email'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:Email')[0];
$result['Deklaracja'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? "Tak" : "Nie";
$P_38 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_38')[0];
$P_39 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_39')[0];
$P_48 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_48')[0];
$P_48_P_39 = round($P_48 - $P_39, 2);
$result['P_38'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? ('' . number_format($P_38, 2, ',', '.') . '
') : '';
$result['P_48-P_39'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? ('' . number_format($P_48_P_39 , 2, ',', '.') . '
') : '';
$result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'];
$result['PodatekNalezny'] = number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.');
$result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'];
$result['PodatekNaliczony'] = number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.');
}
return $result;
}
private function showTable() {
?>
JPK['IN_L1']) throw new Exception("Błąd danych - nie pobrano danych JPK z L1");
$xml = simplexml_load_string($this->JPK['IN_L1']);
$ns = $xml->getNamespaces(true);
$this->validateJPK_VAT($xml);
if ($this->JPK_wersjaSchemy == '1-0') $pelnaNazwa = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
elseif ($this->JPK_wersjaSchemy == '1-1') $pelnaNazwa = $xml->Podmiot1->PelnaNazwa;
elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') $pelnaNazwa = $xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa;
$fileName = preg_replace("/[: \.]/", "_", "JPK_VAT_{$this->JPK['MONTH']}_L1_" . str_replace('"', '', $pelnaNazwa)) . ".xml";
$output = $xml->asXml();
header("Content-Type: application/xml");
header("Content-Disposition: attachment; filename={$fileName};");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($output));
echo $output;
}
private function show() {
if (V::get('action','',$_POST) == "getJPK") {
try {
if (!$this->JPK['OUT_MERGED']) throw new Exception("Błąd danych - nie wygenerowano wynikowego pliku JPK");
$xml = simplexml_load_string($this->JPK['OUT_MERGED']);
$ns = $xml->getNamespaces(true);
$this->validateJPK_VAT($xml);
if ($this->JPK_wersjaSchemy == '1-0') $pelnaNazwa = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
elseif ($this->JPK_wersjaSchemy == '1-1') $pelnaNazwa = $xml->Podmiot1->PelnaNazwa;
elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') $pelnaNazwa = $xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa;
$fileName = preg_replace("/[: \.]/", "_", "JPK_VAT_{$this->JPK['MONTH']}_" . str_replace('"', '', $pelnaNazwa)) . ".xml";
$output = $xml->asXml();
header("Content-Type: application/xml");
header("Content-Disposition: attachment; filename={$fileName};");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($output));
echo $output;
} catch (Exception $e) {
SE_Layout::gora();
SE_Layout::menu();
SE_Layout::alert('danger', $e->getMessage());
?>