JPK.php 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('ProcesHelper');
  4. class Route_UrlAction_JPK extends RouteBase {
  5. private $REFERER, $LAST_REFERER;
  6. private $JPK, $BO;
  7. private $NIPerrors = array();
  8. private $JPK_wersjaSchemy = null;
  9. private $tns = [
  10. 'JPK_VAT (2)' => "http://jpk.mf.gov.pl/wzor/2016/10/26/10261/",
  11. 'JPK_VAT (3)' => "http://jpk.mf.gov.pl/wzor/2017/11/13/1113/",
  12. 'JPK_V7M (1)' => "http://crd.gov.pl/wzor/2020/05/08/9393/",
  13. 'JPK_V7K (1)' => "http://crd.gov.pl/wzor/2020/05/08/9394/",
  14. 'JPK_V7M (2)' => "http://crd.gov.pl/wzor/2021/12/27/11148/",
  15. 'JPK_V7K (2)' => "http://crd.gov.pl/wzor/2021/12/27/11149/",
  16. ];
  17. private $JPK_Wariant = [
  18. '1-0' => 2,
  19. '1-1' => 3,
  20. '1-2E' => 1,
  21. '1-0E' => 2,
  22. ];
  23. private $kodySystemowe = [
  24. 'JPK_VAT (2)' => '1-0',
  25. 'JPK_VAT (3)' => '1-1',
  26. 'JPK_V7M (1)' => '1-2E',
  27. 'JPK_V7K (1)' => '1-2E',
  28. 'JPK_V7M (2)' => '1-0E',
  29. 'JPK_V7K (2)' => '1-0E',
  30. ];
  31. private $xsd = [
  32. 'JPK_VAT (2)' => 'Schemat_JPK_VAT(2)_v1-0.xsd',
  33. 'JPK_VAT (3)' => 'Schemat_JPK_VAT(3)_v1-1.xsd',
  34. 'JPK_V7M (1)' => 'Schemat_JPK_V7M(1)_v1-2E.xsd',
  35. 'JPK_V7K (1)' => 'Schemat_JPK_V7K(1)_v1-2E.xsd',
  36. 'JPK_V7M (2)' => 'Schemat_JPK_V7M(2)_v1-0E.xsd',
  37. 'JPK_V7K (2)' => 'Schemat_JPK_V7K(2)_v1-0E.xsd',
  38. ];
  39. public function handleAuth() {
  40. if (!User::logged()) {
  41. throw new HttpException('Unauthorized', 401);
  42. }
  43. $this->LAST_REFERER = $_SERVER['HTTP_REFERER'];
  44. if (($this->REFERER=V::get('REFERER','',$_POST))=='') $this->REFERER = $_SERVER['HTTP_REFERER'];
  45. try {
  46. if (!($ID_JPK = V::get('ID_JPK',0,$_GET,'int'))) throw new Exception("Błąd parametru");
  47. if ($result = DB::getPDO()->fetchall("select * from JPK where ID='{$ID_JPK}'")) $this->JPK = $result[0];
  48. else throw new Exception("Dostęp zabroniony");
  49. if ($result = DB::getPDO()->fetchall("select * from BILLING_OWNER where ID='{$this->JPK['ID_BILLING_OWNER']}'")) $this->BO = $result[0];
  50. else throw new Exception("Błąd spójności danych");
  51. if ($this->JPK['A_STATUS'] != 'WAITING') {
  52. if (!$this->JPK['MONTH']) throw new Exception("Błąd daty w rekordzie JPK_VAT");
  53. $this->JPK_wersjaSchemy = self::getWersjaSchemy($this->JPK['MONTH']);
  54. }
  55. } catch (Exception $e) {
  56. SE_Layout::gora();
  57. SE_Layout::menu();
  58. SE_Layout::alert('danger',$e->getMessage());
  59. ?>
  60. <div class="container" style="text-align:center">
  61. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  62. </div>
  63. <?php
  64. SE_Layout::dol();
  65. die();
  66. }
  67. }
  68. private static function getWersjaSchemy($month) {
  69. $_year = date("Y", strtotime($month));
  70. $_month = date("m", strtotime($month));
  71. if ($_year < 2018) return '1-0';
  72. elseif ($_year < 2020 || ($_year == 2020 && $_month < 10)) return '1-1';
  73. elseif ($_year < 2022) return '1-2E';
  74. else return '1-0E';
  75. }
  76. private function initialize() {
  77. SE_Layout::gora();
  78. SE_Layout::menu();
  79. try {
  80. if (V::get('action','',$_POST) == 'initialize') {
  81. $month = V::get('MONTH','',$_POST);
  82. $purpose = V::get('PURPOSE','',$_POST);
  83. if (!preg_match("/^[[:digit:]]{4}-[[:digit:]]{2}$/",$month)) throw new Exception("błędny format daty (YYYY-MM)");
  84. switch ($purpose) {
  85. case "1":
  86. $lastMonth = DB::getPDO()->fetchValue("select max(MONTH) from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}'
  87. and (((MONTH < '2018-01' or MONTH >= '2020-10') and PURPOSE='1') or (MONTH >= '2018-01' and MONTH < '2020-10' and PURPOSE = '0'))");
  88. if (strtotime($month) <= strtotime($lastMonth)) throw new Exception("błędny miesiąc (deklaracja z tego okresu lub późniejszego już istnieje)");
  89. break;
  90. case "2":
  91. $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}'
  92. and (((MONTH < '2018-01' or MONTH >= '2020-10') and PURPOSE='1') or (MONTH >= '2018-01' and MONTH < '2020-10' and PURPOSE = 0))");
  93. if (!$JPKexists) throw new Exception("brak deklaracji z tego okresu - nie ma czego korygować");
  94. break;
  95. default:
  96. throw new Exception("błędne określenie celu złożenia deklaracji");
  97. }
  98. if (self::getWersjaSchemy($month) == '1-1') {
  99. if ($purpose == 1) $purpose = (int) 0;
  100. 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}'");
  101. }
  102. $sqlObj = new stdClass();
  103. $sqlObj->ID = $this->JPK['ID'];
  104. $sqlObj->A_STATUS = 'NORMAL';
  105. $sqlObj->A_STATUS_INFO = 'W trakcie tworzenia';
  106. $sqlObj->MONTH = $month;
  107. $sqlObj->PURPOSE = $purpose;
  108. $affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
  109. if ($affected) {
  110. SE_Layout::alert('success','Pomyślnie zainicjalizowano deklarację JPK.');
  111. ?>
  112. <div class="container" style="text-align:center">
  113. <form method="post">
  114. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  115. <button type="submit" class="btn btn-primary">Edytuj</button>
  116. <a href="<?=$this->REFERER?>" class="btn btn-default">Powrót</a>
  117. </form>
  118. </div>
  119. <?php
  120. }
  121. else {
  122. SE_Layout::alert('warning','Wystąpił nieznany błąd podczas inicjalizowania deklaracji JPK.');
  123. ?>
  124. <div class="container" style="text-align:center">
  125. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  126. </div>
  127. <?php
  128. }
  129. } else {
  130. $month = date('Y-m', strtotime('-1 month'));
  131. ?>
  132. <div class="container" style="margin-top:20px">
  133. <form class="form-horizontal" method="post">
  134. <legend>Inicjalizacja deklaracji JPK</legend>
  135. <div class="form-group">
  136. <label class="col-sm-3 control-label">Operator</label>
  137. <div class="col-sm-9" style="margin-top:7px;"><?=$this->BO['name1']?></div>
  138. </div>
  139. <div class="form-group">
  140. <label class="col-sm-3 control-label">Typ JPK</label>
  141. <div class="col-sm-9" style="margin-top:7px;"><?=$this->JPK['TYPE']?></div>
  142. </div>
  143. <div class="form-group">
  144. <label class="col-sm-3 control-label">Miesiąc, którego dotyczy deklaracja</label>
  145. <div class="col-sm-2">
  146. <div class="input-group">
  147. <input type="text" id="MONTH" class="form-control se_type-date" name="MONTH" value="<?=$month?>" max="<?=$month?>" maxlength="7"/>
  148. <span class="input-group-addon">
  149. <span class="glyphicon glyphicon-calendar"/>
  150. </span>
  151. </input>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="form-group">
  156. <label class="col-sm-3 control-label">Cel złożenia deklaracji za dany okres</label>
  157. <div class="col-sm-3">
  158. <select class="form-control" name="PURPOSE">
  159. <option value="1">Złożenie po raz pierwszy</option>
  160. <option value="2">Korekta</option>
  161. </select>
  162. </div>
  163. </div>
  164. <div class="form-group">
  165. <div class="col-sm-offset-3 col-sm-9">
  166. <button type="submit" class="btn btn-primary" name="action" value="initialize">Zapisz</button>
  167. <a href="<?=$this->REFERER?>" class="btn btn-default">Anuluj</a>
  168. </div>
  169. </div>
  170. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  171. </form>
  172. </div>
  173. <script>
  174. jQuery(document.getElementById('MONTH')).parent().datetimepicker({
  175. format: 'YYYY-MM'
  176. , locale: 'pl'
  177. , showTodayButton: false
  178. , minDate: '2017-01-01'
  179. , maxDate: '<?=date("Y-m", strtotime("-1 month"))?>-28'
  180. });
  181. </script>
  182. <?php
  183. }
  184. } catch (Exception $e) {
  185. SE_Layout::alert('danger', "Wystąpił problem z inicjalizacją deklaracji JPK - " . $e->getMessage());
  186. ?>
  187. <div class="container" style="text-align:center">
  188. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  189. </div>
  190. <?php
  191. }
  192. SE_Layout::dol();
  193. }
  194. private $fieldsDescrJPK_VAT = [
  195. '1-0' => [
  196. "KodFormularza" => "Kod formularza",
  197. "kodSystemowy" => "Kod systemowy",
  198. "WariantFormularza" => "Wariant formularza",
  199. "CelZlozenia" => "Cel złożenia",
  200. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  201. "DataOd" => "Data od",
  202. "DataDo" => "Data do",
  203. "DomyslnyKodWaluty" => "Waluta",
  204. "KodUrzedu" => "Kod urzędu skarbowego",
  205. "NIP" => "NIP",
  206. "PelnaNazwa" => "Nazwa podmiotu",
  207. "REGON" => "Regon",
  208. "KodKraju" => "Kod kraju",
  209. "Wojewodztwo" => "Województwo",
  210. "Powiat" => "Powiat",
  211. "Gmina" => "Gmina",
  212. "Miejscowosc" => "Miejscowość",
  213. "Ulica" => "Ulica",
  214. "NrDomu" => "Nr domu",
  215. "NrLokalu" => "Nr lokalu",
  216. "KodPocztowy" => "Kod pocztowy",
  217. "Poczta" => "Poczta",
  218. "LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
  219. "PodatekNalezny" => "Podatek należny",
  220. "LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
  221. "PodatekNaliczony" => "Podatek naliczony",
  222. ],
  223. '1-1' => [
  224. "KodFormularza" => "Kod formularza",
  225. "kodSystemowy" => "Kod systemowy",
  226. "WariantFormularza" => "Wariant formularza",
  227. "CelZlozenia" => "Cel złożenia",
  228. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  229. "DataOd" => "Data od",
  230. "DataDo" => "Data do",
  231. "NazwaSystemu" => "Nazwa systemu",
  232. "NIP" => "NIP",
  233. "PelnaNazwa" => "Nazwa podmiotu",
  234. "Email" => "Adres email",
  235. "LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
  236. "PodatekNalezny" => "Podatek należny",
  237. "LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
  238. "PodatekNaliczony" => "Podatek naliczony",
  239. ],
  240. '1-2E' => [
  241. "KodFormularza" => "Kod formularza",
  242. "kodSystemowy" => "Kod systemowy",
  243. "WariantFormularza" => "Wariant formularza",
  244. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  245. "NazwaSystemu" => "Nazwa systemu",
  246. "CelZlozenia" => "Cel złożenia",
  247. "KodUrzedu" => "Kod urzędu",
  248. "Rok" => "Rok",
  249. "Miesiac" => "Miesiąc",
  250. "NIP" => "NIP",
  251. "PelnaNazwa" => "Pełna nazwa",
  252. "Email" => "Adres email",
  253. "Deklaracja" => "Deklaracja VAT",
  254. "P_38" => "Deklaracja - Podatek należny",
  255. "P_48-P_39" => "Deklaracja - Podatek naliczony<br/>(pomniejszony o nadwyżkę z poprzedniej deklaracji)",
  256. "LiczbaWierszySprzedazy" => "Ewidencja - Liczba dokumenów sprzedaży",
  257. "PodatekNalezny" => "Ewidencja - Podatek należny",
  258. "LiczbaWierszyZakupow" => "Ewidencja - Liczba dokumentów zakupu",
  259. "PodatekNaliczony" => "Ewidencja - Podatek naliczony",
  260. ],
  261. '1-0E' => [
  262. "KodFormularza" => "Kod formularza",
  263. "kodSystemowy" => "Kod systemowy",
  264. "WariantFormularza" => "Wariant formularza",
  265. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  266. "NazwaSystemu" => "Nazwa systemu",
  267. "CelZlozenia" => "Cel złożenia",
  268. "KodUrzedu" => "Kod urzędu",
  269. "Rok" => "Rok",
  270. "Miesiac" => "Miesiąc",
  271. "NIP" => "NIP",
  272. "PelnaNazwa" => "Pełna nazwa",
  273. "Email" => "Adres email",
  274. "Deklaracja" => "Deklaracja VAT",
  275. "P_38" => "Deklaracja - Podatek należny",
  276. "P_48-P_39" => "Deklaracja - Podatek naliczony<br/>(pomniejszony o nadwyżkę z poprzedniej deklaracji)",
  277. "LiczbaWierszySprzedazy" => "Ewidencja - Liczba dokumenów sprzedaży",
  278. "PodatekNalezny" => "Ewidencja - Podatek należny",
  279. "LiczbaWierszyZakupow" => "Ewidencja - Liczba dokumentów zakupu",
  280. "PodatekNaliczony" => "Ewidencja - Podatek naliczony",
  281. ],
  282. ];
  283. private static function getNamespaces($xml) {
  284. $ns = $xml->getNamespaces(true);
  285. if (!isset($ns['tns'])) {
  286. if (isset($ns[''])) {
  287. $ns['tns'] = $ns[''];
  288. unset($ns['']);
  289. } else throw new Exception('Błędna struktura namespace');
  290. }
  291. foreach ($ns as $k => $v) $xml->registerXPathNamespace($k, $v);
  292. return $ns;
  293. }
  294. private function showJPK_VAT($xml) {
  295. $ns = self::getNamespaces($xml);
  296. $summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  297. $result['KodFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0];
  298. $result['kodSystemowy'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza/@kodSystemowy')[0];
  299. $result['WariantFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0];
  300. $result['CelZlozenia'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0];
  301. $result['DataWytworzeniaJPK'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataWytworzeniaJPK')[0];
  302. if ($this->JPK_wersjaSchemy == '1-0') {
  303. $result['DataOd'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0];
  304. $result['DataDo'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0];
  305. $result['DomyslnyKodWaluty'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0];
  306. $result['KodUrzedu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodUrzedu')[0];
  307. $result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:NIP')[0];
  308. $result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:PelnaNazwa')[0];
  309. $result['REGON'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:REGON')[0];
  310. $result['KodKraju'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodKraju')[0];
  311. $result['Wojewodztwo'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Wojewodztwo')[0];
  312. $result['Powiat'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Powiat')[0];
  313. $result['Gmina'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Gmina')[0];
  314. $result['Ulica'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Ulica')[0];
  315. $result['NrDomu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrDomu')[0];
  316. $result['NrLokalu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrLokalu')[0];
  317. $result['Miejscowosc'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Miejscowosc')[0];
  318. $result['KodPocztowy'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodPocztowy')[0];
  319. $result['Poczta'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Poczta')[0];
  320. $result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ?: "";
  321. $result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
  322. $result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ?: "";
  323. $result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
  324. } elseif ($this->JPK_wersjaSchemy == '1-1') {
  325. $result['DataOd'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0];
  326. $result['DataDo'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0];
  327. $result['NazwaSystemu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:NazwaSystemu')[0];
  328. $result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:NIP')[0];
  329. $result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:PelnaNazwa')[0];
  330. $result['Email'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:Email')[0];
  331. $result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ?: "";
  332. $result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
  333. $result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ?: "";
  334. $result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
  335. } elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  336. $result['KodUrzedu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodUrzedu')[0];
  337. $result['Rok'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:Rok')[0];
  338. $result['Miesiac'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:Miesiac')[0];
  339. $result['NazwaSystemu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:NazwaSystemu')[0];
  340. $result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:NIP')[0];
  341. $result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:PelnaNazwa')[0];
  342. $result['Email'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:Email')[0];
  343. $result['Deklaracja'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? "Tak" : "Nie";
  344. $P_38 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_38')[0];
  345. $P_39 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_39')[0];
  346. $P_48 = (double)$xml->xpath('/tns:JPK/tns:Deklaracja/tns:PozycjeSzczegolowe/tns:P_48')[0];
  347. $P_48_P_39 = round($P_48 - $P_39, 2);
  348. $result['P_38'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? ('<div' . ($P_38 == round($summaryJPK_VAT['PodatekNalezny']) ?: ' style="color:red"') . '>' . number_format($P_38, 2, ',', '.') . '</div>') : '';
  349. $result['P_48-P_39'] = $xml->xpath('/tns:JPK/tns:Deklaracja') ? ('<div' . ($P_48_P_39 == round($summaryJPK_VAT['PodatekNaliczony']) ?: ' style="color:red"') . '>' . number_format($P_48_P_39 , 2, ',', '.') . '</div>') : '';
  350. $result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'];
  351. $result['PodatekNalezny'] = number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.');
  352. $result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'];
  353. $result['PodatekNaliczony'] = number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.');
  354. }
  355. return $result;
  356. }
  357. private function showTable() {
  358. ?>
  359. <div class="form-group">
  360. <div class="col-sm-12">
  361. <table class="table table-bordered table-hover table-striped">
  362. <thead>
  363. <tr style="text-align:center; background-color:lightgray">
  364. <td width="28%"></td>
  365. <td witdh="24%">Insert</td>
  366. <td width="24%">L1
  367. <?php
  368. if ($this->JPK['IN_L1']) {
  369. echo '<br/>' . UI::h('a', [
  370. 'class' => "btn btn-xs btn-default",
  371. 'target' => "_blank",
  372. 'href' => $this->getLink('exportL1JPK', [ 'ID_JPK' => V::get('ID_JPK',0,$_GET,'int') ]),
  373. ], 'Pobierz JPK');
  374. }
  375. ?>
  376. </td>
  377. <td width="24%">Dane wynikowe</td>
  378. </tr>
  379. </thead>
  380. <tbody>
  381. <?php
  382. if ($this->JPK['IN_INSERT']) {
  383. $xmlIN_INSERT = simplexml_load_string($this->JPK['IN_INSERT']);
  384. self::removeTnsNamespace($xmlIN_INSERT);
  385. $IN_INSERT = $this->showJPK_VAT($xmlIN_INSERT);
  386. }
  387. if ($this->JPK['IN_L1']) {
  388. $xmlIN_L1 = simplexml_load_string($this->JPK['IN_L1']);
  389. $IN_L1 = $this->showJPK_VAT($xmlIN_L1);
  390. }
  391. if ($this->JPK['OUT_MERGED']) {
  392. $xmlOUT_MERGED = simplexml_load_string($this->JPK['OUT_MERGED']);
  393. $OUT_MERGED = $this->showJPK_VAT($xmlOUT_MERGED);
  394. }
  395. foreach ($this->fieldsDescrJPK_VAT[$this->JPK_wersjaSchemy] as $fieldKey => $fieldName) {
  396. echo "<tr><td>{$fieldName}</td><td style=\"vertical-align:middle;\">";
  397. if ($this->JPK['IN_INSERT']) echo $IN_INSERT[$fieldKey];
  398. echo '</td><td style="vertical-align:middle;">';
  399. if ($this->JPK['IN_L1']) echo $IN_L1[$fieldKey];
  400. echo '</td><td style="vertical-align:middle;">';
  401. if ($this->JPK['OUT_MERGED']) echo $OUT_MERGED[$fieldKey];
  402. echo "</td></tr>\n";
  403. }
  404. ?>
  405. </tbody>
  406. </table>
  407. </div>
  408. </div>
  409. <?php
  410. }
  411. function exportL1JPKAction() {
  412. if (!$this->JPK['IN_L1']) throw new Exception("Błąd danych - nie pobrano danych JPK z L1");
  413. $xml = simplexml_load_string($this->JPK['IN_L1']);
  414. $ns = $xml->getNamespaces(true);
  415. $this->validateJPK_VAT($xml);
  416. if ($this->JPK_wersjaSchemy == '1-0') $pelnaNazwa = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
  417. elseif ($this->JPK_wersjaSchemy == '1-1') $pelnaNazwa = $xml->Podmiot1->PelnaNazwa;
  418. elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') $pelnaNazwa = $xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa;
  419. $fileName = preg_replace("/[: \.]/", "_", "JPK_VAT_{$this->JPK['MONTH']}_L1_" . str_replace('"', '', $pelnaNazwa)) . ".xml";
  420. $output = $xml->asXml();
  421. header("Content-Type: application/xml");
  422. header("Content-Disposition: attachment; filename={$fileName};");
  423. header("Content-Transfer-Encoding: binary");
  424. header("Content-Length: " . strlen($output));
  425. echo $output;
  426. }
  427. private function show() {
  428. if (V::get('action','',$_POST) == "getJPK") {
  429. try {
  430. if (!$this->JPK['OUT_MERGED']) throw new Exception("Błąd danych - nie wygenerowano wynikowego pliku JPK");
  431. $xml = simplexml_load_string($this->JPK['OUT_MERGED']);
  432. $ns = $xml->getNamespaces(true);
  433. $this->validateJPK_VAT($xml);
  434. if ($this->JPK_wersjaSchemy == '1-0') $pelnaNazwa = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
  435. elseif ($this->JPK_wersjaSchemy == '1-1') $pelnaNazwa = $xml->Podmiot1->PelnaNazwa;
  436. elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') $pelnaNazwa = $xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa;
  437. $fileName = preg_replace("/[: \.]/", "_", "JPK_VAT_{$this->JPK['MONTH']}_" . str_replace('"', '', $pelnaNazwa)) . ".xml";
  438. $output = $xml->asXml();
  439. header("Content-Type: application/xml");
  440. header("Content-Disposition: attachment; filename={$fileName};");
  441. header("Content-Transfer-Encoding: binary");
  442. header("Content-Length: " . strlen($output));
  443. echo $output;
  444. } catch (Exception $e) {
  445. SE_Layout::gora();
  446. SE_Layout::menu();
  447. SE_Layout::alert('danger', $e->getMessage());
  448. ?>
  449. <div class="container" style="text-align:center">
  450. <form method="post" action="<?=$this->LAST_REFERER?>">
  451. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  452. <button type="submit" class="btn btn-primary">Powrót</button>
  453. </form>
  454. </div>
  455. <?php
  456. SE_Layout::dol();
  457. }
  458. } else {
  459. SE_Layout::gora();
  460. SE_Layout::menu();
  461. ?>
  462. <div class="container" style="margin-top:20px">
  463. <form class="form-horizontal" method="post" target="_blank">
  464. <legend>
  465. Podgląd deklaracjii JPK :: <?=$this->JPK['TYPE']?> - <?=$this->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") . ")"?>
  466. <span class="pull-right">
  467. <?=$this->BO['name1']?>
  468. </span>
  469. </legend>
  470. <div class="form-group">
  471. <div class="form-group">
  472. <div class="col-sm-10">
  473. <button type="submit" class="btn-sm btn-primary" name="action" value="getJPK">Pobierz plik JPK</button>
  474. </div>
  475. </div>
  476. <?=$this->showTable();?>
  477. <div class="form-group" style="text-align:center">
  478. <div class="col-sm-12">
  479. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  480. <a href="<?=$this->REFERER?>" class="btn btn-default">Powrót</a>
  481. </div>
  482. </div>
  483. </form>
  484. </div>
  485. <?php
  486. SE_Layout::dol();
  487. }
  488. }
  489. private function edit() {
  490. SE_Layout::gora();
  491. SE_Layout::menu();
  492. ?>
  493. <div class="container" style="margin-top:20px">
  494. <form class="form-horizontal" method="post" enctype="multipart/form-data">
  495. <legend>
  496. Edycja deklaracji JPK :: <?=$this->JPK['TYPE']?> - <?=$this->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").")"?>
  497. <span class="pull-right">
  498. <?=$this->BO['name1']?>
  499. </span>
  500. </legend>
  501. <div class="form-group">
  502. <label class="col-sm-3 control-label"><?=($this->JPK['IN_INSERT'] ? "Usuń dane zaimportowane" : "Dodaj plik JPK")?> z pakietu Insert</label>
  503. <?php
  504. if ($this->JPK['IN_INSERT']) {
  505. ?>
  506. <div class="col-sm-9" style="margin-top:3px;">
  507. <button type="submit" class="btn-xs btn-default" name="action" value="delete_insert_jpk">Usuń</button>
  508. </div>
  509. <?php
  510. } else {
  511. ?>
  512. <div class="col-sm-9" style="margin-top:7px;">
  513. <input type="hidden" name="action" value="upload_insert_jpk"/>
  514. <input type="file" name="IN_INSERT" onchange="javascript:this.form.submit();"/>
  515. </div>
  516. <?php
  517. }
  518. ?>
  519. </div>
  520. <div class="form-group">
  521. <label class="col-sm-3 control-label"><?=($this->JPK['IN_L1'] ? "Usuń" : "Pobierz")?> dane z L1</label>
  522. <div class="col-sm-9" style="margin-top:3px;">
  523. <button type="submit" class="btn-xs btn-default" name="action" value=<?=($this->JPK['IN_L1'] ? '"delete_l1_jpk">Usuń' : '"import_l1_jpk">Pobierz')?></button>
  524. </div>
  525. </div>
  526. <?php
  527. if (!($this->JPK['IN_INSERT'] || $this->JPK['IN_L1'])) {
  528. ?>
  529. <div class="form-group">
  530. <label class="col-sm-3 control-label">Reinicjalizuj deklarację</label>
  531. <div class="col-sm-9" style="margin-top:3px;">
  532. <button type="submit" class="btn-xs btn-default" name="action" value="reinitialize">Reinicjalizuj</button>
  533. </div>
  534. </div>
  535. <?php
  536. }
  537. if ($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'] && (!$this->JPK['OUT_MERGED'])) {
  538. ?>
  539. <div class="form-group">
  540. <label class="col-sm-3 control-label">Importuj dane podmiotu z</label>
  541. <div class="col-sm-9" style="margin-top:3px;">
  542. <input type="radio" name="SRC_PODMIOT" value="Insert" checked> Insert<br/>
  543. <input type="radio" name="SRC_PODMIOT" value="L1"> L1
  544. </div>
  545. </div>
  546. <div class="form-group">
  547. <label class="col-sm-3 control-label">Generuj deklarację wynikową</label>
  548. <div class="col-sm-9" style="margin-top:3px;">
  549. <button type="submit" class="btn-xs btn-default" name="action" value="generate_merged_jpk">Generuj</button>
  550. </div>
  551. </div>
  552. <?php
  553. }
  554. if ($this->JPK['OUT_MERGED']) {
  555. ?>
  556. <div class="form-group">
  557. <label class="col-sm-3 control-label">Zamknij deklarację JPK</label>
  558. <div class="col-sm-9" style="margin-top:3px;">
  559. <button type="submit" class="btn-xs btn-default" name="action" value="close_jpk">Zamknij</button>
  560. <p class="help-block">(tej operacji nie można cofnąć)</p>
  561. </div>
  562. </div>
  563. <?php
  564. }
  565. ?>
  566. <?=$this->showTable()?>
  567. <div class="form-group" style="text-align:center">
  568. <div class="col-sm-12">
  569. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  570. <input type="hidden" name="_task" value="edit">
  571. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  572. </div>
  573. </div>
  574. </form>
  575. </div>
  576. <?php
  577. SE_Layout::dol();
  578. }
  579. public function editAction() {
  580. $allowedActions = array("upload_insert_jpk", "delete_insert_jpk", "import_l1_jpk", "delete_l1_jpk", "generate_merged_jpk", "close_jpk", "reinitialize");
  581. if (in_array(($action = V::get('action','',$_POST)), $allowedActions)) $this->$action();
  582. else {
  583. SE_Layout::gora();
  584. SE_Layout::menu();
  585. SE_Layout::alert('danger', "Wykryto abuse! Wysłano informację do administratora.");
  586. ?>
  587. <div class="container" style="text-align:center">
  588. <form method="post" action="<?=$this->LAST_REFERER?>">
  589. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  590. <button type="submit" class="btn btn-primary">Powrót</button>
  591. </form>
  592. </div>
  593. <?php
  594. SE_Layout::dol();
  595. }
  596. }
  597. private function getSummaryJPK_VAT($xml) {
  598. switch ($this->JPK_wersjaSchemy) {
  599. case '1-0':
  600. case '1-1':
  601. $PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1",
  602. "K_30" => "1", "K_33" => "1", "K_35" => "1", "K_36" => "1", "K_37" => "1", "K_38" => "-1", "K_39" => "-1");
  603. $PodatekNaliczonyFields = array("K_44" => 1, "K_46" => 1, "K_47" => 1, "K_48" => 1, "K_49" => 1, "K_50" => 1);
  604. $Sprzedaz = $xml->SprzedazWiersz;
  605. $Zakup = $xml->ZakupWiersz;
  606. break;
  607. case '1-2E':
  608. case '1-0E':
  609. $PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1",
  610. "K_30" => "1", "K_32" => "1", "K_33" => "1", "K_34" => "1", "K_35" => "-1", "K_36" => "-1");
  611. $PodatekNaliczonyFields = array("K_41" => 1, "K_43" => 1, "K_44" => 1, "K_45" => 1, "K_46" => 1, "K_47" => 1);
  612. $Sprzedaz = $xml->Ewidencja->SprzedazWiersz;
  613. $Zakup = $xml->Ewidencja->ZakupWiersz;
  614. break;
  615. }
  616. $result = array(
  617. "LiczbaWierszySprzedazy" => 0,
  618. "PodatekNalezny" => 0,
  619. "LiczbaWierszyZakupow" => 0,
  620. "PodatekNaliczony" => 0);
  621. foreach ($Sprzedaz as $SprzedazWiersz) {
  622. $result["LiczbaWierszySprzedazy"]++;
  623. if ($SprzedazWiersz->children($tns)->FP) continue;
  624. foreach ($PodatekNaleznyFields as $PodatekNaleznyField => $sign) {
  625. if (isset($SprzedazWiersz->$PodatekNaleznyField)) {
  626. $result["PodatekNalezny"] += round((float) $SprzedazWiersz->$PodatekNaleznyField * $sign, 2);
  627. }
  628. }
  629. }
  630. foreach ($Zakup as $ZakupWiersz) {
  631. foreach ($PodatekNaliczonyFields as $PodatekNaliczonyField => $sign) {
  632. if (isset($ZakupWiersz->$PodatekNaliczonyField)) {
  633. $result["PodatekNaliczony"] += round((float) $ZakupWiersz->$PodatekNaliczonyField * $sign, 2);
  634. }
  635. }
  636. $result["LiczbaWierszyZakupow"]++;
  637. }
  638. $result["PodatekNalezny"] = number_format(round($result["PodatekNalezny"], 2), 2, '.', '');
  639. $result["PodatekNaliczony"] = number_format(round($result["PodatekNaliczony"], 2), 2, '.', '');
  640. return $result;
  641. }
  642. private function validateJPK_VAT(&$xml) {
  643. $ns = self::getNamespaces($xml);
  644. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0] != "JPK_VAT") throw new Exception("Błędny typ deklaracji JPK");
  645. $kodSystemowy = (string) $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza/@kodSystemowy')[0];
  646. if ($this->kodySystemowe[$kodSystemowy] != $this->JPK_wersjaSchemy) throw new Exception("Niewlasciwy kod systemowy deklaracji JPK");
  647. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0] != $this->JPK_Wariant[$this->JPK_wersjaSchemy]) throw new Exception("Błędna wersja deklaracji JPK");
  648. switch ($this->JPK_wersjaSchemy) {
  649. case '1-0':
  650. case '1-2E':
  651. case '1-0E':
  652. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0] != $this->JPK['PURPOSE']) throw new Exception("Niezgodny cel zlozenia deklaracji JPK");
  653. break;
  654. case '1-1':
  655. if (((int) $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0]) xor ((int) $this->JPK['PURPOSE'])) throw new Exception("Niezgodny cel zlozenia deklaracji JPK");
  656. break;
  657. }
  658. switch ($this->JPK_wersjaSchemy) {
  659. case '1-0':
  660. case '1-1':
  661. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0] != ($this->JPK['MONTH'] . "-01")) throw new Exception("Bledna data 'od' deklaracji JPK");
  662. 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");
  663. $ewidencjaXpath = '/tns:JPK';
  664. break;
  665. case '1-2E':
  666. case '1-0E':
  667. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:Rok')[0] != date('Y', strtotime($this->JPK['MONTH']))) throw new Exception("Bledny rok w deklaracji JPK");
  668. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:Miesiac')[0] != date('m', strtotime($this->JPK['MONTH']))) throw new Exception("Bledny miesiac w deklaracji JPK");
  669. $ewidencjaXpath = '/tns:JPK/tns:Ewidencja';
  670. break;
  671. default:
  672. throw new Exception("Bledna wersja schemy");
  673. }
  674. switch ($this->JPK_wersjaSchemy) {
  675. case '1-0':
  676. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0] != "PLN") throw new Exception("Bledna waluta deklaracji JPK");
  677. 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");
  678. break;
  679. case '1-1':
  680. 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");
  681. if (!$xml->Podmiot1->Email) unset($xml->Podmiot1->Email);
  682. break;
  683. case '1-2E':
  684. case '1-0E':
  685. 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");
  686. if (!$xml->xpath('/tns:JPK/tns:Podmiot1/tns:OsobaNiefizyczna/tns:Email')) throw new Exception("Brak adresu email");
  687. break;
  688. }
  689. $summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  690. if ($summaryJPK_VAT["LiczbaWierszySprzedazy"]) {
  691. 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");
  692. 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");
  693. }
  694. if ($summaryJPK_VAT["LiczbaWierszyZakupow"]) {
  695. 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");
  696. 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");
  697. }
  698. set_error_handler(function ($errno, $errstr, $errfile, $errline) {
  699. if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0)) throw new DOMException($errstr);
  700. else return false;
  701. });
  702. try {
  703. $dom = new DOMDocument();
  704. $dom->preserveWhiteSpace = false;
  705. $dom->formatOutput = true;
  706. $dom->loadXML($xml->asXML());
  707. } catch (Exception $e) {
  708. throw new Exception("Błąd parsowania pliku JPK");
  709. }
  710. restore_error_handler();
  711. libxml_use_internal_errors(true);
  712. if (!$dom->schemaValidate(APP_PATH_SCHEMA . "/jpk/" . $this->xsd[$kodSystemowy])) {
  713. $errors = '';
  714. foreach (libxml_get_errors() as $libxml_error) $errors .= "<br/>{$libxml_error->message}";
  715. throw new Exception("Plik JPK niezgodny ze schematem XSD{$errors}<pre>" . htmlentities($dom->saveXML()) . "</pre>");
  716. }
  717. $xml = simplexml_load_string($dom->saveXML());
  718. }
  719. private function upload_insert_jpk() {
  720. try {
  721. if ($_FILES['IN_INSERT']['type'] != "text/xml") throw new Exception("Błędny plik JPK");
  722. $xml = simplexml_load_file($_FILES['IN_INSERT']['tmp_name']);
  723. $this->validateJPK_VAT($xml);
  724. if ($this->JPK['IN_L1']) $info = "Zaimportowano dane z Insert i L1";
  725. else $info = "Zaimportowano dane z Insert";
  726. $sqlObj = new stdClass();
  727. $sqlObj->ID = $this->JPK['ID'];
  728. $sqlObj->A_STATUS_INFO = $info;
  729. $sqlObj->IN_INSERT = $xml->asXml();
  730. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił błąd, prawdopodobnie Ten plik JPK został wgrany już wcześniej");
  731. $this->handleAuth();
  732. $this->edit();
  733. } catch (Exception $e) {
  734. SE_Layout::gora();
  735. SE_Layout::menu();
  736. SE_Layout::alert('danger', $e->getMessage());
  737. ?>
  738. <div class="container" style="text-align:center">
  739. <form method="post" action="<?=$this->LAST_REFERER?>">
  740. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  741. <button type="submit" class="btn btn-primary">Powrót</button>
  742. </form>
  743. </div>
  744. <?php
  745. SE_Layout::dol();
  746. }
  747. }
  748. private function delete_insert_jpk() {
  749. try {
  750. $info = "Usunięto dane z Insert";
  751. if ($this->JPK['IN_L1']) $info .= " (pozostawiono dane z L1)";
  752. $sqlObj = new stdClass();
  753. $sqlObj->ID = $this->JPK['ID'];
  754. $sqlObj->A_STATUS_INFO = $info;
  755. $sqlObj->IN_INSERT = null;
  756. $sqlObj->OUT_MERGED = null;
  757. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
  758. $this->handleAuth();
  759. $this->edit();
  760. } catch (Exception $e) {
  761. SE_Layout::gora();
  762. SE_Layout::menu();
  763. SE_Layout::alert('danger', $e->getMessage());
  764. ?>
  765. <div class="container" style="text-align:center">
  766. <form method="post" action="<?=$this->LAST_REFERER?>">
  767. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  768. <button type="submit" class="btn btn-primary">Powrót</button>
  769. </form>
  770. </div>
  771. <?php
  772. SE_Layout::dol();
  773. }
  774. }
  775. private function validateNIP($nip_orig, $name, $type) {
  776. $nip = str_replace("-", "", trim($nip_orig));
  777. $error = false;
  778. if ($nip == "" || $nip == "Brak") return true;
  779. $prefix = substr($nip, 0, 2);
  780. if (!is_numeric($prefix)) $nip = substr($nip, 2);
  781. else $prefix = null;
  782. if ($prefix && $prefix != "PL") return true;
  783. if (strlen($nip) != 10 || (!is_numeric($nip))) $error = true;
  784. else {
  785. $control = (($nip[0] * 6 + $nip[1] * 5 + $nip[2] * 7 + $nip[3] * 2 + $nip[4] * 3 + $nip[5] * 4 + $nip[6] * 5 + $nip[7] * 6 + $nip[8] * 7) % 11 ) % 10;
  786. $error = ($control != $nip[9]);
  787. }
  788. if ($error) {
  789. $this->NIPerrors[] = "NIP: {$nip_orig}, nazwa: {$name}, rodzaj dokumentu: {$type}";
  790. return false;
  791. }
  792. return true;
  793. }
  794. private function import_l1_jpk() {
  795. switch ($this->JPK_wersjaSchemy) {
  796. case '1-0':
  797. $xmlSchema = <<<EOT
  798. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
  799. <JPK xmlns="{$this->tns['JPK_VAT (2)']}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  800. <Naglowek>
  801. <KodFormularza kodSystemowy="JPK_VAT (2)" wersjaSchemy="1-0">JPK_VAT</KodFormularza>
  802. <WariantFormularza>2</WariantFormularza>
  803. <CelZlozenia></CelZlozenia>
  804. <DataWytworzeniaJPK></DataWytworzeniaJPK>
  805. <DataOd></DataOd>
  806. <DataDo></DataDo>
  807. <DomyslnyKodWaluty>PLN</DomyslnyKodWaluty>
  808. <KodUrzedu></KodUrzedu>
  809. </Naglowek>
  810. <Podmiot1>
  811. <IdentyfikatorPodmiotu>
  812. <etd:NIP></etd:NIP>
  813. <etd:PelnaNazwa></etd:PelnaNazwa>
  814. <etd:REGON></etd:REGON>
  815. </IdentyfikatorPodmiotu>
  816. <AdresPodmiotu>
  817. <KodKraju></KodKraju>
  818. <Wojewodztwo></Wojewodztwo>
  819. <Powiat></Powiat>
  820. <Gmina></Gmina>
  821. <Ulica></Ulica>
  822. <NrDomu></NrDomu>
  823. <NrLokalu></NrLokalu>
  824. <Miejscowosc></Miejscowosc>
  825. <KodPocztowy></KodPocztowy>
  826. <Poczta></Poczta>
  827. </AdresPodmiotu>
  828. </Podmiot1>
  829. </JPK>
  830. EOT;
  831. break;
  832. case '1-1':
  833. $xmlSchema = <<<EOT
  834. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  835. <JPK xmlns="{$this->tns['JPK_VAT (3)']}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  836. <Naglowek>
  837. <KodFormularza kodSystemowy="JPK_VAT (3)" wersjaSchemy="1-1">JPK_VAT</KodFormularza>
  838. <WariantFormularza>3</WariantFormularza>
  839. <CelZlozenia></CelZlozenia>
  840. <DataWytworzeniaJPK></DataWytworzeniaJPK>
  841. <DataOd></DataOd>
  842. <DataDo></DataDo>
  843. <NazwaSystemu>Procesy5</NazwaSystemu>
  844. </Naglowek>
  845. <Podmiot1>
  846. <NIP></NIP>
  847. <PelnaNazwa></PelnaNazwa>
  848. <Email></Email>
  849. </Podmiot1>
  850. </JPK>
  851. EOT;
  852. break;
  853. case '1-2E':
  854. $xmlSchema = <<<EOT
  855. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  856. <JPK xmlns="{$this->tns['JPK_V7M (1)']}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2020/03/11/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  857. <Naglowek>
  858. <KodFormularza kodSystemowy="JPK_V7M (1)" wersjaSchemy="1-2E">JPK_VAT</KodFormularza>
  859. <WariantFormularza>1</WariantFormularza>
  860. <DataWytworzeniaJPK/>
  861. <NazwaSystemu>Procesy5</NazwaSystemu>
  862. <CelZlozenia poz="P_7"></CelZlozenia>
  863. <KodUrzedu/>
  864. <Rok/>
  865. <Miesiac/>
  866. </Naglowek>
  867. <Podmiot1 rola="Podatnik">
  868. <OsobaNiefizyczna>
  869. <NIP/>
  870. <PelnaNazwa/>
  871. <Email/>
  872. </OsobaNiefizyczna>
  873. </Podmiot1>
  874. </JPK>
  875. EOT;
  876. break;
  877. case '1-0E':
  878. $xmlSchema = <<<EOT
  879. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  880. <JPK xmlns="{$this->tns['JPK_V7M (2)']}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2021/06/08/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  881. <Naglowek>
  882. <KodFormularza kodSystemowy="JPK_V7M (2)" wersjaSchemy="1-0E">JPK_VAT</KodFormularza>
  883. <WariantFormularza>2</WariantFormularza>
  884. <DataWytworzeniaJPK/>
  885. <NazwaSystemu>Procesy5</NazwaSystemu>
  886. <CelZlozenia poz="P_7"></CelZlozenia>
  887. <KodUrzedu/>
  888. <Rok/>
  889. <Miesiac/>
  890. </Naglowek>
  891. <Podmiot1 rola="Podatnik">
  892. <OsobaNiefizyczna>
  893. <NIP/>
  894. <PelnaNazwa/>
  895. <Email/>
  896. </OsobaNiefizyczna>
  897. </Podmiot1>
  898. </JPK>
  899. EOT;
  900. break;
  901. }
  902. // bfp.ID_SERVICES -> SERVICES.ID (NAME_LIST_SERVICES: NET, TV, VOIP)
  903. $queryFVAT = <<<EOT
  904. select
  905. bn.ID as BN_ID,
  906. if (bu.TAXPAYER_ID_BILLING_USERS > 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,
  907. 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,
  908. bf.SELL_DATE AS 'DataWystawienia',
  909. concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
  910. 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',
  911. coalesce(ls.EE, 0) as EE,
  912. bua.PODMIOT_POWIAZANY as TP,
  913. round(bfp.AMMOUNT * bfp.PRICE, 2) as Netto,
  914. round(round(bfp.AMMOUNT * bfp.PRICE, 2) * bfp.VAT/100, 2) as VAT,
  915. bfp.VAT_NAME as 'VAT_NAME'
  916. from BILLING_NUMBERS bn
  917. join BILLS_FVAT bf on bn.ID=bf.ID_BILLING_NUMBERS
  918. join BILLS_FVAT_POS bfp on bf.ID=bfp.ID_BILLS_FVAT
  919. join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
  920. join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
  921. left join BILLING_USERS_ADD bua_tp on bu.TAXPAYER_ID_BILLING_USERS = bua_tp.id_users
  922. left join SERVICES s on bfp.ID_SERVICES = s.ID
  923. left join LIST_SERVICES ls on s.NAME_LIST_SERVICES = ls.name
  924. where bn.ID_BILLING_NUMBERS_TYPE='1' and bf.BILL_DATE like '{$this->JPK['MONTH']}%'
  925. and bu.BILLING_OWNER='{$this->BO['ID']}'
  926. order by bf.BILL_DATE,bn.ID
  927. EOT;
  928. // bkp.ID_SERVICES -> -> SERVICES.ID (NAME_LIST_SERVICES: NET, TV, VOIP)
  929. $queryKORV = <<<EOT
  930. select
  931. bn.ID AS BN_ID,
  932. if (bu.TAXPAYER_ID_BILLING_USERS > 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,
  933. 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,
  934. bk.BILL_DATE AS 'DataWystawienia',
  935. bk.SELL_DATE AS 'DataSprzedazy',
  936. concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
  937. 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',
  938. coalesce(ls.EE) as EE,
  939. bua.PODMIOT_POWIAZANY as TP,
  940. bkp.AMMOUNT AS AMMOUNT,
  941. bkp.PRICE AS PRICE,
  942. bkp.VAT AS VAT,
  943. bkp.VAT_NAME AS VAT_NAME,
  944. bkp.N_AMMOUNT AS N_AMMOUNT,
  945. bkp.N_PRICE AS N_PRICE,
  946. bkp.N_VAT AS N_VAT,
  947. bkp.N_VAT_NAME AS N_VAT_NAME,
  948. bkp.TYP_KOREKTY AS TYP_KOREKTY
  949. from BILLING_NUMBERS bn
  950. join BILLS_KORV bk on bn.ID=bk.ID_BILLING_NUMBERS
  951. join BILLS_KORV_POS bkp on bk.ID=bkp.ID_BILLS_FVAT
  952. join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
  953. join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
  954. left join BILLING_USERS_ADD bua_tp on bu.TAXPAYER_ID_BILLING_USERS = bua_tp.id_users
  955. left join SERVICES s on bkp.ID_SERVICES = s.ID
  956. left join LIST_SERVICES ls on s.NAME_LIST_SERVICES = ls.name
  957. where bn.ID_BILLING_NUMBERS_TYPE='3'
  958. and bk.BILL_DATE like '{$this->JPK['MONTH']}%'
  959. and bkp.TYP_KOREKTY IS NOT NULL
  960. and bu.BILLING_OWNER='{$this->BO['ID']}'
  961. order by bk.BILL_DATE,bn.ID
  962. EOT;
  963. $xmlVAT = [
  964. 'ZW' => ['netto' => ['K_10']],
  965. '0' => ['netto' => ['K_13']],
  966. '7' => ['netto' => ['K_17'], 'vat' => 'K_18'],
  967. '8' => ['netto' => ['K_17'], 'vat' => 'K_18'],
  968. '22' => ['netto' => ['K_19'], 'vat' => 'K_20'],
  969. '23' => ['netto' => ['K_19'], 'vat' => 'K_20'],
  970. 'OO UE' => ['netto' => ['K_11', 'K_12']],
  971. ];
  972. try {
  973. 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;")) {
  974. throw new Exception("wykryto niezamknięte faktury lub korekty faktur");
  975. }
  976. $xml = new SimpleXMLElement($xmlSchema);
  977. $ns = $xml->getNamespaces(true);
  978. $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE'];
  979. $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
  980. if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') {
  981. $xml->Naglowek->DataOd = $this->JPK['MONTH'] . "-01";
  982. $xml->Naglowek->DataDo = date("Y-m-d", strtotime($xml->Naglowek->DataOd . "+ 1 month - 1 day"));
  983. } elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  984. $xml->Naglowek->Rok = date('Y', strtotime($this->JPK['MONTH']));
  985. $xml->Naglowek->Miesiac = date('m', strtotime($this->JPK['MONTH']));
  986. }
  987. $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';
  988. if ($this->JPK_wersjaSchemy == '1-0') {
  989. if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego");
  990. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP");
  991. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
  992. if ($this->BO['name2']) $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa .= " " . $this->BO['name2'];
  993. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON = $this->BO['regon'])) unset($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON);
  994. if (!($xml->Podmiot1->AdresPodmiotu->KodKraju = $this->BO['kodKraju'])) throw new Exception("blędne dane podmiotu - brak kodu kraju");
  995. if (!($xml->Podmiot1->AdresPodmiotu->Wojewodztwo = $this->BO['wojewodztwo'])) unset($xml->Podmiot1->AdresPodmiotu->Wojewodztwo);
  996. if (!($xml->Podmiot1->AdresPodmiotu->Powiat = $this->BO['powiat'])) unset($xml->Podmiot1->AdresPodmiotu->Powiat);
  997. if (!($xml->Podmiot1->AdresPodmiotu->Gmina = $this->BO['gmina'])) unset($xml->Podmiot1->AdresPodmiotu->Gmina);
  998. if (!($xml->Podmiot1->AdresPodmiotu->Ulica = $this->BO['ulica'])) unset($xml->Podmiot1->AdresPodmiotu->Ulica);
  999. if (!($xml->Podmiot1->AdresPodmiotu->NrDomu = $this->BO['numer_dom'])) unset($xml->Podmiot1->AdresPodmiotu->NrDomu);
  1000. if (!($xml->Podmiot1->AdresPodmiotu->NrLokalu = $this->BO['numer_pos'])) unset($xml->Podmiot1->AdresPodmiotu->NrLokalu);
  1001. if (!($xml->Podmiot1->AdresPodmiotu->Miejscowosc = $this->BO['miasto'])) throw new Exception("blędne dane podmiotu - brak nazwy miejscowości");
  1002. if (!($xml->Podmiot1->AdresPodmiotu->KodPocztowy = $this->BO['kod'])) unset($xml->Podmiot1->AdresPodmiotu->KodPocztowy);
  1003. if (!($xml->Podmiot1->AdresPodmiotu->Poczta = $this->BO['poczta'])) unset($xml->Podmiot1->AdresPodmiotu->Poczta);
  1004. $ewidencja = $xml;
  1005. } elseif ($this->JPK_wersjaSchemy == '1-1') {
  1006. if (!($xml->Podmiot1->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP");
  1007. if (!($xml->Podmiot1->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
  1008. if (preg_match($mailRegex, $this->BO['BILLING_OWNER_EMAIL'])) $xml->Podmiot1->Email = $this->BO['BILLING_OWNER_EMAIL'];
  1009. else unset($xml->Podmiot1->Email);
  1010. $ewidencja = $xml;
  1011. } elseif ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  1012. if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego");
  1013. if (!($xml->Podmiot1->OsobaNiefizyczna->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP");
  1014. if (!($xml->Podmiot1->OsobaNiefizyczna->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
  1015. if (preg_match($mailRegex, $this->BO['BILLING_OWNER_EMAIL'])) $xml->Podmiot1->OsobaNiefizyczna->Email = $this->BO['BILLING_OWNER_EMAIL'];
  1016. else throw new Exception("błędne dane podmiotu - brak luk błędny adres email");
  1017. $ewidencja = $xml->addChild('Ewidencja');
  1018. }
  1019. $data = array();
  1020. $allVAT = 0;
  1021. $result = DB::getPDO(931)->fetchall($queryFVAT);
  1022. foreach ($result as $row) {
  1023. $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta']));
  1024. $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
  1025. if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') {
  1026. $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
  1027. }
  1028. $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
  1029. $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
  1030. if ($this->JPK_wersjaSchemy == '1-2E') {
  1031. if ($row['EE']) $data[$row['BN_ID']][0]['EE'] += $row['EE'];
  1032. if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP'];
  1033. } elseif ($this->JPK_wersjaSchemy == '1-0E') {
  1034. // if ($row['EE']) $data[$row['BN_ID']][0]['WSTO_EE'] += $row['EE'];
  1035. if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP'];
  1036. }
  1037. if (!in_array($row['VAT_NAME'],array_keys($xmlVAT))) throw new Exception("Problem ze stawką VAT (1) - {$row['VAT_NAME']}");
  1038. foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += $row['Netto'];
  1039. if ($row['VAT'] > 0) {
  1040. if (!isset($xmlVAT[$row['VAT_NAME']]['vat'])) throw new Exception("Problem ze stawką VAT (2) - {$row['VAT_NAME']}");
  1041. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += $row['VAT'];
  1042. $allVAT += $row['VAT'];
  1043. }
  1044. }
  1045. $result = DB::getPDO(931)->fetchall($queryKORV);
  1046. foreach ($result as $row) {
  1047. $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta']));
  1048. $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
  1049. if ($this->JPK_wersjaSchemy == '1-0' || $this->JPK_wersjaSchemy == '1-1') {
  1050. $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
  1051. }
  1052. $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
  1053. $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
  1054. $data[$row['BN_ID']][0]['DataSprzedazy'] = $row['DataSprzedazy'];
  1055. if ($this->JPK_wersjaSchemy == '1-2E') {
  1056. if ($row['EE']) $data[$row['BN_ID']][0]['EE'] += $row['EE'];
  1057. if ($row['TP']) $data[$row['BN_ID']][0]['TP'] = $row['TP'];
  1058. } elseif ($this->JPK_wersjaSchemy == '1-0E') {
  1059. // if ($row['EE']) $data[$row['BN_ID']][0]['WSTO_EE'] += $row['EE'];
  1060. if ($row['TP']) $data[$row['BN_ID']][0]['TP'] += $row['TP'];
  1061. }
  1062. 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']}");
  1063. 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']}");
  1064. if ($row['VAT_NAME'] == $row['N_VAT_NAME']) {
  1065. foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += round($row['AMMOUNT']*$row['PRICE'],2);
  1066. if ($row['VAT'] > 0) {
  1067. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  1068. $allVAT += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  1069. }
  1070. } else {
  1071. 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);
  1072. foreach ($xmlVAT[$row['N_VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] -= round($row['N_AMMOUNT']*$row['N_PRICE'],2);
  1073. if ($row['VAT'] > 0) {
  1074. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2)
  1075. + round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  1076. $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);
  1077. }
  1078. if ($row['N_VAT'] > 0) {
  1079. $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);
  1080. $allVAT -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2);
  1081. }
  1082. }
  1083. }
  1084. ksort($data);
  1085. $addCdata = function(&$node, $value) {
  1086. $dom_node = dom_import_simplexml($node);
  1087. $dom_owner = $dom_node->ownerDocument;
  1088. $dom_node->appendChild($dom_owner->createCDATASection($value));
  1089. };
  1090. $i = 0;
  1091. foreach ($data as $pos) {
  1092. $this->validateNIP($pos[0]['NrKontrahenta'], $pos[0]['NazwaKontrahenta'], 'Sprzedaż L1');
  1093. if (isset($pos[0]['EE'])) $pos[0]['EE'] = 1;
  1094. if (isset($pos[0]['WSTO_EE'])) $pos[0]['WSTO_EE'] = 1;
  1095. $x = $ewidencja->addChild('SprzedazWiersz');
  1096. if ($this->JPK_wersjaSchemy == '1-0') $x->addAttribute('typ', 'G');
  1097. $x->addChild('LpSprzedazy', ++$i);
  1098. ksort($pos[1]);
  1099. foreach ($pos as $subpos) foreach ($subpos as $key => $value) {
  1100. $x->addChild($key, $value);
  1101. if (!strlen($x->$key)) $addCdata($x->$key, $value);
  1102. }
  1103. }
  1104. if ($this->NIPerrors) throw new Exception("Błędne numery NIP:<br/>" . implode("<br/>", $this->NIPerrors));
  1105. $ewidencja->SprzedazCtrl->LiczbaWierszySprzedazy = count($data);
  1106. $ewidencja->SprzedazCtrl->PodatekNalezny = number_format($allVAT, 2, '.', '');
  1107. if ($this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  1108. $zakupCtrl = $ewidencja->addChild('ZakupCtrl');
  1109. $zakupCtrl->LiczbaWierszyZakupow = '0';
  1110. $zakupCtrl->PodatekNaliczony = '0.00';
  1111. }
  1112. $this->validateJPK_VAT($xml);
  1113. if ($this->JPK['IN_INSERT']) $info = "Zaimportowano dane z Insert i L1";
  1114. else $info = "Zaimportowano dane z L1";
  1115. $sqlObj = new stdClass();
  1116. $sqlObj->ID = $this->JPK['ID'];
  1117. $sqlObj->A_STATUS_INFO = $info;
  1118. $sqlObj->IN_L1 = $xml->asXml();
  1119. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  1120. $this->handleAuth();
  1121. $this->edit();
  1122. } catch (Exception $e) {
  1123. SE_Layout::gora();
  1124. SE_Layout::menu();
  1125. SE_Layout::alert('danger', "Błąd w trakcie importu danych z L1. {$e->getMessage()}");
  1126. ?>
  1127. <div class="container" style="text-align:center">
  1128. <form method="post" action="<?=$this->LAST_REFERER?>">
  1129. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  1130. <button type="submit" class="btn btn-primary">Powrót</button>
  1131. </form>
  1132. </div>
  1133. <?php
  1134. SE_Layout::dol();
  1135. }
  1136. }
  1137. private function delete_l1_jpk() {
  1138. try {
  1139. $info = "Usunięto dane z L1";
  1140. if ($this->JPK['IN_INSERT']) $info .= " (pozostawiono dane z Insert)";
  1141. $sqlObj = new stdClass();
  1142. $sqlObj->ID = $this->JPK['ID'];
  1143. $sqlObj->A_STATUS_INFO = $info;
  1144. $sqlObj->IN_L1 = null;
  1145. $sqlObj->OUT_MERGED = null;
  1146. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
  1147. $this->handleAuth();
  1148. $this->edit();
  1149. } catch (Exception $e) {
  1150. SE_Layout::gora();
  1151. SE_Layout::menu();
  1152. SE_Layout::alert('danger', $e->getMessage());
  1153. ?>
  1154. <div class="container" style="text-align:center">
  1155. <form method="post" action="<?=$this->LAST_REFERER?>">
  1156. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  1157. <button type="submit" class="btn btn-primary">Powrót</button>
  1158. </form>
  1159. </div>
  1160. <?php
  1161. SE_Layout::dol();
  1162. }
  1163. }
  1164. private static function removeTnsNamespace(&$xml) {
  1165. $ns = $xml->getNamespaces(true);
  1166. if (isset($ns[''])) return;
  1167. if ((!isset($ns['tns']) || isset($ns['xsi']))) throw new Exception("Błędna struktura pliku XML - błędne namespace");
  1168. $dom = dom_import_simplexml($xml);
  1169. $ns_uri = $dom->lookupNamespaceURI('tns');
  1170. $dom->removeAttributeNS($ns_uri, 'tns');
  1171. $xml->addAttribute('xmlns', $ns['tns']);
  1172. $xml->addAttribute('xmlns:xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
  1173. $xml = simplexml_load_string($xml->asXML());
  1174. }
  1175. private function generate_merged_jpk() {
  1176. try {
  1177. if (!($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'])) throw new Exception("Błąd danych");
  1178. $xmlInsert = simplexml_load_string($this->JPK['IN_INSERT']);
  1179. self::removeTnsNamespace($xmlInsert);
  1180. $xmlL1 = simplexml_load_string($this->JPK['IN_L1']);
  1181. $kodSystemowy = (string) $xmlInsert->Naglowek->KodFormularza->attributes()['kodSystemowy'];
  1182. $tns = $this->tns[$kodSystemowy];
  1183. switch ($this->JPK_wersjaSchemy) {
  1184. case '1-0':
  1185. $xmlSchema = <<<EOT
  1186. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  1187. <JPK xmlns="{$tns}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  1188. </JPK>
  1189. EOT;
  1190. break;
  1191. case '1-1':
  1192. $xmlSchema = <<<EOT
  1193. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  1194. <JPK xmlns="{$tns}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  1195. </JPK>
  1196. EOT;
  1197. break;
  1198. case '1-2E':
  1199. $xmlSchema = <<<EOT
  1200. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  1201. <JPK xmlns="{$tns}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2020/03/11/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  1202. </JPK>
  1203. EOT;
  1204. break;
  1205. case '1-0E':
  1206. $xmlSchema = <<<EOT
  1207. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  1208. <JPK xmlns="{$tns}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2021/06/08/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  1209. </JPK>
  1210. EOT;
  1211. break;
  1212. }
  1213. $xml_append = function(SimpleXMLElement $to, SimpleXMLElement $from) {
  1214. $toDom = dom_import_simplexml($to);
  1215. $fromDom = dom_import_simplexml($from);
  1216. $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
  1217. };
  1218. $xml = simplexml_load_string($xmlSchema);
  1219. switch (V::get('SRC_PODMIOT','',$_POST)) {
  1220. case "Insert":
  1221. $xml_append($xml, $xmlInsert->Naglowek);
  1222. $xml_append($xml, $xmlInsert->Podmiot1);
  1223. if ($this->JPK_wersjaSchemy == '1-1' || $this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  1224. $xml->Naglowek->NazwaSystemu .= "; " . $xmlL1->Naglowek->NazwaSystemu;
  1225. if ($this->JPK_wersjaSchemy == '1-1' ) {
  1226. if ((!isset($xml->Podmiot1->Email)) && isset($xmlL1->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlL1->Podmiot1->Email;
  1227. }
  1228. }
  1229. break;
  1230. case "L1":
  1231. $xml_append($xml, $xmlL1->Naglowek);
  1232. $xml_append($xml, $xmlL1->Podmiot1);
  1233. if ($this->JPK_wersjaSchemy == '1-1' || $this->JPK_wersjaSchemy == '1-2E' || $this->JPK_wersjaSchemy == '1-0E') {
  1234. $xml->Naglowek->NazwaSystemu .= "; " . $xmlInsert->Naglowek->NazwaSystemu;
  1235. if ($this->JPK_wersjaSchemy == '1-1' ) {
  1236. if ((!isset($xml->Podmiot1->Email)) && isset($xmlInsert->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlInsert->Podmiot1->Email;
  1237. }
  1238. }
  1239. break;
  1240. default:
  1241. throw new Exception("Błąd formularza");
  1242. }
  1243. $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
  1244. $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE'];
  1245. if ($xmlInsert->Deklaracja) $xml_append($xml, $xmlInsert->Deklaracja);
  1246. switch ($this->JPK_wersjaSchemy) {
  1247. case '1-0':
  1248. case '1-1':
  1249. $ewidencja = $xml;
  1250. $ewidencjaInsert = $xmlInsert;
  1251. $ewidencjaL1 = $xmlL1;
  1252. $ctrl = false;
  1253. break;
  1254. case '1-2E':
  1255. case '1-0E':
  1256. $ewidencja = $xml->addChild("Ewidencja");
  1257. $ewidencjaInsert = simplexml_load_string($xmlInsert->Ewidencja->asXml());
  1258. $ewidencjaL1 = simplexml_load_string($xmlL1->Ewidencja->asXml());
  1259. $ctrl = true;
  1260. break;
  1261. }
  1262. $si = 0;
  1263. foreach ($ewidencjaInsert->SprzedazWiersz as $sprzedazWiersz) {
  1264. $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż Insert");
  1265. $sprzedazWiersz->LpSprzedazy = ++$si;
  1266. $xml_append($ewidencja, $sprzedazWiersz);
  1267. }
  1268. foreach ($ewidencjaL1->SprzedazWiersz as $sprzedazWiersz) {
  1269. $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż L1");
  1270. $sprzedazWiersz->LpSprzedazy = ++$si;
  1271. $xml_append($ewidencja, $sprzedazWiersz);
  1272. }
  1273. if ($si || $ctrl) $ewidencja->addChild("SprzedazCtrl");
  1274. $zi = 0;
  1275. foreach ($ewidencjaInsert->ZakupWiersz as $zakupWiersz) {
  1276. $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup Insert");
  1277. $zakupWiersz->LpZakupu = ++$zi;
  1278. $xml_append($ewidencja, $zakupWiersz);
  1279. }
  1280. foreach ($ewidencjaL1->ZakupWiersz as $zakupWiersz) {
  1281. $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup L1");
  1282. $zakupWiersz->LpZakupu = ++$zi;
  1283. $xml_append($ewidencja, $zakupWiersz);
  1284. }
  1285. if ($zi || $ctrl) $ewidencja->addChild("ZakupCtrl");
  1286. if ($this->NIPerrors) throw new Exception("Błędne numery NIP:<br/>" . implode("<br/>", $this->NIPerrors));
  1287. $sumaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  1288. if ($si || $ctrl) {
  1289. $ewidencja->SprzedazCtrl->LiczbaWierszySprzedazy = $sumaryJPK_VAT['LiczbaWierszySprzedazy'];
  1290. $ewidencja->SprzedazCtrl->PodatekNalezny = $sumaryJPK_VAT['PodatekNalezny'];
  1291. }
  1292. if ($zi || $ctrl) {
  1293. $ewidencja->ZakupCtrl->LiczbaWierszyZakupow = $sumaryJPK_VAT['LiczbaWierszyZakupow'];
  1294. $ewidencja->ZakupCtrl->PodatekNaliczony = $sumaryJPK_VAT['PodatekNaliczony'];
  1295. }
  1296. $this->validateJPK_VAT($xml);
  1297. $sqlObj = new stdClass();
  1298. $sqlObj->ID = $this->JPK['ID'];
  1299. $sqlObj->A_STATUS_INFO = "Wygenerowano wynikowy plik JPK";
  1300. $sqlObj->OUT_MERGED = $xml->asXml();
  1301. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  1302. $this->handleAuth();
  1303. $this->edit();
  1304. } catch (Exception $e) {
  1305. SE_Layout::gora();
  1306. SE_Layout::menu();
  1307. SE_Layout::alert('danger', $e->getMessage());
  1308. ?>
  1309. <div class="container" style="text-align:center">
  1310. <form method="post" action="<?=$this->LAST_REFERER?>">
  1311. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  1312. <button type="submit" class="btn btn-primary">Powrót</button>
  1313. </form>
  1314. </div>
  1315. <?php
  1316. SE_Layout::dol();
  1317. }
  1318. }
  1319. private function close_jpk() {
  1320. try {
  1321. $sqlObj = new stdClass();
  1322. $sqlObj->ID = $this->JPK['ID'];
  1323. $sqlObj->A_STATUS = 'OFF_HARD';
  1324. $sqlObj->A_STATUS_INFO = "Zamknięto deklarację JPK";
  1325. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  1326. $this->handleAuth();
  1327. $this->show();
  1328. } catch (Exception $e) {
  1329. SE_Layout::gora();
  1330. SE_Layout::menu();
  1331. SE_Layout::alert('danger', $e->getMessage());
  1332. ?>
  1333. <div class="container" style="text-align:center">
  1334. <form method="post" action="<?=$this->LAST_REFERER?>">
  1335. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  1336. <button type="submit" class="btn btn-primary">Powrót</button>
  1337. </form>
  1338. </div>
  1339. <?php
  1340. SE_Layout::dol();
  1341. }
  1342. }
  1343. private function reinitialize() {
  1344. $sqlObj = new stdClass();
  1345. $sqlObj->ID = $this->JPK['ID'];
  1346. $sqlObj->A_STATUS = 'WAITING';
  1347. $sqlObj->A_STATUS_INFO = "Oczekuje na inicjalizację";
  1348. $sqlObj->MONTH = "NULL";
  1349. $sqlObj->PURPOSE = "NULL";
  1350. DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
  1351. $this->initialize();
  1352. }
  1353. public function defaultAction() {
  1354. switch ($this->JPK['A_STATUS']) {
  1355. case "WAITING":
  1356. $this->initialize();
  1357. break;
  1358. case "NORMAL":
  1359. $this->edit();
  1360. break;
  1361. case "OFF_HARD":
  1362. $this->show();
  1363. break;
  1364. default:
  1365. SE_Layout::alert('danger', "Błędny status rekordu.");
  1366. }
  1367. }
  1368. }