PageRenderTime 61ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 1ms

/plugins/fortfuehrungslisten/model/loader.php

https://github.com/srahn/kvwmap
PHP | 309 lines | 261 code | 25 blank | 23 comment | 56 complexity | 8bedb3aa3365b24fe12fc4f5a7e7f3b8 MD5 | raw file
  1. <?php
  2. class NASLoader extends DOMDocument {
  3. static $write_debug = false;
  4. public $messages = array();
  5. function __construct($gui) {
  6. $gui->debug->show('Create new Object NASLoader', NASLoader::$write_debug);
  7. $this->gui = $gui;
  8. }
  9. function load_fortfuehrungsfaelle($ff_auftrag) {
  10. $success = true;
  11. $file_name = $ff_auftrag->get_file_name();
  12. $original_file_name = $ff_auftrag->get_original_file_name();
  13. #echo '<br>Lade Datei: ' . $file_name;
  14. $file = pathinfo($file_name);
  15. #echo '<br>Prüfe ob Datei: ' . $file['basename'] . ' eine Zip-Datei ist.';
  16. if (strtolower($file['extension']) == 'zip') {
  17. #echo '<br>Ja Datei ist eine Zipdatei. Versuche auszupacken.';
  18. $unziped_files = unzip($file_name, false, false, true);
  19. foreach ($unziped_files AS $unziped_file) {
  20. $unziped_file = str_replace('\\', '/', $unziped_file);
  21. #echo '<br>Verarbeite ausgepackte Datei: ' . $unziped_file;
  22. $pathinfo_unziped_file = pathinfo($unziped_file);
  23. if (substr($pathinfo_unziped_file['filename'], -5) == '_2000') {
  24. $xml_file_name = $file['dirname'] . '/'. $unziped_file;
  25. $xml = file_get_contents($xml_file_name);
  26. }
  27. $rm_file = $file['dirname'] . '/' . $unziped_file;
  28. #echo '<br>Lösche Datei: ' . $rm_file;
  29. unlink(str_replace('\\', '/', $file['dirname'] . '/' . $unziped_file));
  30. if (!empty($pathinfo_unziped_file['dirname'])) {
  31. $rmdir = $file['dirname'] . '/' . $pathinfo_unziped_file['dirname'];
  32. #echo '<br>Lösche Verzeichnis: ' . $rmdir;
  33. @rmdir($rmdir);
  34. }
  35. }
  36. if (empty($xml_file_name)) {
  37. $success = false;
  38. GUI::$messages[] = array(
  39. 'msg' => "Keine Datei mit der Endung _2000 in Zip-Datei gefunden. Prüfen Sie bitte ob Sie die richtige Zip-Datei hochgeladen haben.",
  40. 'type' => 'error'
  41. );
  42. }
  43. }
  44. else {
  45. $xml_file_name = $file_name;
  46. $xml = file_get_contents($xml_file_name);
  47. }
  48. if (empty($xml_file_name)) {
  49. $success = false;
  50. GUI::$messages[] = array(
  51. 'msg' => "Keine Datei gefunden. Prüfen Sie ob Sie schon eine Datei hochgeladen haben.",
  52. 'type' => 'error'
  53. );
  54. }
  55. else {
  56. #echo '<br>Lade Datei: ' . $xml_file_name;
  57. $this->loadXML($xml, LIBXML_NOBLANKS);
  58. # Lese und speicher Attribute zum Auftrag
  59. $nodes = $this->getElementsByTagName('datumDerAusgabe');
  60. $node = $nodes->item(0);
  61. $ff_auftrag->set('datumderausgabe', $node->nodeValue);
  62. $nodes = $this->getElementsByTagName('AX_Fortfuehrungsauftrag');
  63. $auftrag_node = $nodes->item(0);
  64. foreach($auftrag_node->childNodes AS $child_node) {
  65. #echo '<br>node: ' . $child_node->localName;
  66. $tag = strtolower($child_node->localName);
  67. if (in_array($tag, array(
  68. 'profilkennung',
  69. 'auftragsnummer',
  70. 'impliziteloeschungderreservierung',
  71. 'verarbeitungsart',
  72. 'geometriebehandlung',
  73. 'mittemporaeremarbeitsbereich',
  74. 'mitobjektenimfortfuehrungsgebiet',
  75. 'mitfortfuehrungsnachweis'
  76. ))) {
  77. $ff_auftrag->set($tag, $child_node->nodeValue);
  78. }
  79. if ($tag == 'antragsnummer') {
  80. $antragsnummer_datei = $child_node->nodeValue;
  81. }
  82. }
  83. if ($antragsnummer_datei != $ff_auftrag->get('antragsnr')) {
  84. $success = false;
  85. GUI::$messages[] = array(
  86. 'msg' => "Die Antragsnummer in der Auftragsdatei (" . $antragsnummer_datei . ") stimmt nicht mit der Antragsnr im Formular (" . $ff_auftrag->get('antragsnr') . ") überein.<br>Prüfen Sie die Eingabe und die Datei<br>und laden Sie ggf. eine neue Datei hoch!",
  87. 'type' => 'warning'
  88. );
  89. }
  90. else {
  91. # Suche alle Gemarkungsnummern von Flurstücken raus.
  92. $this->gemkg_nummern = $this->getElementsByTagName('gemarkungsnummer');
  93. if ($this->gemkg_nummern->length > 0) {
  94. foreach($this->gemkg_nummern AS $gemkg_nummer) {
  95. if ($gemkg_nummer->nodeValue != $ff_auftrag->get('gemkgnr')) {
  96. $success = ($ff_auftrag->get('an_pruefen') == 't' ? false : true);
  97. $msg = "In der Auftragsdatei wurde die Gemarkungsnummer: " . $gemkg_nummer->nodeValue . " gefunden. Diese Nummer stimmt nicht mit der im Formular oben angegebenen Gemarkungsnummer: " . $ff_auftrag->get('gemkgnr') . ' überein.';
  98. if (!$success) {
  99. $msg .= "<br>Korrigieren Sie die Gemarkungsnummer im Formular, prüfen Sie ob die Auftragsdatei korrekt ist oder speichern Sie vorher, dass der Datensatz nicht geprüft werden soll.";
  100. }
  101. GUI::$messages[] = array(
  102. 'msg' => $msg,
  103. 'type' => ($ff_auftrag->get('an_pruefen') == 't' ? 'error' : 'warning')
  104. );
  105. break;
  106. }
  107. }
  108. }
  109. if ($success) {
  110. # Finde Gebäude und deren Anlass
  111. $this->gebaeude_nodes = $this->getElementsByTagName('AX_Gebaeude');
  112. if ($this->gebaeude_nodes->length > 0) {
  113. foreach($this->gebaeude_nodes->item(0)->childNodes AS $child_node) {
  114. $tag = strtolower($child_node->localName);
  115. if ($tag == 'anlass') {
  116. $ff_auftrag->set('gebaeude', $child_node->nodeValue);
  117. }
  118. }
  119. }
  120. # speicher Auftrag
  121. $ff_auftrag->update();
  122. # Finde Flurstüecke und deren Anlässe
  123. $this->flst_nodes = $this->getElementsByTagName('AX_Flurstueck');
  124. $flurstuecke = array();
  125. foreach($this->flst_nodes AS $flst_node) {
  126. foreach($flst_node->childNodes AS $child_node) {
  127. $tag = strtolower($child_node->localName);
  128. if ($tag == 'flurstueckskennzeichen') {
  129. $flst['flurstueckskennzeichen'] = $child_node->nodeValue;
  130. }
  131. if ($tag == 'anlass') {
  132. $flst['anlass'] = $child_node->nodeValue;
  133. }
  134. }
  135. $anlaesse[$flst['flurstueckskennzeichen']] = $flst['anlass'];
  136. }
  137. # Lösche vorhandene Fälle des Auftrages
  138. $ff = new Fortfuehrungsfall($this->gui);
  139. $ff->delete_by('ff_auftrag_id', $ff_auftrag->get('id'));
  140. # Lege Fälle des Auftrages an
  141. $this->fall_nodes = $this->getElementsByTagName('AX_Fortfuehrungsfall');
  142. foreach($this->fall_nodes AS $fall_node) {
  143. $ff = new Fortfuehrungsfall($this->gui);
  144. $ff->set('ff_auftrag_id', $ff_auftrag->get('id'));
  145. foreach($fall_node->childNodes AS $child_node) {
  146. $tag = strtolower($child_node->localName);
  147. if (in_array($tag, array(
  148. 'fortfuehrungsfallnummer',
  149. 'laufendenummer',
  150. 'ueberschriftimfortfuehrungsnachweis'
  151. ))) {
  152. $ff->set($tag, $child_node->nodeValue);
  153. }
  154. if ($tag == 'zeigtaufaltesflurstueck') {
  155. $ff->set_array($tag, $child_node->nodeValue);
  156. }
  157. if ($tag == 'zeigtaufneuesflurstueck') {
  158. # Speichert neues Flurstück nur, wenn es nicht mit altem übereinstimmt
  159. if ($child_node->nodeValue != $ff->get('zeigtaufaltesflurstueck')[0]) {
  160. # Ab 2017 prüfe ob es eine höhere Flurstücksnummer in ALKIS gibt als die, die eingetragen werden soll
  161. if ($ff_auftrag->get('jahr') > 2016) {
  162. $result = $this->is_last_nenner($child_node->nodeValue, $ff->get('fortfuehrungsfallnummer'));
  163. if ($result['success']) {
  164. if (!empty($result['bigger_kennz'])) {
  165. GUI::$messages[] = array(
  166. 'msg' => $result['msg'],
  167. 'type' => 'warning'
  168. );
  169. }
  170. }
  171. else {
  172. GUI::$messages[] = array(
  173. 'msg' => $result['msg'],
  174. 'type' => 'error'
  175. );
  176. }
  177. }
  178. $ff->set_array('anlassarten', $anlaesse[$child_node->nodeValue]);
  179. $ff->set_array($tag, $child_node->nodeValue);
  180. }
  181. else {
  182. GUI::$messages[] = array(
  183. 'msg' => 'Im Fortführungsfall Nr.: ' . $ff->get('fortfuehrungsfallnummer') . ' ist die alte Flurstücksnummer:<br>' . $ff->get('zeigtaufaltesflurstueck')[0] . ' identisch mit der neuen Nummer.<br>In dem Fall wird die neue Nummer nicht gespeichert.',
  184. 'type' => 'warning'
  185. );
  186. }
  187. }
  188. }
  189. $anlassarten = $ff->get('anlassarten');
  190. if (!empty($anlassarten)) {
  191. $ff->set('anlassart', $anlassarten[0]);
  192. }
  193. $ff_id = $ff->create();
  194. if (empty($ff_id)) {
  195. while($row = pg_fetch_assoc($ff->lastquery)) {
  196. $this->gui->add_message($row['msg_type'], $row['msg']);
  197. }
  198. }
  199. $this->fortfuehrungsfaelle[] = $ff;
  200. }
  201. }
  202. }
  203. }
  204. $result = array(
  205. 'success' => $success,
  206. 'fortfuehrungsfaelle' => $this->fortfuehrungsfaelle
  207. );
  208. return $result;
  209. }
  210. function nodeToArray( $dom, $node) {
  211. if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
  212. return false;
  213. }
  214. $array = false;
  215. if(trim($node->localName) == '') { // Discard empty nodes
  216. return false;
  217. }
  218. if( XML_TEXT_NODE == $node->nodeType ) {
  219. return $node->nodeValue;
  220. }
  221. foreach ($node->attributes as $attr) {
  222. $array['@'.$attr->localName] = $attr->nodeValue;
  223. }
  224. foreach ($node->childNodes as $childNode) {
  225. if ( 1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) {
  226. $array[$childNode->localName] = $childNode->nodeValue;
  227. }
  228. else {
  229. if( false !== ($a = self::nodeToArray( $dom, $childNode))) {
  230. $array[$childNode->localName] = $a;
  231. }
  232. }
  233. }
  234. return $array;
  235. }
  236. /*
  237. * Diese Funktion liefert ein Array mit success = true wenn das im flurstueckskennzeichen übergebene Flurstück von der
  238. * zählweise her das letzte Flurstück ist. Ansonsten ist success = false und bigger_kennz enthält ein Array aller
  239. * flurstueckskennzeichen, die eine höhere Nummerierung haben und in msg eine Message, die das beschreibt.
  240. * Tritt ein Fehler bei der Abfrag auf ist success auch false und msg enthält eine Fehlermeldung.
  241. * @param $flurstueckskennzeichen String
  242. * @return Array('success', 'msg', 'bigger_kennz')
  243. */
  244. function is_last_nenner($flurstueckskennzeichen, $fortfuehrungsfallnummer) {
  245. $success = true;
  246. $msg = '';
  247. $bigger_kennz = array();
  248. $bis_zahler = substr($flurstueckskennzeichen, 0, 14);
  249. $sql = "
  250. SELECT
  251. flurstueckskennzeichen
  252. FROM
  253. alkis.ax_flurstueck
  254. WHERE
  255. flurstueckskennzeichen like '{$bis_zahler}%' AND
  256. flurstueckskennzeichen > '{$flurstueckskennzeichen}'
  257. LIMIT 1
  258. ";
  259. $ret = $this->gui->pgdatabase->execSQL($sql, 4, 0, true);
  260. if ($ret[0]) {
  261. $success = false;
  262. $msg = 'Fehler bei der Abfrage der Datenbank in SQL-Statement:<br>' . $sql;
  263. }
  264. else {
  265. $num_rows = pg_num_rows($ret[1]);
  266. if ($num_rows > 0) {
  267. $bigger_kennz = array_map(
  268. function($row) {
  269. return $row['flurstueckskennzeichen'];
  270. },
  271. pg_fetch_all($ret[1])
  272. );
  273. $msg = 'Im Fortführungsfall Nr.: ' . $fortfuehrungsfallnummer . ' hat das Flurstück: ' . $flurstueckskennzeichen . ' einen kleineren Nenner als folgende Flurstücke aus ALKIS: ' . implode(', ', $bigger_kennz);
  274. }
  275. }
  276. return array(
  277. 'success' => $success,
  278. 'msg' => $msg,
  279. 'bigger_kennz' => $bigger_kennz
  280. );
  281. }
  282. }
  283. ?>