JPK.php 65 KB

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