JPK.php 43 KB

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