source: trunk/info/info/alkisn/alkisfkt.php @ 430

Revision 430, 29.2 KB checked in by frank.jaeger, 22 months ago (diff)

ALKIS-Auskunft angepasst an PHP 8

Line 
1<?php
2/*      alkisfkt.php
3
4        ALKIS-Auskunft
5        Author: Frank JÀger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo)
6
7        F u n c t i o n s , die von mehreren Modulen verwendet werden.
8
9        Version:
10        2016-02-24 Version fÃŒr norGIS-ALKIS-Import, "function linkgml" raus. Case-EntschlÃŒsselung raus.
11        ....
12        2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF'] fÃŒr Einsatz hinter Gateway mit Änderung des Pfades (Docker/QWC2)
13        2020-12-09 Entschl. BodenschÀtzung korrigiert in function werteliste()
14        2020-12-15 Input-Validation und Strict Comparisation (===)
15        2020-12-16 Sonderfall QWC2 API-Gateway-Umleitung bei Selbstverlinkung
16        2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÀche)
17                           Footer: Umschalter fÃŒr SchlÃŒssel und Debug unabhÀngig benutzbar. Authentifizierung aus QWC2 nicht hier behandeln.
18        2021-12-30 Bestandsnachweis recursiv ÃŒber alle Buchungs-Ebenen
19        2022-01-13 Functions in Fach-Modul verschoben, wenn nur von einem verwendet. Neue Functions LnkStf(), DsKy()
20        2022-07-05 PHP 8.1: Connection verwenden bei "pg_prepare" und "pg_execute", keine NULL-Werte in String-Functions verwenden
21*/
22
23function selbstverlinkung() {
24//      Aus der Server-Variable den Pfad entfernen.
25        global $pfadlos_selbstlink;
26        If ($pfadlos_selbstlink === 1) { // Selbstverlinkung ohne Pfad z.B. hinter QWC2 API-Gateway (Umleitung)
27                $mod=strrchr($_SERVER['PHP_SELF'], '/');
28                $mod=substr($mod, 1);
29        } else { // normaler Webserver, die Systemvariable ist korrekt
30                $mod=$_SERVER['PHP_SELF'];
31        }
32        return $mod;
33}
34
35function darf_ich() {
36//      Am Anfang jedes Moduls aufrufen um $customer zu fÃŒllen.       
37//      Der automatisch einloggende anonyme Gast-Benutzers muss bei der Authentifizierung ausgeschlossen werden.
38        global $auth, $customer, $mb_guest_user, $dbg;
39
40        if ($auth === "") {             // nicht prÃŒfen
41                $customer = "";         // dann anonym
42                return 1;                       // alles erlaubt
43        } elseif ($auth === "mapbender") {
44                $customer = "";
45                include '/opt/gdi/mapbender/http/php/mb_validateSession.php';
46
47                if (!isset($_SESSION)) { // keine (passende) Session
48                        if ($dbg > 1) {echo "\n<p class='dbg'>Session nicht gesetzt</p>";}
49                } elseif ( !isset($_SESSION["mb_user_name"]) )  {
50                        if ($dbg > 1) {echo "\n<p class='dbg'>username nicht gesetzt</p>";}
51                } else {
52                        $customer = $_SESSION["mb_user_name"]; // angemeldeter Benutzer
53                }
54                if ($customer == "") {  // Wer bin ich?
55                        echo "<p class='stop2'>Aufruf nur aus Mapbender erlaubt.</p>";
56                        return 0;
57                } elseif ($customer == $mb_guest_user) { // in conf festgelegt
58                        echo "<p class='stop2'>Eine Anmeldung im Mapbender ist notwendig.</p>";
59                        return 0;       // gast-User darf nix
60                } else {
61                        return 1;       // echter User, ist erlaubt
62                }
63        } else {
64                echo "\n<p class='stop2'>Die Berechtigungs-Pr&uuml;fung ist falsch konfiguriert</p>";
65                return 0;       // verboten
66        }
67}
68
69function footer($gmlid, $link, $append) {
70// Einen Seitenfuß ausgeben.
71// Die Parameter &gkz= und &gmlid= kommen in allen Modulen einheitlich vor
72// Den URL-Parameter "&showkey=j/n" umschalten lassen.
73// $append wird angehÀngt wenn gefÌllt. Anwendung: &eig=j bei FSNW, &ltyp=m/p/o bei Lage
74        global $gkz, $showkey, $hilfeurl, $debug, $dbg, $customer;
75
76        echo "\n<footer>";
77        // S c r e e n - F o o t
78        echo "\n\t<div class='confbereich noprint'>"
79        ."\n\t\t<table class='outer'>\n\t\t<tr>";
80
81        // Sp.1: Info Benutzerkennung
82        if (isset($customer) and $customer != '') { // ÃŒber global von fkt. darf_ich()
83                echo "\n\t\t\t<td title='Info'><i>Benutzer:&nbsp;".$customer."</i></td>";
84        } else {
85                echo "\n\t\t\t<td>&nbsp;</td>";
86        }
87
88        // Sp.2: Umschalter
89// +++ ToDo: Texte eindeutiger machen, z.B. Anzeige der SchlÃŒssel ist an >> aus // Anzeige der SchlÃŒssel ist aus >> an
90// oder als Formular / Option-Element
91        echo "\n\t\t\t<td title='Konfiguration'>";
92                $mylink ="\n\t\t\t\t<a class='keyswitch' href='".$link."gkz=".$gkz."&amp;gmlid=".$gmlid.$append;
93
94                if ($showkey) { // Umschalten SchlÃŒssel ein/aus
95                        echo $mylink."&amp;showkey=n";
96                        if ($debug > 0 and $dbg == 0) {echo "&amp;nodebug=j";}
97                        echo "' title='Verschl&uuml;sselungen ausblenden'>Schl&uuml;ssel aus</a>";
98                        $mylink.="&amp;showkey=j";
99                } else {
100                        echo $mylink."&amp;showkey=j";
101                        if ($debug > 0 and $dbg == 0) {echo "&amp;nodebug=j";}
102                        echo "' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
103                        $mylink.="&amp;showkey=n";
104                }
105
106                if ($debug > 0) {       // nur fÃŒr Entwicklung
107                        if ($dbg > 0) { // temporÀr eine Ansicht OHNE debug
108                                echo "<br>".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Testausgaben aus</a>";
109                        } else {                // Abschaltung beenden
110                                echo "<br>".$mylink."' title='Debug-Ausgaben wie konfiguriert'>Testausgaben ein</a>";
111                        }
112                }
113
114        echo "\n\t\t\t</td>";
115
116        // Sp.3: Dokumentation
117        echo "\n\t\t\t<td title='Hilfe'>"
118                ."\n\t\t\t\t<p class='nwlink'>\n\t\t\t\t\t<a target='_blank' href='".$hilfeurl."' title='Dokumentation'>Hilfe zur ALKIS-Auskunft</a>\n\t\t\t\t</p>\n\t\t\t</td>"
119                ."\n\t\t</tr>\n\t\t</table>"
120        ."\n\t</div>";
121
122        // P r i n t - F o o t
123        if (isset($customer) and $customer != '') {
124                echo "\n\t<p class='onlyprint'><i>Benutzer:&nbsp;".$customer."</i></p>";
125        }
126
127        echo "\n</footer>\n";
128        return 0;
129}
130
131function UnqKatAmt($t1, $t2){
132// Wenn der Datenbestand aus NBA-Verfahren mehrerer KatasterÀmter gemixt wurde, dann muss beim SQL-JOIN auf einige SchlÌsseltabellen
133// zusÀtzlich dafÌr gesort werden, dass nur die SchlÌssel des gleichen Katasteramtes verwendet werden. Sonst bekommt man redundante Treffer.
134// Benötigt den Alias der zu verbindenden Tabellen.
135// Liefert einen String zum EinfÃŒgen hinter "JOIN .. ON".
136        global $katAmtMix; // aus Conf
137        if ($katAmtMix){
138                return "AND substr(".$t1.".gml_id,1,6) = substr(".$t2.".gml_id,1,6) ";
139        } else {
140                return "";
141        }
142}
143
144function LnkStf(){
145// Link-Staffeltab - Die Parameter showkey und nodebug im href eines <a>-Tag an ein anderes Modul weiter geben.
146// Gibt einen String zurÃŒck, der im href eingefÃŒgt wird.
147        global $debug, $dbg, $showkey;
148
149        if ($showkey) { // SchlÃŒssel anzeigen
150                $ret="&amp;showkey=j";
151        } else {
152                $ret="";
153        }
154
155        // Nur relevant in einer Entwicklungsumgebung:
156        // Falls debug-Ausgaben erlaubt sind (conf) kann man das temporÀr einschrÀnken, umgekehrt nicht.
157        // $dbg = aktueller Arbeitswert, $debug = aus Conf.
158        if ($dbg === 0 AND $debug > 0){
159                $ret.="&amp;nodebug=j";
160        }
161        return $ret;
162}
163
164function DsKy($derKey, $Tipp){
165// Display Key - Optional einen ALKIS-internen SchlÃŒsselwert vor dem entschlÃŒsselten Wert ausgeben.
166// Die Option wird gesteuert durch einen Schalter im Seitenfuß.
167// Liefert einen HTML-Text zur Verwendung in einem Echo-Befehl. Zur Verkettung mit Literalen.
168        global $showkey;
169        $Tipp = str_replace("*", "Schl&uuml;ssel", $Tipp); // hÀufig verwendet
170        if ($showkey and $derKey != "") {
171                $html="<span class='key' title='".$Tipp."'>(".$derKey.")&nbsp;</span>";
172        } else {
173                $html="";
174        }
175        return $html;
176}
177
178function ber_bs_zaehl($gmls) {
179// Berechtigte Buchungs-Stellen zÀhlen.
180        global $con;
181
182        // Buchungstelle dienend <(Recht)an< Buchungstelle herrschend
183        $sql ="SELECT count(sh.gml_id) AS anz FROM ax_buchungsstelle sd JOIN ax_buchungsstelle sh ON sd.gml_id=ANY(sh.an) "
184        ."WHERE sd.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL;";
185        $v = array($gmls); // GML dienende Buchungs-Stelle
186        $resan = pg_prepare($con, "", $sql);
187        $resan = pg_execute($con, "", $v);
188        if (!$resan) {echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen z&auml;hlen'.</p>";}
189        $rowan = pg_fetch_assoc($resan);
190        $anz=$rowan["anz"];
191        pg_free_result($resan);
192        return $anz; // Funktionswert = Anzahl der berechtigten Buchungen
193}
194
195function buchung_anzg($gmlbs, $eig, $jsfenster, $gml_fs, $trtyp) {
196// In einem FS-Nachw. EINE Buchungsstelle anzeigen.
197// Parameter:
198//  $gmlbs: GML-ID der anzuzeigenden Buchungs-Stelle
199//  $eig: EigentÃŒmer ausgeben j/n
200//  $jsfenster: Javascript-Funktion zum Verlassen des Feature-Info-Fensters verwenden (bool)
201//  $gml_fs: GML-ID des FlurstÃŒcke (nur bei erstem Aufruf in einem FS-Nachweis notwendig)
202//      $trtyp: Tabellen-Zeilen-Typ. Werte: 1="mit GS-Link", 2="ohne GS-Link", 3="ohne GS-Link +Zeile einfÀrben"
203        global $gkz, $dbg, $showkey, $bartgrp, $barttypgrp, $stufe, $katAmtMix, $con;
204
205        $sqlbs="SELECT sh.gml_id AS hgml, sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, " // Buchungs-Stelle herrschend
206        ."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, z.bezeichnung, a.beschreibung AS bart, a.dokumentation AS barttitle, w.beschreibung AS blattartv "
207        ."FROM ax_buchungsstelle sh "
208        ."JOIN ax_buchungsblatt b ON b.gml_id=sh.istbestandteilvon "
209        ."LEFT JOIN ax_buchungsblattbezirk z ON z.land=b.land AND z.bezirk=b.bezirk ".UnqKatAmt("z","b")
210        ."LEFT JOIN ax_buchungsart_buchungsstelle a ON sh.buchungsart = a.wert " // entschl. Buchungsart
211        ."LEFT JOIN ax_blattart_buchungsblatt w ON b.blattart = w.wert " // entschl. Blatt-Art
212        ."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL;";
213
214        $v = array($gmlbs); // ID dienende Buchungs-Stelle
215        $resbs = pg_prepare($con, "", $sqlbs);
216        $resbs = pg_execute($con, "", $v);
217        if (!$resbs) {
218                echo "\n<p class='err'>Fehler bei 'Buchungsstelle ausgeben'.</p>";
219                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlbs."'", $sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
220        }
221        $gezeigt = 0; // Funktionswert default
222        if ($dbg > 0) {
223                $zeianz=pg_num_rows($resbs);
224                if ($zeianz > 1){
225                        echo "\n<p class='err'>Die Abfrage liefert mehr als eine (".$zeianz.") Buchung!</p>";
226                        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
227                }
228        }
229        if ($rowbs = pg_fetch_assoc($resbs)) { // EIN Treffer
230                $blattkeyber=$rowbs["blattart"]; // SchlÃŒssel von Blatt-Art des GB
231                if ($blattkeyber != '5000' or $dbg > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
232                        $gezeigt = 1; // Funktionswert nach Treffer
233                        $hgml=$rowbs["hgml"]; // GML-ID der (herrschenden) BuchungsStelle
234                        $bartkey=$rowbs["buchungsart"]; // Buchungsart SchlÃŒssel
235                        $bart=$rowbs["bart"]; // Buchungsart Text
236                        $beznam=$rowbs["bezeichnung"]; // Bezirk
237                        $blattartber=$rowbs["blattartv"]; // Wert von Blatt-Art des GB
238                        $nrpl=$rowbs["nrpl"]; // Nr im Auft.plan
239                        $sond=$rowbs["sond"]; // Beschr. d.Sondereigentums
240                        $gbgml=$rowbs["g_gml"]; // GML-ID des Grundbuch-Blattes
241                        $blatt=ltrim($rowbs["blatt"], "0");
242                        $lfd=ltrim($rowbs["lfd"], "0");
243                        if ($bartkey != $bartgrp) { // Wechsel Buchungsart
244                                $barttitle=$rowbs["barttitle"]; // Buchungsart ErklÀrung
245                                switch (true) { // Die Buchungsart einem Typ (Gruppierung) zuweisen
246                                        case ($bartkey <= 1999): $barttyp = "E"; break; // Eigentum/GrundstÃŒck
247                                        case ($bartkey >= 2000): $barttyp = "R"; break; // GrundstÃŒcksgleiches Recht, z.B. 2101 "Erbbaurecht"
248                                        default: $barttyp = "E"; break;
249                                }
250                                if ($barttypgrp != $barttyp) { // Wenn der Typ wechselt, neue Überschrift in Tabelle
251                                        switch ($barttyp) { // Text der Überschrift
252                                                case "E":
253                                                        if ($eig === 'j') {$h3txt = "Buchung und Eigentum";}
254                                                        else {$h3txt = "Buchung";}
255                                                break;
256                                                case "R": $h3txt = "Grundst&uuml;cksgleiche Rechte"; break;
257                                        }
258                                        if ($barttypgrp === "" and $gml_fs != "") { // die erste Überschrift mit ID und Umschalter
259                                                echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3 id='gb'>".$h3txt."</h3>\n\t\t</td>"; // 1-3
260                                                echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>" // 4
261                                                        ."\n\t\t\t\t<a href='".selbstverlinkung()."?gkz=".$gkz."&amp;gmlid=".$gml_fs.LnkStf();
262                                                        if ($eig=="j") { // Umschalter: FS-Nachweis ruft sich selbst mit geÀndertem Param. auf. Pos. auf Marke "#gb"
263                                                                echo "&amp;eig=n#gb' title='Umschalter: Flurst&uuml;cksnachweis'>ohne Eigent&uuml;mer</a>";
264                                                        } else {
265                                                                echo "&amp;eig=j#gb' title='Umschalter: Flurst&uuml;cks- und Eigent&uuml;mernachweis'>mit Eigent&uuml;mer "
266                                                                ."<img src='ico/EigentuemerGBzeile.png' width='16' height='16' alt=''></a>";
267                                                        }
268                                                echo "\n\t\t\t</p>\n\t\t</td>";
269                                        } else {
270                                                echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3>".$h3txt."</h3>\n\t\t</td>\n\t\t<td>&nbsp;</td>"; // 1-4
271                                        }
272                                        echo "\n\t</tr>";
273                                        $barttypgrp = $barttyp;
274                                }
275                                echo "\n\t<tr>" // Buchungsart als Zwischenzeile
276                                        ."\n\t\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Buchungsart:</td>"
277                                        ."\n\t\t<td colspan='2' title='".$barttitle."'>".DsKy($bartkey, 'Buchungsart')."<span class='wichtig'>".$bart."</span>"
278                                        ."</td>\n\t\t<td></td>" // 4
279                                ."\n\t</tr>";
280                                $bartgrp=$bartkey; // Gruppe merken
281                        } // Ende Wechsel der Buchungsart
282
283                        echo "\n\t<tr>" // Zeile mit 4 Spalten fÃŒr Buchung und EigentÃŒmer
284                                ."\n\t\t<td class='ll'><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Buchung:"; // 1
285                        if ($showkey and $dbg > 2) {echo "<br><span class='key'>Stufe ".$stufe."<br>".$hgml."</span> ";}
286                        echo "</td>\n\t\t<td colspan='2'>"; // 2-3
287
288                                        // innere Tabelle: Rahmen mit GB-Kennz.
289                                        if ($blattkeyber == 1000) {
290                                                echo "\n\t\t\t<table class='kennzgb' title='Bestandskennzeichen'>";
291                                        } else {
292                                                echo "\n\t\t\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
293                                        }
294                                        echo "\n\t\t\t<tr>"
295                                        ."\n\t\t\t\t<td class='head'>Bezirk</td>"
296                                        ."\n\t\t\t\t<td class='head'>".DsKy($blattkeyber, 'Blattart-*').$blattartber."</td>"
297                                        ."\n\t\t\t\t<td class='head'>Lfd-Nr</td>"
298                                        ."\n\t\t\t</tr>";
299
300                                        if ($trtyp === 3) { // Treffer-Grundst. einfÀrben
301                                                echo "\n\t\t\t<tr class='paa'>";
302                                        } else {
303                                                echo "\n\t\t\t<tr>";
304                                        }
305                                        echo "\n\t\t\t\t<td title='Grundbuchbezirk'>".DsKy($rowbs["bezirk"], 'GB-Bezirk-*').$beznam."</td>"
306                                        ."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
307                                        ."\n\t\t\t\t<td title='Bestandsverzeichnis-Nummer (BVNR, Grundst&uuml;ck)'>".$lfd."</td>"
308                                        ."\n\t\t\t</tr>"
309                                        ."\n\t\t\t</table>";
310
311                                        if ($rowbs["zaehler"] != "") {
312                                                echo "\n\t\t\t<p class='ant'>".$rowbs["zaehler"]."/".$rowbs["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
313                                        }
314                                        if ($nrpl != "") {
315                                                echo "\n\t\t\t<p class='nrap' title='Nummer im Aufteilungsplan'>Nummer <span class='wichtig'>".$nrpl."</span> im Aufteilungsplan.</p>";
316                                        }
317                                        if ($sond != "") {
318                                                echo "\n\t\t\t<p class='sond' title='Sondereigentum'>Verbunden mit dem Sondereigentum: ".$sond."</p>";
319                                        }
320                                echo "\n\t\t</td>"; // 2-3
321
322                                echo "\n\t\t<td>"; // 4
323                                        echo "\n\t\t\t<p class='nwlink noprint'>".DsKy($blattkeyber, 'Blattart-*');
324                                        //      Bestand
325                                                $url="alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml.LnkStf();
326                                                if ($jsfenster) {$url="javascript:imFenster(\"".$url."\")";} // Sonderfall "Inlay" aus Feature-Info
327                                                echo "\n\t\t\t\t<a href='".$url."' title='Grundbuchnachweis'>".$blattartber
328                                                ." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
329                                        //      Buchung
330                                                if ($trtyp === 1) {
331                                                        echo "<br>".DsKy($bartkey, 'Buchungsart');
332                                                        $url="alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$hgml.LnkStf();
333                                                        if ($jsfenster) {$url="javascript:imFenster(\"".$url."\")";}
334                                                        echo "\n\t\t\t\t<a href='".$url."' title='GrundstÃŒcksnachweis: ".$bart."'>Buchung"
335                                                        ." <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>";
336                                                }
337                                        echo "\n\t\t\t</p>"
338                                ."\n\t\t</td>"
339                        ."\n\t</tr>";
340                        if ($eig === "j") {
341                                $n = eigentuemer($gbgml, true, $jsfenster); // mit Adresse
342                        }
343                }
344        }
345        pg_free_result($resbs);
346        return $gezeigt; // 1 wenn eine Buchung ausgegeben wurde
347}
348
349function ber_bs_anzg($gmls, $eig, $jsfenster, $gml_fs, $gsanfrd) {
350// In einem FS-Nachw. die berechtigten (herrschenden) Buchungsstellen anzeigen z.B. "Wohnungs-/Teileigentum".
351// Parameter:
352//  $gmls: GML-ID der dienenden Buchungs-Stelle. Im ersten Durchlauf also, die BS auf der das FS gebucht ist.
353//  $eig: EigentÃŒmer ausgeben j/n
354//  $jsfenster: Javascript-Funktion zum Verlassen des Feature-Info-Fensters verwenden (bool)
355//  $gml_fs: GML-ID des FlurstÃŒcke (nur bei erstem Aufruf in einem FS-Nachweis notwendig)
356//      $gsanfrd: In einem GS-Nachw. die GML-ID der in de URL angeforderten Buchungsstelle (-> Hervorhebung)
357        global $dbg, $gezeigt, $con;
358
359        // sh=Buchungstelle herrschend >(Recht)an> sd=Buchungstelle dienend >istBestandteilVon> BLATT -> Bezirk
360        $sql="SELECT sh.gml_id AS hgml, sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, "
361        ."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart "
362        ."FROM ax_buchungsstelle sh JOIN ax_buchungsblatt b ON b.gml_id=sh.istbestandteilvon "
363        ."WHERE $1 = ANY(sh.an) AND sh.endet IS NULL AND b.endet IS NULL "
364        ."ORDER BY b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung, sh.laufendenummer;";
365
366        $v = array($gmls); // ID dienende BuchungsStelle
367        $resber = pg_prepare($con, "", $sql);
368        $resber = pg_execute($con, "", $v);
369        if (!$resber) {
370                echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen'.</p>";
371                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmls."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
372        }
373        $an=0;
374        $verfolg=array(); // Ein (zunÀchst leeres) Array fÃŒr weitere GML-IDs anlegen
375        while($rowan = pg_fetch_assoc($resber)) { // Loop durch Result von berechtigte BS
376                $hgml=$rowan["hgml"]; // GML-ID der berechtigten Buchungs-Stelle
377
378                if ($hgml === $gsanfrd) {
379                        $trtyp=3; // einfÀrben, o. Lnk.
380                } else {
381                        if ($gezeigt) {
382                                $trtyp=2; // ohne Link auf GS
383                        } else { // Wenn Stufe 1 "Fiktives Blatt" war, welches ausgeblendet wurde, dann auf Stufe 2 einen GS-Link ausgeben
384                                $trtyp=1; // mit Link auf GS
385                        }
386                }
387                $gezeigt2=buchung_anzg($hgml, $eig, $jsfenster, $gml_fs, $trtyp); // Die herrschende Buchung anzeigen wenn nicht fiktiv
388                $an++;
389                $weitere=ber_bs_zaehl($hgml);
390                if ($weitere > 0) { // gibt es WEITERE berechtigte Buchungen dazu?
391                        $verfolg[] = $hgml; // neuen Wert fÃŒr weitere Verfolgung in Array anfÃŒgen
392                }
393        }
394        pg_free_result($resber);
395        return $verfolg; // weitere zu verfolgende GML-ID zurÃŒck geben
396}
397
398function kurz_namnr($lang) {
399// Namensnummer kÌrzen. Nicht benötigte Stufen der Dezimalklassifikation abschneiden
400        $kurz=str_replace(".00","",$lang); // leere Stufen (nur am Ende)
401        $kurz=str_replace("0000","",$kurz); // ganz leer (am Anfang)
402        $kurz=ltrim($kurz, "0"); // fÃŒhrd. Nullen
403        $kurz=str_replace(".0",".",$kurz); // fÃŒhrd. Null jeder Stufe
404        $kurz=rtrim($kurz); // Leerzeichen hinten
405        return $kurz;
406}
407
408function eigentuemer($gmlid, $mitadresse, $jsfenster) {
409/*      Tabelle mit EigentÃŒmerdaten zu einem Grundbuchblatt ausgeben
410        Sp.1="EigentÃŒmer" Sp.2=NamNr, Sp.3=Name/Adresse, Sp.4=Link
411  Parameter:
412        $gmlid: ID GB-Blatt
413        $mitadresse: Option (t/f) ob die Adresszeile ausgegeben werden soll
414        $jsfenster: Beim Link mit Javascript ein neues Fenster öffnen
415  Return = Anzahl Namensnummern */
416        global $dbg, $gkz, $showkey, $con;
417        if ($jsfenster) { // beim Link aus iFrame ausbrechen
418                $lnkvor  = "javascript:imFenster(\"";
419                $lnknach = "\")";               
420        } else {       
421                $lnkvor = "";
422                $lnknach = "";
423        }
424
425        // N a m e n s n u m m e r
426        // ax_namensnummer >istBestandteilVon> ax_buchungsblatt
427        $sqln="SELECT n.gml_id, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, n.artderrechtsgemeinschaft AS adr, coalesce(n.beschriebderrechtsgemeinschaft, '') as beschr, n.eigentuemerart, n.anlass, n.benennt, "
428        ."coalesce(wn.beschreibung, '') AS adrv, we.beschreibung AS eiartv, "
429        ."p.gml_id AS gmlpers, p.nachnameoderfirma, p.vorname, p.geburtsname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, p.namensbestandteil, p.akademischergrad "
430        ."FROM ax_namensnummer n "
431        ."LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wn ON n.artderrechtsgemeinschaft = wn.wert "
432        ."LEFT JOIN ax_eigentuemerart_namensnummer we ON n.eigentuemerart = we.wert "   
433        ."LEFT JOIN ax_person p ON p.gml_id = n.benennt "
434        ."WHERE n.istbestandteilvon = $1 AND n.endet IS NULL AND p.endet IS NULL "
435        ."ORDER BY n.laufendenummernachdin1421;";
436        // "benennt" ist leer bei "Beschrieb der Rechtsgemeinschaft".
437
438        $v = array($gmlid); // GB-Blatt
439        $resn = pg_prepare($con, "", $sqln);
440        $resn = pg_execute($con, "", $v);
441        if (!$resn) {
442                echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";
443                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sqln )."</p>";}
444        }
445
446        $n=0; // Z.NamNum.
447        while($rown = pg_fetch_assoc($resn)) {
448                $gmlnn=$rown["gml_id"];
449                $namnum=kurz_namnr($rown["lfd"]);
450                $rechtsg=$rown["adr"];
451                $beschr=htmlentities($rown["beschr"], ENT_QUOTES, "UTF-8");
452                $adrv=htmlentities($rown["adrv"], ENT_QUOTES, "UTF-8");
453                $eiartkey=$rown["eigentuemerart"]; // Key
454                $eiart=$rown["eiartv"]; // Value
455        //      $anlass=$rown["anlass"];
456                $gmlpers=$rown["gmlpers"]; // leer bei RechtsverhÀltnis
457                $akadem=$rown["akademischergrad"];
458                $nachnam=$rown["nachnameoderfirma"];
459                $vorname=$rown["vorname"];
460                $nbest=$rown["namensbestandteil"];
461                $gebdat=$rown["geburtsdatum"];
462                $gebnam=$rown["geburtsname"];
463                if (is_null($rown["zaehler"])) {
464                        $zaehler="";
465                } else {
466                        $zaehler=str_replace(".", ",", $rown["zaehler"]); // Dezimal-KOMMA wenn dem Notar der Bruch nicht reicht
467                }
468                if (is_null($rown["nenner"]))  {
469                        $nenner="";
470                } else {
471                        $nenner=str_replace(".", ",", $rown["nenner"]);
472                }
473                echo "\n\t<tr>";
474                if($n === 0) { // 1. Zeile zum GB
475                        echo "\n\t\t<td class='ll'><img src='ico/Eigentuemer_2.png' width='16' height='16' alt=''> Eigent&uuml;mer:</td>"; // 1
476                } else { // Folgezeile
477                        echo "\n\t\t<td class='ll'>&nbsp;</td>";
478                }
479                if ($rechtsg != "" ) { // Erbengemeinschaft usw.
480                        echo "\n\t\t<td colspan='2'>";
481                        if ($rechtsg == 9999) { // sonstiges
482                                echo "\n\t\t\t<p class='zus' title='Beschrieb der Rechtsgemeinschaft'>".$beschr."</p>";
483                        } else {
484                                echo "\n\t\t\t<p class='zus' title='Art der Rechtsgemeinschaft'>".$adrv."</p>";
485                        }
486                } else { // Namensnummer
487                        echo "\n\t\t<td class='nanu' title='Namens-Nummer'>\n\t\t\t<p>".$namnum."&nbsp;</p>\n\t\t</td>"
488                        . "\n\t\t<td>";
489                }
490
491        //      if ($anlass > 0 ) {echo "<p>Anlass=".$anlass."</p>";} // Array, EntschlÃŒsseln?
492
493                // Andere Namensnummern? Relation: ax_namensnummer >bestehtAusRechtsverhaeltnissenZu> ax_namensnummer
494                // Die Relation 'Namensnummer' besteht aus RechtsverhÀltnissen zu 'Namensnummer' sagt aus, dass mehrere Namensnummern zu einer Rechtsgemeinschaft gehören können.
495                // Die Rechtsgemeinschaft selbst steht unter einer eigenen AX_Namensnummer, die zu allen Namensnummern der Rechtsgemeinschaft eine Relation besitzt.
496
497                $diePerson="";
498                if ($akadem != "") {$diePerson=$akadem." ";}
499                $diePerson.=$nachnam;
500                if ($vorname != "") {$diePerson.=", ".$vorname;}
501                if ($nbest != "") {$diePerson.=". ".$nbest;}
502                if ($gebdat != "") {$diePerson.=", geb. ".$gebdat;}
503                if ($gebnam != "") {$diePerson.=", geb. ".$gebnam;}
504                $diePerson=htmlentities($diePerson, ENT_QUOTES, "UTF-8");
505
506                if ($eiartkey == "") {$eiart="Eigent&uuml;mer" ;} // Default
507                echo "\n\t\t\t<p class='geig' title='Eigent&uuml;merart: ".$eiart."'>".$diePerson."</p>\n\t\t</td>"
508                ."\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>".DsKy($eiartkey, 'Eigent&uuml;merart-*')
509                ."\n\t\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$gmlpers.LnkStf()
510                .$lnknach."' title='vollst&auml;ndiger Name und Adresse eines Eigent&uuml;mers'>".$eiart
511                ." \n\t\t\t\t\t<img src='ico/Eigentuemer.png' width='16' height='16' alt=''>\n\t\t\t\t</a>\n\t\t\t</p>"
512                ."\n\t\t</td>\n\t</tr>";
513
514                if ($mitadresse) { // optional
515                        // A d r e s s e  zur Person
516                        $sqla ="SELECT a.gml_id, a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer, a.bestimmungsland "
517                        ."FROM ax_anschrift a JOIN ax_person p ON a.gml_id=ANY(p.hat) "
518                        ."WHERE p.gml_id= $1 AND a.endet IS NULL AND p.endet IS NULL "
519                        ."ORDER BY a.beginnt DESC LIMIT 2;";
520                        $v = array($gmlpers);
521                        $resa = pg_prepare($con, "", $sqla);
522                        $resa = pg_execute($con, "", $v);
523                        if (!$resa) {
524                                echo "\n\t<p class='err'>Fehler bei Adressen</p>";
525                                if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqla)."</p>";}
526                        }
527                        $j=0;
528                        while($rowa = pg_fetch_assoc($resa)) {
529                                $j++;
530                                if ($j === 1) { // erste ("jÃŒngste") Adresse anzeigen
531                                        $gmla=$rowa["gml_id"];
532                                        $plz=$rowa["plz"]; // integer
533                                        if($plz === 0) {
534                                                $plz="";
535                                        } else {
536                                                $plz=str_pad($plz, 5, "0", STR_PAD_LEFT);
537                                        }
538                                        $ort=htmlentities($rowa["ort_post"], ENT_QUOTES, "UTF-8");
539                                        $str=htmlentities($rowa["strasse"], ENT_QUOTES, "UTF-8");
540                                        $hsnr=$rowa["hausnummer"];
541                                        $land=htmlentities($rowa["bestimmungsland"], ENT_QUOTES, "UTF-8");
542
543                                        echo "\n\t<tr>\n\t\t<td class='ll'>&nbsp;</td>\n\t\t<td>&nbsp;</td>"
544                                        ."\n\t\t<td><p class='gadr'>";
545                                        if ($str.$hsnr != "") {echo $str." ".$hsnr."<br>";}
546                                        if ($plz.$ort != "") {echo $plz." ".$ort;}
547                                        if ($land != "" and $land != "DEUTSCHLAND") {echo ", ".$land;}
548                                        echo "</p></td>"
549                                        ."\n\t\t<td>&nbsp;</td>\n\t</tr>";
550                                } else { // manchmal mehrere Angaben
551                                        echo "\n\t<tr>\n\t\t<td class='ll'>&nbsp;</td>\n\t\t<td>&nbsp;</td>"
552                                        ."\n\t\t<td><p class='dbg' title='Siehe Auskunft zur Person'>weitere Adresse</p></td>"
553                                        ."\n\t\t<td>&nbsp;</td>\n\t</tr>";
554                                }
555                        }
556                        pg_free_result($resa);
557                }       // 'keine Adresse' kann vorkommen, z.B. "Deutsche Telekom AG"
558
559                if ($zaehler != "") { // Anteil als eigene Tab-Zeile
560                        $comnt="Anteil der Berechtigten in Bruchteilen (Par. 47 GBO) an einem gemeinschaftlichen Eigentum (Grundst&uuml;ck oder Recht).";
561                        echo "\n\t<tr>\n\t\t<td class='ll'>&nbsp;</td>\n\t\t<td>&nbsp;</td>"
562                        ."\n\t\t<td><p class='avh' title='".$comnt."'>".$zaehler."/".$nenner." Anteil</p></td>"
563                        ."\n\t\t<td>&nbsp;</td>\n\t</tr>";
564                }
565                if ($gmlpers == "") { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
566                        if ($dbg > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
567                        if ($rechtsg !== '9999') {
568                                echo "\n<p class='err'>(Die Person mit der ID '".$gmlpers."' fehlt im Datenbestand)</p>";
569                        }
570                        echo "</td>\n\t\t<td>&nbsp;</td>\n\t</tr>";
571                }
572                $n++;
573        }
574        pg_free_result($resn);
575        return $n;
576}
577
578function fortfuehrungen($entsteh, $dbzeart, $dbzename) {
579// Tabelle im Kopf von FlurstÃŒck und FS-Historie. 2 Z./Sp. Entstehung/FortfÃŒhrung
580// Parameter: Die DB-Spalten "zeitpunktderentstehung"[], "zeigtaufexternes_art"[] und "zeigtaufexternes_name"[]
581        global $dbg, $showkey;
582
583        echo "\n\t<table class='fsd'>" // FS-Daten 2 Spalten
584        ."\n\t\t<tr>\n\t\t\t<td>Entstehung</td>"
585        ."\n\t\t\t<td title='Zeitpunkt der Enstehung'>".$entsteh."</td>\n\t\t</tr>";
586        echo "\n\t<tr>\n\t\t\t<td>";
587        $arrart=explode(",", trim($dbzeart, "{}"));
588        foreach($arrart AS $artval) { // Eine Zeile fÃŒr jedes Element von "zeigtaufexternes_art"
589                $artval=trim($artval, '"');
590                $artpos=strpos($artval, '#');
591                if ($artpos > 0) { // AED
592                        $artkey=substr($artval, $artpos + 1);
593                        switch ($artkey) { // keine SchlÃŒsseltabelle?
594                                case '5100':
595                                        $arttxt="Grundst&uuml;ckshinweis (aus ALB-Historie)";
596                                        $artinfo="";
597                                        break;
598                                case '5200':
599                                        $arttxt="Entstehung des Flurst&uuml;cks";
600                                        $artinfo="'Entstehung des FlurstÃŒcks' enthÀlt das Jahr der Entstehung, die lfd. Nr. der FortfÃŒhrung und den SchlÃŒssel der FortfÃŒhrungsart zur manuellen Recherche in den Grundbuchakten.";
601                                        break;
602                                case '5300':
603                                        $arttxt="Letzte Fortf&uuml;hrung des Flurst&uuml;cks";
604                                        $artinfo="'Letzte FortfÃŒhrung' enthÀlt das Jahr der letzten FortfÃŒhrung, die lfd. Nr. der FortfÃŒhrung und den SchlÃŒssel der FortfÃŒhrungsart zur manuellen Recherche in den Grundbuchakten.";
605                                        break;
606                                default:
607                                        $arttxt=$artval;
608                                        $artinfo="";
609                        }
610                        if ($showkey) {echo "<span class='key'><a target='_blank' title='".htmlentities($artinfo, ENT_QUOTES, "UTF-8")."' href='".$artval."'>(".$artkey.")</a></span> ";}
611                        echo $arttxt."<br>";
612                } else {
613                        $artpos=strpos($artval, '/');
614                        if ($artpos > 0) { // ibR
615                                $artkey=substr($artval, $artpos + 1);
616                                $arttxt=substr($artval, 0, $artpos);
617                                echo DsKy($artkey, 'Fortf&uuml;hrungsart').$arttxt."<br>";
618                        }
619                }
620        }
621        echo "</td>\n\t\t\t<td title='Jahrgang / Fortf&uuml;hrungsnummer - Fortf&uuml;hrungsart'>";
622        $arrname=explode(",", trim($dbzename, "{}")); // Eine Zeile fÃŒr jedes Element von "zeigtaufexternes_name"
623        foreach($arrname AS $val) {echo trim($val, '"')."<br>";}
624        echo "</td>\n\t\t</tr>\n\t</table>";
625}
626
627function fskenn_dbformat($fskennz) {
628// Erzeugt aus dem Bindetrich-getrennten FlurstÃŒckskennzeichen "llgggg-fff-nnnn/zz.nn" oder "gggg-ff-nnn/zz"
629// das ALKIS-DB-interne Format des FlurstÃŒckskennzeichens.
630        global $defland;
631        $arr=explode("-", $fskennz, 4); // zerlegen
632        $zgemkg=trim($arr[0]);
633        if (strlen($zgemkg) === 20 and !isset($arr[1])) {
634                $fskzdb=$zgemkg; // ist schon Datenbank-Feldformat
635        } else { // Das Kennzeichen auseinander nehmen.
636                if (strlen($zgemkg) === 6) {
637                        $land=substr($zgemkg, 0, 2);
638                        $zgemkg=substr($zgemkg, 2, 4);
639                } else { // kein schöner Land ..
640                        $land=$defland; // Default-Land aus config
641                }
642                $zflur=str_pad($arr[1], 3 , "0", STR_PAD_LEFT); // Flur-Nr
643                $zfsnr=trim($arr[2]); // FlurstÃŒcks-Nr
644                $zn=explode("/", $zfsnr, 2); // Bruch?
645                $zzaehler=str_pad(trim($zn[0]), 5 , "0", STR_PAD_LEFT);
646                if (isset($zn[1])) {
647                        $znenner=trim($zn[1]);
648                } else {
649                        $znenner="";
650                }
651                if (trim($znenner, " 0.") === "") { // kein Bruch oder nur Nullen
652                        $znenner="____"; // in DB-Spalte mit Tiefstrich aufgefÃŒllt
653                } else {
654                        $zn=explode(".", $znenner, 2); // .00 wegwerfen
655                        $znenner=str_pad($zn[0], 4 , "0", STR_PAD_LEFT);
656                }
657                // die Teile stellengerecht wieder zusammen setzen             
658                $fskzdb=$land.$zgemkg.$zflur.$zzaehler.$znenner.'__'; // FS-Kennz. Format Datenbank
659        }
660        return $fskzdb;
661}
662?>
Note: See TracBrowser for help on using the repository browser.