"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()); ?>
Powrót
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.'); ?>
Powrót
Powrót
Inicjalizacja deklaracji JPK
BO['name1']?>
JPK['TYPE']?>
Anuluj
getMessage()); ?>
Powrót
[ "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_INSERT']) { $xmlIN_INSERT = simplexml_load_string($this->JPK['IN_INSERT']); self::removeTnsNamespace($xmlIN_INSERT); $IN_INSERT = $this->showJPK_VAT($xmlIN_INSERT); } if ($this->JPK['IN_L1']) { $xmlIN_L1 = simplexml_load_string($this->JPK['IN_L1']); $IN_L1 = $this->showJPK_VAT($xmlIN_L1); } if ($this->JPK['OUT_MERGED']) { $xmlOUT_MERGED = simplexml_load_string($this->JPK['OUT_MERGED']); $OUT_MERGED = $this->showJPK_VAT($xmlOUT_MERGED); } foreach ($this->fieldsDescrJPK_VAT[$this->JPK_wersjaSchemy] as $fieldKey => $fieldName) { echo "\n"; } ?>
Insert L1 JPK['IN_L1']) { echo '
' . UI::h('a', [ 'class' => "btn btn-xs btn-default", 'target' => "_blank", 'href' => $this->getLink('exportL1JPK', [ 'ID_JPK' => V::get('ID_JPK',0,$_GET,'int') ]), ], 'Pobierz JPK'); } ?>
Dane wynikowe
{$fieldName}"; if ($this->JPK['IN_INSERT']) echo $IN_INSERT[$fieldKey]; echo ''; if ($this->JPK['IN_L1']) echo $IN_L1[$fieldKey]; echo ''; if ($this->JPK['OUT_MERGED']) echo $OUT_MERGED[$fieldKey]; echo "
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()); ?>
Podgląd deklaracjii JPK :: JPK['TYPE']?> - JPK['MONTH'] . " (" . ((($this->JPK_wersjaSchemy != '1-1' && $this->JPK['PURPOSE'] == 1) || ($this->JPK_wersjaSchemy == '1-1' && $this->JPK['PURPOSE'] == 0)) ? "pierwsze złożenie" : "korekta") . ")"?> BO['name1']?>
showTable();?>
Edycja deklaracji JPK :: JPK['TYPE']?> - JPK['MONTH']." (".((($this->JPK_wersjaSchemy != '1-1' && $this->JPK['PURPOSE'] == 1) || ($this->JPK_wersjaSchemy == '1-1' && $this->JPK['PURPOSE'] == 0)) ? "pierwsze złożenie" : "korekta").")"?> BO['name1']?>
JPK['IN_INSERT']) { ?>
JPK['IN_INSERT'] || $this->JPK['IN_L1'])) { ?>
JPK['IN_INSERT'] && $this->JPK['IN_L1'] && (!$this->JPK['OUT_MERGED'])) { ?>
Insert
L1
JPK['OUT_MERGED']) { ?>

(tej operacji nie można cofnąć)

showTable()?>
$action(); else { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', "Wykryto abuse! Wysłano informację do administratora."); ?>
JPK_wersjaSchemy) { case '1-0': case '1-1': $PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1", "K_30" => "1", "K_33" => "1", "K_35" => "1", "K_36" => "1", "K_37" => "1", "K_38" => "-1", "K_39" => "-1"); $PodatekNaliczonyFields = array("K_44" => 1, "K_46" => 1, "K_47" => 1, "K_48" => 1, "K_49" => 1, "K_50" => 1); $Sprzedaz = $xml->SprzedazWiersz; $Zakup = $xml->ZakupWiersz; break; case '1-2E': case '1-0E': $PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1", "K_30" => "1", "K_32" => "1", "K_33" => "1", "K_34" => "1", "K_35" => "-1", "K_36" => "-1"); $PodatekNaliczonyFields = array("K_41" => 1, "K_43" => 1, "K_44" => 1, "K_45" => 1, "K_46" => 1, "K_47" => 1); $Sprzedaz = $xml->Ewidencja->SprzedazWiersz; $Zakup = $xml->Ewidencja->ZakupWiersz; break; } $result = array( "LiczbaWierszySprzedazy" => 0, "PodatekNalezny" => 0, "LiczbaWierszyZakupow" => 0, "PodatekNaliczony" => 0); foreach ($Sprzedaz as $SprzedazWiersz) { $result["LiczbaWierszySprzedazy"]++; if ($SprzedazWiersz->children($tns)->FP) continue; foreach ($PodatekNaleznyFields as $PodatekNaleznyField => $sign) { if (isset($SprzedazWiersz->$PodatekNaleznyField)) { $result["PodatekNalezny"] += round((float) $SprzedazWiersz->$PodatekNaleznyField * $sign, 2); } } } foreach ($Zakup as $ZakupWiersz) { foreach ($PodatekNaliczonyFields as $PodatekNaliczonyField => $sign) { if (isset($ZakupWiersz->$PodatekNaliczonyField)) { $result["PodatekNaliczony"] += round((float) $ZakupWiersz->$PodatekNaliczonyField * $sign, 2); } } $result["LiczbaWierszyZakupow"]++; } $result["PodatekNalezny"] = number_format(round($result["PodatekNalezny"], 2), 2, '.', ''); $result["PodatekNaliczony"] = number_format(round($result["PodatekNaliczony"], 2), 2, '.', ''); return $result; } private function validateJPK_VAT(&$xml) { $ns = self::getNamespaces($xml); if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0] != "JPK_VAT") throw new Exception("Błędny typ deklaracji JPK"); $kodSystemowy = (string) $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza/@kodSystemowy')[0]; if ($this->kodySystemowe[$kodSystemowy] != $this->JPK_wersjaSchemy) throw new Exception("Niewlasciwy kod systemowy deklaracji JPK"); if (!in_array($xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0], $this->JPK_Wariant[$this->JPK_wersjaSchemy])) throw new Exception("Błędna wersja deklaracji JPK"); switch ($this->JPK_wersjaSchemy) { case '1-0': case '1-2E': case '1-0E': if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0] != $this->JPK['PURPOSE']) throw new Exception("Niezgodny cel zlozenia deklaracji JPK"); break; case '1-1': if (((int) $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0]) xor ((int) $this->JPK['PURPOSE'])) throw new Exception("Niezgodny cel zlozenia deklaracji JPK"); break; } switch ($this->JPK_wersjaSchemy) { case '1-0': case '1-1': if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0] != ($this->JPK['MONTH'] . "-01")) throw new Exception("Bledna data 'od' deklaracji JPK"); if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0] != date("Y-m-d", strtotime($xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0] . " + 1 month - 1 day"))) throw new Exception("Bledna data 'do' deklaracji JPK"); $ewidencjaXpath = '/tns:JPK'; break; case '1-2E': case '1-0E': if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:Rok')[0] != date('Y', strtotime($this->JPK['MONTH']))) throw new Exception("Bledny rok w deklaracji JPK"); if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:Miesiac')[0] != date('m', strtotime($this->JPK['MONTH']))) throw new Exception("Bledny miesiac w deklaracji JPK"); $ewidencjaXpath = '/tns:JPK/tns:Ewidencja'; break; default: throw new Exception("Bledna wersja schemy"); } switch ($this->JPK_wersjaSchemy) { case '1-0': if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0] != "PLN") throw new Exception("Bledna waluta deklaracji JPK"); if (trim(str_replace('-', '', $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:NIP')[0])) != trim(str_replace('-', '', $this->BO['nip']))) throw new Exception("Niezgodny NIP podmiotu w deklaracji JPK"); break; case '1-1': if (trim(str_replace('-', '', $xml->xpath('/tns:JPK/tns:Podmiot1/tns:NIP')[0])) != trim(str_replace('-', '', $this->BO['nip']))) throw new Exception("Niezgodny NIP podmiotu w deklaracji JPK"); if (!$xml->Podmiot1->Email) unset($xml->Podmiot1->Email); break; case '1-2E': case '1-0E': if (trim(str_replace('-', '', $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:NIP')[0])) != trim(str_replace('-', '', $this->BO['nip']))) throw new Exception("Niezgodny NIP podmiotu w deklaracji JPK"); if (!$xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:Email')) throw new Exception("Brak adresu email"); break; } $summaryJPK_VAT = $this->getSummaryJPK_VAT($xml); if ($summaryJPK_VAT["LiczbaWierszySprzedazy"]) { if ($xml->xpath($ewidencjaXpath . '/tns:SprzedazCtrl/tns:LiczbaWierszySprzedazy')[0] != $summaryJPK_VAT["LiczbaWierszySprzedazy"]) throw new Exception("Brak spójności liczby wierszy sprzedaży w deklaracji JPK"); if (((float) $xml->xpath($ewidencjaXpath . '/tns:SprzedazCtrl/tns:PodatekNalezny')[0]) != $summaryJPK_VAT["PodatekNalezny"]) throw new Exception("Brak spójności wartości podatku należnego w deklaracji JPK"); } if ($summaryJPK_VAT["LiczbaWierszyZakupow"]) { if ($xml->xpath($ewidencjaXpath . '/tns:ZakupCtrl/tns:LiczbaWierszyZakupow')[0] != $summaryJPK_VAT["LiczbaWierszyZakupow"]) throw new Exception("Brak spójności liczby wierszy zakupów w deklaracji JPK"); if (((float) $xml->xpath($ewidencjaXpath . '/tns:ZakupCtrl/tns:PodatekNaliczony')[0]) != $summaryJPK_VAT["PodatekNaliczony"]) throw new Exception("Brak spójności wartości podatku naliczonego w deklaracji JPK"); } set_error_handler(function ($errno, $errstr, $errfile, $errline) { if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0)) throw new DOMException($errstr); else return false; }); try { $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml->asXML()); } catch (Exception $e) { throw new Exception("Błąd parsowania pliku JPK"); } restore_error_handler(); libxml_use_internal_errors(true); if (!$dom->schemaValidate(APP_PATH_SCHEMA . "/jpk/" . $this->xsd[$kodSystemowy])) { $errors = ''; foreach (libxml_get_errors() as $libxml_error) $errors .= "
{$libxml_error->message}"; throw new Exception("Plik JPK niezgodny ze schematem XSD{$errors}
" . htmlentities($dom->saveXML()) . "
"); } $xml = simplexml_load_string($dom->saveXML()); } private function upload_insert_jpk() { try { if ($_FILES['IN_INSERT']['type'] != "text/xml") throw new Exception("Błędny plik JPK"); $xml = simplexml_load_file($_FILES['IN_INSERT']['tmp_name']); $this->validateJPK_VAT($xml); if ($this->JPK['IN_L1']) $info = "Zaimportowano dane z Insert i L1"; else $info = "Zaimportowano dane z Insert"; $sqlObj = new stdClass(); $sqlObj->ID = $this->JPK['ID']; $sqlObj->A_STATUS_INFO = $info; $sqlObj->IN_INSERT = $xml->asXml(); if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił błąd, prawdopodobnie Ten plik JPK został wgrany już wcześniej"); $this->handleAuth(); $this->edit(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', $e->getMessage()); ?>
JPK['IN_L1']) $info .= " (pozostawiono dane z L1)"; $sqlObj = new stdClass(); $sqlObj->ID = $this->JPK['ID']; $sqlObj->A_STATUS_INFO = $info; $sqlObj->IN_INSERT = null; $sqlObj->OUT_MERGED = null; if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd"); $this->handleAuth(); $this->edit(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', $e->getMessage()); ?>
NIPerrors[] = "NIP: {$nip_orig}, nazwa: {$name}, rodzaj dokumentu: {$type}"; return false; } return true; } private function import_l1_jpk() { switch ($this->JPK_kodSystemowy) { case 'JPK_VAT (2)': $xmlSchema = << JPK_VAT 2 PLN EOT; break; case 'JPK_VAT (3)': $xmlSchema = << JPK_VAT 3 Procesy5 EOT; break; case 'JPK_V7M (1)': $xmlSchema = << JPK_VAT 1 Procesy5 EOT; break; case 'JPK_V7M (2)': $xmlSchema = << JPK_VAT 2 Procesy5 EOT; break; case 'JPK_V7M (3)': $xmlSchema = << JPK_VAT 3 Procesy5 EOT; break; } // bfp.ID_SERVICES -> SERVICES.ID (NAME_LIST_SERVICES: NET, TV, VOIP) $queryFVAT = << 0, concat(bua_tp.P_NAME, if(bua_tp.P_NAME_SECOND='','',concat(' ',bua_tp.P_NAME_SECOND))), concat(bua.P_NAME, if(bua.P_NAME_SECOND='','',concat(' ',bua.P_NAME_SECOND)))) AS NazwaKontrahenta, if (bu.TAXPAYER_ID_BILLING_USERS > 0, concat(bua_tp.P_ADDRESS_STREET,' ',bua_tp.P_ADDRESS_HOUSE, if(bua_tp.P_ADDRESS_HOME='','',concat('/',bua_tp.P_ADDRESS_HOME)),', ',bua_tp.P_ADDRESS_POST_CODE,' ',bua_tp.P_ADDRESS_CITY), concat(bua.P_ADDRESS_STREET,' ',bua.P_ADDRESS_HOUSE, if(bua.P_ADDRESS_HOME='','',concat('/',bua.P_ADDRESS_HOME)),', ',bua.P_ADDRESS_POST_CODE,' ',bua.P_ADDRESS_CITY)) AS AdresKontrahenta, bf.SELL_DATE AS 'DataWystawienia', concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy', if (bu.TAXPAYER_ID_BILLING_USERS > 0, if(bua_tp.is_firma=0,'Brak',coalesce(bua_tp.P_NIP,'')), if(bua.is_firma=0,'Brak',coalesce(bua.P_NIP,''))) AS 'NrKontrahenta', coalesce(ls.EE, 0) as EE, bua.PODMIOT_POWIAZANY as TP, round(bfp.AMMOUNT * bfp.PRICE, 2) as Netto, round(round(bfp.AMMOUNT * bfp.PRICE, 2) * bfp.VAT/100, 2) as VAT, bfp.VAT_NAME as 'VAT_NAME' from BILLING_NUMBERS bn join BILLS_FVAT bf on bn.ID=bf.ID_BILLING_NUMBERS join BILLS_FVAT_POS bfp on bf.ID=bfp.ID_BILLS_FVAT join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS left join BILLING_USERS_ADD bua_tp on bu.TAXPAYER_ID_BILLING_USERS = bua_tp.id_users left join SERVICES s on bfp.ID_SERVICES = s.ID left join LIST_SERVICES ls on s.NAME_LIST_SERVICES = ls.name where bn.ID_BILLING_NUMBERS_TYPE='1' and bf.BILL_DATE like '{$this->JPK['MONTH']}%' and bu.BILLING_OWNER='{$this->BO['ID']}' order by bf.BILL_DATE,bn.ID EOT; // bkp.ID_SERVICES -> -> SERVICES.ID (NAME_LIST_SERVICES: NET, TV, VOIP) $queryKORV = << 0, concat(bua_tp.P_NAME, if(bua_tp.P_NAME_SECOND='','',concat(' ',bua_tp.P_NAME_SECOND))), concat(bua.P_NAME, if(bua.P_NAME_SECOND='','',concat(' ',bua.P_NAME_SECOND)))) AS NazwaKontrahenta, if (bu.TAXPAYER_ID_BILLING_USERS > 0, concat(bua_tp.P_ADDRESS_STREET,' ',bua_tp.P_ADDRESS_HOUSE, if(bua_tp.P_ADDRESS_HOME='','',concat('/',bua_tp.P_ADDRESS_HOME)),', ',bua_tp.P_ADDRESS_POST_CODE,' ',bua_tp.P_ADDRESS_CITY), concat(bua.P_ADDRESS_STREET,' ',bua.P_ADDRESS_HOUSE, if(bua.P_ADDRESS_HOME='','',concat('/',bua.P_ADDRESS_HOME)),', ',bua.P_ADDRESS_POST_CODE,' ',bua.P_ADDRESS_CITY)) AS AdresKontrahenta, bk.BILL_DATE AS 'DataWystawienia', bk.SELL_DATE AS 'DataSprzedazy', concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy', if (bu.TAXPAYER_ID_BILLING_USERS > 0, if(bua_tp.is_firma=0,'Brak',coalesce(bua_tp.P_NIP,'')), if(bua.is_firma=0,'Brak',coalesce(bua.P_NIP,''))) AS 'NrKontrahenta', coalesce(ls.EE) as EE, bua.PODMIOT_POWIAZANY as TP, bkp.AMMOUNT AS AMMOUNT, bkp.PRICE AS PRICE, bkp.VAT AS VAT, bkp.VAT_NAME AS VAT_NAME, bkp.N_AMMOUNT AS N_AMMOUNT, bkp.N_PRICE AS N_PRICE, bkp.N_VAT AS N_VAT, bkp.N_VAT_NAME AS N_VAT_NAME, bkp.TYP_KOREKTY AS TYP_KOREKTY from BILLING_NUMBERS bn join BILLS_KORV bk on bn.ID=bk.ID_BILLING_NUMBERS join BILLS_KORV_POS bkp on bk.ID=bkp.ID_BILLS_FVAT join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS left join BILLING_USERS_ADD bua_tp on bu.TAXPAYER_ID_BILLING_USERS = bua_tp.id_users left join SERVICES s on bkp.ID_SERVICES = s.ID left join LIST_SERVICES ls on s.NAME_LIST_SERVICES = ls.name where bn.ID_BILLING_NUMBERS_TYPE='3' and bk.BILL_DATE like '{$this->JPK['MONTH']}%' and bkp.TYP_KOREKTY IS NOT NULL and bu.BILLING_OWNER='{$this->BO['ID']}' order by bk.BILL_DATE,bn.ID EOT; $xmlVAT = [ 'ZW' => ['netto' => ['K_10']], '0' => ['netto' => ['K_13']], '7' => ['netto' => ['K_17'], 'vat' => 'K_18'], '8' => ['netto' => ['K_17'], 'vat' => 'K_18'], '22' => ['netto' => ['K_19'], 'vat' => 'K_20'], '23' => ['netto' => ['K_19'], 'vat' => 'K_20'], 'OO UE' => ['netto' => ['K_11', 'K_12']], ]; try { if (DB::getPDO(931)->fetchValue("select sum(c) from (select count(*) as c from BILLS_FVAT where OPEN='y' union select count(*) as c from BILLS_KORV where OPEN='y') as c;")) { throw new Exception("wykryto niezamknięte faktury lub korekty faktur"); } $xml = new SimpleXMLElement($xmlSchema); $ns = $xml->getNamespaces(true); $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE']; $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s"); if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') { $xml->Naglowek->DataOd = $this->JPK['MONTH'] . "-01"; $xml->Naglowek->DataDo = date("Y-m-d", strtotime($xml->Naglowek->DataOd . "+ 1 month - 1 day")); } elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') { $xml->Naglowek->Rok = date('Y', strtotime($this->JPK['MONTH'])); $xml->Naglowek->Miesiac = date('m', strtotime($this->JPK['MONTH'])); } $mailRegex = '/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD'; if ($this->JPK_wersjaSchemy == '1-0') { if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego"); if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP"); if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu"); if ($this->BO['name2']) $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa .= " " . $this->BO['name2']; if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON = $this->BO['regon'])) unset($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON); if (!($xml->Podmiot1->AdresPodmiotu->KodKraju = $this->BO['kodKraju'])) throw new Exception("blędne dane podmiotu - brak kodu kraju"); if (!($xml->Podmiot1->AdresPodmiotu->Wojewodztwo = $this->BO['wojewodztwo'])) unset($xml->Podmiot1->AdresPodmiotu->Wojewodztwo); if (!($xml->Podmiot1->AdresPodmiotu->Powiat = $this->BO['powiat'])) unset($xml->Podmiot1->AdresPodmiotu->Powiat); if (!($xml->Podmiot1->AdresPodmiotu->Gmina = $this->BO['gmina'])) unset($xml->Podmiot1->AdresPodmiotu->Gmina); if (!($xml->Podmiot1->AdresPodmiotu->Ulica = $this->BO['ulica'])) unset($xml->Podmiot1->AdresPodmiotu->Ulica); if (!($xml->Podmiot1->AdresPodmiotu->NrDomu = $this->BO['numer_dom'])) unset($xml->Podmiot1->AdresPodmiotu->NrDomu); if (!($xml->Podmiot1->AdresPodmiotu->NrLokalu = $this->BO['numer_pos'])) unset($xml->Podmiot1->AdresPodmiotu->NrLokalu); if (!($xml->Podmiot1->AdresPodmiotu->Miejscowosc = $this->BO['miasto'])) throw new Exception("blędne dane podmiotu - brak nazwy miejscowości"); if (!($xml->Podmiot1->AdresPodmiotu->KodPocztowy = $this->BO['kod'])) unset($xml->Podmiot1->AdresPodmiotu->KodPocztowy); if (!($xml->Podmiot1->AdresPodmiotu->Poczta = $this->BO['poczta'])) unset($xml->Podmiot1->AdresPodmiotu->Poczta); $ewidencja = $xml; } elseif ($this->JPK_wersjaSchemy == '1-1') { if (!($xml->Podmiot1->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP"); if (!($xml->Podmiot1->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu"); if (preg_match($mailRegex, $this->BO['BILLING_OWNER_EMAIL'])) $xml->Podmiot1->Email = $this->BO['BILLING_OWNER_EMAIL']; else unset($xml->Podmiot1->Email); $ewidencja = $xml; } elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') { if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego"); if (!($xml->Podmiot1->OsobaNiefizyczna->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP"); if (!($xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu"); if (preg_match($mailRegex, $this->BO['BILLING_OWNER_EMAIL'])) $xml->Podmiot1->OsobaNiefizyczna->Email = $this->BO['BILLING_OWNER_EMAIL']; else throw new Exception("błędne dane podmiotu - brak luk błędny adres email"); $ewidencja = $xml->addChild('Ewidencja'); } $data = array(); $allVAT = 0; $result = DB::getPDO(931)->fetchall($queryFVAT); foreach ($result as $row) { $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta'])); $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta']; if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') { $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta']; } $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy']; $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia']; if ($this->JPK_kodSystemowy == 'JPK_V7M (3)') $data[$row['BN_ID']][0]['BFK'] = 1; if ($this->JPK_wersjaSchemy == '1-2E') { if ($row['EE']) $data[$row['BN_ID']][0]['EE'] += $row['EE']; if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP']; } elseif ($this->JPK_wersjaSchemy == '1-0E') { // if ($row['EE']) $data[$row['BN_ID']][0]['WSTO_EE'] += $row['EE']; if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP']; } if (!in_array($row['VAT_NAME'],array_keys($xmlVAT))) throw new Exception("Problem ze stawką VAT (1) - {$row['VAT_NAME']}"); foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += $row['Netto']; if ($row['VAT'] > 0) { if (!isset($xmlVAT[$row['VAT_NAME']]['vat'])) throw new Exception("Problem ze stawką VAT (2) - {$row['VAT_NAME']}"); $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += $row['VAT']; $allVAT += $row['VAT']; } } $result = DB::getPDO(931)->fetchall($queryKORV); foreach ($result as $row) { $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta'])); $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta']; if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') { $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta']; } $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy']; $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia']; $data[$row['BN_ID']][0]['DataSprzedazy'] = $row['DataSprzedazy']; if ($this->JPK_kodSystemowy == 'JPK_V7M (3)') $data[$row['BN_ID']][0]['BFK'] = 1; if ($this->JPK_wersjaSchemy == '1-2E') { if ($row['EE']) $data[$row['BN_ID']][0]['EE'] += $row['EE']; if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP']; } elseif ($this->JPK_wersjaSchemy == '1-0E') { // if ($row['EE']) $data[$row['BN_ID']][0]['WSTO_EE'] += $row['EE']; if ($row['TP']) $data[$row['BN_ID']][0]['TP'] += $row['TP']; } if (!(in_array($row['VAT_NAME'], array_keys($xmlVAT)) && in_array($row['N_VAT_NAME'], array_keys($xmlVAT)))) throw new Exception("Problem ze stawką VAT (3) - {$row['VAT_NAME']}"); if ((($row['VAT'] > 0) && !(isset($xmlVAT[$row['VAT_NAME']]['vat']))) || (($row['N_VAT'] > 0) && !(isset($xmlVAT[$row['N_VAT_NAME']]['vat'])))) throw new Exception("Problem ze stawką VAT (4) - {$row['VAT_NAME']}"); if ($row['VAT_NAME'] == $row['N_VAT_NAME']) { foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += round($row['AMMOUNT']*$row['PRICE'],2); if ($row['VAT'] > 0) { $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2); $allVAT += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2); } } else { foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += round($row['N_AMMOUNT']*$row['N_PRICE'],2) + round($row['AMMOUNT']*$row['PRICE'],2); foreach ($xmlVAT[$row['N_VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] -= round($row['N_AMMOUNT']*$row['N_PRICE'],2); if ($row['VAT'] > 0) { $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2) + round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2); $allVAT += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2) + round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2); } if ($row['N_VAT'] > 0) { $data[$row['BN_ID']][1][$xmlVAT[$row['N_VAT_NAME']]['vat']] -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2); $allVAT -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2); } } } ksort($data); $addCdata = function(&$node, $value) { $dom_node = dom_import_simplexml($node); $dom_owner = $dom_node->ownerDocument; $dom_node->appendChild($dom_owner->createCDATASection($value)); }; $i = 0; foreach ($data as $pos) { $this->validateNIP($pos[0]['NrKontrahenta'], $pos[0]['NazwaKontrahenta'], 'Sprzedaż L1'); if (isset($pos[0]['EE'])) $pos[0]['EE'] = 1; if (isset($pos[0]['WSTO_EE'])) $pos[0]['WSTO_EE'] = 1; $x = $ewidencja->addChild('SprzedazWiersz'); if ($this->JPK_wersjaSchemy == '1-0') $x->addAttribute('typ', 'G'); $x->addChild('LpSprzedazy', ++$i); ksort($pos[1]); foreach ($pos as $subpos) foreach ($subpos as $key => $value) { $x->addChild($key, $value); if (!strlen($x->$key)) $addCdata($x->$key, $value); } } if ($this->NIPerrors) throw new Exception("Błędne numery NIP:
" . implode("
", $this->NIPerrors)); $ewidencja->SprzedazCtrl->LiczbaWierszySprzedazy = count($data); $ewidencja->SprzedazCtrl->PodatekNalezny = number_format($allVAT, 2, '.', ''); if ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') { $zakupCtrl = $ewidencja->addChild('ZakupCtrl'); $zakupCtrl->LiczbaWierszyZakupow = '0'; $zakupCtrl->PodatekNaliczony = '0.00'; } $this->validateJPK_VAT($xml); if ($this->JPK['IN_INSERT']) $info = "Zaimportowano dane z Insert i L1"; else $info = "Zaimportowano dane z L1"; $sqlObj = new stdClass(); $sqlObj->ID = $this->JPK['ID']; $sqlObj->A_STATUS_INFO = $info; $sqlObj->IN_L1 = $xml->asXml(); if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych"); $this->handleAuth(); $this->edit(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', "Błąd w trakcie importu danych z L1. {$e->getMessage()}"); ?>
JPK['IN_INSERT']) $info .= " (pozostawiono dane z Insert)"; $sqlObj = new stdClass(); $sqlObj->ID = $this->JPK['ID']; $sqlObj->A_STATUS_INFO = $info; $sqlObj->IN_L1 = null; $sqlObj->OUT_MERGED = null; if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd"); $this->handleAuth(); $this->edit(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', $e->getMessage()); ?>
getNamespaces(true); if (isset($ns[''])) return; if ((!isset($ns['tns']) || isset($ns['xsi']))) throw new Exception("Błędna struktura pliku XML - błędne namespace"); $dom = dom_import_simplexml($xml); $ns_uri = $dom->lookupNamespaceURI('tns'); $dom->removeAttributeNS($ns_uri, 'tns'); $xml->addAttribute('xmlns', $ns['tns']); $xml->addAttribute('xmlns:xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); $xml = simplexml_load_string($xml->asXML()); } private function generate_merged_jpk() { try { if (!($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'])) throw new Exception("Błąd danych"); $xmlInsert = simplexml_load_string($this->JPK['IN_INSERT']); self::removeTnsNamespace($xmlInsert); $xmlL1 = simplexml_load_string($this->JPK['IN_L1']); $kodSystemowy = (string) $xmlInsert->Naglowek->KodFormularza->attributes()['kodSystemowy']; $tns = $this->tns[$kodSystemowy]; switch ($this->JPK_wersjaSchemy) { case '1-0': $xmlSchema = << EOT; break; case '1-1': $xmlSchema = << EOT; break; case '1-2E': $xmlSchema = << EOT; break; case '1-0E': $xmlSchema = << EOT; break; } $xml_append = function(SimpleXMLElement $to, SimpleXMLElement $from) { $toDom = dom_import_simplexml($to); $fromDom = dom_import_simplexml($from); $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true)); }; $xml = simplexml_load_string($xmlSchema); switch (V::get('SRC_PODMIOT','',$_POST)) { case "Insert": $xml_append($xml, $xmlInsert->Naglowek); $xml_append($xml, $xmlInsert->Podmiot1); if ($this->JPK_wersjaSchemy == '1-1' || $this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') { $xml->Naglowek->NazwaSystemu .= "; " . $xmlL1->Naglowek->NazwaSystemu; if ($this->JPK_wersjaSchemy == '1-1' ) { if ((!isset($xml->Podmiot1->Email)) && isset($xmlL1->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlL1->Podmiot1->Email; } } break; case "L1": $xml_append($xml, $xmlL1->Naglowek); $xml_append($xml, $xmlL1->Podmiot1); if ($this->JPK_wersjaSchemy == '1-1' || $this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') { $xml->Naglowek->NazwaSystemu .= "; " . $xmlInsert->Naglowek->NazwaSystemu; if ($this->JPK_wersjaSchemy == '1-1' ) { if ((!isset($xml->Podmiot1->Email)) && isset($xmlInsert->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlInsert->Podmiot1->Email; } } break; default: throw new Exception("Błąd formularza"); } $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s"); $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE']; if ($xmlInsert->Deklaracja) $xml_append($xml, $xmlInsert->Deklaracja); switch ($this->JPK_wersjaSchemy) { case '1-0': case '1-1': $ewidencja = $xml; $ewidencjaInsert = $xmlInsert; $ewidencjaL1 = $xmlL1; $ctrl = false; break; case '1-2E': case '1-0E': $ewidencja = $xml->addChild("Ewidencja"); $ewidencjaInsert = simplexml_load_string($xmlInsert->Ewidencja->asXml()); $ewidencjaL1 = simplexml_load_string($xmlL1->Ewidencja->asXml()); $ctrl = true; break; } $si = 0; foreach ($ewidencjaInsert->SprzedazWiersz as $sprzedazWiersz) { $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż Insert"); $sprzedazWiersz->LpSprzedazy = ++$si; $xml_append($ewidencja, $sprzedazWiersz); } foreach ($ewidencjaL1->SprzedazWiersz as $sprzedazWiersz) { $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż L1"); $sprzedazWiersz->LpSprzedazy = ++$si; $xml_append($ewidencja, $sprzedazWiersz); } if ($si || $ctrl) $ewidencja->addChild("SprzedazCtrl"); $zi = 0; foreach ($ewidencjaInsert->ZakupWiersz as $zakupWiersz) { $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup Insert"); $zakupWiersz->LpZakupu = ++$zi; $xml_append($ewidencja, $zakupWiersz); } foreach ($ewidencjaL1->ZakupWiersz as $zakupWiersz) { $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup L1"); $zakupWiersz->LpZakupu = ++$zi; $xml_append($ewidencja, $zakupWiersz); } if ($zi || $ctrl) $ewidencja->addChild("ZakupCtrl"); if ($this->NIPerrors) throw new Exception("Błędne numery NIP:
" . implode("
", $this->NIPerrors)); $sumaryJPK_VAT = $this->getSummaryJPK_VAT($xml); if ($si || $ctrl) { $ewidencja->SprzedazCtrl->LiczbaWierszySprzedazy = $sumaryJPK_VAT['LiczbaWierszySprzedazy']; $ewidencja->SprzedazCtrl->PodatekNalezny = $sumaryJPK_VAT['PodatekNalezny']; } if ($zi || $ctrl) { $ewidencja->ZakupCtrl->LiczbaWierszyZakupow = $sumaryJPK_VAT['LiczbaWierszyZakupow']; $ewidencja->ZakupCtrl->PodatekNaliczony = $sumaryJPK_VAT['PodatekNaliczony']; } $this->validateJPK_VAT($xml); $sqlObj = new stdClass(); $sqlObj->ID = $this->JPK['ID']; $sqlObj->A_STATUS_INFO = "Wygenerowano wynikowy plik JPK"; $sqlObj->OUT_MERGED = $xml->asXml(); if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych"); $this->handleAuth(); $this->edit(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', $e->getMessage()); ?>
ID = $this->JPK['ID']; $sqlObj->A_STATUS = 'OFF_HARD'; $sqlObj->A_STATUS_INFO = "Zamknięto deklarację JPK"; if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych"); $this->handleAuth(); $this->show(); } catch (Exception $e) { SE_Layout::gora(); SE_Layout::menu(); SE_Layout::alert('danger', $e->getMessage()); ?>
ID = $this->JPK['ID']; $sqlObj->A_STATUS = 'WAITING'; $sqlObj->A_STATUS_INFO = "Oczekuje na inicjalizację"; $sqlObj->MONTH = "NULL"; $sqlObj->PURPOSE = "NULL"; DB::getDB()->UPDATE_OBJ('JPK', $sqlObj); $this->initialize(); } public function defaultAction() { switch ($this->JPK['A_STATUS']) { case "WAITING": $this->initialize(); break; case "NORMAL": $this->edit(); break; case "OFF_HARD": $this->show(); break; default: SE_Layout::alert('danger', "Błędny status rekordu."); } } }