Index: trunk/info/info/alkisn/alkisbestnw.php
===================================================================
--- trunk/info/info/alkisn/alkisbestnw.php	(revision 425)
+++ trunk/info/info/alkisn/alkisbestnw.php	(revision 427)
@@ -1,7 +1,9 @@
 <?php
-/*	Modul: alkisbestnw.php
-
-	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Bestandsnachweis fÃŒr ein Grundbuch aus ALKIS PostNAS
+/*	alkisbestnw.php
+
+	ALKIS-Auskunft
+	Author: Frank JÃ€ger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo)
+
+	Bestandsnachweis fÃŒr ein Grundbuch (-Blatt) aus ALKIS PostNAS
 
 	Version:
@@ -14,5 +16,189 @@
 			   Tabellenstruktur verbessert und Title bei "Recht an".
 	2021-12-30 Bestandsnachweis recursiv ÃŒber alle Buchungs-Ebenen
+	2022-01-13 Functions aus alkisfkt.php in dies Modul verschoben, wenn nur hier verwendet. Neue Functions LnkStf(), DsKy()
 */
+
+function bnw_bsdaten($gml_h, $ebene) {
+/*	Bestandsnachweis - Buchungsstellen-Daten
+	"dienende" Buchungsstellen suchen. Miteigentumsanteil, Erbbaurecht usw. 
+	Return: gml_id der dienenden Buchungsstelle wenn gefunden? Sonst Leerstring */
+	global $dbg, $bartkey, $bart, $bartstory, $anteil;
+
+//	dann "dienende" Buchungsstellen
+//  sh=herrschend          sd=dienend
+//  ax_buchungsstelle >zu> ax_buchungsstelle (des gleichen Blattes) 
+//  ax_buchungsstelle >an> ax_buchungsstelle (anderes Blatt, z.B Erbbaurecht an)
+//	- "zu" kommt in der Praxis (NRW) nicht vor, wird hier nicht berÃŒcksichtigt
+
+	if ($ebene > 5) {echo "\n<p class='err'>UngewÃ¶hnlich tiefe Schachtelung ".$ebene." der Buchungs-Stellen.</p>";}
+
+	$sql ="SELECT sd.gml_id, sd.buchungsart, sd.zaehler, sd.nenner, sd.laufendenummer AS lfd, sd.beschreibungdesumfangsderbuchung AS udb, "
+	."sd.nummerimaufteilungsplan AS nrap, sd.beschreibungdessondereigentums AS sond, "
+	."wb.beschreibung AS bart, wb.dokumentation, "
+	."b.gml_id as gbgml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, b.blattart, "
+	."bb.beschreibung AS blattartv, z.bezeichnung AS beznam "
+	."FROM ax_buchungsstelle sh "
+	."JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) "
+	."JOIN ax_buchungsblatt b ON b.gml_id=sd.istbestandteilvon "	
+	."LEFT JOIN ax_buchungsart_buchungsstelle wb ON sd.buchungsart = wb.wert "
+	."LEFT JOIN ax_buchungsblattbezirk z ON b.land=z.land AND b.bezirk=z.bezirk ".UnqKatAmt("b","z")
+	."LEFT JOIN ax_blattart_buchungsblatt bb ON b.blattart = bb.wert "
+	."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL "
+	."ORDER BY sd.laufendenummer;";
+	$v=array($gml_h); // gml_id "herrschende" B-Stelle
+	$resan=pg_prepare("", $sql);
+	$resan=pg_execute("", $v);
+	if (!$resan) {
+		echo "\n<p class='err'>Fehler bei 'dienende Buchungsstelle'.</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gml_bs."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+	$zeianz=pg_num_rows($resan); // Zeilen-Anzahl = Returnwert
+	$und = false; // mehrfaches "Recht an" auf gleicher Ebene
+	while($row= pg_fetch_assoc($resan)) {
+		$gml_bsan=$row["gml_id"];	// id der dien. BS
+		$blatt=ltrim($row["blatt"], "0");		
+
+		// als Global-Var zur Sub-Function:
+		$bartkey=$row["buchungsart"];	
+		$bart=$row["bart"]; // Buchungsart, entschlÃŒsselt
+		$bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8");
+		if ($row["zaehler"] == "") {$anteil = "";} 
+		else {$anteil = $row["zaehler"]."/".$row["nenner"];}
+
+		// Zeile ausgeben Buchungsstelle dienend 
+		bnw_bszeile_d($row["bezirk"], $row["beznam"], $blatt, $row["blattart"], $row["blattartv"], $row["lfd"], $row["gbgml"], $gml_bsan, $ebene, $und);
+		$und = true;
+		if ($row["nrap"] != "") { // Nr im Auft.Plan
+			echo "\n<tr>\n\t<td colspan=3></td><td class='nrap' colspan=4>Nummer <span class='wichtig'>".$row["nrap"]."</span> im Aufteilungsplan.</td><td></td>\n</tr>";
+		}
+		if ($row["sond"] != "") { // Sondereigentumsbeschreibung
+			echo "\n<tr>\n\t<td></td><td class='sond' colspan=6 title='Sondereigentums-Beschreibung'>Verbunden mit dem Sondereigentum an: ".$row["sond"]."</td><td></td>\n</tr>";
+		}
+
+		// Rekursiver Aufruf der gleichen Function, weitere Ebene dienend?
+		$tiefer = bnw_bsdaten($gml_bsan, ($ebene + 1));
+		If ($tiefer == 0) {  // Wenn nicht, dann kann es FlurstÃŒcke dazu geben
+			$fscnt= bnw_fsdaten($gml_bsan, false); // FlurstÃŒcksdaten
+		}
+	}
+	pg_free_result($resan);
+	return $zeianz;
+}
+
+function bnw_fsdaten($gml_bs, $mit_buchung_link) {
+/*	Bestandsnachweis - FlurstÃŒcksdaten
+	Die Tabellenzeilen mit den FlurstÃŒcksdaten zu EINER Buchungsstelle im Bestandsnachweis ausgeben.
+	Die Funktion wird entweder aufgerufen fÃŒr die Buchungen direkt auf dem GB (Normalfall)
+	oder bei Erbbaurecht fÃŒr die mit "an" verknÃŒpften Buchungsstellen der untersten Ebene (dienende Buchung).
+	Der Tabellenkopf wird im aufrufenden Programm ausgegeben. 
+	Return: Anzahl der ausgegebenen FlurstÃŒcke */
+	global $dbg, $gkz, $showkey, $filtkreis, $filtgem, $trclass, $katAmtMix, $lfdnr, $altlfdnr, $bartkey, $bart, $bartstory, $anteil;
+
+	$sql="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche "
+	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+	."WHERE f.endet IS NULL AND g.endet IS NULL AND f.istgebucht = $1 ";
+	if ($filtgem === '') { // ungefiltert
+		$v=array($gml_bs);
+	} else {
+		$sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÃ€ndiges Gebiet
+		$v=array($gml_bs, $filtkreis, $filtgem);
+	}
+	$sql.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
+	$resf = pg_prepare("", $sql);
+	$resf = pg_execute("", $v);
+	if (!$resf) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck</p>";}
+	$zeianz=pg_num_rows($resf);
+	while($rowf = pg_fetch_assoc($resf)) {
+		$fskenn=$rowf["zaehler"];
+		if ($rowf["nenner"] != "") { // Bruch
+			$fskenn.="/".$rowf["nenner"];
+		}
+		$flae=number_format($rowf["amtlicheflaeche"],0,",",".") . " m&#178;";
+
+		echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
+		
+		// Sp. 1-3 der Tab. Daten aus Buchungsstelle, nicht aus FS
+		if($lfdnr === $altlfdnr) { // gleiches GrundstÃŒck, leer lassen
+			echo "\n\t<td>&nbsp;</td>"
+			."\n\t<td>&nbsp;</td>"
+			."\n\t<td>&nbsp;</td>";
+		} else { // Sprungmarke, BVNR
+			$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
+			echo "\n\t<td id='bvnr".$bvnr."'><span class='wichtig'>".$bvnr."</span>\n\t</td>"
+			."\n\t<td title ='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
+			."\n\t<td>&nbsp;</td>";
+			$altlfdnr=$lfdnr;
+		}
+
+		// Sp. 4-7 aus FlurstÃŒck
+		echo "\n\t<td>".DsKy($rowf["gemarkungsnummer"], 'Gemarkungsnummer').$rowf["bezeichnung"]."</td>"
+		."\n\t<td>".$rowf["flurnummer"]."</td>\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
+		."\n\t<td class='fla'>".$flae."</td>"
+		."\n\t<td>\n\t\t<p class='nwlink noprint'>";
+
+		// Buchung BVNR
+		If ($mit_buchung_link == true) { // nur bei GrundstÃŒck
+			echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs.LnkStf()
+			."' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>&nbsp;";			
+			$mit_buchung_link = false; // nur in erster Zeile
+		}
+		// Flurstk.
+		echo "\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowf["gml_id"]."&amp;eig=n".LnkStf()."' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
+		."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''></a>"
+		."\n\t\t</p>\n\t</td>\n</tr>";
+	}
+	pg_free_result($resf);
+	return $zeianz;
+}
+
+function bnw_bszeile_h() {
+/*	Bestandsnachweis - Buchungs-Stellen-Zeile ausgeben - herrschend.
+	Die GB-Daten hierzu stehen bereits im Kopf und bleiben in der Tab. leer */
+	global $dbg, $gkz, $trclass, $lfdnr, $bartkey, $bart, $bartstory, $anteil;
+
+	$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
+	echo "\n<tr class='".$trclass."'>"
+	."\n\t<td id='bvnr".$bvnr."'><span class='wichtig'>".$bvnr."</span></td>" // Sprungmarke=BVNR auf dem GB-Blatt
+	."\n\t<td class='dien' title='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
+	."\n\t<td class='dien'>".$anteil."</td>"
+	."\n\t<td colspan=5>&nbsp;</td>\n</tr>";
+}
+
+function bnw_bszeile_d($bezkey, $beznam, $blatt, $blattartkey, $blattart, $lfdnran, $gbgml, $gml_bsan, $ebene, $und) {
+/*	Bestandsnachweis - Buchungsstellen-Zeile ausgeben - dienend
+	Eine Folge-Zeile fÃŒr eine dienende Buchung ausgeben. */
+	global $gkz, $trclass, $bartkey, $bart, $bartstory, $anteil;
+
+	$bvnr=str_pad($lfdnran, 4, "0", STR_PAD_LEFT);
+	$filler=str_repeat("&nbsp;", $ebene - 2); // 3 und 4 EinrÃŒcken
+	if ($und){$filler.="und ";}; // Unterscheidung Hierarchie (Ebene wechselt) von Liste (gleiche Ebene)
+	echo "\n<tr class='".$trclass."'>"
+	."\n\t<td title='Ebene ".$ebene."'>".$filler."an</td>"
+	."\n\t<td class='dien' title='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
+	."\n\t<td class='dien'>".$anteil."</td>";
+
+	// Sp.4 GB-Bezirk
+	echo "\n\t<td class='dien' title='Grundbuch-Bezirk'>".DsKy($bezkey, 'Grundbuch-Bezirk-*').htmlentities($beznam, ENT_QUOTES, "UTF-8")."</td>"
+	."\n\t<td class='dien' title='".$blattart."'>".$blatt."</td>"
+	."\n\t<td class='dien' title='Bestandsverzeichnis-Nummer'>".$bvnr."</td>"
+	."\n\t<td class='dien'></td>"; 
+
+	echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
+
+	// Link Bestand Blatt
+	echo "\n\t\t\t".DsKy($blattartkey, 'Blatt-Art-*')."<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml.LnkStf()
+	."#bvnr".$lfdnran."' title='Zum Grundbuchnachweis des dienenden Blattes'>".$blattart
+	." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
+
+	if ($bartkey < 2000){
+		// Link Buchung BVNR nur fÃŒr GrundstÃŒck usw.
+		echo "<br>\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bsan.LnkStf()
+		."' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>";	
+	}
+	echo "\n\t\t</p>"
+	."\n\t</td>\n</tr>";
+}
+
+// Start
 ini_set("session.cookie_httponly", 1);
 session_start();
@@ -57,7 +243,5 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
-$dbg=$debug; // CONF in Arbeits-Variable
-
-// Entwicklungsumgebung (in Conf definiert) ausschalten.
+$dbg=$debug;
 if ($nodebug === "j") {$dbg=0;} 
 
@@ -112,18 +296,10 @@
 			}
 			echo "\n\t\t\t<tr>"
-				."\n\t\t\t<td class='head'>";
-				if ($showkey) {echo "<span class='key'>".$row["stellenart"]."&nbsp;</span>";}
-				echo $row["stellev"]."</td>";
-				echo "\n\t\t\t<td class='head'>Bezirk</td>"
-				."\n\t\t\t\t<td class='head' title='".htmlentities($row["blattartd"], ENT_QUOTES, "UTF-8")."'>";
-				if ($showkey) {echo "<span class='key'>".$blattkey."&nbsp;</span>";}
-				echo $blattart."</td>"
+				."\n\t\t\t\t<td class='head'>".DsKy($row["stellenart"], 'Stellenart-*').$row["stellev"]."</td>"
+				."\n\t\t\t\t<td class='head'>Bezirk</td>"
+				."\n\t\t\t\t<td class='head' title='".htmlentities($row["blattartd"], ENT_QUOTES, "UTF-8")."'>".DsKy($blattkey, 'Blattart-*').$blattart."</td>"
 			."\n\t\t\t</tr>\n\t\t\t<tr>"
-				."\n\t\t\t\t<td title='Amtsgerichtsbezirk'>";
-				if ($showkey) {echo "<span class='key'>".$row["stelle"]."</span><br>";}
-				echo htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8")."</td>"
-				."\n\t\t\t\t<td title='Grundbuchbezirk'>";
-				if ($showkey) {echo "<span class='key'>".$row["bezirk"]."</span><br>";}
-				echo htmlentities($row["beznam"], ENT_QUOTES, "UTF-8")."</td>"
+				."\n\t\t\t\t<td title='Amtsgerichtsbezirk'>".DsKy($row["stelle"], 'Stelle-*').htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8")."</td>"
+				."\n\t\t\t\t<td title='Grundbuchbezirk'>".DsKy($row["bezirk"], 'Grundbuchbezirk-*').htmlentities($row["beznam"], ENT_QUOTES, "UTF-8")."</td>"
 				."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
 			."\n\t\t\t</tr>"
@@ -136,5 +312,5 @@
 	echo "\n<p>Keine Angaben zum Eigentum bei fiktivem Blatt.</p>";
 } else { // E I G E N T Ã M E R
-	$n = eigentuemer($gmlid, true, ""); // MIT Adressen.
+	$n = eigentuemer($gmlid, true, false); // MIT Adressen.
 	if ($n === 0) { // keine NamensNr, kein Eigentuemer
 		echo "\n<p class='err'>Keine Namensnummer gefunden.</p>"
@@ -240,5 +416,8 @@
 
 		$zeianz = bnw_fsdaten($gml_bs, true); // FlurstÃŒcksdaten zur direkten Buchungsstelle
-		if ($zeianz === 0) {echo "\n<tr class='".$trclass."'>\n\t<td></td>\n\t<td colspan='7'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n\t<td></td>\n</tr>";}
+		if ($zeianz === 0) {
+			echo "\n<tr class='".$trclass."'>\n\t<td><span class='wichtig'>".$lfdnr."</span></td>"
+			."\n\t<td colspan='7'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n\t<td></td>\n</tr>";
+		}
 
 	} else { // herrschende Buchung
@@ -291,16 +470,14 @@
 $zpaar=false;
 while($rowb = pg_fetch_assoc($resb)) {
-	if ($b === 0) { // Ueberschrift und Tabelle nur ausgeben, wenn etwas gefunden wurde
+	if ($b === 0) { // Ãberschrift und Tabelle nur ausgeben, wenn etwas gefunden wurde
 		echo "\n\n<h3><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Berechtigte Grundb&uuml;cher</h3>"
-		."\n<table class='outer'>"
-		."\n<tr>"
-			."\n\t<td class='heads' title='lfd. Nr. auf diesem Blatt, wie im Teil Flurst&uuml;cke'><span class='wichtig'>an BVNR</span><img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'></td>"
-			."\n\t<td class='head'>Dienststelle</td>"
-			."\n\t<td class='heads'>Bezirk</td>"
-			."\n\t<td class='heads'><span class='wichtig'>Blatt</span></td>"
-			."\n\t<td class='heads'>BVNR</td>"
-			."\n\t<td class='head'>Buchungsart</td>"
-			."\n\t<td class='head nwlink noprint'>Weitere Auskunft</td>"
-		."\n</tr>";
+		."\n<table class='outer'>\n<tr>"
+		."\n\t<td class='heads' title='lfd. Nr. auf diesem Blatt, wie im Teil Flurst&uuml;cke'><span class='wichtig'>an BVNR</span><img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'></td>"
+		."\n\t<td class='head'>Dienststelle</td>"
+		."\n\t<td class='heads'>Bezirk</td>"
+		."\n\t<td class='heads'><span class='wichtig'>Blatt</span></td>"
+		."\n\t<td class='heads'>BVNR</td>"
+		."\n\t<td class='head'>Buchungsart</td>"
+		."\n\t<td class='head nwlink noprint'>Weitere Auskunft</td>\n</tr>";
 	}
 
@@ -324,27 +501,17 @@
 		."\n\t<td>"; // Amtsgericht,Grundbuchamt
 			echo htmlentities($rowb["stellev"], ENT_QUOTES, "UTF-8")." ";
-			if ($showkey) {echo "<span class='key'>".$rowb["stelle"]."</span> ";}
-			echo htmlentities($rowb["bezeichnung"], ENT_QUOTES, "UTF-8")
+			echo DsKy($rowb["stelle"], 'Stelle-*').htmlentities($rowb["bezeichnung"], ENT_QUOTES, "UTF-8")
 		."</td>"
-		."\n\t<td>";
-			if ($showkey) {echo "<span class='key'>".$rowb["bezirk"]."</span> ";}
-			echo htmlentities($rowb["beznam"], ENT_QUOTES, "UTF-8")
-		."</td>"
+		."\n\t<td>".DsKy($rowb["bezirk"], 'Grundbuch-Bezirk-*').htmlentities($rowb["beznam"], ENT_QUOTES, "UTF-8")."</td>"
 		."\n\t<td><span class='wichtig'>".$blatt."</span></td>"
 		."\n\t<td>".$bvnr."</td>"
-		."\n\t<td title='".htmlentities($rowb["bartd"], ENT_QUOTES, "UTF-8")."'>";
-			if ($showkey) {echo "<span class='key'>".$buch."</span> ";}
-			echo $bart
-		."</td>"
+		."\n\t<td title='".htmlentities($rowb["bartd"], ENT_QUOTES, "UTF-8")."'>".DsKy($buch, 'Buchungsart-*').$bart."</td>"
 		."\n\t<td>"
 			."\n\t\t<p class='nwlink noprint'>";
-
 			// Bestand
-			if ($showkey) {echo "<span class='key'>".$blart."</span> ";}
-			echo "\n\t\t\t<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gml_b;
-				if ($showkey) {echo "&amp;showkey=j";}
-				echo "#bvnr".$lfdnr."' title='Nachweis des berechtigten Blattes an einer Buchung auf ".$blattart."'>".$rowb["blattartv"];
-				echo " \n\t\t\t<img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
-			echo "\n\t\t</p>"
+			echo "\n\t\t\t".DsKy($blart, 'Blattart-*')."<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gml_b.LnkStf()
+			."#bvnr".$lfdnr."' title='Nachweis des berechtigten Blattes an einer Buchung auf ".$blattart."'>".$rowb["blattartv"]
+			." \n\t\t\t<img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>"
+			."\n\t\t</p>"
 		."</td>"
 	."\n</tr>";
