JPK.php 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136
  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_VAT_Wariant = null;
  9. private $tns = [
  10. 2 => "http://jpk.mf.gov.pl/wzor/2016/10/26/10261/",
  11. 3 => "http://jpk.mf.gov.pl/wzor/2017/11/13/1113/",
  12. ];
  13. public function handleAuth() {
  14. if (!User::logged()) {
  15. throw new HttpException('Unauthorized', 401);
  16. }
  17. $this->LAST_REFERER = $_SERVER['HTTP_REFERER'];
  18. if (($this->REFERER=V::get('REFERER','',$_POST))=='') $this->REFERER = $_SERVER['HTTP_REFERER'];
  19. try {
  20. if (!($ID_JPK = V::get('ID_JPK',0,$_GET,'int'))) throw new Exception("Błąd parametru");
  21. if ($result = DB::getPDO()->fetchall("select * from JPK where ID='{$ID_JPK}'")) $this->JPK = $result[0];
  22. else throw new Exception("Dostęp zabroniony");
  23. if ($result = DB::getPDO()->fetchall("select * from BILLING_OWNER where ID='{$this->JPK['ID_BILLING_OWNER']}'")) $this->BO = $result[0];
  24. else throw new Exception("Błąd spójności danych");
  25. if ($this->JPK['A_STATUS'] != 'WAITING') {
  26. if (!$this->JPK['MONTH']) throw new Exception("Błąd daty w rekordzie JPK_VAT");
  27. $this->JPK_VAT_Wariant = self::getWariant($this->JPK['MONTH']);
  28. }
  29. } catch (Exception $e) {
  30. SE_Layout::gora();
  31. SE_Layout::menu();
  32. SE_Layout::alert('danger',$e->getMessage());
  33. ?>
  34. <div class="container" style="text-align:center">
  35. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  36. </div>
  37. <?php
  38. SE_Layout::dol();
  39. die();
  40. }
  41. }
  42. private static function getWariant($month) {
  43. $year = date("Y", strtotime($month));
  44. if ($year < 2018) return 2;
  45. else return 3;
  46. }
  47. private function initialize() {
  48. SE_Layout::gora();
  49. SE_Layout::menu();
  50. try {
  51. if (V::get('action','',$_POST) == 'initialize') {
  52. $month = V::get('MONTH','',$_POST);
  53. $purpose = V::get('PURPOSE','',$_POST);
  54. if (!preg_match("/^[[:digit:]]{4}-[[:digit:]]{2}$/",$month)) throw new Exception("błędny format daty (YYYY-MM)");
  55. switch ($purpose) {
  56. case "1":
  57. $lastMonth = DB::getPDO()->fetchValue("select max(MONTH) from JPK where ID_BILLING_OWNER='{$this->JPK['ID_BILLING_OWNER']}' and TYPE='{$this->JPK['TYPE']}'
  58. and ((MONTH < '2018-01' and PURPOSE='1') or (MONTH >= '2018-01' and PURPOSE = '0'))");
  59. if (strtotime($month) <= strtotime($lastMonth)) throw new Exception("błędny miesiąc (deklaracja z tego okresu lub późniejszego już istnieje)");
  60. break;
  61. case "2":
  62. $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}'
  63. and ((MONTH < '2018-01' and PURPOSE='1') or (MONTH >= '2018-01' and PURPOSE = 0))");
  64. if (!$JPKexists) throw new Exception("brak deklaracji z tego okresu - nie ma czego korygować");
  65. break;
  66. default:
  67. throw new Exception("błędne określenie celu złożenia deklaracji");
  68. }
  69. if (self::getWariant($month) > 2) {
  70. if ($purpose == 1) $purpose = (int) 0;
  71. 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}'");
  72. }
  73. $sqlObj = new stdClass();
  74. $sqlObj->ID = $this->JPK['ID'];
  75. $sqlObj->A_STATUS = 'NORMAL';
  76. $sqlObj->A_STATUS_INFO = 'W trakcie tworzenia';
  77. $sqlObj->MONTH = $month;
  78. $sqlObj->PURPOSE = $purpose;
  79. $affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
  80. if ($affected) {
  81. SE_Layout::alert('success','Pomyślnie zainicjalizowano deklarację JPK.');
  82. ?>
  83. <div class="container" style="text-align:center">
  84. <form method="post">
  85. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  86. <button type="submit" class="btn btn-primary">Edytuj</button>
  87. <a href="<?=$this->REFERER?>" class="btn btn-default">Powrót</a>
  88. </form>
  89. </div>
  90. <?php
  91. }
  92. else {
  93. SE_Layout::alert('warning','Wystąpił nieznany błąd podczas inicjalizowania deklaracji JPK.');
  94. ?>
  95. <div class="container" style="text-align:center">
  96. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  97. </div>
  98. <?php
  99. }
  100. } else {
  101. ?>
  102. <div class="container" style="margin-top:20px">
  103. <form class="form-horizontal" method="post">
  104. <legend>Inicjalizacja deklaracji JPK</legend>
  105. <div class="form-group">
  106. <label class="col-sm-3 control-label">Operator</label>
  107. <div class="col-sm-9" style="margin-top:7px;"><?=$this->BO['name1']?></div>
  108. </div>
  109. <div class="form-group">
  110. <label class="col-sm-3 control-label">Typ JPK</label>
  111. <div class="col-sm-9" style="margin-top:7px;"><?=$this->JPK['TYPE']?></div>
  112. </div>
  113. <div class="form-group">
  114. <label class="col-sm-3 control-label">Miesiąc, którego dotyczy deklaracja</label>
  115. <div class="col-sm-2">
  116. <div class="input-group">
  117. <input type="text" id="MONTH" class="form-control se_type-date" name="MONTH" value="2017-01" maxlength="7"/>
  118. <span class="input-group-addon">
  119. <span class="glyphicon glyphicon-calendar"/>
  120. </span>
  121. </input>
  122. </div>
  123. </div>
  124. </div>
  125. <div class="form-group">
  126. <label class="col-sm-3 control-label">Cel złożenia deklaracji za dany okres</label>
  127. <div class="col-sm-3">
  128. <select class="form-control" name="PURPOSE">
  129. <option value="1">Złożenie po raz pierwszy</option>
  130. <option value="2">Korekta</option>
  131. </select>
  132. </div>
  133. </div>
  134. <div class="form-group">
  135. <div class="col-sm-offset-3 col-sm-9">
  136. <button type="submit" class="btn btn-primary" name="action" value="initialize">Zapisz</button>
  137. <a href="<?=$this->REFERER?>" class="btn btn-default">Anuluj</a>
  138. </div>
  139. </div>
  140. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  141. </form>
  142. </div>
  143. <script>
  144. jQuery(document.getElementById('MONTH')).parent().datetimepicker({
  145. format: 'YYYY-MM'
  146. , locale: 'pl'
  147. , showTodayButton: false
  148. , minDate: '2017-01-01'
  149. , maxDate: '<?=date("Y-m", strtotime("-1 month"))?>-28'
  150. });
  151. </script>
  152. <?php
  153. }
  154. } catch (Exception $e) {
  155. SE_Layout::alert('danger', "Wystąpił problem z inicjalizacją deklaracji JPK - " . $e->getMessage());
  156. ?>
  157. <div class="container" style="text-align:center">
  158. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  159. </div>
  160. <?php
  161. }
  162. SE_Layout::dol();
  163. }
  164. private $fieldsDescrJPK_VAT = [
  165. 2 => [
  166. "KodFormularza" => "Kod formularza",
  167. "WariantFormularza" => "Wariant formularza",
  168. "CelZlozenia" => "Cel złożenia",
  169. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  170. "DataOd" => "Data od",
  171. "DataDo" => "Data do",
  172. "DomyslnyKodWaluty" => "Waluta",
  173. "KodUrzedu" => "Kod urzędu skarbowego",
  174. "NIP" => "NIP",
  175. "PelnaNazwa" => "Nazwa podmiotu",
  176. "REGON" => "Regon",
  177. "KodKraju" => "Kod kraju",
  178. "Wojewodztwo" => "Województwo",
  179. "Powiat" => "Powiat",
  180. "Gmina" => "Gmina",
  181. "Miejscowosc" => "Miejscowość",
  182. "Ulica" => "Ulica",
  183. "NrDomu" => "Nr domu",
  184. "NrLokalu" => "Nr lokalu",
  185. "KodPocztowy" => "Kod pocztowy",
  186. "Poczta" => "Poczta",
  187. "LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
  188. "PodatekNalezny" => "Podatek należny",
  189. "LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
  190. "PodatekNaliczony" => "Podatek naliczony",
  191. ],
  192. 3 => [
  193. "KodFormularza" => "Kod formularza",
  194. "WariantFormularza" => "Wariant formularza",
  195. "CelZlozenia" => "Cel złożenia",
  196. "DataWytworzeniaJPK" => "Data wytworzenia JPK",
  197. "DataOd" => "Data od",
  198. "DataDo" => "Data do",
  199. "NazwaSystemu" => "Nazwa systemu",
  200. "NIP" => "NIP",
  201. "PelnaNazwa" => "Nazwa podmiotu",
  202. "Email" => "Adres email",
  203. "LiczbaWierszySprzedazy" => "Liczba dokumentów sprzedaży",
  204. "PodatekNalezny" => "Podatek należny",
  205. "LiczbaWierszyZakupow" => "Liczba dokumentów zakupu",
  206. "PodatekNaliczony" => "Podatek naliczony",
  207. ],
  208. ];
  209. private static function getNamespaces($xml) {
  210. $ns = $xml->getNamespaces(true);
  211. if (!isset($ns['tns'])) {
  212. if (isset($ns[''])) {
  213. $ns['tns'] = $ns[''];
  214. unset($ns['']);
  215. } else throw new Exception('Błędna struktura namespace');
  216. }
  217. foreach ($ns as $k => $v) $xml->registerXPathNamespace($k, $v);
  218. return $ns;
  219. }
  220. private function showJPK_VAT($xml) {
  221. $ns = self::getNamespaces($xml);
  222. $summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  223. $result['KodFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0];
  224. $result['WariantFormularza'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0];
  225. $result['CelZlozenia'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0];
  226. $result['DataWytworzeniaJPK'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataWytworzeniaJPK')[0];
  227. $result['DataOd'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0];
  228. $result['DataDo'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DataDo')[0];
  229. if ($this->JPK_VAT_Wariant == 2) {
  230. $result['DomyslnyKodWaluty'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0];
  231. $result['KodUrzedu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:KodUrzedu')[0];
  232. $result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:NIP')[0];
  233. $result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:PelnaNazwa')[0];
  234. $result['REGON'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:IdentyfikatorPodmiotu/etd:REGON')[0];
  235. $result['KodKraju'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodKraju')[0];
  236. $result['Wojewodztwo'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Wojewodztwo')[0];
  237. $result['Powiat'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Powiat')[0];
  238. $result['Gmina'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Gmina')[0];
  239. $result['Ulica'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Ulica')[0];
  240. $result['NrDomu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrDomu')[0];
  241. $result['NrLokalu'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:NrLokalu')[0];
  242. $result['Miejscowosc'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Miejscowosc')[0];
  243. $result['KodPocztowy'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:KodPocztowy')[0];
  244. $result['Poczta'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:AdresPodmiotu/tns:Poczta')[0];
  245. } elseif ($this->JPK_VAT_Wariant == 3) {
  246. $result['NazwaSystemu'] = $xml->xpath('/tns:JPK/tns:Naglowek/tns:NazwaSystemu')[0];
  247. $result['NIP'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:NIP')[0];
  248. $result['PelnaNazwa'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:PelnaNazwa')[0];
  249. $result['Email'] = $xml->xpath('/tns:JPK/tns:Podmiot1/tns:Email')[0];
  250. }
  251. $result['LiczbaWierszySprzedazy'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ?: "";
  252. $result['PodatekNalezny'] = $summaryJPK_VAT['LiczbaWierszySprzedazy'] ? number_format($summaryJPK_VAT['PodatekNalezny'], 2, ',', '.'): "";
  253. $result['LiczbaWierszyZakupow'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ?: "";
  254. $result['PodatekNaliczony'] = $summaryJPK_VAT['LiczbaWierszyZakupow'] ? number_format($summaryJPK_VAT['PodatekNaliczony'], 2, ',', '.'): "";
  255. return $result;
  256. }
  257. private function showTable() {
  258. ?>
  259. <div class="form-group">
  260. <div class="col-sm-12">
  261. <table class="table table-bordered table-hover table-striped">
  262. <thead>
  263. <tr style="text-align:center; background-color:lightgray"><td width="19%"></td><td witdh="27%">Insert</td><td width="27%">L1</td><td width="27%">Dane wynikowe</td></tr>
  264. </thead>
  265. <tbody>
  266. <?php
  267. if ($this->JPK['IN_INSERT']) {
  268. $xmlIN_INSERT = simplexml_load_string($this->JPK['IN_INSERT']);
  269. $IN_INSERT = $this->showJPK_VAT($xmlIN_INSERT);
  270. }
  271. if ($this->JPK['IN_L1']) {
  272. $xmlIN_L1 = simplexml_load_string($this->JPK['IN_L1']);
  273. $IN_L1 = $this->showJPK_VAT($xmlIN_L1);
  274. }
  275. if ($this->JPK['OUT_MERGED']) {
  276. $xmlOUT_MERGED = simplexml_load_string($this->JPK['OUT_MERGED']);
  277. $OUT_MERGED = $this->showJPK_VAT($xmlOUT_MERGED);
  278. }
  279. foreach ($this->fieldsDescrJPK_VAT[$this->JPK_VAT_Wariant] as $fieldKey => $fieldName) {
  280. echo "<tr><td>{$fieldName}</td><td>";
  281. if ($this->JPK['IN_INSERT']) echo $IN_INSERT[$fieldKey];
  282. echo "</td><td>";
  283. if ($this->JPK['IN_L1']) echo $IN_L1[$fieldKey];
  284. echo "</td><td>";
  285. if ($this->JPK['OUT_MERGED']) echo $OUT_MERGED[$fieldKey];
  286. echo "</td></tr>\n";
  287. }
  288. ?>
  289. </tbody>
  290. </table>
  291. </div>
  292. </div>
  293. <?php
  294. }
  295. private function show() {
  296. if (V::get('action','',$_POST) == "getJPK") {
  297. try {
  298. if (!$this->JPK['OUT_MERGED']) throw new Exception("Błąd danych - nie wygenerowano wynikowego pliku JPK");
  299. $xml = simplexml_load_string($this->JPK['OUT_MERGED']);
  300. $ns = $xml->getNamespaces(true);
  301. $this->validateJPK_VAT($xml);
  302. if ($this->JPK_VAT_Wariant == 2) $pelnaNazwa = $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa;
  303. elseif ($this->JPK_VAT_Wariant == 3) $pelnaNazwa = $xml->Podmiot1->PelnaNazwa;
  304. $fileName = preg_replace("/[: \.]/", "_", "JPK_VAT_{$this->JPK['MONTH']}_" . str_replace('"', '', $pelnaNazwa)) . ".xml";
  305. $output = $xml->asXml();
  306. header("Content-Type: application/xml");
  307. header("Content-Disposition: attachment; filename={$fileName};");
  308. header("Content-Transfer-Encoding: binary");
  309. header("Content-Length: " . strlen($output));
  310. echo $output;
  311. } catch (Exception $e) {
  312. SE_Layout::gora();
  313. SE_Layout::menu();
  314. SE_Layout::alert('danger', $e->getMessage());
  315. ?>
  316. <div class="container" style="text-align:center">
  317. <form method="post" action="<?=$this->LAST_REFERER?>">
  318. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  319. <button type="submit" class="btn btn-primary">Powrót</button>
  320. </form>
  321. </div>
  322. <?php
  323. SE_Layout::dol();
  324. }
  325. } else {
  326. SE_Layout::gora();
  327. SE_Layout::menu();
  328. ?>
  329. <div class="container" style="margin-top:20px">
  330. <form class="form-horizontal" method="post" target="_blank">
  331. <legend>
  332. Podgląd deklaracjii JPK :: <?=$this->JPK['TYPE']?> - <?=$this->JPK['MONTH'] . " (" . ((($this->JPK_VAT_Wariant == 2 && $this->JPK['PURPOSE'] == 1) || ($this->JPK_VAT_Wariant == 3 && $this->JPK['PURPOSE'] === 0)) ? "pierwsze złożenie" : "korekta") . ")"?>
  333. <span class="pull-right">
  334. <?=$this->BO['name1']?>
  335. </span>
  336. </legend>
  337. <div class="form-group">
  338. <div class="form-group">
  339. <div class="col-sm-10">
  340. <button type="submit" class="btn-sm btn-primary" name="action" value="getJPK">Pobierz plik JPK</button>
  341. </div>
  342. </div>
  343. <?=$this->showTable();?>
  344. <div class="form-group" style="text-align:center">
  345. <div class="col-sm-12">
  346. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  347. <a href="<?=$this->REFERER?>" class="btn btn-default">Powrót</a>
  348. </div>
  349. </div>
  350. </form>
  351. </div>
  352. <?php
  353. SE_Layout::dol();
  354. }
  355. }
  356. private function edit() {
  357. SE_Layout::gora();
  358. SE_Layout::menu();
  359. ?>
  360. <div class="container" style="margin-top:20px">
  361. <form class="form-horizontal" method="post" enctype="multipart/form-data">
  362. <legend>
  363. Edycja deklaracji JPK :: <?=$this->JPK['TYPE']?> - <?=$this->JPK['MONTH']." (".((($this->JPK_VAT_Wariant == 2 && $this->JPK['PURPOSE'] == 1) || ($this->JPK_VAT_Wariant == 3 && $this->JPK['PURPOSE'] === 0)) ? "pierwsze złożenie" : "korekta").")"?>
  364. <span class="pull-right">
  365. <?=$this->BO['name1']?>
  366. </span>
  367. </legend>
  368. <div class="form-group">
  369. <label class="col-sm-3 control-label"><?=($this->JPK['IN_INSERT'] ? "Usuń dane zaimportowane" : "Dodaj plik JPK")?> z pakietu Insert</label>
  370. <?php
  371. if ($this->JPK['IN_INSERT']) {
  372. ?>
  373. <div class="col-sm-9" style="margin-top:3px;">
  374. <button type="submit" class="btn-xs btn-default" name="action" value="delete_insert_jpk">Usuń</button>
  375. </div>
  376. <?php
  377. } else {
  378. ?>
  379. <div class="col-sm-9" style="margin-top:7px;">
  380. <input type="hidden" name="action" value="upload_insert_jpk"/>
  381. <input type="file" name="IN_INSERT" onchange="javascript:this.form.submit();"/>
  382. </div>
  383. <?php
  384. }
  385. ?>
  386. </div>
  387. <div class="form-group">
  388. <label class="col-sm-3 control-label"><?=($this->JPK['IN_L1'] ? "Usuń" : "Pobierz")?> dane z L1</label>
  389. <div class="col-sm-9" style="margin-top:3px;">
  390. <button type="submit" class="btn-xs btn-default" name="action" value=<?=($this->JPK['IN_L1'] ? '"delete_l1_jpk">Usuń' : '"import_l1_jpk">Pobierz')?></button>
  391. </div>
  392. </div>
  393. <?php
  394. if (!($this->JPK['IN_INSERT'] || $this->JPK['IN_L1'])) {
  395. ?>
  396. <div class="form-group">
  397. <label class="col-sm-3 control-label">Reinicjalizuj deklarację</label>
  398. <div class="col-sm-9" style="margin-top:3px;">
  399. <button type="submit" class="btn-xs btn-default" name="action" value="reinitialize">Reinicjalizuj</button>
  400. </div>
  401. </div>
  402. <?php
  403. }
  404. if ($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'] && (!$this->JPK['OUT_MERGED'])) {
  405. ?>
  406. <div class="form-group">
  407. <label class="col-sm-3 control-label">Importuj dane podmiotu z</label>
  408. <div class="col-sm-9" style="margin-top:3px;">
  409. <input type="radio" name="SRC_PODMIOT" value="Insert" checked> Insert<br/>
  410. <input type="radio" name="SRC_PODMIOT" value="L1"> L1
  411. </div>
  412. </div>
  413. <div class="form-group">
  414. <label class="col-sm-3 control-label">Generuj deklarację wynikową</label>
  415. <div class="col-sm-9" style="margin-top:3px;">
  416. <button type="submit" class="btn-xs btn-default" name="action" value="generate_merged_jpk">Generuj</button>
  417. </div>
  418. </div>
  419. <?php
  420. }
  421. if ($this->JPK['OUT_MERGED']) {
  422. ?>
  423. <div class="form-group">
  424. <label class="col-sm-3 control-label">Zamknij deklarację JPK</label>
  425. <div class="col-sm-9" style="margin-top:3px;">
  426. <button type="submit" class="btn-xs btn-default" name="action" value="close_jpk">Zamknij</button>
  427. <p class="help-block">(tej operacji nie można cofnąć)</p>
  428. </div>
  429. </div>
  430. <?php
  431. }
  432. ?>
  433. <?=$this->showTable()?>
  434. <div class="form-group" style="text-align:center">
  435. <div class="col-sm-12">
  436. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  437. <input type="hidden" name="_task" value="edit">
  438. <a href="<?=$this->REFERER?>" class="btn btn-primary">Powrót</a>
  439. </div>
  440. </div>
  441. </form>
  442. </div>
  443. <?php
  444. SE_Layout::dol();
  445. }
  446. public function editAction() {
  447. $allowedActions = array("upload_insert_jpk", "delete_insert_jpk", "import_l1_jpk", "delete_l1_jpk", "generate_merged_jpk", "close_jpk", "reinitialize");
  448. if (in_array(($action = V::get('action','',$_POST)), $allowedActions)) $this->$action();
  449. else {
  450. SE_Layout::gora();
  451. SE_Layout::menu();
  452. SE_Layout::alert('danger', "Wykryto abuse! Wysłano informację do administratora.");
  453. ?>
  454. <div class="container" style="text-align:center">
  455. <form method="post" action="<?=$this->LAST_REFERER?>">
  456. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  457. <button type="submit" class="btn btn-primary">Powrót</button>
  458. </form>
  459. </div>
  460. <?php
  461. SE_Layout::dol();
  462. }
  463. }
  464. private function getSummaryJPK_VAT($xml) {
  465. $ns = $xml->getNamespaces(true);
  466. $tns = $this->tns[$this->JPK_VAT_Wariant];
  467. if (array_search($tns, $ns) === false) throw new Exception("Błąd struktury pliku XML - błędny namespace");
  468. $PodatekNaleznyFields = array("K_16" => "1", "K_18" => "1", "K_20" => "1", "K_24" => "1", "K_26" => "1", "K_28" => "1",
  469. "K_30" => "1", "K_33" => "1", "K_35" => "1", "K_36" => "1", "K_37" => "1", "K_38" => "-1", "K_39" => "-1");
  470. $PodatekNaliczonyFields = array("K_44" => 1, "K_46" => 1, "K_47" => 1, "K_48" => 1, "K_49" => 1, "K_50" => 1);
  471. $result = array(
  472. "LiczbaWierszySprzedazy" => 0,
  473. "PodatekNalezny" => 0,
  474. "LiczbaWierszyZakupow" => 0,
  475. "PodatekNaliczony" => 0);
  476. foreach ($xml->children($tns)->SprzedazWiersz as $SprzedazWiersz) {
  477. foreach ($PodatekNaleznyFields as $PodatekNaleznyField => $sign) {
  478. if (isset($SprzedazWiersz->children($tns)->$PodatekNaleznyField)) {
  479. $result["PodatekNalezny"] += round((float) $SprzedazWiersz->children($tns)->$PodatekNaleznyField * $sign, 2);
  480. }
  481. }
  482. $result["LiczbaWierszySprzedazy"]++;
  483. }
  484. foreach ($xml->children($tns)->ZakupWiersz as $ZakupWiersz) {
  485. foreach ($PodatekNaliczonyFields as $PodatekNaliczonyField => $sign) {
  486. if (isset($ZakupWiersz->children($tns)->$PodatekNaliczonyField)) {
  487. $result["PodatekNaliczony"] += round((float) $ZakupWiersz->children($tns)->$PodatekNaliczonyField * $sign, 2);
  488. }
  489. }
  490. $result["LiczbaWierszyZakupow"]++;
  491. }
  492. $result["PodatekNalezny"] = round($result["PodatekNalezny"], 2);
  493. $result["PodatekNaliczony"] = round($result["PodatekNaliczony"], 2);
  494. return $result;
  495. }
  496. private function validateJPK_VAT(&$xml) {
  497. $ns = self::getNamespaces($xml);
  498. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:KodFormularza')[0] != "JPK_VAT") throw new Exception("Błędny typ deklaracji JPK");
  499. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:WariantFormularza')[0] != $this->JPK_VAT_Wariant) throw new Exception("Błędna wersja deklaracji JPK");
  500. if ($this->JPK_VAT_Wariant == 2) {
  501. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0] != $this->JPK['PURPOSE']) throw new Exception("Niezgodny cel złożenia deklaracji JPK");
  502. } elseif ($this->JPK_VAT_Wariant == 3) {
  503. if (((int) $xml->xpath('/tns:JPK/tns:Naglowek/tns:CelZlozenia')[0]) xor ((int) $this->JPK['PURPOSE'])) throw new Exception("Niezgodny cel złożenia deklaracji JPK");
  504. }
  505. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DataOd')[0] != ($this->JPK['MONTH'] . "-01")) throw new Exception("Błędna data 'od' deklaracji JPK");
  506. 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("Błędna data 'do' deklaracji JPK");
  507. if ($this->JPK_VAT_Wariant == 2) {
  508. if ($xml->xpath('/tns:JPK/tns:Naglowek/tns:DomyslnyKodWaluty')[0] != "PLN") throw new Exception("Błędna waluta deklaracji JPK");
  509. 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");
  510. } elseif ($this->JPK_VAT_Wariant == 3) {
  511. 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");
  512. if (!$xml->Podmiot1->Email) unset($xml->Podmiot1->Email);
  513. }
  514. $summaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  515. if ($summaryJPK_VAT["LiczbaWierszySprzedazy"]) {
  516. if ($xml->xpath('/tns:JPK/tns:SprzedazCtrl/tns:LiczbaWierszySprzedazy')[0] != $summaryJPK_VAT["LiczbaWierszySprzedazy"]) throw new Exception("Brak spójności liczby wierszy sprzedaży w deklaracji JPK");
  517. if (((float) $xml->xpath('/tns:JPK/tns:SprzedazCtrl/tns:PodatekNalezny')[0]) != $summaryJPK_VAT["PodatekNalezny"]) throw new Exception("Brak spójności wartości podatku należnego w deklaracji JPK");
  518. }
  519. if ($summaryJPK_VAT["LiczbaWierszyZakupow"]) {
  520. if ($xml->xpath('/tns:JPK/tns:ZakupCtrl/tns:LiczbaWierszyZakupow')[0] != $summaryJPK_VAT["LiczbaWierszyZakupow"]) throw new Exception("Brak spójności liczby wierszy zakupów w deklaracji JPK");
  521. if (((float) $xml->xpath('/tns:JPK/tns:ZakupCtrl/tns:PodatekNaliczony')[0]) != $summaryJPK_VAT["PodatekNaliczony"]) throw new Exception("Brak spójności wartości podatku naliczonego w deklaracji JPK");
  522. }
  523. set_error_handler(function ($errno, $errstr, $errfile, $errline) {
  524. if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0)) throw new DOMException($errstr);
  525. else return false;
  526. });
  527. try {
  528. $dom = new DOMDocument();
  529. $dom->preserveWhiteSpace = false;
  530. $dom->formatOutput = true;
  531. $dom->loadXML($xml->asXML());
  532. } catch (Exception $e) {
  533. throw new Exception("Błąd parsowania pliku JPK");
  534. }
  535. restore_error_handler();
  536. $xsd = [
  537. 2 => 'Schemat_JPK_VAT(2)_v1-0.xsd',
  538. 3 => 'Schemat_JPK_VAT(3)_v1-1.xsd',
  539. ];
  540. libxml_use_internal_errors(true);
  541. if (!$dom->schemaValidate(APP_PATH_SCHEMA . "/jpk/" . $xsd[$this->JPK_VAT_Wariant])) {
  542. $errors = '';
  543. foreach (libxml_get_errors() as $libxml_error) $errors .= "<br/>{$libxml_error->message}";
  544. throw new Exception("Plik JPK niezgodny ze schematem XSD{$errors}<pre>" . htmlentities($dom->saveXML()) . "</pre>");
  545. }
  546. $xml = simplexml_load_string($dom->saveXML());
  547. }
  548. private function upload_insert_jpk() {
  549. try {
  550. if ($_FILES['IN_INSERT']['type'] != "text/xml") throw new Exception("Błędny plik JPK");
  551. $xml = simplexml_load_file($_FILES['IN_INSERT']['tmp_name']);
  552. $this->validateJPK_VAT($xml);
  553. if ($this->JPK['IN_L1']) $info = "Zaimportowano dane z Insert i L1";
  554. else $info = "Zaimportowano dane z Insert";
  555. $sqlObj = new stdClass();
  556. $sqlObj->ID = $this->JPK['ID'];
  557. $sqlObj->A_STATUS_INFO = $info;
  558. $sqlObj->IN_INSERT = $xml->asXml();
  559. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił błąd, prawdopodobnie Ten plik JPK został wgrany już wcześniej");
  560. $this->handleAuth();
  561. $this->edit();
  562. } catch (Exception $e) {
  563. SE_Layout::gora();
  564. SE_Layout::menu();
  565. SE_Layout::alert('danger', $e->getMessage());
  566. ?>
  567. <div class="container" style="text-align:center">
  568. <form method="post" action="<?=$this->LAST_REFERER?>">
  569. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  570. <button type="submit" class="btn btn-primary">Powrót</button>
  571. </form>
  572. </div>
  573. <?php
  574. SE_Layout::dol();
  575. }
  576. }
  577. private function delete_insert_jpk() {
  578. try {
  579. $info = "Usunięto dane z Insert";
  580. if ($this->JPK['IN_L1']) $info .= " (pozostawiono dane z L1)";
  581. $sqlObj = new stdClass();
  582. $sqlObj->ID = $this->JPK['ID'];
  583. $sqlObj->A_STATUS_INFO = $info;
  584. $sqlObj->IN_INSERT = null;
  585. $sqlObj->OUT_MERGED = null;
  586. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
  587. $this->handleAuth();
  588. $this->edit();
  589. } catch (Exception $e) {
  590. SE_Layout::gora();
  591. SE_Layout::menu();
  592. SE_Layout::alert('danger', $e->getMessage());
  593. ?>
  594. <div class="container" style="text-align:center">
  595. <form method="post" action="<?=$this->LAST_REFERER?>">
  596. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  597. <button type="submit" class="btn btn-primary">Powrót</button>
  598. </form>
  599. </div>
  600. <?php
  601. SE_Layout::dol();
  602. }
  603. }
  604. private function validateNIP($nip_orig, $name, $type) {
  605. $nip = str_replace("-", "", trim($nip_orig));
  606. $error = false;
  607. if ($nip == "" || $nip == "Brak") return true;
  608. $prefix = substr($nip, 0, 2);
  609. if (!is_numeric($prefix)) $nip = substr($nip, 2);
  610. else $prefix = null;
  611. if ($prefix && $prefix != "PL") return true;
  612. if (strlen($nip) != 10 || (!is_numeric($nip))) $error = true;
  613. else {
  614. $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;
  615. $error = ($control != $nip[9]);
  616. }
  617. if ($error) {
  618. $this->NIPerrors[] = "NIP: {$nip_orig}, nazwa: {$name}, rodzaj dokumentu: {$type}";
  619. return false;
  620. }
  621. return true;
  622. }
  623. private function import_l1_jpk() {
  624. $xmlSchemaWarianty = [];
  625. $xmlSchemaWarianty[2] = <<<EOT
  626. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
  627. <JPK xmlns="{$this->tns[$this->JPK_VAT_Wariant]}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  628. <Naglowek>
  629. <KodFormularza kodSystemowy="JPK_VAT (2)" wersjaSchemy="1-0">JPK_VAT</KodFormularza>
  630. <WariantFormularza>2</WariantFormularza>
  631. <CelZlozenia></CelZlozenia>
  632. <DataWytworzeniaJPK></DataWytworzeniaJPK>
  633. <DataOd></DataOd>
  634. <DataDo></DataDo>
  635. <DomyslnyKodWaluty>PLN</DomyslnyKodWaluty>
  636. <KodUrzedu></KodUrzedu>
  637. </Naglowek>
  638. <Podmiot1>
  639. <IdentyfikatorPodmiotu>
  640. <etd:NIP></etd:NIP>
  641. <etd:PelnaNazwa></etd:PelnaNazwa>
  642. <etd:REGON></etd:REGON>
  643. </IdentyfikatorPodmiotu>
  644. <AdresPodmiotu>
  645. <KodKraju></KodKraju>
  646. <Wojewodztwo></Wojewodztwo>
  647. <Powiat></Powiat>
  648. <Gmina></Gmina>
  649. <Ulica></Ulica>
  650. <NrDomu></NrDomu>
  651. <NrLokalu></NrLokalu>
  652. <Miejscowosc></Miejscowosc>
  653. <KodPocztowy></KodPocztowy>
  654. <Poczta></Poczta>
  655. </AdresPodmiotu>
  656. </Podmiot1>
  657. </JPK>
  658. EOT;
  659. $xmlSchemaWarianty[3] = <<<EOT
  660. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
  661. <JPK xmlns="{$this->tns[$this->JPK_VAT_Wariant]}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  662. <Naglowek>
  663. <KodFormularza kodSystemowy="JPK_VAT (3)" wersjaSchemy="1-1">JPK_VAT</KodFormularza>
  664. <WariantFormularza>3</WariantFormularza>
  665. <CelZlozenia></CelZlozenia>
  666. <DataWytworzeniaJPK></DataWytworzeniaJPK>
  667. <DataOd></DataOd>
  668. <DataDo></DataDo>
  669. <NazwaSystemu>Procesy5</NazwaSystemu>
  670. </Naglowek>
  671. <Podmiot1>
  672. <NIP></NIP>
  673. <PelnaNazwa></PelnaNazwa>
  674. <Email></Email>
  675. </Podmiot1>
  676. </JPK>
  677. EOT;
  678. $xmlSchema = $xmlSchemaWarianty[$this->JPK_VAT_Wariant];
  679. $queryFVAT = <<<EOT
  680. select
  681. bn.ID as BN_ID,
  682. 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,
  683. 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,
  684. bf.SELL_DATE AS 'DataWystawienia',
  685. concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
  686. 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',
  687. round(bfp.AMMOUNT * bfp.PRICE, 2) as Netto,
  688. round(round(bfp.AMMOUNT * bfp.PRICE, 2) * bfp.VAT/100, 2) as VAT,
  689. bfp.VAT_NAME as 'VAT_NAME'
  690. from BILLING_NUMBERS bn
  691. join BILLS_FVAT bf on bn.ID=bf.ID_BILLING_NUMBERS
  692. join BILLS_FVAT_POS bfp on bf.ID=bfp.ID_BILLS_FVAT
  693. join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
  694. join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
  695. left join BILLING_USERS_ADD bua_tp on bu.TAXPAYER_ID_BILLING_USERS = bua_tp.id_users
  696. where bn.ID_BILLING_NUMBERS_TYPE='1' and bf.BILL_DATE like '{$this->JPK['MONTH']}%'
  697. and bu.BILLING_OWNER='{$this->BO['ID']}'
  698. order by bf.BILL_DATE,bn.ID
  699. EOT;
  700. $queryKORV = <<<EOT
  701. select
  702. bn.ID AS BN_ID,
  703. concat(bua.P_NAME, if(bua.P_NAME_SECOND='','',concat(' ',bua.P_NAME_SECOND))) AS NazwaKontrahenta,
  704. concat(bua.P_ADDRESS_STREET,' ',bua.P_ADDRESS_HOUSE, if(bua.P_ADDRESS_HOME='','',concat('/',bua.P_ADDRESS_HOME)),', ',P_ADDRESS_POST_CODE,' ',P_ADDRESS_CITY) AS AdresKontrahenta,
  705. bk.BILL_DATE AS 'DataWystawienia',
  706. bk.SELL_DATE AS 'DataSprzedazy',
  707. concat(bn.NUMBER,'/',bn.ID_BILLING_PREFIXES) AS 'DowodSprzedazy',
  708. if(is_firma=0,'Brak',coalesce(bua.P_NIP,'')) AS 'NrKontrahenta',
  709. bkp.AMMOUNT AS AMMOUNT,
  710. bkp.PRICE AS PRICE,
  711. bkp.VAT AS VAT,
  712. bkp.VAT_NAME AS VAT_NAME,
  713. bkp.N_AMMOUNT AS N_AMMOUNT,
  714. bkp.N_PRICE AS N_PRICE,
  715. bkp.N_VAT AS N_VAT,
  716. bkp.N_VAT_NAME AS N_VAT_NAME,
  717. bkp.TYP_KOREKTY AS TYP_KOREKTY
  718. from BILLING_NUMBERS bn
  719. join BILLS_KORV bk on bn.ID=bk.ID_BILLING_NUMBERS
  720. join BILLS_KORV_POS bkp on bk.ID=bkp.ID_BILLS_FVAT
  721. join BILLING_USERS_ADD bua on bua.id_users=bn.ID_BILLING_USERS
  722. join BILLING_USERS bu on bu.ID=bn.ID_BILLING_USERS
  723. where bn.ID_BILLING_NUMBERS_TYPE='3'
  724. and bk.BILL_DATE like '{$this->JPK['MONTH']}%'
  725. and bkp.TYP_KOREKTY IS NOT NULL
  726. and bu.BILLING_OWNER='{$this->BO['ID']}'
  727. order by bk.BILL_DATE,bn.ID
  728. EOT;
  729. $xmlVAT = [
  730. 'ZW' => ['netto' => ['K_10']],
  731. '0' => ['netto' => ['K_13']],
  732. '7' => ['netto' => ['K_17'], 'vat' => 'K_18'],
  733. '8' => ['netto' => ['K_17'], 'vat' => 'K_18'],
  734. '22' => ['netto' => ['K_19'], 'vat' => 'K_20'],
  735. '23' => ['netto' => ['K_19'], 'vat' => 'K_20'],
  736. 'OO UE' => ['netto' => ['K_11', 'K_12']],
  737. ];
  738. try {
  739. 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;")) {
  740. throw new Exception("wykryto niezamknięte faktury lub korekty faktur");
  741. }
  742. $xml = new SimpleXMLElement($xmlSchema);
  743. $ns = $xml->getNamespaces(true);
  744. $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE'];
  745. $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
  746. $xml->Naglowek->DataOd = $this->JPK['MONTH'] . "-01";
  747. $xml->Naglowek->DataDo = date("Y-m-d", strtotime($xml->Naglowek->DataOd . "+ 1 month - 1 day"));
  748. if ($this->JPK_VAT_Wariant == 2) {
  749. if (!($xml->Naglowek->KodUrzedu = $this->BO['kodUrzeduSkarbowego'])) throw new Exception("blędne dane podmiotu - brak kodu urzędu skarbowego");
  750. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP");
  751. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
  752. if ($this->BO['name2']) $xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->PelnaNazwa .= " " . $this->BO['name2'];
  753. if (!($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON = $this->BO['regon'])) unset($xml->Podmiot1->IdentyfikatorPodmiotu->children($ns['etd'])->REGON);
  754. if (!($xml->Podmiot1->AdresPodmiotu->KodKraju = $this->BO['kodKraju'])) throw new Exception("blędne dane podmiotu - brak kodu kraju");
  755. if (!($xml->Podmiot1->AdresPodmiotu->Wojewodztwo = $this->BO['wojewodztwo'])) unset($xml->Podmiot1->AdresPodmiotu->Wojewodztwo);
  756. if (!($xml->Podmiot1->AdresPodmiotu->Powiat = $this->BO['powiat'])) unset($xml->Podmiot1->AdresPodmiotu->Powiat);
  757. if (!($xml->Podmiot1->AdresPodmiotu->Gmina = $this->BO['gmina'])) unset($xml->Podmiot1->AdresPodmiotu->Gmina);
  758. if (!($xml->Podmiot1->AdresPodmiotu->Ulica = $this->BO['ulica'])) unset($xml->Podmiot1->AdresPodmiotu->Ulica);
  759. if (!($xml->Podmiot1->AdresPodmiotu->NrDomu = $this->BO['numer_dom'])) unset($xml->Podmiot1->AdresPodmiotu->NrDomu);
  760. if (!($xml->Podmiot1->AdresPodmiotu->NrLokalu = $this->BO['numer_pos'])) unset($xml->Podmiot1->AdresPodmiotu->NrLokalu);
  761. if (!($xml->Podmiot1->AdresPodmiotu->Miejscowosc = $this->BO['miasto'])) throw new Exception("blędne dane podmiotu - brak nazwy miejscowości");
  762. if (!($xml->Podmiot1->AdresPodmiotu->KodPocztowy = $this->BO['kod'])) unset($xml->Podmiot1->AdresPodmiotu->KodPocztowy);
  763. if (!($xml->Podmiot1->AdresPodmiotu->Poczta = $this->BO['poczta'])) unset($xml->Podmiot1->AdresPodmiotu->Poczta);
  764. } elseif ($this->JPK_VAT_Wariant == 3) {
  765. if (!($xml->Podmiot1->NIP = trim(str_replace("-", "", $this->BO['nip'])))) throw new Exception("blędne dane podmiotu - brak NIP");
  766. if (!($xml->Podmiot1->PelnaNazwa = $this->BO['name1'])) throw new Exception("blędne dane podmiotu - brak nazwy podmiotu");
  767. $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';
  768. if (preg_match($mailRegex, $this->BO['BILLING_OWNER_EMAIL'])) $xml->Podmiot1->Email = $this->BO['BILLING_OWNER_EMAIL'];
  769. else unset($xml->Podmiot1->Email);
  770. }
  771. $data = array();
  772. $allVAT = 0;
  773. $result = DB::getPDO(931)->fetchall($queryFVAT);
  774. foreach ($result as $row) {
  775. $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta']));
  776. $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
  777. $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
  778. $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
  779. $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
  780. if (!in_array($row['VAT_NAME'],array_keys($xmlVAT))) throw new Exception("Problem ze stawką VAT (1) - {$row['VAT_NAME']}");
  781. foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += $row['Netto'];
  782. if ($row['VAT'] > 0) {
  783. if (!isset($xmlVAT[$row['VAT_NAME']]['vat'])) throw new Exception("Problem ze stawką VAT (2) - {$row['VAT_NAME']}");
  784. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += $row['VAT'];
  785. $allVAT += $row['VAT'];
  786. }
  787. }
  788. $result = DB::getPDO(931)->fetchall($queryKORV);
  789. foreach ($result as $row) {
  790. $data[$row['BN_ID']][0]['NrKontrahenta'] = trim(str_replace("-", "", $row['NrKontrahenta']));
  791. $data[$row['BN_ID']][0]['NazwaKontrahenta'] = $row['NazwaKontrahenta'];
  792. $data[$row['BN_ID']][0]['AdresKontrahenta'] = $row['AdresKontrahenta'];
  793. $data[$row['BN_ID']][0]['DowodSprzedazy'] = $row['DowodSprzedazy'];
  794. $data[$row['BN_ID']][0]['DataWystawienia'] = $row['DataWystawienia'];
  795. $data[$row['BN_ID']][0]['DataSprzedazy'] = $row['DataSprzedazy'];
  796. 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']}");
  797. 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']}");
  798. if ($row['VAT_NAME'] == $row['N_VAT_NAME']) {
  799. foreach ($xmlVAT[$row['VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] += round($row['AMMOUNT']*$row['PRICE'],2);
  800. if ($row['VAT'] > 0) {
  801. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  802. $allVAT += round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  803. }
  804. } else {
  805. 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);
  806. foreach ($xmlVAT[$row['N_VAT_NAME']]['netto'] as $netto) $data[$row['BN_ID']][1][$netto] -= round($row['N_AMMOUNT']*$row['N_PRICE'],2);
  807. if ($row['VAT'] > 0) {
  808. $data[$row['BN_ID']][1][$xmlVAT[$row['VAT_NAME']]['vat']] += round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['VAT']/100,2)
  809. + round(round($row['AMMOUNT']*$row['PRICE'],2)*$row['VAT']/100,2);
  810. $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);
  811. }
  812. if ($row['N_VAT'] > 0) {
  813. $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);
  814. $allVAT -= round(round($row['N_AMMOUNT']*$row['N_PRICE'],2)*$row['N_VAT']/100,2);
  815. }
  816. }
  817. }
  818. ksort($data);
  819. $addCdata = function(&$node, $value) {
  820. $dom_node = dom_import_simplexml($node);
  821. $dom_owner = $dom_node->ownerDocument;
  822. $dom_node->appendChild($dom_owner->createCDATASection($value));
  823. };
  824. $i = 0;
  825. foreach ($data as $pos) {
  826. $this->validateNIP($pos[0]['NrKontrahenta'], $pos[0]['NazwaKontrahenta'], 'Sprzedaż L1');
  827. $x = $xml->addChild('SprzedazWiersz');
  828. if ($this->JPK_VAT_Wariant == 2) $x->addAttribute('typ', 'G');
  829. $x->addChild('LpSprzedazy', ++$i);
  830. ksort($pos[1]);
  831. foreach ($pos as $subpos) foreach ($subpos as $key => $value) {
  832. $x->addChild($key, $value);
  833. if (!strlen($x->$key)) $addCdata($x->$key, $value);
  834. }
  835. }
  836. if ($this->NIPerrors) throw new Exception("Błędne numery NIP:<br/>" . implode("<br/>", $this->NIPerrors));
  837. $xml->SprzedazCtrl->LiczbaWierszySprzedazy = count($data);
  838. $xml->SprzedazCtrl->PodatekNalezny = $allVAT;
  839. $this->validateJPK_VAT($xml);
  840. if ($this->JPK['IN_INSERT']) $info = "Zaimportowano dane z Insert i L1";
  841. else $info = "Zaimportowano dane z L1";
  842. $sqlObj = new stdClass();
  843. $sqlObj->ID = $this->JPK['ID'];
  844. $sqlObj->A_STATUS_INFO = $info;
  845. $sqlObj->IN_L1 = $xml->asXml();
  846. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  847. $this->handleAuth();
  848. $this->edit();
  849. } catch (Exception $e) {
  850. SE_Layout::gora();
  851. SE_Layout::menu();
  852. SE_Layout::alert('danger', "Błąd w trakcie importu danych z L1. {$e->getMessage()}");
  853. ?>
  854. <div class="container" style="text-align:center">
  855. <form method="post" action="<?=$this->LAST_REFERER?>">
  856. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  857. <button type="submit" class="btn btn-primary">Powrót</button>
  858. </form>
  859. </div>
  860. <?php
  861. SE_Layout::dol();
  862. }
  863. }
  864. private function delete_l1_jpk() {
  865. try {
  866. $info = "Usunięto dane z L1";
  867. if ($this->JPK['IN_INSERT']) $info .= " (pozostawiono dane z Insert)";
  868. $sqlObj = new stdClass();
  869. $sqlObj->ID = $this->JPK['ID'];
  870. $sqlObj->A_STATUS_INFO = $info;
  871. $sqlObj->IN_L1 = null;
  872. $sqlObj->OUT_MERGED = null;
  873. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd");
  874. $this->handleAuth();
  875. $this->edit();
  876. } catch (Exception $e) {
  877. SE_Layout::gora();
  878. SE_Layout::menu();
  879. SE_Layout::alert('danger', $e->getMessage());
  880. ?>
  881. <div class="container" style="text-align:center">
  882. <form method="post" action="<?=$this->LAST_REFERER?>">
  883. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  884. <button type="submit" class="btn btn-primary">Powrót</button>
  885. </form>
  886. </div>
  887. <?php
  888. SE_Layout::dol();
  889. }
  890. }
  891. private static function removeTnsNamespace(&$xml) {
  892. $ns = $xml->getNamespaces(true);
  893. if (isset($ns[''])) return;
  894. if ((!isset($ns['tns']) || isset($ns['xsi']))) throw new Exception("Błędna struktura pliku XML - błędne namespace");
  895. $dom = dom_import_simplexml($xml);
  896. $ns_uri = $dom->lookupNamespaceURI('tns');
  897. $dom->removeAttributeNS($ns_uri, 'tns');
  898. $xml->addAttribute('xmlns', $ns['tns']);
  899. $xml->addAttribute('xmlns:xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
  900. $xml = simplexml_load_string($xml->asXML());
  901. }
  902. private function generate_merged_jpk() {
  903. $xmlSchemaWariant = [];
  904. $xmlSchemaWariant[2] = <<<EOT
  905. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  906. <JPK xmlns="{$this->tns[$this->JPK_VAT_Wariant]}" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  907. </JPK>
  908. EOT;
  909. $xmlSchemaWariant[3] = <<<EOT
  910. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  911. <JPK xmlns="{$this->tns[$this->JPK_VAT_Wariant]}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  912. </JPK>
  913. EOT;
  914. $xmlSchema = $xmlSchemaWariant[$this->JPK_VAT_Wariant];
  915. $xml_append = function(SimpleXMLElement $to, SimpleXMLElement $from) {
  916. $toDom = dom_import_simplexml($to);
  917. $fromDom = dom_import_simplexml($from);
  918. $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
  919. };
  920. try {
  921. if (!($this->JPK['IN_INSERT'] && $this->JPK['IN_L1'])) throw new Exception("Błąd danych");
  922. $xmlInsert = simplexml_load_string($this->JPK['IN_INSERT']);
  923. self::removeTnsNamespace($xmlInsert);
  924. $xmlL1 = simplexml_load_string($this->JPK['IN_L1']);
  925. $xml = simplexml_load_string($xmlSchema);
  926. $tns = $this->tns[$this->JPK_VAT_Wariant];
  927. switch (V::get('SRC_PODMIOT','',$_POST)) {
  928. case "Insert":
  929. $xml_append($xml, $xmlInsert->children($tns)->Naglowek);
  930. $xml_append($xml, $xmlInsert->children($tns)->Podmiot1);
  931. if ($this->JPK_VAT_Wariant == 3) {
  932. $xml->Naglowek->NazwaSystemu .= "; " . $xmlL1->Naglowek->NazwaSystemu;
  933. if ((!isset($xml->Podmiot1->Email)) && isset($xmlL1->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlL1->Podmiot1->Email;
  934. }
  935. break;
  936. case "L1":
  937. $xml_append($xml, $xmlL1->children($tns)->Naglowek);
  938. $xml_append($xml, $xmlL1->children($tns)->Podmiot1);
  939. if ($this->JPK_VAT_Wariant == 3) {
  940. $xml->Naglowek->NazwaSystemu .= "; " . $xmlInsert->Naglowek->NazwaSystemu;
  941. if ((!isset($xml->Podmiot1->Email)) && isset($xmlInsert->Podmiot1->Email)) $xml->Podmiot1->Email = $xmlInsert->Podmiot1->Email;
  942. }
  943. break;
  944. default:
  945. throw new Exception("Błąd formularza");
  946. }
  947. $xml->Naglowek->DataWytworzeniaJPK = date("Y-m-d\TH:i:s");
  948. $xml->Naglowek->CelZlozenia = $this->JPK['PURPOSE'];
  949. $i = 0;
  950. foreach ($xmlInsert->SprzedazWiersz as $sprzedazWiersz) {
  951. $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż Insert");
  952. $sprzedazWiersz->LpSprzedazy = ++$i;
  953. $xml_append($xml, $sprzedazWiersz);
  954. }
  955. foreach ($xmlL1->SprzedazWiersz as $sprzedazWiersz) {
  956. $this->validateNIP($sprzedazWiersz->NrKontrahenta, $sprzedazWiersz->NazwaKontrahenta, "Sprzedaż L1");
  957. $sprzedazWiersz->LpSprzedazy = ++$i;
  958. $xml_append($xml, $sprzedazWiersz);
  959. }
  960. $xml->addChild("SprzedazCtrl");
  961. $i = 0;
  962. foreach ($xmlInsert->ZakupWiersz as $zakupWiersz) {
  963. $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup Insert");
  964. $zakupWiersz->LpZakupu = ++$i;
  965. $xml_append($xml, $zakupWiersz);
  966. }
  967. foreach ($xmlL1->ZakupWiersz as $zakupWiersz) {
  968. $this->validateNIP($zakupWiersz->NrDostawcy, $zakupWiersz->NazwaDostawcy, "Zakup L1");
  969. $zakupWiersz->LpZakupu = ++$i;
  970. $xml_append($xml, $zakupWiersz);
  971. }
  972. $xml->addChild("ZakupCtrl");
  973. if ($this->NIPerrors) throw new Exception("Błędne numery NIP:<br/>" . implode("<br/>", $this->NIPerrors));
  974. $sumaryJPK_VAT = $this->getSummaryJPK_VAT($xml);
  975. $xml->SprzedazCtrl->LiczbaWierszySprzedazy = $sumaryJPK_VAT['LiczbaWierszySprzedazy'];
  976. $xml->SprzedazCtrl->PodatekNalezny = $sumaryJPK_VAT['PodatekNalezny'];
  977. $xml->ZakupCtrl->LiczbaWierszyZakupow = $sumaryJPK_VAT['LiczbaWierszyZakupow'];
  978. $xml->ZakupCtrl->PodatekNaliczony = $sumaryJPK_VAT['PodatekNaliczony'];
  979. $this->validateJPK_VAT($xml);
  980. $sqlObj = new stdClass();
  981. $sqlObj->ID = $this->JPK['ID'];
  982. $sqlObj->A_STATUS_INFO = "Wygenerowano wynikowy plik JPK";
  983. $sqlObj->OUT_MERGED = $xml->asXml();
  984. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  985. $this->handleAuth();
  986. $this->edit();
  987. } catch (Exception $e) {
  988. SE_Layout::gora();
  989. SE_Layout::menu();
  990. SE_Layout::alert('danger', $e->getMessage());
  991. ?>
  992. <div class="container" style="text-align:center">
  993. <form method="post" action="<?=$this->LAST_REFERER?>">
  994. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  995. <button type="submit" class="btn btn-primary">Powrót</button>
  996. </form>
  997. </div>
  998. <?php
  999. SE_Layout::dol();
  1000. }
  1001. }
  1002. private function close_jpk() {
  1003. try {
  1004. $sqlObj = new stdClass();
  1005. $sqlObj->ID = $this->JPK['ID'];
  1006. $sqlObj->A_STATUS = 'OFF_HARD';
  1007. $sqlObj->A_STATUS_INFO = "Zamknięto deklarację JPK";
  1008. if (!$affected = DB::getDB()->UPDATE_OBJ('JPK', $sqlObj)) throw new Exception("Wystąpił nieznany błąd bazy danych");
  1009. $this->handleAuth();
  1010. $this->show();
  1011. } catch (Exception $e) {
  1012. SE_Layout::gora();
  1013. SE_Layout::menu();
  1014. SE_Layout::alert('danger', $e->getMessage());
  1015. ?>
  1016. <div class="container" style="text-align:center">
  1017. <form method="post" action="<?=$this->LAST_REFERER?>">
  1018. <input type="hidden" name="REFERER" value="<?=$this->REFERER?>"/>
  1019. <button type="submit" class="btn btn-primary">Powrót</button>
  1020. </form>
  1021. </div>
  1022. <?php
  1023. SE_Layout::dol();
  1024. }
  1025. }
  1026. private function reinitialize() {
  1027. $sqlObj = new stdClass();
  1028. $sqlObj->ID = $this->JPK['ID'];
  1029. $sqlObj->A_STATUS = 'WAITING';
  1030. $sqlObj->A_STATUS_INFO = "Oczekuje na inicjalizację";
  1031. $sqlObj->MONTH = "NULL";
  1032. $sqlObj->PURPOSE = "NULL";
  1033. DB::getDB()->UPDATE_OBJ('JPK', $sqlObj);
  1034. $this->initialize();
  1035. }
  1036. public function defaultAction() {
  1037. switch ($this->JPK['A_STATUS']) {
  1038. case "WAITING":
  1039. $this->initialize();
  1040. break;
  1041. case "NORMAL":
  1042. $this->edit();
  1043. break;
  1044. case "OFF_HARD":
  1045. $this->show();
  1046. break;
  1047. default:
  1048. SE_Layout::alert('danger', "Błędny status rekordu.");
  1049. }
  1050. }
  1051. }