<?php

include_once( "kd_einsprungspunkte.php" );





	function xlog( $level, $meldung )
	{
		chdir( $_SERVER[ "DOCUMENT_ROOT" ]."/ca/" );
		$zeitstempel = date( "Y.m.d H:i:s", time(  ) );
		$LOG_LEVEL = 4;
		switch ( $level ) 
		{
			case 6:
				$loglevel = "DEB_2";
				break;
			case 5:
				$loglevel = "DEBUG";
				break;
			case 4:
				$loglevel = "INFO ";
				break;
			case 3:
				$loglevel = "WARN ";
				break;
			case 2:
				$loglevel = "ERROR";
				break;
			case 1:
				$loglevel = "FATAL";
				break;
		}
		if ( $level <= $LOG_LEVEL )
		{
			$datei = fopen( "system.log", "a+" );
			fwrite( $datei, $zeitstempel." ".$loglevel." ".$_SESSION[ "mandant_id" ]." ".$meldung."\n" );
			fclose( $datei );
		}
	}
	
	function xdb( $STATEMENT )
	{
		/*
			Es wird ein Array zurückgegeben
			
			array( $rc, $ergebnis )
			
			$rc = -1 wenn Fehler
			$rc = Anzahl Ergebniszeilen wenn Select
			$rc = ID des eingefügten Elements wenn Insert
			$rc = 0 für Inserts ohne auto_increment und andere Statements ( update, delete, ...)
		
		*/
		
		/*if ( strtoupper( substr( $STATEMENT, 0, 5 ) ) == "DELET" )
		{
			
			return array( 0, 0 );
		}
		
		*/
		// Herstellen der DB-Verbindung
		$connection = mysqli_connect( "p:localhost", "ca_db", "ca_db", "ca_system" );
		mysqli_query( $connection, "SET NAMES utf8" );
		mysqli_select_db( $connection, "ca_system" );
		
		//xlog(4, $STATEMENT );
		
		//$STATEMENT = utf8_encode( $STATEMENT );
		
		$ergebnis = mysqli_query( $connection, $STATEMENT );
		
		$id = mysqli_insert_id( $connection );
		
		$sql_ok = mysqli_error( $connection );
		
		if ( strlen( $sql_ok ) > 0 )
		{
			$rc = -1;
			$ergebnis = $sql_ok;
			//xlog( 2, $STATEMENT );
			xlog( 2, $sql_ok );
		}
		else
		{
			if ( ! is_bool( $ergebnis ) )
			{
				// STATEMENT offenbar ein Select, Trefferliste:
				while ( $zeile = mysqli_fetch_array( $ergebnis, MYSQLI_ASSOC ) )
				{
					/*$ergebnis_2 = array();
					foreach( $zeile as $key=>$value )
					{
						$ergebnis_2[ $key ] = utf8_decode( $value );
					}
					$ergebnis_1[ ] = $ergebnis_2;
					*/
					$ergebnis_1[ ] = $zeile;
				}
				$rc = count( $ergebnis_1 );
				$ergebnis = $ergebnis_1;
			}
			else
			{
				// STATEMENT offenbar ein Insert
				//$STATEMENT		= "select @@IDENTITY as id";
				//$STATEMENT		= utf8_encode( $STATEMENT );
				//$ergebnis_2		= mysql_query( $STATEMENT );
				//$id				= mysql_fetch_array( $ergebnis_2 );
				
				$rc				= $id;
				if ( strlen( $rc ) == 0 )
				{
					$rc = 0;
				}
				$ergebnis		= "Liefere ID ".$rc.".";
			}
			
		}
		return array( $rc, $ergebnis );
	}
	
	function login( $mandant_name, $domaene, $benutzer_anmeldename, $passwort )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $benutzer_anmeldename == "superuser" )
		{
			$mandant_name = "Standard";
		}
		//xlog( 3, " Parameter: ". $mandant_name."|". $domaene."|". $benutzer_anmeldename."|". $passwort );
		
		// Machen wir LDAP?
		
		$ldap = liefere_konfig( $mandant_name, "ldap_aktiv" );
		
		if ( ( $ldap == "ja" ) and ( strlen( $domaene ) > 0 ) )
		{
			
			
			$ldap_server = liefere_konfig( $mandant_name, "ldap_server" );
			
			$ldap_server	= 'ldap://'.$ldap_server;
			$connection		= @ldap_connect( $ldap_server );
			
			ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);
			ldap_set_option($connection, LDAP_OPT_REFERRALS, 0);
			
			$login = @ldap_bind( $connection, $benutzer_anmeldename."@".$domaene, $passwort );
			
			ldap_unbind( $connection );
			
			if ( $login !== false )
			{
				
				$ok_1 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
				
				$ergebnis = ldap_liefere_benutzerinformationen( $mandant_name, $domaene, $benutzer_anmeldename );
				
				
				if ( $ok_1[ 0 ] == 0 )
				{
					// Benutzer existiert nicht
					// benutzer_anlegen( $mandant_name, $benutzer_anmeldename, $passwort, $vorname = "", $nachname = "", $email="", $geschlecht = "", $geburtstag = "", $passwort_pruefen = true, $domaene = "" )
					
					// Erweiterte Benutzerinformationen aus dem LDAP lesen
					
					$_SESSION[ "benutzer_anmeldename" ] = "superuser";
					$ok_2 = benutzer_anlegen( $mandant_name, $benutzer_anmeldename, "", $ergebnis[ 2 ][ "vorname" ], $ergebnis[ 2 ][ "nachname" ], $ergebnis[ 2 ][ "email" ], "m", date( "d.m.Y" ), false, $domaene );
					$_SESSION[ "benutzer_anmeldename" ] = "";
					
				}
				
				
				// Gruppenzugehörigkeiten regeln
				
				
				// erstmal den Benutzer aus allen Gruppen entfernen
				
				$in_welchen_gruppen_ist_benutzer_mitglied = in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename );
				
				$_SESSION[ "benutzer_anmeldename" ] = "superuser";
				foreach( $in_welchen_gruppen_ist_benutzer_mitglied[ 2 ] as $gruppen_name )
				{
					benutzer_aus_gruppe_entfernen( $mandant_name, $benutzer_anmeldename, $gruppen_name );
				}
				$_SESSION[ "benutzer_anmeldename" ] = "";
				
				// jetzt den Benutzer aufgrund von LDAP-Gruppenzugehörigkeiten in 4w-Gruppen zuordnen
				
				$gruppenzuordnungen = liefere_wertemenge_elemente( $mandant_name, "ldap_gruppen" );
				
				$_SESSION[ "benutzer_anmeldename" ] = "superuser";
				foreach ( $gruppenzuordnungen[ 2 ] as $zuordnung )
				{
					foreach( $ergebnis[ 3 ] as $ldap_gruppe=>$ldap_vollbezeichnung )
					{
						if ( strpos( $zuordnung[ "alpha_01" ], $ldap_gruppe ) !== false )
						{
							benutzer_einer_gruppe_hinzufuegen( $mandant_name, $benutzer_anmeldename, $zuordnung[ "alpha_02" ] );
						}
					}
				}
				$_SESSION[ "benutzer_anmeldename" ] = "";
				// fertig.
				
				
				
				
				
				// Unterscheidungen zwischen Domänen- und nicht-Domänenbenutzern
				
				
				$rc = 0;
				$meldung = "Der Benutzer >".$benutzer_anmeldename."< wird eingeloggt.";
			}
			else
			{
				ldap_get_option( $connection, LDAP_OPT_ERROR_STRING, $error );
				
				$rc = -1;
				$meldung = $error;
			}
			
			
		}
		else
		{
			if ( $benutzer_anmeldename <> "superuser" )
			{
				$erweiterung = " and mandant_id = (select mandant_id from ca_mandant where mandant_name = '".$mandant_name."') ";
			}
			else
			{
				$erweiterung = "";
			}
			
			
			//xlog( 4, "Passwort: >".$passwort."<" );
			$passwort = md5( $passwort );
			
			$benutzer_anmeldename = mb_strtolower( $benutzer_anmeldename, "UTF-8" );
			
			$STATEMENT			= "select count(*) anz from ca_benutzer where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."' and benutzer_passwort = '".mysqli_real_escape_string( $connection, $passwort )."'".$erweiterung;
			
			//xlog( 4, "STATEMENT: ".$STATEMENT );
			
			$ergebnis_1 = xdb( $STATEMENT );
			
			//xlog( 4, "Ergebnis 1 " . json_encode( $ergebnis_1[ 0 ] ));
			
			$STATEMENT			= "select benutzer_gesperrt from ca_benutzer where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."'".$erweiterung;
			
			$ergebnis_2 = xdb( $STATEMENT );
			
			//xlog( 4, json_encode( $ergebnis_2 ) );
			
			if ( $ergebnis_2[ 0 ] == 0 )
			{
				$benutzer_gesperrt = 0;
			}
			else
			{
				$benutzer_gesperrt = $ergebnis_2[ 1 ][ 0 ][ "benutzer_gesperrt" ];
			}
			
			//xlog( 4, $benutzer_gesperrt );
			/*xlog( 4, "Ergebnis 2 " . json_encode( $ergebnis_1[ 1 ] ));
			xlog( 4, "Ergebnis 3 " . json_encode( $ergebnis_1[ 1 ][ 0 ] ));
			xlog( 4, "Ergebnis 4 " . json_encode( $ergebnis_1[ 1 ][ 0 ][ "anz" ] ));*/
			if ( $ergebnis_1[ 1 ][ 0 ][ "anz" ] > 0 )
			{
				if ( $benutzer_gesperrt <> 1 )
				{
					// Setzen der Fehlversuche auf 0 (werden mitgezählt bei fehlerhaften Anmeldeversuchen)
					$STATEMENT = "update ca_benutzer set benutzer_passwort_fehlversuche = '0' where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."'";
					
					xdb( $STATEMENT );
					
					// sind seit dem letzten erfolgreichen Einlogvorgang mehr als X tage vergangen? (mit X aus Konfiguration gelesen)
					
					$pwd_gueltigkeitsdauer_tage			= liefere_konfig( $mandant_name, "pwd_gueltigkeitsdauer_tage" );
					
					$meldung							= "pwd_gueltigkeitsdauer_tage = ".$pwd_gueltigkeitsdauer_tage;
					
					$STATEMENT							= "select benutzer_passwort_letzte_aenderung from ca_benutzer where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."' and mandant_id = (select mandant_id from ca_mandant where mandant_name = '".$mandant_name."')";
					
					$ergebnis_3							= xdb( $STATEMENT );
					
					$benutzer_passwort_letzte_aenderung	= $ergebnis_3[ 1 ][ 0 ][ "benutzer_passwort_letzte_aenderung" ];
					
					$datum_uhrzeit_oder_beides			= time();
					
					$zeitpunkt							= bcadd( bcmul( $pwd_gueltigkeitsdauer_tage, "86400", 0 ), $benutzer_passwort_letzte_aenderung );
					
					//xlog( 2, $zeitpunkt." < ".$datum_uhrzeit_oder_beides );
					
					if ( $zeitpunkt < $datum_uhrzeit_oder_beides )
					{
						// Passwort ist abgelaufen
						
						$rc				= 1;
						$meldung		= "Das Passwort des Benutzers ".$benutzer_anmeldename." ist abgelaufen.";
						
					}
					else
					{
						// Passwort ist noch gültig
						$rc = 0;
						$meldung = "Der Benutzer >".$benutzer_anmeldename."< wird eingeloggt.";
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Der Benutzer ".$benutzer_anmeldename." (Mandant ".$mandant_name.") ist gesperrt. Bitte kontaktieren Sie den Administrator.";
				}
			}
			else
			{
				// Passwort falsch oder Benutzername falsch oder Benutzername existiert nicht
				
				$STATEMENT						= "update ca_benutzer set benutzer_passwort_fehlversuche = benutzer_passwort_fehlversuche + 1 where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."'";
				
				xdb( $STATEMENT );
				
				$max_anzahl_fehlversuche		= liefere_konfig( $mandant_name, "pwd_anzahl_erlaubter_fehlversuche" );
				
				$STATEMENT						= "select benutzer_passwort_fehlversuche from ca_benutzer where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."' and mandant_id = ( select mandant_id from ca_mandant where mandant_name = '".$mandant_name."')";
				
				$ergebnis_4 = xdb( $STATEMENT );
				
				if ( $ergebnis_4[ 0 ] == 0 )
				{
					// Benutzer existiert nicht
					$rc = -1;
					$meldung = "Benutzername oder Passwort sind nicht korrekt.";
				}
				else
				{
					// Passwort falsch
					$benutzer_passwort_fehlversuche	= $ergebnis_4[ 1 ][ 0 ][ "benutzer_passwort_fehlversuche" ];
				
				
					if ( $benutzer_passwort_fehlversuche >= $max_anzahl_fehlversuche )
					{
						// Maximale Anzahl Fehlversuche erreicht, Benutzer wird gesperrt
						$STATEMENT = "update ca_benutzer set benutzer_gesperrt = '1' where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."'";
						//xlog( 4, $STATEMENT );
						xdb( $STATEMENT );
						
						$rc = -4;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." wurde nach ".$benutzer_passwort_fehlversuche." Versuchen, sein Passwort einzugeben, gesperrt.";
						
					}
					else
					{
						$rc = -1;
						$meldung = "Benutzername oder Passwort sind nicht korrekt.";
					}
				}
			}
		}	
		
		if ( $rc < 0 )
		{
			$level = 3;
		}
		else
		{
			$level = 4;
		}
		
		
		xlog( $level, "admin.login: RC ".$rc.": ".$meldung );
		mysqli_close( $connection );
		
		return array( $rc, $meldung );
		
		
		
		
		
		
	}
	
	
	
	
	
	function ldap_liefere_benutzerinformationen( $mandant_name, $domaene, $benutzer_anmeldename )
	{
		$ldap_server	= liefere_konfig( $mandant_name, "ldap_server" );
		$ldap_benutzer	= liefere_konfig( $mandant_name, "ldap_benutzer" );
		$ldap_passwort	= liefere_konfig( $mandant_name, "ldap_passwort" );
		
		//ldap_set_option( NULL, LDAP_OPT_DEBUG_LEVEL, 7 );
		
		$ldap_server	= 'ldap://'.$ldap_server;
		
		
		
		$connection		= @ldap_connect( $ldap_server );
		
		
		@ldap_set_option( $connection, LDAP_OPT_PROTOCOL_VERSION, 3 );
		@ldap_set_option( $connection, LDAP_OPT_REFERRALS, 0 );
		
		
		@ldap_bind($connection, $ldap_benutzer, $ldap_passwort);
		
		
		
		
		$dn			= utf8_encode( "DC=dms01,DC=local" );
		$filter		= "(CN=".$benutzer_anmeldename.")";
		$justthese	= array( "ou", "sn", "cn", "givenName", "mail", "vorname", "memberOf", "dn", "pwdlastset", "badpwdcount" );
		
		
		
		
		$sr			= ldap_search( $connection, $dn, $filter, $justthese );
		
		//$test = ldap_get_option( $connection, LDAP_OPT_ERROR_STRING, $error );
		
		$info		= ldap_get_entries( $connection, $sr );
		
		$benutzerinfos[ "nachname" ]				= $info[ 0 ][ "sn" ][ 0 ];
		$benutzerinfos[ "benutzer_anmeldename" ]	= $info[ 0 ][ "cn" ][ 0 ];
		$benutzerinfos[ "vorname" ]					= $info[ 0 ][ "givenname" ][ 0 ];
		$benutzerinfos[ "email" ]					= $info[ 0 ][ "mail" ][ 0 ];
		$benutzerinfos[ "dn" ]						= $info[ 0 ][ "dn" ][ 0 ];
		$pwdlastset									= $info[ 0 ][ "pwdlastset" ][ 0 ];			// The date and time that the password for this account was last changed. This value is stored as a large integer that represents the number of 100 nanosecond intervals since January 1, 1601 (UTC). If this value is set to 0 and the User-Account-Control attribute does not contain the UF_DONT_EXPIRE_PASSWD flag, then the user must set the password at the next logon.
		$winSecs									= bcdiv( $pwdlastset, 10000000);			// divide by 10 000 000 to get seconds
		$benutzerinfos[ "pw_letzte_aenderung" ]		= bcsub($winSecs, 11644473600);				// 1.1.1600 -> 1.1.1970 difference in seconds
		$benutzerinfos[ "benutzer_passwort_fehlversuche" ]	= $info[ 0 ][ "badpwdcount" ][ 0 ];
		
		
		
		/*
		foreach( $benutzerinfos as $key=>$element )
		{
			xlog( 3, "key ".$key." element ".$element );
		}
		*/
		
		$gruppen		= array();
		
		foreach( $info[ 0 ][ "memberof" ] as $key=>$element )
		{
			if ( is_int( $key) )
			{
				$gruppenname_voll		= $element;
				//CN=Alle,CN=Users,DC=DMS01,DC=local
				$element				= explode( "=", $element );
				$element				= explode( ",", $element[ 1 ] );
				$element				= $element[ 0 ];
				$gruppen[ $element ]	= $gruppenname_voll;
				
			}
		}
		
		ldap_unbind( $connection );
		
		$rc = 0;
		$meldung = "Liefere Informationen über den LDAP-Benutzer ".$benutzer_anmeldename." aus der Domaene ".$domaene.".";
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.ldap_liefere_benutzerinformationen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzerinfos, $gruppen );
		
	}
	
	
	
	
	
	
	
	/*
		Benutzerfunktionen
	*/
	
	function benutzer_anlegen( $mandant_name, $benutzer_anmeldename, $passwort, $vorname = "", $nachname = "", $email = "", $geschlecht = "", $geburtstag = "", $passwort_pruefen = true, $domaene = "" )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		/****************
		BESCHREIBUNG_____Diese Funktion erstellt einen Benutzer.
		RETURNS_____array( (integer) Returncode, (string) Meldung)
		****************/
		
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $benutzer_anmeldename ) <> 0 )
				{
					if ( ( strlen( $passwort ) <> 0 ) or ( ! $passwort_pruefen ) )
					{
						$benutzer_anmeldename = mb_strtolower( $benutzer_anmeldename, "UTF-8" );
						
						if ( strlen( $geburtstag ) == 0 )
						{
							$geburtstag = date( "d.m.Y" );
						}
						xlog( 1, $geburtstag );
						$geburtstag = datum2mysql( $geburtstag );
						xlog( 1, $geburtstag );
						$geschlecht = mb_strtolower( $geschlecht, "UTF-8" );
						
						if ( ( strlen( $geschlecht ) == 0 ) or ( ( $geschlecht <> "m" ) and ( $geschlecht <> "w" ) ) )
						{
							$geschlecht = "m";
						}
						
						$regex		= preg_match( "/[\!\"\§\$\%\&\\\,\.\ \?\:\;\/\(\)\=\*\#\'\{\}\[\]\~\|]/", $benutzer_anmeldename );
						
						if ( $regex == 0 )
						{
							$benutzer_id = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
							
							if ( $benutzer_id[ 0 ] == 0 )
							{
								if ( $passwort_pruefen == true )
								{
									$pass_ok = pruefe_password( $mandant_name, $passwort );
								}
								else
								{
									$pass_ok = array( "0", "Es hat keine Prüfung stattgefunden." );
								}
								
								
								if ( $pass_ok[ 0 ] == "0" )
								{
									$regex_vorname		= preg_match( "/[\!\"\§\$\%\&\\\,\.\?\:\;\/\(\)\=\*\#\{\}\[\]\~\|]/", $vorname );
									$regex_nachname		= preg_match( "/[\!\"\§\$\%\&\\\,\.\?\:\;\/\(\)\=\*\#\{\}\[\]\~\|]/", $nachname );
									
									if ( ( $regex_vorname == 0 ) and ( $regex_nachname == 0 ) )
									{
										$passwort = md5( $passwort );
										
										$datum_uhrzeit_oder_beides = time( );
										
										// Erstellen des Benutzers
										$STATEMENT = "insert into ca_benutzer ( benutzer_geburtstag, domaene, mandant_id, benutzer_geschlecht, benutzer_vorname, benutzer_nachname, benutzer_anmeldename, benutzer_email_adresse, benutzer_passwort, benutzer_angelegt_am, benutzer_letzte_aenderung, benutzer_passwort_letzte_aenderung, benutzer_passwort_fehlversuche, benutzer_abwesend, benutzer_gesperrt, benutzer_vertreter, benutzer_vertreter_typ ) values ( '".mysqli_real_escape_string( $connection, $geburtstag )."', '".mysqli_real_escape_string( $connection, $domaene )."', ".mysqli_real_escape_string( $connection, $ok[ 0 ] ).", '".mysqli_real_escape_string( $connection, $geschlecht )."', '".mysqli_real_escape_string( $connection, $vorname )."', '".mysqli_real_escape_string( $connection, $nachname )."', '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."', '".mysqli_real_escape_string( $connection, $email )."', '".mysqli_real_escape_string( $connection, $passwort )."', '".mysqli_real_escape_string( $connection, $datum_uhrzeit_oder_beides )."', '".mysqli_real_escape_string( $connection, $datum_uhrzeit_oder_beides )."', '".mysqli_real_escape_string( $connection, $datum_uhrzeit_oder_beides )."', '0', 'nein', '', '', '' );";
										
										$ergebnis = xdb( $STATEMENT );
										
										/////////////////////////////////////////////////
										// Es fehlt noch das Anlegen der benutzerspezifischen Konfiguration (siehe Wertemenge benutzer_konfig)
										//
										
										// initale Gruppen/Benutzerzuordnungen eintragen
										$element_anzulegen = liefere_wertemenge_elemente( $mandant_name, "benutzer_konfig" );
										
										if ( $element_anzulegen[ 0 ] > 0 )
										{
											foreach( $element_anzulegen[ 2 ] as $element )
											{
												// benutzer_einer_gruppe_hinzufuegen( $mandant_name, $benutzer_anmeldename, $gruppen_name )
												//xlog( 4, "Benutzername ".$element[ "alpha_01" ]." gruppenname ".$element[ "alpha_02" ] ) ;
												//$ok = benutzer_einer_gruppe_hinzufuegen( $mandant_name, "superuser", $element[ "alpha_01" ], $element[ "alpha_02" ] );
												$ok = aktualisiere_benutzerspezifische_einstellung( $mandant_name, $benutzer_anmeldename, $element[ "alpha_01" ], $element[ "alpha_02" ], $element[ "alpha_04" ], $element[ "alpha_03" ], $element[ "alpha_05" ], $element[ "alpha_06" ], $element[ "text_01" ] );
											}
										}
										
										if ( $ergebnis[ 0 ] <> -1 )
										{
											// Feststellen der Benutzer-ID
											$rc				= $ergebnis[ 0 ];
											$meldung		= "Der Benutzer >".$benutzer_anmeldename."< wurde mit der ID >".$ergebnis[ 0 ]."< angelegt.";
										}
										else
										{
											$rc = -8;
											$meldung = "Beim Anlegen des Benutzers ist ein Fehler aufgetreten: >".$ergebnis[ 1 ]."<";
										}	
									}
									else
									{
										$rc = -7;
										$meldung = "Sonderzeichen sind im Realnamen nicht erlaubt.";
									}
								}
								else
								{
									$rc = -6;
									$meldung = $pass_ok[1];
								}
							}
							else
							{
								$rc = -5;
								$meldung = "Der Benutzer ".$benutzer_anmeldename." existiert bereits mit der ID ".$benutzer_id[ 0 ].".";
							}
						}
						else
						{
							$rc = -4;
							$meldung = "Beim gewünschten Benutzer-Anmeldenamen >".$benutzer_anmeldename."< wurde ein nicht erlaubtes Sonderzeichen verwendet.";
						}
					}
					else
					{
						$rc = -3;
						$meldung = "Es wurde kein Passwort angegeben.";
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Es wurde kein Benutzer-Anmeldename angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht, um Benutzer anlegen zu dürfen.";
			}
		}
		else
		{
			$rc = $ok[ 0 ];
			$meldung = $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		mysqli_close( $connection );
		
		xlog( $level, "admin.benutzer_anlegen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function benutzer_loeschen( $mandant_name, $benutzer_anmeldename, $force = false )
	{
		if ( ( $force !== true ) && ( $force !== false ) )
		{
			$force = false;
		}
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				// Benutzer und Mandant existieren .... das ist gut so!
				
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
				}
				
				if ( $exec[ 0 ] == 1 )
				{
					
					if ( ( $benutzer_anmeldename <> "ca_admin" ) || ( $force === true ) )
					{
						$erg = in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename );
						if ( $erg[ 0 ] > 0 )
						{
							foreach( $erg[ 3 ] as $gruppe )
							{
								//xlog( 6, "benutzer aus Gruppe entfernen: ".$benutzer_anmeldename." ** ".$gruppe." ... ".$force );
								benutzer_aus_gruppe_entfernen( $mandant_name, $benutzer_anmeldename, $gruppe, $force );
							}
						}
						
						$STATEMENT = "delete from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_notiz where element_typ = 'b' and element_id = ".$ok_2[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_benutzer where benutzer_id = ".$ok_2[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_favoriten where benutzer_anmeldename = '".$benutzer_anmeldename."' and mandant_id = ".$ok_1[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Der Benutzer ".$benutzer_anmeldename." wurde im Mandanten ".$mandant_name." gelöscht.";
						}
						else
						{
							$rc = -1;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -2;
						$meldung = "Der Systembenutzer >".$benutzer_anmeldename."< kann nicht gelöscht werden.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = $ok_2[ 0 ];
				$meldung = $ok_2[ 1 ];
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_loeschen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function existiert_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		/****************
		BESCHREIBUNG_____Liefert die Benutzer-ID anhand des Benutzernamens
		RETURNS_____(string) Benutzer-ID
		****************/
		
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $benutzer_anmeldename ) > 0 )
			{
				// Feststellen der Benutzer-ID zum Anmeldenamen
				$STATEMENT = "select benutzer_id from ca_benutzer where lower( benutzer_anmeldename ) = '".mb_strtolower( $benutzer_anmeldename, "UTF-8" )."' and mandant_id = ".$ok[ 0 ]." ;";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] <> -1 )
				{
					if ( $ergebnis[ 0 ] <> 0 )
					{
						$rc = $ergebnis[ 1 ][ 0 ][ "benutzer_id" ];
						$meldung = "Der Benutzer ".$benutzer_anmeldename." hat im Mandanten ".$mandant_name." die ID ".$rc.".";
					}
					else
					{
						$rc = 0;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." existiert im Mandanten ".$mandant_name." nicht.";
					}
				}
				else
				{
					$rc = -3;
					$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
				
			}
			else
			{
				$rc = -2;
				$meldung = "Es wurde kein Benutzer-Anmeldename angegeben.";
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Der Mandant ".$mandant_name." existiert nicht.";
		}
		xlog( 6, "admin.existiert_benutzer: ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_benutzerinformationen( $mandant_name, $benutzer_anmeldename )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( strlen( $benutzer_anmeldename ) > 0 )
			{
				$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
				
				if ( $ok_2[ 0 ] > 0 )
				{
					$STATEMENT = "select domaene, mandant_id , benutzer_id , benutzer_anmeldename , benutzer_vorname , benutzer_nachname , benutzer_passwort , benutzer_email_adresse , benutzer_geschlecht , benutzer_angelegt_am , benutzer_letzte_aenderung , benutzer_gesperrt , benutzer_passwort_letzte_aenderung , benutzer_passwort_fehlversuche , benutzer_geburtstag, benutzer_abwesend, benutzer_vertreter, benutzer_vertreter_typ FROM ca_benutzer where benutzer_id = ".$ok_2[ 0 ];
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] <> -1 )
					{
						$zeile = $ergebnis[ 1 ][ 0 ];
						$benutzer_array = array( );
						
						if ( $zeile[ "benutzer_abwesend" ] == "nein" )
						{
							$zeile[ "benutzer_vertreter" ]		= "";
							$zeile[ "benutzer_vertreter_typ" ]	= "";
						}
						
						
						
						$benutzer_array[ "domaene" ]							= (string)	$zeile[ "domaene" ];
						$benutzer_array[ "mandant_id" ]							= (string)	$zeile[ "mandant_id" ];
						$benutzer_array[ "benutzer_id" ]						= (int)		$zeile[ "benutzer_id" ];
						$benutzer_array[ "benutzer_anmeldename" ]				= (string)	$zeile[ "benutzer_anmeldename" ];
						$benutzer_array[ "benutzer_vorname" ]					= (string)	$zeile[ "benutzer_vorname" ];
						$benutzer_array[ "benutzer_nachname" ]					= (string)	$zeile[ "benutzer_nachname" ];
						$benutzer_array[ "benutzer_name" ]						= $benutzer_array[ "benutzer_vorname" ]." ".$benutzer_array[ "benutzer_nachname" ];
						$benutzer_array[ "benutzer_name_komplett" ]				= $benutzer_array[ "benutzer_vorname" ]." ".$benutzer_array[ "benutzer_nachname" ]." (".$benutzer_array[ "benutzer_anmeldename" ].")";
						$benutzer_array[ "benutzer_gesperrt" ]					= (string)	$zeile[ "benutzer_gesperrt" ];
						$benutzer_array[ "benutzer_email_adresse" ]				= (string)	$zeile[ "benutzer_email_adresse" ];
						$benutzer_array[ "benutzer_geschlecht" ]				= (string)	$zeile[ "benutzer_geschlecht" ];
						$benutzer_array[ "benutzer_angelegt_am" ]				= (string)	$zeile[ "benutzer_angelegt_am" ];
						$benutzer_array[ "benutzer_passwort_letzte_aenderung" ]	= (string)	$zeile[ "benutzer_passwort_letzte_aenderung" ];
						$benutzer_array[ "benutzer_letzte_aenderung" ]			= (string)	$zeile[ "benutzer_letzte_aenderung" ];
						$benutzer_array[ "benutzer_passwort_fehlversuche" ]		= (string)	$zeile[ "benutzer_passwort_fehlversuche" ];
						$benutzer_array[ "benutzer_abwesend" ]					= (string)	$zeile[ "benutzer_abwesend" ];
						$benutzer_array[ "benutzer_vertreter" ]					= (string)	$zeile[ "benutzer_vertreter" ];
						$benutzer_array[ "benutzer_vertreter_typ" ]				= (string)	$zeile[ "benutzer_vertreter_typ" ];
						$benutzer_array[ "benutzer_geburtstag" ]				= (string)mysql2datum( $zeile[ "benutzer_geburtstag" ] );
						
						$rc = $benutzer_array[ "benutzer_id" ];
						$meldung = "Liefere Informationen zum Benutzer ".$benutzer_array[ "benutzer_anmeldename" ].": ".json_encode( $benutzer_array );
					}
					else
					{
						$rc = -3;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Der angegebene Benutzer wurde nicht im System gefunden.";
				}
				
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Benutzername angegeben.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_benutzerinformationen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzer_array );
		
	}
	
	function liefere_alle_benutzer( $mandant_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		$benutzerliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$STATEMENT = "select benutzer_anmeldename from ca_benutzer where mandant_id = ".$ok_1[ 0 ];
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				$rc				= $ergebnis[ 0 ];
				$benutzerliste	= $ergebnis[ 1 ];
				$meldung = "Liefere ".$rc." Benutzer des Mandants ".$mandant_name.".";
			}
			else
			{
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.liefere_alle_benutzer: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzerliste );
	}
	
	function liefere_alle_benutzer_bavn( $mandant_name, $systembenutzer_liefern = true, $abwesende_benutzer_liefern = true )
	{
		// liefert nur benutzer-anmeldename, vorname und nachname und Abwesenheitsstatus
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		$benutzerliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( $systembenutzer_liefern == false )
			{
				$sysbenutzer = liefere_wertemenge_elemente( $mandant_name, "systembenutzer" );
				
				$STMT_ERW = " and benutzer_anmeldename not in ( ";
				
				foreach ( $sysbenutzer[ 2 ] as $systembenutzer )
				{
					$STMT_ERW = $STMT_ERW." '".$systembenutzer[ "alpha_01" ]."', ";
				}
				$STMT_ERW = substr( $STMT_ERW, 0, -2 )." )";
			}
			else
			{
				$STMT_ERW = "";
			}
			
			if ( $abwesende_benutzer_liefern == false )
			{
				$where = " and benutzer_abwesend = 'nein' ";
			}
			else
			{
				$where = "  ";
			}
			
			
			
			$STATEMENT = "select benutzer_anmeldename, benutzer_vorname, benutzer_nachname, benutzer_abwesend from ca_benutzer where mandant_id = ".$ok_1[ 0 ]." ".$STMT_ERW.$where." order by benutzer_nachname, benutzer_vorname";
			
			//xlog( 4, $STATEMENT );
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				$rc				= $ergebnis[ 0 ];
				$benutzerliste	= $ergebnis[ 1 ];
				$meldung = "Liefere ".$rc." Benutzer des Mandants ".$mandant_name.".";
			}
			else
			{
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.liefere_alle_benutzer_bavn: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzerliste );
	}
	
	function setze_password_fuer_benutzer( $mandant_name, $benutzer_anmeldename, $passwort, $setze_auf_jeden_fall = false )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$darf_aktualisierung_stattfinden = false;
			
			if ( $exekutor == $benutzer_anmeldename )
			{
				$darf_aktualisierung_stattfinden = true;
			}
			
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$darf_aktualisierung_stattfinden = true;
			}
			
			if ( $darf_aktualisierung_stattfinden == false )
			{
				$darf_stattfinden = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
			
				if ( $darf_stattfinden[ 0 ] == 1 )
				{
					$darf_aktualisierung_stattfinden = true;
				}
			}
			
			if ( $darf_aktualisierung_stattfinden == true )
			{
				$erg = pruefe_password( $mandant_name, $passwort );
				if ( ( $setze_auf_jeden_fall == true ) or ( $erg[ 0 ] == 0 ) )
				{
				
					
					//xlog( 4, "Passwort: >".$passwort."<" );
					$STATEMENT = "update ca_benutzer set benutzer_passwort = '".mysqli_real_escape_string( $connection, md5( $passwort ) )."', benutzer_passwort_letzte_aenderung='".time()."' where benutzer_anmeldename = '".mysqli_real_escape_string( $connection, $benutzer_anmeldename )."' and mandant_id = ".$ok_1[ 0 ];
					
					//xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					//xlog( 4, $ergebnis[ 0 ]." ".$ergebnis[ 1 ] );
					
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc = 0;
						$meldung = "Das Passwort des Benutzers >".$benutzer_anmeldename."< wurde geändert.";
					}
					else
					{
						$rc = -4;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = $erg[ 0 ];
					$meldung = $erg[ 1 ];
				}
			}
			else
			{
				$rc = -10;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht ausreichende Rechte, um das Passwort des Benutzers >".$benutzer_anmeldename."< zu ändern.";
			}
			
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.setze_password: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function benutzer_sperren( $mandant_name, $benutzer_anmeldename )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
				
				if ( $exec[ 0 ] == 1 )
				{
					$ergebnis_1 = liefere_wertemenge_elemente( $mandant_name, "systembenutzer" );
					
					$gefunden = false;
					
					if ( count ( $ergebnis_1[ 2 ] ) > 0 )
					{
						foreach ( $ergebnis_1[ 2 ] as $zeile )
						{
							if ( $zeile[ "alpha_01" ] == $benutzer_anmeldename )
							{
								$gefunden = true;
							}
						}
					}
					
					if ( ! ( $gefunden ) )
					{
						
						$STATEMENT = "update ca_benutzer set benutzer_gesperrt = 1 where benutzer_id = ".$ok_2[ 0 ]." and mandant_id = ".$ok_1[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Der Benutzer ".$benutzer_anmeldename." wurde im Mandanten ".$mandant_name." gesperrt.";
						}
						else
						{
							$rc = -1;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -2;
						$meldung = "Der Systembenutzer >".$benutzer_anmeldename."< kann nicht gesperrt werden.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = $ok_2[ 0 ];
				$meldung = $ok_2[ 1 ];
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_sperren: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function benutzer_entsperren( $mandant_name, $benutzer_anmeldename )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
				
				if ( $exec[ 0 ] == 1 )
				{
					$ergebnis_1 = liefere_wertemenge_elemente( $mandant_name, "systembenutzer" );
					
					$gefunden = false;
					
					if ( count ( $ergebnis_1[ 2 ] ) > 0 )
					{
						foreach ( $ergebnis_1[ 2 ] as $zeile )
						{
							if ( $zeile[ "alpha_01" ] == $benutzer_anmeldename )
							{
								$gefunden = true;
							}
						}
					}
					
					if ( ! ( $gefunden ) )
					{
						
						$STATEMENT = "update ca_benutzer set benutzer_gesperrt = 0 where benutzer_id = ".$ok_2[ 0 ]." and mandant_id = ".$ok_1[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Der Benutzer ".$benutzer_anmeldename." wurde im Mandanten ".$mandant_name." entsperrt.";
						}
						else
						{
							$rc = -1;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -2;
						$meldung = "Der Systembenutzer >".$benutzer_anmeldename."< sollte nicht entsperrt werden müssen.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = $ok_2[ 0 ];
				$meldung = $ok_2[ 1 ];
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_entsperren: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function benutzer_aendern( $mandant_name, $benutzer_anmeldename, $parameter )
	{
		/*
			$parameter kann folgende Elementen haben:
			
			benutzer_vorname
			benutzer_nachname
			benutzer_email_adresse
			benutzer_geschlecht
			benutzer_geburtstag
			benutzer_abwesend
			benutzer_vertreter
			benutzer_vertreter_typ
			
		*/
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$ergebnis_1 = liefere_wertemenge_elemente( $mandant_name, "systembenutzer" );
				
				$gefunden = false;
				
				if ( count ( $ergebnis_1[ 2 ] ) > 0 )
				{
					foreach ( $ergebnis_1[ 2 ] as $zeile )
					{
						if ( $zeile[ "alpha_01" ] == $benutzer_anmeldename )
						{
							$gefunden = true;
						}
					}
				}
				
				if ( ! ( $gefunden ) )
				{
					
					if ( !( ( $parameter[ "benutzer_abwesend" ] == "ja" ) && ( ( strlen( $parameter[ "benutzer_vertreter" ] ) == 0 ) || ( strlen( $parameter[ "benutzer_vertreter_typ" ] ) == 0 ) ) ) )
					{
						$meldung = "";
						
						if ( ( $parameter[ "benutzer_abwesend" ] == "ja" ) && ( strlen( $parameter[ "benutzer_vertreter_typ" ] ) == "b" ) )
						{
							$b = liefere_benutzerinformmationen( $mandant_name, $parameter[ "benutzer_vertreter" ] );
							
							if ( $b[ 2 ][ "benutzer_abwesend" ] == "ja" )
							{
								$rc = -15;
								$meldung = "Der als Vertreter angegebene Benutzer ".$parameter[ "benutzer_vertreter" ]." ist abwesend und kann daher nicht als Vertreter angegeben werden.";
							}
						}
						
						$vertretung_nur_gruppen = liefere_konfig( $_SESSION[ "mandant_name" ], "vertretung_nur_gruppen" );
						
						if ( ( $vertretung_nur_gruppen == "ja" ) && ( $parameter[ "benutzer_vertreter_typ" ] == "b" ) )
						{
							$rc = -16;
							$meldung = "Es sind nur Gruppen als Vertreter erlaubt.";
						}
						
						if ( strlen( $meldung ) == 0 )
						{
							
							if ( $parameter[ "benutzer_abwesend" ] == "nein" )
							{
								$parameter[ "benutzer_vertreter" ]		= "";
								$parameter[ "benutzer_vertreter_typ" ]	= "";
							}
							
							$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
							
							if ( $exec[ 0 ] == 1 )
							{
								
								foreach( $parameter as $key=>$value )
								{
									if ( $key == "benutzer_geburtstag" )
									{
										$set = $set.$key." = '".datum2mysql( $value )."', ";
										$liste = $liste.$key." => >".datum2mysql( $value )."< ";
										
									}
									else
									{
										$set = $set.$key." = '".$value."', ";
										$liste = $liste.$key." => >".$value."< ";
									}
								}
								
								//$set = substr( $set, 0, -2 );
								
								$STATEMENT = "update ca_benutzer set ".$set." benutzer_letzte_aenderung = '".time()."' where benutzer_id = ".$ok_2[ 0 ]." and mandant_id = ".$ok_1[ 0 ];
								
								//xlog( 4, $STATEMENT );
								
								$ergebnis = xdb( $STATEMENT );
								
								
								
								if ( $ergebnis[ 0 ] <> -1 )
								{
									if ( $parameter[ "benutzer_abwesend" ] == "ja" )
									{
										$STATEMENT = "update ca_postkorb set empfaenger = '".$parameter[ "benutzer_vertreter" ]."', empfaenger_typ = '".$parameter[ "benutzer_vertreter_typ" ]."', ursprung = '".$benutzer_anmeldename."' where empfaenger = '".$benutzer_anmeldename."' and mandant_id = ".$ok_1[ 0 ];
										
										//xlog( 5, $STATEMENT );
										$ergebnis = xdb( $STATEMENT );
									}
									
									if ( $parameter[ "benutzer_abwesend" ] == "nein" )
									{
										$STATEMENT = "update ca_postkorb set empfaenger = '".$benutzer_anmeldename."', empfaenger_typ = 'b', ursprung = '' where ursprung = '".$benutzer_anmeldename."' and mandant_id = ".$ok_1[ 0 ];
										
										//xlog( 5, $STATEMENT );
										$ergebnis = xdb( $STATEMENT );
									}
									
									$rc = 0;
									$meldung = "Der Benutzer ".$benutzer_anmeldename." wurde im Mandanten ".$mandant_name." geändert.";// (".substr( $liste, 0, -1 ).").";
								}
								else
								{
									$rc = -1;
									$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
								}
							}
							else
							{
								$rc = -12;
								$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
							}
						}
					}
					else
					{
						$rc = -13;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." sollte abwesend gemeldet werden, es wurde aber kein Vertreter angegeben.";
					}
				}
				else
				{
					$rc = -14;
					$meldung = "Der Systembenutzer ".$benutzer_anmeldename." kann nicht geändert werden.";
				}
			}
			else
			{
				$rc = $ok_2[ 0 ];
				$meldung = $ok_2[ 1 ];
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_aendern: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function benutzer_password_fehlversuche_zuruecksetzen( $mandant_name, $benutzer_anmeldename )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER" );
				
				if ( $exec[ 0 ] == 1 )
				{
					$STATEMENT = "update ca_benutzer set benutzer_passwort_fehlversuche = 0, benutzer_letzte_aenderung = '".time()."' where benutzer_id = ".$ok_2[ 0 ]." and mandant_id = ".$ok_1[ 0 ];
					
					//xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] <> -1 )
					{
						$rc = 0;
						$meldung = "Der Passwort-Fehleingabenzähler für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurde auf 0 gesetzt.";
					}
					else
					{
						$rc = -1;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = $ok_2[ 0 ];
				$meldung = $ok_2[ 1 ];
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_password_fehlversuche_zuruecksetzen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function suche_benutzer( $mandant_name, $suchstring )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		$benutzerliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			
			$STATEMENT = "select benutzer_anmeldename, benutzer_vorname, benutzer_nachname, domaene, benutzer_id, benutzer_email_adresse, benutzer_geschlecht, benutzer_angelegt_am, benutzer_letzte_aenderung, benutzer_gesperrt, benutzer_passwort_letzte_aenderung, benutzer_passwort_fehlversuche, benutzer_geburtstag from ca_benutzer where mandant_id = ".$ok_1[ 0 ]." and ( ( benutzer_anmeldename like '%".$suchstring."%' ) or ( benutzer_vorname like '%".$suchstring."%' ) or ( benutzer_nachname like '%".$suchstring."%' ) ) order by benutzer_nachname, benutzer_vorname";
			
			//xlog( 4, $STATEMENT );
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				$rc				= $ergebnis[ 0 ];
				$benutzerliste	= $ergebnis[ 1 ];
				$meldung = "Liefere ".$rc." Benutzer des Mandants ".$mandant_name.".";
			}
			else
			{
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.suche_benutzer: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzerliste );
	}
	
	function setze_benutzer_abwesend( $mandant_name, $benutzer_anmeldename, $parameter )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			
			if ( ( strlen( $benutzer_anmeldename ) > 0 ) && ( $benutzer_anmeldename == $exekutor ) && ( strlen( $parameter[ "vertreter" ] ) > 0 ) && ( strlen( $parameter[ "vertreter_typ" ] ) > 0 ) )
			{
				
				$o = welche_benutzer_vertritt_benutzer( $mandant_name, $benutzer_anmeldename );
				
				if ( $o[ 0 ] == 0 )
				{
					$b = liefere_benutzerinformationen( $mandant_name, $benutzer_anmeldename );
					
					if ( $b[ 2 ][ "benutzer_abwesend" ] == "nein" )
					{
						if ( $parameter[ "vertreter_typ" ] == "b" )
						{
							$v = liefere_benutzerinformationen( $mandant_name, $parameter[ "vertreter" ] );
							
							if ( $v[ 2 ][ "benutzer_abwesend" ] != "nein" )
							{
								$rc = -4;
								$meldung = "Der als Vertreter gewählte Benutzer ".$parameter[ "vertreter" ]." ist selber abwesend.";
							}
						}
						else
						{
							// Es wurde eine Gruppe als Vertreter gewählt
							$v = liefere_gruppeninformationen( $mandant_name, $parameter[ "vertreter" ] );
							if ( $v[ 0 ] < 0 )
							{
								$rc = -3;
								$meldung = "Es gibt ein Problem mit der angegebenen Gruppe: ".$v[ 1 ];
							}
						}
						
						if ( strlen( $meldung ) == 0 )
						{
							$STATEMENT = "update ca_benutzer set benutzer_abwesend = 'ja', benutzer_vertreter = '".$parameter[ "vertreter" ]."', benutzer_vertreter_typ = '".$parameter[ "vertreter_typ" ]."' where benutzer_anmeldename = '".$benutzer_anmeldename."' and mandant_id = ".$ok[ 0 ];
							
							xlog( 6, "admin.setze_benutzer_abwesend: ".$STATEMENT );
							xdb( $STATEMENT );
							
							$STATEMENT = "update ca_postkorb set empfaenger = '".$parameter[ "vertreter" ]."', empfaenger_typ = '".$parameter[ "vertreter_typ" ]."', ursprung = '".$benutzer_anmeldename."' where empfaenger = '".$benutzer_anmeldename."' and mandant_id = ".$ok[ 0 ];
							
							xlog( 6, "admin.setze_benutzer_abwesend: ".$STATEMENT );
							$ergebnis = xdb( $STATEMENT );
							
							$rc = 1;
							$meldung = "Der Benutzer ".$benutzer_anmeldename." hat sich abwesend gemeldet.";
						}
					}
					else
					{
						$rc = 2;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." ist bereits abwesend gemeldet.";
					}
				}
				else
				{
					$rc = -17;
					$meldung = "Der Benutzer ".$benutzer_anmeldename." ist Vertreter für andere Benutzer und kann daher nicht abwesend gemeldet werden.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Falsche Parametrisierung: mandant_name|benutzer_anmeldename|Session Benutzer|parameter vertreter, vertreter_typ: ".$mandant_name."|".$benutzer_anmeldename."|".$_SESSION[ "benutzer_anmeldename" ]."|".$parameter[ "vertreter" ]."|".$parameter[ "vertreter_typ" ];
			}
		}
		else
		{
			$rc = $ok[ 0 ];
			$meldung = $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.setze_benutzer_abwesend: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function setze_benutzer_anwesend( $mandant_name, $benutzer_anmeldename )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			
			if ( ( strlen( $benutzer_anmeldename ) > 0 ) && ( $benutzer_anmeldename == $exekutor ) )
			{
				
				$b = liefere_benutzerinformationen( $mandant_name, $benutzer_anmeldename );
				
				if ( $b[ 2 ][ "benutzer_abwesend" ] == "ja" )
				{
					
					
					if ( strlen( $meldung ) == 0 )
					{
						$STATEMENT = "update ca_benutzer set benutzer_abwesend = 'nein', benutzer_vertreter = '', benutzer_vertreter_typ = '' where benutzer_anmeldename = '".$benutzer_anmeldename."' and mandant_id = ".$ok[ 0 ];
						
						xdb( $STATEMENT );
						
						$STATEMENT = "update ca_postkorb set empfaenger = '".$benutzer_anmeldename."', empfaenger_typ = 'b', ursprung = '' where ursprung = '".$benutzer_anmeldename."' and mandant_id = ".$ok[ 0 ];
						
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$rc = 1;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." hat sich anwesend gemeldet.";
					}
				}
				else
				{
					$rc = 2;
					$meldung = "Der Benutzer ".$benutzer_anmeldename." ist bereits anwesend gemeldet.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Falsche Parametrisierung: mandant_name|benutzer_anmeldename|Session Benutzer|parameter vertreter, vertreter_typ: ".$mandant_name."|".$benutzer_anmeldename."|".$_SESSION[ "benutzer_anmeldename" ]."|".$parameter[ "vertreter" ]."|".$parameter[ "vertreter_typ" ];
			}
		}
		else
		{
			$rc = $ok[ 0 ];
			$meldung = $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.setze_benutzer_anwesend: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function welche_benutzer_vertritt_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $benutzer_anmeldename ) > 0 )
			{
				$e = array();
				
				$STATEMENT = "select distinct b.benutzer_vorname, b.benutzer_anmeldename, b.benutzer_nachname from ca_benutzer b where b.benutzer_vertreter = '".$benutzer_anmeldename."' and b.benutzer_vertreter_typ = 'b' and  b.mandant_id = ".$ok[ 0 ]." ";
				
				//xlog( 4, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$e = $ergebnis[ 1 ];
					
					$rc = count( $e );
					$meldung = "Liefere ".$rc." Benutzer, die von ".$benutzer_anmeldename." vertreten werden.";
				}
				else
				{
					$rc = 0;
					$meldung = "Der Benutzer ".$benutzer_anmeldename." vertritt aktuell niemanden.";
				}
				
			}
		}
		else
		{
			$rc = $ok[ 0 ];
			$meldung = $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.welche_benutzer_vertritt_benutzer: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $e );
	}
	
	
	
	
	/*
		Gruppenfunktionen
	*/
	
	function existiert_gruppe( $mandant_name, $gruppen_name )
	{
		/****************
		BESCHREIBUNG_____Liefert eine Gruppen-ID anhand des Gruppennamens
		RETURNS_____(string) Gruppen-ID
		****************/
		
		$ok = existiert_mandant( $mandant_name );
		
		
		// Feststellen der Gruppen-ID zum Gruppennamen
		$STATEMENT = "select gruppen_id from ca_gruppe where gruppen_name = '".$gruppen_name."' and mandant_id = ".$ok[ 0 ]." ;";
		
		$ergebnis = xdb( $STATEMENT );
		
		if ( $ergebnis[ 0 ] <> -1 )
		{
			if ( $ergebnis[ 0 ] > 0 )
			{
				$rc			= $ergebnis[ 1 ][ 0 ][ "gruppen_id" ];
				$meldung	= "Die Gruppe ".$gruppen_name." hat im Mandanten ".$mandant_name." die ID ".$rc.".";
			}
			else
			{
				$rc = -1;
				$meldung = "Die Gruppe ".$gruppen_name." existiert im Mandanten ".$mandant_name." nicht.";
				
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.existiert_gruppe: RC ".$rc.": ".$meldung );
		
		
		return array( $rc, $meldung );
	}
	
	function gruppe_anlegen( $mandant_name, $gruppen_name, $gruppen_email_adresse, $gruppen_fremd_id )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( strlen( $gruppen_name ) <> 0 )
			{
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_GRUPPE" );
				}
				
				if ( $exec[ 0 ] == 1 )
				{
					$wert_1 = "'".mysqli_real_escape_string( $connection, $gruppen_email_adresse )."'";
					$wert_2 = "'".mysqli_real_escape_string( $connection, $gruppen_fremd_id )."'";
					
					
					$gruppen_id = existiert_gruppe( $mandant_name, $gruppen_name );
					
					$regex          = preg_match( "/[\!\"\§\$\%\&\\\,\?\:\;\/\(\)\=\*\#\'\{\}\[\]\~]/", $gruppen_name );
					
					if ( $regex == 0 )
					{
						if ( $gruppen_id[ 0 ] < 0 )
						{
							// Erstellen der Gruppe
							$STATEMENT = "insert into ca_gruppe ( mandant_id, gruppe_angelegt_am, gruppe_letzte_aenderung, gruppen_name, gruppen_email_adresse, gruppen_fremd_id ) values ( ".$ok_1[ 0 ].", '".time()."', '".time()."', '".mysqli_real_escape_string( $connection, $gruppen_name )."', ".$wert_1.", ".$wert_2." );";
							
							$ergebnis = xdb( $STATEMENT );
							
							if ( $ergebnis[ 0 ] <> -1 )
							{
								$rc = $ergebnis[ 0 ];
								$meldung = "Die Gruppe ".$gruppen_name." wurde angelegt (ID ".$rc.").";
							}
							else
							{
								$rc = -4;
								$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
							}
							
							
						}
						else
						{
							$rc = -3;
							$meldung = "Die Gruppe ".$gruppen_name." existiert bereits (ID ".$gruppen_id[ 0 ].").";
						}
					}
					else
					{
						$rc = -2;
						$meldung = "Beim gewünschten Gruppennamen wurde ein nicht erlaubtes Sonderzeichen verwendet.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Gruppenname angegeben.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		mysqli_close( $connection );
		
		
		xlog( $level, "admin.erstelle_gruppe: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function gruppe_loeschen( $mandant_name, $gruppen_name, $force = false )
	{
		if ( ( $force !== true ) && ( $force !== false ) )
		{
			$force = false;
		}
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$gruppen_id = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $gruppen_id[ 0 ] > 0 )
			{
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_GRUPPE" );
				}
				
				if ( ( $exec[ 0 ] == 1 ) && ( ( $gruppen_name != "Administratoren" ) || ( $force === true ) ) )
				{
					
					$ergebnis = in_welchen_gruppen_ist_gruppe_mitglied( $mandant_name, $gruppen_name );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach ( $ergebnis[ 2 ] as $gruppe )
						{
							gruppe_aus_einer_gruppe_entfernen( $mandant_name, $gruppe, $gruppen_name, $force );
						}
					}
					
					$ergebnis = liefere_benutzer_die_in_gruppe_sind( $mandant_name, $gruppen_name );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach ( $ergebnis[ 2 ] as $benutzer_anmeldename )
						{
							benutzer_aus_gruppe_entfernen( $mandant_name, $benutzer_anmeldename, $gruppen_name, $force );
						}
					}
					
					$ergebnis = welche_systemrechte_besitzt_gruppe( $mandant_name, $gruppen_name );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach ( $ergebnis[ 3 ] as $systemrecht )
						{
							gruppe_systemrecht_entziehen( $mandant_name, $gruppen_name, $systemrecht, $force );
						}
					}
					
					
					$STATEMENT = "delete from ca_gruppe where gruppen_id = ".$gruppen_id[ 0 ]; //( mandant_id, gruppen_name".$feld_1.$feld_2." ) values ( ".$ok_1[ 0 ].", '".$gruppen_name."' ".$wert_1.$wert_2." );";
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] <> -1 )
					{
						$rc				= 0;
						$meldung = "Die Gruppe ".$gruppen_name." wurde im Mandanten ".$mandant_name." gelöscht.";
					}
					else
					{
						$rc = -4;
						$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = -3;
				$meldung = "Die Gruppe ".$gruppen_name." existiert nicht im Mandanten >".$mandant_name."<.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.gruppe_loeschen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function gruppe_aendern( $mandant_name, $gruppen_name, $parameter )
	{
		/*
			$parameter kann folgende Elementen haben:
			
			gruppen_fremd_id
			gruppen_email_adresse
			gruppen_name
			
		*/
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_GRUPPE" );
				
				if ( $exec[ 0 ] == 1 )
				{
					foreach( $parameter as $key=>$value )
					{
						$set = $set.$key." = '".mysqli_real_escape_string( $connection, $value )."', ";
						$liste = $liste.$key." => >".$value."< ";
					}
					
					$STATEMENT = "update ca_gruppe set ".$set." gruppe_letzte_aenderung = '".time()."' where gruppen_id = ".$ok_2[ 0 ]." and mandant_id = ".$ok_1[ 0 ];
					
					xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] <> -1 )
					{
						$rc = 0;
						$meldung = "Die Gruppe ".$gruppen_name." wurde im Mandanten ".$mandant_name." geändert.";// (".substr( $liste, 0, -1 ).").";
					}
					else
					{
						$rc = -1;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
					
					
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.gruppe_aendern: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function liefere_gruppeninformationen( $mandant_name, $gruppen_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$gruppen_id = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $gruppen_id[ 0 ] > 0 )
			{
				$STATEMENT = "select mandant_id, gruppen_name, gruppen_email_adresse, gruppen_fremd_id, gruppen_id, gruppe_angelegt_am, gruppe_letzte_aenderung from ca_gruppe where gruppen_id = ".$gruppen_id[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] <> -1 )
				{
					$gruppe_array = array( );
					
					$gruppe_array[ "mandant_id" ]					= (string)	$ergebnis[ 1 ][ 0 ][ "mandant_id" ];
					$gruppe_array[ "gruppen_name" ]					= (string)	$ergebnis[ 1 ][ 0 ][ "gruppen_name" ];
					$gruppe_array[ "gruppen_email_adresse" ]		= (string)	$ergebnis[ 1 ][ 0 ][ "gruppen_email_adresse" ];
					$gruppe_array[ "gruppen_fremd_id" ]				= (string)	$ergebnis[ 1 ][ 0 ][ "gruppen_fremd_id" ];
					$gruppe_array[ "gruppen_id" ]					= (string)	$ergebnis[ 1 ][ 0 ][ "gruppen_id" ];
					$gruppe_array[ "gruppe_angelegt_am" ]			= (string)	$ergebnis[ 1 ][ 0 ][ "gruppe_angelegt_am" ];
					$gruppe_array[ "gruppe_letzte_aenderung" ]		= (string)	$ergebnis[ 1 ][ 0 ][ "gruppe_letzte_aenderung" ];
					
					
					$rc = $gruppe_array[ "gruppen_id" ];
					$meldung = "Liefere Informationen zur Gruppe ".$gruppen_name.".";
				}
				else
				{
					$rc = -4;
					$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
			}
			else
			{
				$rc = -2;
				$meldung = "Die Gruppe ".$gruppen_name." existiert nicht im Mandanten ".$mandant_name.".";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.liefere_gruppeninformationen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $gruppe_array );
	}
	
	function liefere_alle_gruppen( $mandant_name, $liefere_systemgruppen = true )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		$gruppenliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( $liefere_systemgruppen == false )
			{
				$sysgruppen = liefere_wertemenge_elemente( $mandant_name, "systemgruppen" );
				
				$STMT_ERW = " and gruppen_name not in ( ";
				
				foreach ( $sysgruppen[ 2 ] as $systemgruppen )
				{
					$STMT_ERW = $STMT_ERW." '".$systemgruppen[ "alpha_01" ]."', ";
				}
				$STMT_ERW = substr( $STMT_ERW, 0, -2 )." )";
			}
			else
			{
				$STMT_ERW = "";
			}
			
			
			
			$STATEMENT = "select gruppen_name from ca_gruppe where mandant_id = ".$ok_1[ 0 ].$STMT_ERW;
			
			//xlog( 4, $STATEMENT );
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach( $ergebnis[ 1 ] as $gruppen )
				{
					$gruppenliste[ ] = (string)$gruppen[ "gruppen_name" ];
				}
			}
			else
			{
				$gruppenliste = array();
			}
			
			$rc = count( $gruppenliste );
			$meldung = "Liefere ".$rc." Gruppen des Mandants ".$mandant_name.".";
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.liefere_alle_gruppen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $gruppenliste );
	}
	
	
	
	
	
	
	
	
	
	/*
		Mandanten-Funktionen
	*/
	
	function existiert_mandant( $mandant_name )
	{
		if ( strlen( $mandant_name ) > 0 )
		{
			$STATEMENT = "select mandant_id from ca_mandant where lower( mandant_name ) = '".mb_strtolower( $mandant_name, "utf-8" )."'";
			
			$ergebnis = xdb( $STATEMENT );
			/*
			xlog( 4, json_encode( $ergebnis ));
			xlog( 4, json_encode( $ergebnis[1] ));
			xlog( 4, json_encode( $ergebnis[1][0] ));
			xlog( 4, json_encode( $ergebnis[1][0][ "mandant_id" ] ));
			*/
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				if ( $ergebnis[ 0 ] > 0 )
				{
					$rc = $ergebnis[ 1 ][ 0 ][ "mandant_id" ];
					$meldung = "Der Mandant >".$mandant_name."< existiert im System (ID ".$rc.").";
				}
				else
				{
					$rc = 0;
					$meldung = "Der Mandant >".$mandant_name."< existiert nicht im System.";
				}
			}
			else
			{
				$rc = -2;
				$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde kein Mandant angegeben.";
		}
		
		if ( $rc <= 0 )
		{
			$level = 3;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.existiert_mandant: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function mandant_anlegen( $mandant_name )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		
		if ( strlen( $mandant_name ) > 0 )
		{
			$existiert_mandant = existiert_mandant( $mandant_name );
			
			if ( $existiert_mandant[ 0 ] <= 0 )
			{
				// Der Mandant wurde nicht gefunden
				$STATEMENT = "insert into ca_mandant ( mandant_name, mandant_erstellt_am, mandant_lizenz ) values ( '".mysqli_real_escape_string( $connection, $mandant_name )."', '".time()."', '".mysqli_real_escape_string( $connection, $lizenz )."' ) ";
				
				$ergebnis = xdb( $STATEMENT );
			
				if ( $ergebnis[ 0 ] <> -1 )
				{
					if ( $ergebnis[ 0 ] > 0 )
					{
						$rc		= $ergebnis[ 0 ];
						
						if ( $benutzer_gruppen_anlegen !== true )
						{
							$benutzer_gruppen_anlegen = false;
						}
						
						if ( $dokumentarten_anlegen !== true )
						{
							$dokumentarten_anlegen = false;
						}
						
						
						
						/////////////////////////////////////////////////////////////////
						// zuerst muss noch die Grundkonfiguration angelegt werden
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_konfig" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// erstelle_konfig( $mandant_name, $parameter, $kategorie, $wert = "", $wertemenge = "", $beschreibung = "" )
								$ok = erstelle_konfig( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_04" ], $element[ "alpha_02" ], $element[ "alpha_03" ], $element[ "text_01" ] );
								set_time_limit( 30 );
							}
						}
						
						
						
						/////////////////////////////////////////////////////////////////
						// jetzt werden die Systemrechte erzeugt
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_systemrechte" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// erstelle_konfig( $mandant_name, $parameter, $kategorie, $wert = "", $wertemenge = "", $beschreibung = "" )
								$ok = systemrecht_anlegen( $mandant_name, $element[ "alpha_02" ], $element[ "num_01" ], $element[ "alpha_01" ] );
								set_time_limit( 30 );
							}
						}
						
						
						
						/////////////////////////////////////////////////////////////////
						// initale Wertemengen erzeugen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_wertemenge" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// Erst Wertemenge liefern lassen und im neuen Mandanten anlegen
								$wertemenge = liefere_wertemenge( "Standard", $element[ "alpha_01" ] );
								
								if ( $wertemenge[ 2 ][ "typ" ] == "static" )
								{
									$w_elemente = liefere_wertemenge_elemente( "Standard", $element[ "alpha_01" ] );
								}
								else
								{
									$w_elemente = array( 0, 1, array() );
								}
								$ok = wertemenge_anlegen( $mandant_name, $wertemenge[ 2 ][ "kuerzel" ], $wertemenge[ 2 ][ "typ" ], $wertemenge[ 2 ][ "konfig" ], $wertemenge[ 2 ][ "bezeichnung" ], $wertemenge[ 2 ][ "kategorie" ], $wertemenge[ 2 ][ "beschreibung" ], array( "bezeichnung_alpha_01"=>$wertemenge[ 2 ][ "bezeichnung_alpha_01" ], "bezeichnung_alpha_02"=>$wertemenge[ 2 ][ "bezeichnung_alpha_02" ], "bezeichnung_alpha_03"=>$wertemenge[ 2 ][ "bezeichnung_alpha_03" ], "bezeichnung_alpha_04"=>$wertemenge[ 2 ][ "bezeichnung_alpha_04" ], "bezeichnung_alpha_05"=>$wertemenge[ 2 ][ "bezeichnung_alpha_05" ], "bezeichnung_alpha_06"=>$wertemenge[ 2 ][ "bezeichnung_alpha_06" ], "bezeichnung_alpha_07"=>$wertemenge[ 2 ][ "bezeichnung_alpha_07" ], "bezeichnung_alpha_08"=>$wertemenge[ 2 ][ "bezeichnung_alpha_08" ], "bezeichnung_alpha_09"=>$wertemenge[ 2 ][ "bezeichnung_alpha_09" ], "bezeichnung_alpha_10"=>$wertemenge[ 2 ][ "bezeichnung_alpha_10" ], "bezeichnung_alpha_11"=>$wertemenge[ 2 ][ "bezeichnung_alpha_11" ], "bezeichnung_alpha_12"=>$wertemenge[ 2 ][ "bezeichnung_alpha_12" ], "bezeichnung_alpha_13"=>$wertemenge[ 2 ][ "bezeichnung_alpha_13" ], "bezeichnung_alpha_14"=>$wertemenge[ 2 ][ "bezeichnung_alpha_14" ], "bezeichnung_alpha_15"=>$wertemenge[ 2 ][ "bezeichnung_alpha_15" ], "bezeichnung_alpha_16"=>$wertemenge[ 2 ][ "bezeichnung_alpha_16" ], "bezeichnung_alpha_17"=>$wertemenge[ 2 ][ "bezeichnung_alpha_17" ], "bezeichnung_alpha_18"=>$wertemenge[ 2 ][ "bezeichnung_alpha_18" ], "bezeichnung_alpha_19"=>$wertemenge[ 2 ][ "bezeichnung_alpha_19" ], "bezeichnung_alpha_20"=>$wertemenge[ 2 ][ "bezeichnung_alpha_20" ], "bezeichnung_alpha_21"=>$wertemenge[ 2 ][ "bezeichnung_alpha_21" ], "bezeichnung_alpha_22"=>$wertemenge[ 2 ][ "bezeichnung_alpha_22" ], "bezeichnung_alpha_23"=>$wertemenge[ 2 ][ "bezeichnung_alpha_23" ], "bezeichnung_alpha_24"=>$wertemenge[ 2 ][ "bezeichnung_alpha_24" ], "bezeichnung_alpha_25"=>$wertemenge[ 2 ][ "bezeichnung_alpha_25" ], "bezeichnung_alpha_26"=>$wertemenge[ 2 ][ "bezeichnung_alpha_26" ], "bezeichnung_alpha_27"=>$wertemenge[ 2 ][ "bezeichnung_alpha_27" ], "bezeichnung_alpha_28"=>$wertemenge[ 2 ][ "bezeichnung_alpha_28" ], "bezeichnung_alpha_29"=>$wertemenge[ 2 ][ "bezeichnung_alpha_29" ], "bezeichnung_alpha_30"=>$wertemenge[ 2 ][ "bezeichnung_alpha_30" ], "bezeichnung_num_01"=>$wertemenge[ 2 ][ "bezeichnung_num_01" ], "bezeichnung_num_02"=>$wertemenge[ 2 ][ "bezeichnung_num_02" ], "bezeichnung_num_03"=>$wertemenge[ 2 ][ "bezeichnung_num_03" ], "bezeichnung_datum_01"=>$wertemenge[ 2 ][ "bezeichnung_datum_01" ], "bezeichnung_datum_02"=>$wertemenge[ 2 ][ "bezeichnung_datum_02" ], "bezeichnung_datum_03"=>$wertemenge[ 2 ][ "bezeichnung_datum_03" ], "bezeichnung_geld_01"=>$wertemenge[ 2 ][ "bezeichnung_geld_01" ], "bezeichnung_geld_02"=>$wertemenge[ 2 ][ "bezeichnung_geld_02" ], "bezeichnung_geld_03"=>$wertemenge[ 2 ][ "bezeichnung_geld_03" ], "bezeichnung_text_01"=>$wertemenge[ 2 ][ "bezeichnung_text_01" ] ), $w_elemente[ 2 ] );
								
								set_time_limit( 30 );
								
							}
						}
						
						
						
						/////////////////////////////////////////////////////////////////
						// Anlegen der Systembenutzer und -Gruppen
						
						$ok = benutzer_anlegen( $mandant_name, "ca_admin", "ca_admin", "Systembenutzer", "Administrator", "info@calbers.de", "m", "01.01.2011", false );
						$ok = benutzer_anlegen( $mandant_name, "ca_system", "ca_system", "Systembenutzer", "System", "info@calbers.de", "m", "01.01.2011", false );
						
						$ok = gruppe_anlegen( $mandant_name, "Administratoren", "", "" );
						
						$ok = gruppe_systemrecht_zuweisen( $mandant_name, "Administratoren", "ADMINISTRATOR" );
						
						$ok = benutzer_einer_gruppe_hinzufuegen( $mandant_name, "ca_admin", "Administratoren" );
						$ok = benutzer_einer_gruppe_hinzufuegen( $mandant_name, "ca_system", "Administratoren" );
						
						/*
						$ok = attribut_anlegen( $mandant_name, "[Benutzer-Anmeldename]", "alpha_01", "", "" );
						$ok = attribut_anlegen( $mandant_name, "[Zweck]", "alpha_02", "", "" );
						
						$ok = depot_anlegen( $mandant_name, "UN", "D", "", 0, false, "offen", "" );
						
						$ok = dokart_anlegen( $mandant_name, "[USERNOTE]", "Benutzerinformationen", "System-Dokumentart für Informationen von Benutzern", "d", "UN", array( array( "attrib_name"=>"[Benutzer-Anmeldename]", "pflichtfeld"=>false ), array( "attrib_name"=>"[Zweck]", "pflichtfeld"=>false ) ) );
						*/
						
						
						
						
						/////////////////////////////////////////////////////////////////
						// Anlegen der Benutzer
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_benutzer" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// benutzer_anlegen( $mandant_name, $benutzer_anmeldename, $passwort, $vorname = "", $nachname = "", $email="", $geschlecht = "", $geburtstag = "", $passwort_pruefen = true )
								$ok = benutzer_anlegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_01" ], $element[ "alpha_02" ], $element[ "alpha_03" ], $element[ "alpha_04" ], $element[ "alpha_05" ], $element[ "datum_01" ], false );
								set_time_limit( 30 );
							}
						}
						
						/////////////////////////////////////////////////////////////////
						// initale Gruppen anlegen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_gruppen" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// gruppe_anlegen( $mandant_name, $gruppen_name, $gruppen_email_adresse, $gruppen_fremd_id )
								$ok = gruppe_anlegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ], $element[ "alpha_03" ] );
								set_time_limit( 30 );
							}
						}
						
						/////////////////////////////////////////////////////////////////
						// initale Gruppen/Benutzerzuordnungen eintragen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_benutzer_gruppe" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// benutzer_einer_gruppe_hinzufuegen( $mandant_name, $benutzer_anmeldename, $gruppen_name )
								//xlog( 4, "Benutzername ".$element[ "alpha_01" ]." gruppenname ".$element[ "alpha_02" ] ) ;
								$ok = benutzer_einer_gruppe_hinzufuegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ] );
								set_time_limit( 30 );
							}
						}
						
						/////////////////////////////////////////////////////////////////
						// initale Gruppen/Gruppenzuordnungen eintragen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_gruppe_gruppen" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// gruppe_einer_gruppe_hinzufuegen( $mandant_name, $ober_gruppe, $unter_gruppe )
								$ok = gruppe_einer_gruppe_hinzufuegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ] );
								set_time_limit( 30 );
							}
						}
						
						
						
							
							
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						// initale Attribute anlegen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_attrib" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// attribut_anlegen( $mandant_name, $attrib_name, $attrib_db_spalte, $attrib_wertemenge, $attrib_beschreibung )
								$ok = attribut_anlegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ], $element[ "alpha_03" ], $element[ "alpha_04" ] );
								set_time_limit( 30 );
							}
						}
						
						
						// initale Depots anlegen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_depot" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// depot_anlegen( $mandant_name, 	$kuerzel, 				$typ, 					$ort, 					$schranke = 0, 		$scramble = false, 		$status="offen", $beschreibung = "" )
								
								$ok = depot_anlegen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ], $element[ "alpha_03" ], $element[ "num_01" ], $element[ "alpha_04" ], $element[ "alpha_05" ], $element[ "alpha_06" ] );
								set_time_limit( 30 );
							}
						}
						

						
						// initale Dokumentarten anlegen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_dokarten" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// dokart_anlegen( $mandant_name, $dokart_kuerzel, $dokart_name, $dokart_beschreibung, $dokart_typ, $arr_attribute, $flags )
								// dokart_anlegen( $mandant_name, $dokart_kuerzel, $dokart_name, $dokart_beschreibung, $dokart_typ, $depot, $arr_attribute, $flags )
								$attribs	= array();
								$attribute	= explode( "|", $element[ "alpha_05" ] );
								foreach ( $attribute as $attr )
								{
									$attribs[ ] = array( "attrib_name"=>$attr );
								}
								/*
								$flags		= explode( "|", $element[ "alpha_06" ] );
								foreach ( $flags as $flag )
								{
									$flag_dummy = explode( "=", $flag );
									$flags_fertig[ $flag_dummy[ 0 ] ] = $flag_dummy[ 1 ];
								}
								*/
								//xlog( 2, "======================>".$element[ "alpha_06" ] );
								$ok = dokart_anlegen( $mandant_name, $element[ "alpha_02" ], $element[ "alpha_01" ], $element[ "alpha_03" ], $element[ "alpha_04" ], $element[ "alpha_06" ], $attribs, "" );
								set_time_limit( 30 );
							}
						}
						
						
						
						
						
						
						
						/////////////////////////////////////////////////////////////////
						// initale Gruppen/Systemrechtzuordnungen eintragen
						$element_anzulegen = liefere_wertemenge_elemente( "Standard", "init_gruppe_systemrecht" );
						
						if ( $element_anzulegen[ 0 ] > 0 )
						{
							foreach( $element_anzulegen[ 2 ] as $element )
							{
								// gruppe_einer_gruppe_hinzufuegen( $mandant_name, $ober_gruppe, $unter_gruppe )
								$ok = gruppe_systemrecht_zuweisen( $mandant_name, $element[ "alpha_01" ], $element[ "alpha_02" ] );
								set_time_limit( 30 );
							}
						}
						
						
						
						
						
						/////////////////////////////////////////////////////////////////
						// Dokumentübergreifende Suche anlegen
						
						$d = liefere_depotinformationen( $mandant_name, "DB", false );
						
						if ( $d[ 0 ] < 0 )
						{
							// depot_anlegen( $mandant_name, 	$kuerzel, 				$typ, 					$ort, 					$schranke = 0, 		$scramble = false, 		$status="offen",	$beschreibung = "" )
							
							$ok = depot_anlegen( $mandant_name, "DB",					"D",					"",						50000,				false,					"offen",			"Datenbank-Depot" );
							set_time_limit( 30 );
						}
						
						//attribut_anlegen( $mandant_name, $attrib_name, $attrib_db_spalte, $attrib_wertemenge, $attrib_beschreibung )
						$ok = attribut_anlegen( $mandant_name, "Stichwort", "alpha_01", "", "Stichwort für dokumentartübergreifende Suche" );
						set_time_limit( 30 );
						
						
						
						// dokart_anlegen( $mandant_name, $dokart_kuerzel, $dokart_name, $dokart_beschreibung, $dokart_typ, $depot, $arr_attribute, $flags )
						$attribs = array( array( "attrib_name" => "Stichwort" ) );
						$ok = dokart_anlegen( $mandant_name, "SCHABLONE", "*****Übergreifende Suche", "Dokumentartübergreifende Suche", "A", "DB", $attribs, "" );
						set_time_limit( 30 );
						
						
						
						
						
						
						
						
						
						//$ok = benutzer_anlegen( $mandant_name, "ca_admin", "ca_admin", "System", "Verwaltung", "", "m", "01.01.".date( "Y" ), false );
						
						if ( $ok[ 0 ] >= 0 )
						{
							/* Benutzer Systemrecht zuweisen
							$ok_2 = erstelle_konfig( $mandant_name, "SYSTEMRECHT_01", "systemrechte", "ADMINISTRATOR", "Systemrechte sollten nicht geändert werden." );
							
							$ok_3 = gruppe_anlegen( $mandant_name, "Administratoren", "", "Administratoren" );
							
							$ok_4 = gruppe_systemrecht_zuweisen( $mandant_name, "Administratoren", "ADMINISTRATOR" );
							
							$ok_5 = benutzer_einer_gruppe_hinzufuegen( $mandant_name, "ca_admin", "Administratoren" );
							
							*/
							$meldung		= "Der Mandant >".$mandant_name."< wurde mit der ID >".$rc."< angelegt.";
						}
						else
						{
							// Rollback ...
							$STATEMENT = "delete from ca_mandant where mandant_id = ".$rc;
							
							$ergebnis = xdb( $STATEMENT );
							
							$rc = -4;
							$meldung = "Es ist ein Problem aufgetreten: '".$ok[ 1 ]."'";
						}
					}
					else
					{
						$rc = -3;
						$meldung = "Beim Anlegen des Mandanten ist ein Fehler aufgetreten: >".$ergebnis[ 1 ]."<";
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
			}
			else
			{
				// Der Mandant existiert bereits
				$rc = -2;
				$meldung = "Es ist ein Fehler aufgetreten: '".$existiert_mandant[ 1 ]."'";
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde kein Mandant angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		mysqli_close( $connection );
		
		xlog( $level, "admin.mandant_anlegen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function mandant_loeschen( $mandant_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			
			// Dokumente löschen
			$STATEMENT = "delete from ca_dok_history where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_index where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_index_history where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_notiz where element_typ = 'd' and element_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_posdaten where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_posdaten_history where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_rech_verlauf where mandant_id = ".$ok_1[ 0 ]." ";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			
			
			/*
			$STATEMENT = "delete from ca_posdaten_ablage where dok_id in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			*/
			
			// Bezüge löschen
			$STATEMENT = "delete from ca_bezug where dok_id_1 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			$STATEMENT = "delete from ca_bezug where dok_id_2 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." )";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			
			
			$STATEMENT = "delete from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." ";
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			
			
			
			// Benutzer/Gruppen löschen
			//$STATEMENT = "delete from ca_benutzer_einstellungen where benutzer_id in (select benutzer_id from ca_benutzer where mandant_id = ".$ok_1[ 0 ]." )";
			//$ergebnis = xdb( $STATEMENT );
			
			//$STATEMENT = "delete from ca_benutzer where mandant_id = ".$ok_1[ 0 ];
			//$ergebnis = xdb( $STATEMENT );
			
			$ergebnis = liefere_alle_benutzer( $mandant_name );
			
			if ( ( is_array( $ergebnis[ 2 ] ) == true ) && ( count( $ergebnis[ 2 ] ) > 0 ) )
			{
				foreach( $ergebnis[ 2 ] as $benutzer )
				{
					$erg = benutzer_loeschen( $mandant_name, $benutzer[ "benutzer_anmeldename" ], true );
					set_time_limit( 300 );
				}
			}
			
			
			
			
			$ergebnis = liefere_alle_gruppen( $mandant_name );
			if ( ( is_array( $ergebnis[ 2 ] ) == true ) && ( count( $ergebnis[ 2 ] ) > 0 ) )
			{
				foreach( $ergebnis[ 2 ] as $gruppe )
				{
					$erg = gruppe_loeschen( $mandant_name, $gruppe, true );
					set_time_limit( 300 );
				}
			}
			
			//$STATEMENT = "delete from ca_gruppe where mandant_id = ".$ok_1[ 0 ];
			//$ergebnis = xdb( $STATEMENT );
			
			
			// Rechte löschen
			//$STATEMENT = "delete from ca_gruppe_in_gruppe where mandant_id = ".$ok_1[ 0 ];
			//$ergebnis = xdb( $STATEMENT );
			
			//$STATEMENT = "delete from ca_benutzer_in_gruppe where mandant_id = ".$ok_1[ 0 ];
			//$ergebnis = xdb( $STATEMENT );
			
			//$STATEMENT = "delete from ca_gruppe_system_rechte where mandant_id = ".$ok_1[ 0 ];
			//$ergebnis = xdb( $STATEMENT );
			
			$ergebnis = liefere_alle_systemrechte( $mandant_name );
			if ( ( is_array( $ergebnis[ 2 ] ) == true ) && ( count( $ergebnis[ 2 ] ) > 0 ) )
			{
				foreach( $ergebnis[ 2 ] as $systemrecht )
				{
					$erg = systemrecht_loeschen( $mandant_name, $systemrecht );
					set_time_limit( 300 );
				}
			}
			
			
			
			// Wertemengen, Konfiguration, Mandant-Informationen löschen
			$ergebnis = liefere_alle_wertemengen( $mandant_name );
			if ( ( is_array( $ergebnis[ 2 ] ) == true ) && ( count( $ergebnis[ 2 ] ) > 0 ) )
			{
				foreach( $ergebnis[ 2 ] as $wertemenge )
				{
					$erg = wertemenge_loeschen( $mandant_name, $wertemenge[ "kuerzel" ] );
					set_time_limit( 300 );
				}
			}
			
			
			$STATEMENT = "delete from ca_wertemenge where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_wertemenge_elemente where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_mandant_informationen where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_konfig where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			$STATEMENT = "delete from ca_konfig_history where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			set_time_limit( 300 );
			
			
			$ergebnis = liefere_dok_akten_art_liste( $mandant_name, "", true );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach ( $ergebnis[ 2 ] as $dokart )
				{
					$alarm = dokart_loeschen( $mandant_name, $dokart[ "dokart_kuerzel" ] );
					set_time_limit( 300 );
				}
			}
			
			$ergebnis = liefere_attributliste( $mandant_name, true );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach ( $ergebnis[ 2 ] as $attribut )
				{
					$alarm = attribut_loeschen( $mandant_name, $attribut[ "attrib_name" ] );
					set_time_limit( 300 );
				}
			}
			
			$ergebnis = welche_depots_gibt_es( $mandant_name );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach ( $ergebnis[ 2 ] as $kuerzel )
				{
					$alarm = depot_loeschen( $mandant_name, $kuerzel );
					set_time_limit( 300 );
				}
			}
			
			$STATEMENT = "delete from ca_mandant where mandant_id = ".$ok_1[ 0 ];
			$ergebnis = xdb( $STATEMENT );
			
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				$rc = 0;
				$meldung = "Der Mandant >".$mandant_name."< wurde gelöscht.";
			}
			else
			{
				$rc = -4;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.mandant_loeschen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function mandant_aendern( $mandant_name_alt, $mandant_name_neu, $lizenz )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		//xlog( $level, "admin.mandant_aendern ----------------- START" );
		$ok_1 = liefere_mandant( $mandant_name_alt );
		
		$ok_2 = existiert_mandant( $mandant_name_neu );
		
		$gruppenliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( $ok_2[ 0 ] == 0 )
			{
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name_alt, $exekutor, "ADMINISTRATOR" );
				}
				
				if ( $exec[ 0 ] == 1 )
				{
					if ( strlen( $lizenz ) > 0 )
					{
						$STATEMENT_ERW = ", mandant_lizenz = '".mysqli_real_escape_string( $connection, $lizenz )."'";
						$erw = ", neue Lizenz: >".$lizenz."<.";
					}
					else
					{
						$STATEMENT_ERW = "";
						$erw = ".";
					}
					
					$STATEMENT = "update ca_mandant set mandant_name = '".mysqli_real_escape_string( $connection, $mandant_name_neu )."' ".$STATEMENT_ERW." where mandant_id = ".$ok_1[ 0 ]." ";
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] <> -1 )
					{
						$rc = $ok_1[ 0 ];
						$meldung = "Der Mandant >".$mandant_name_alt."< (ID ".$ok_1[ 0 ].") wurde geändert. Neuer Name: >".$mandant_name_neu."<".$erw;
					}
					else
					{
						$rc = -3;
						$meldung = "Es ist ein Problem aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				if ( $ok_2[ 0 ] > 0 )
				{
					if ( $ok_1[ 2 ][ "mandant_lizenz" ] == $lizenz )
					{
						$rc = -1;
						$meldung = "Der gewünschte Mandantenname >".$mandant_name_neu."< ist bereits belegt.";
					}
					else
					{
						$STATEMENT = "update ca_mandant set mandant_lizenz = '".mysqli_real_escape_string( $connection, $lizenz )."' where mandant_id = ".$ok_1[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = $ok_1[ 0 ];
							$meldung = "Die Lizenz des Mandanten ".$mandant_name_alt." wurde geändert, neue Lizenz: >".$lizenz."<.";
						}
						else
						{
							$rc = -4;
							$meldung = "Es ist ein Problem aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
						
					}
				}
				else
				{
					$rc = -2;
					$meldung = $ok_2[ 1 ];
				}
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		mysqli_close( $connection );
		
		xlog( $level, "admin.mandant_aendern: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function liefere_alle_mandanten( $wirklich_alle = false )
	{
		$mandantenliste = array();
		
		$STATEMENT = "select mandant_name from ca_mandant";
		
		$ergebnis = xdb( $STATEMENT );
		
		if ( $ergebnis[ 0 ] <> -1 )
		{
			foreach( $ergebnis[ 1 ] as $zeile )
			{
				if ( ( (string)$zeile[ "mandant_name" ] <> "Standard" ) or ( $wirklich_alle == true ) )
				{
					$mandantenliste[ ] = (string)$zeile[ "mandant_name" ];
				}
			}
		}
		else
		{
			$rc = -2;
			$meldung = "Es ist ein DB-Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
		}
		
		if ( count( $mandantenliste ) == 0 )
		{
			$mandantenliste[ ] = "Standard";
		}
		
		$rc = count( $mandantenliste );
		$meldung = "Liefere ".$rc." Mandanten.";
		
		xlog( 6, "admin.liefere_alle_mandanten: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $mandantenliste );
	}
	
	function liefere_mandant( $mandant_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
			$STATEMENT = "select mandant_id, mandant_name, mandant_erstellt_am, mandant_lizenz from ca_mandant where mandant_name = '".mysqli_real_escape_string( $connection, $mandant_name )."'";
			
			//xlog( 4, $STATEMENT );
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				if ( $ergebnis[ 0 ] > 0 )
				{
					$mandant			= $ergebnis[ 1 ][ 0 ];
					$ergebnis_arr		= array( "mandant_id"=>$mandant[ "mandant_id" ], "mandant_name"=>$mandant[ "mandant_name" ], "mandant_erstellt_am"=>$mandant[ "mandant_erstellt_am" ], "mandant_lizenz"=>$mandant[ "mandant_lizenz" ] );
					
					$STATEMENT			= "select count(*) calbers from ca_benutzer where mandant_id = ".$ok_1[ 0 ];
					$ergebnis_1			= xdb( $STATEMENT );
					$anzahl_user		= $ergebnis_1[ 1 ][ 0 ][ "calbers" ];
					
					$STATEMENT			= "select count(*) calbers from ca_gruppe where mandant_id = ".$ok_1[ 0 ];
					$ergebnis_2			= xdb( $STATEMENT );
					$anzahl_gruppen		= $ergebnis_2[ 1 ][ 0 ][ "calbers" ];
					
					
					$STATEMENT			= "select count(*) calbers from ca_dok_ablage where mandant_id = ".$ok_1[ 0 ]." ";
					$ergebnis_3			= xdb( $STATEMENT );
					$anzahl_dokumente	= $ergebnis_3[ 1 ][ 0 ][ "calbers" ];
					
					
					$ergebnis_arr[ "anzahl_benutzer" ]		= $anzahl_user;
					$ergebnis_arr[ "anzahl_gruppen" ]		= $anzahl_gruppen;
					$ergebnis_arr[ "anzahl_dokumente" ]		= $anzahl_dokumente;
					
					
					$rc = (int)$mandant[ "mandant_id" ];
					$meldung = "Liefere Informationen zu Mandant ".$mandant_name.".";
				}
				else
				{
					//darf eigentlich nicht vorkommen, da schon mit existiert_mandant abgefragt
				}
			}
			else
			{
				$rc = -3;
				$meldung = "Es ist ein Fehler aufgetreten: >".$ergebnis[ 1 ]."<";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		mysqli_close( $connection );
		
		xlog( $level, "admin.liefere_mandant: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $ergebnis_arr );
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/*
		Rechte
	*/
	
	function gruppe_systemrecht_zuweisen( $mandant_name, $gruppen_name, $systemrecht )
	{
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		if ( strlen( $systemrecht ) > 0 )
		{
			$ok_1 = existiert_mandant( $mandant_name );
			
			if ( $ok_1[ 0 ] > 0 )
			{
				$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
				
				if ( $ok_2[ 0 ] > 0 )
				{
					if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
					{
						$exec[ 0 ] = 1;
					}
					else
					{
						$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
					}
					
					if ( $exec[ 0 ] == 1 )
					{
						$besitzt_gruppe_systemrecht = besitzt_gruppe_systemrecht( $mandant_name, $gruppen_name, $systemrecht );
						
						$systemrecht = strtoupper( $systemrecht );
						
						if ( $besitzt_gruppe_systemrecht[ 0 ] == 0 )
						{
							$STATEMENT = "insert into ca_gruppe_systemrechte ( gruppen_id, systemrecht ) values ( ".$ok_2[ 0 ].", '".mysqli_real_escape_string( $connection, $systemrecht )."' )";
							
							$ergebnis = xdb( $STATEMENT );
				
							if ( $ergebnis[ 0 ] <> -1 )
							{
								$rc = 0;
								$meldung = "Der Gruppe >".$gruppen_name."< (ID ".$ok_2[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") das Systemrecht >".$systemrecht."< zugewiesen.";
							}
							else
							{
								$rc = -4;
								$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
							}
						}
						else
						{
							$rc = -5;
							$meldung = "Die Gruppe ".$gruppen_name." besitzt im Mandanten ".$mandant_name." bereits das Systemrecht ".$systemrecht." (oder ein höherwertiges Systemrecht).";
						}
					}
					else
					{
						$rc = -12;
						$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
					}
				}
				else
				{
					$rc			= $ok_2[ 0 ];
					$meldung	= $ok_2[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_1[ 0 ];
				$meldung	= $ok_1[ 1 ];
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde kein Systemrecht angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.gruppe_systemrecht_zuweisen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function gruppe_systemrecht_entziehen( $mandant_name, $gruppen_name, $systemrecht, $force = false )
	{
		if ( ( $force !== true ) && ( $force !== false ) )
		{
			$force = false;
		}
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		if ( strlen( $systemrecht ) > 0 )
		{
			$ok_1 = existiert_mandant( $mandant_name );
			
			if ( $ok_1[ 0 ] > 0 )
			{
				$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
				
				if ( $ok_2[ 0 ] > 0 )
				{
					if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
					{
						$exec[ 0 ] = 1;
					}
					else
					{
						$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
					}
					
					if ( $exec[ 0 ] == 1 )
					{
						if ( ( ! ( ( mb_strtoupper( $gruppen_name, "UTF-8" ) == "ADMINISTRATOREN" ) && ( mb_strtoupper( $systemrecht, "UTF-8" ) == "ADMINISTRATOR" ) ) ) || ( $force === true ) )
						{
							$systemrecht = strtoupper( $systemrecht );

							$STATEMENT = "delete from ca_gruppe_systemrechte where gruppen_id = ".$ok_2[ 0 ]." and systemrecht = '".$systemrecht."'";
							
							$ergebnis = xdb( $STATEMENT );
					
							if ( $ergebnis[ 0 ] <> -1 )
							{
								$rc = 0;
								$meldung = "Der Gruppe >".$gruppen_name."< (ID ".$ok_2[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") das Systemrecht >".$systemrecht."< entzogen.";
							}
							else
							{
								$rc = -4;
								$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
							}
						}
						else
						{
							$rc = -2;
							$meldung = "Der Gruppe Administratoren kann das Systemrecht ADMINISTRATOR nicht entzogen werden.";
						}
					}
					else
					{
						$rc = -12;
						$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
					}
				}
				else
				{
					$rc			= $ok_2[ 0 ];
					$meldung	= $ok_2[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_1[ 0 ];
				$meldung	= $ok_1[ 1 ];
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde kein Systemrecht angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.gruppe_systemrecht_entziehen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function besitzt_gruppe_systemrecht( $mandant_name, $gruppen_name, $systemrecht )
	{
		/*
			liefert array( $rc, $meldung )
			$rc = 1 wenn gruppe das Systemrecht besitzt
			$rc = 0 wenn das nicht der Fall ist
		
		*/
		
		$ergebnis = welche_systemrechte_besitzt_gruppe( $mandant_name, $gruppen_name );
		
		//xlog( 4, $ergebnis[ 0 ]);
		
		if ( $ergebnis[ 0 ]	== 0 )
		{
			// Die Gruppe besitzt keine Systemrechte
			$rc = 0;
			$meldung = $meldung = "Die Gruppe >".$gruppen_name."< besitzt im Mandant >".$mandant_name."< das Systemrecht >".$systemrecht."< NICHT.";
		}
		elseif ( $ergebnis[ 0 ] < 0 )
		{
			// Es ist ein Fehler aufgetreten
			$rc = $ergebnis[ 0 ];
			$meldung = $ergebnis[ 1 ];
		}
		else
		{
			// Die Gruppe besitzt Systemrechte, jetzt muß festgestellt werden, ob das gefragte Systemrecht dabei ist
			
			// erstmal legen wir fest, daß das Recht nicht zugewiesen ist, und prüfen dann das Gegenteil.
			$rc = 0;
			$meldung = "Die Gruppe >".$gruppen_name."< besitzt im Mandant >".$mandant_name."< das Systemrecht >".$systemrecht."< NICHT.";
			
			foreach( $ergebnis[ 2 ] as $sys_recht )
			{
				if ( mb_strtoupper( $sys_recht, "UTF-8" ) == mb_strtoupper( $systemrecht, "UTF-8" ) )
				{
					$rc = 1;
					$meldung = "Die Gruppe >".$gruppen_name."< besitzt im Mandant >".$mandant_name."< das Systemrecht >".$systemrecht."<.";
					break;
				}
			}
			
		}
		
		/*
		
		///////////////////
		
		Alte Implementierung:
		
		///////////////////
		if ( strlen( $systemrecht ) > 0 )
		{
			$ok_1 = existiert_mandant( $mandant_name );
			
			if ( $ok_1[ 0 ] > 0 )
			{
				$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
				
				if ( $ok_2[ 0 ] > 0 )
				{
					$systemrecht = strtoupper( $systemrecht );

					$STATEMENT = "select count(*) calbers from ca_gruppe_system_rechte where mandant_id = ".$ok_1[ 0 ]." and gruppen_id = ".$ok_2[ 0 ]." and systemrecht = '".$systemrecht."'";
					
					$ergebnis = xdb( $STATEMENT );
					
					
					if ( $ergebnis[ 1 ][ 0 ][ "calbers" ] > 0 )
					{
						$rc = 1;
						$meldung = "Die Gruppe >".$gruppen_name."< (ID ".$ok_2[ 0 ].") besitzt im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") das Systemrecht >".$systemrecht."<.";
					}
					else
					{
						$rc = 0;
						$meldung = "Die Gruppe >".$gruppen_name."< (ID ".$ok_2[ 0 ].") besitzt im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") das Systemrecht >".$systemrecht."< NICHT.";
					}
					
				}
				else
				{
					$rc			= $ok_2[ 0 ];
					$meldung	= $ok_2[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_1[ 0 ];
				$meldung	= $ok_1[ 1 ];
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde kein Systemrecht angegeben.";
		}
		*/
		
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.besitzt_gruppe_systemrecht: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function welche_systemrechte_besitzt_gruppe( $mandant_name, $gruppen_name )
	{
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$systemrecht = strtoupper( $systemrecht );
				
				$STATEMENT = "select systemrecht from ca_gruppe_systemrechte where gruppen_id = ".$ok_2[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				//xlog( 4, "anzahl treffer: ".$ergebnis[ 0 ] );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$erstes_ergebnis = array();
					
					foreach ( $ergebnis[ 1 ] as $zeile )
					{
						$finales_ergebnis_nachher[] = $zeile[ "systemrecht" ];
					}
					
					$nur_direkte_systemrechte = $finales_ergebnis_nachher;
					
					//xlog( 4, "anzahl sysrechte: ".count( $finales_ergebnis_nachher ) );
					
					$finales_ergebnis_vorher = array();
					
					//xlog( 4, "count vorher ".count( $finales_ergebnis_vorher )." nachher ".count( $finales_ergebnis_nachher ) );
					
					while ( count( $finales_ergebnis_vorher ) <> count( $finales_ergebnis_nachher ) )
					{
						
						$finales_ergebnis_vorher = $finales_ergebnis_nachher;
						
						foreach( $finales_ergebnis_vorher as $systemrecht )
						{
							$STATEMENT = "select systemrecht from ca_systemrecht where ober_systemrecht = '".$systemrecht."' and mandant_id = ".$ok_1[ 0 ];
							
							$ergebnis_2 = xdb( $STATEMENT );
							
							if ( $ergebnis_2[ 0 ] > 0 )
							{
								foreach ( $ergebnis_2[ 1 ] as $zeile )
								{
									$finales_ergebnis_nachher[] = $zeile[ "systemrecht" ];
								}
							}
						}
						
						$finales_ergebnis_nachher = array_unique( $finales_ergebnis_nachher );
					
					}
					
					$rc = count( $finales_ergebnis_nachher );
					$meldung = "Liefere ".$rc." Systemrechte für die Gruppe ".$gruppen_name." im Mandanten ".$mandant_name.".";
					
				}
				else
				{
					$finales_ergebnis_nachher = array();
					$nur_direkte_systemrechte = array();
					$rc = 0;
					$meldung = "Für die Gruppe ".$gruppen_name." sind im Mandanten ".$mandant_name." keine Systemrechte eingetragen.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.welche_systemrechte_besitzt_gruppe: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $finales_ergebnis_nachher, $nur_direkte_systemrechte );

	}
	
	function welche_systemrechte_besitzt_gruppe_nicht( $mandant_name, $gruppen_name )
	{
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$systemrecht = strtoupper( $systemrecht );
				
				$STATEMENT = "select distinct systemrecht from ca_systemrecht where mandant_id = ".$ok_1[ 0 ]." and systemrecht not in ( select systemrecht from ca_gruppe_systemrechte where gruppen_id = ".$ok_2[ 0 ]." ) order by systemrecht ";
				
				$ergebnis = xdb( $STATEMENT );
				
				//xlog( 4, "anzahl treffer: ".$ergebnis[ 0 ] );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					
					foreach ( $ergebnis[ 1 ] as $zeile )
					{
						$finales_ergebnis[] = $zeile[ "systemrecht" ];
					}
					
					
					$rc = count( $finales_ergebnis );
					$meldung = "Liefere ".$rc." Systemrechte, die die Gruppe ".$gruppen_name." im Mandanten ".$mandant_name." nicht besitzt.";
					
				}
				else
				{
					$rc = 0;
					$meldung = "Für die Gruppe ".$gruppen_name." sind im Mandanten ".$mandant_name." alle Systemrechte eingetragen.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.welche_systemrechte_besitzt_gruppe: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $finales_ergebnis );

	}
	
	function besitzt_benutzer_systemrecht( $mandant_name, $benutzer_anmeldename, $systemrecht )
	{
		$gruppen = in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename );
		//xlog( 4, "hallo");
		$rc = 0;
		$meldung = "Der Benutzer >".$benutzer_anmeldename."< aus dem Mandanten >".$mandant_name."< besitzt über die Mitgliedschaft in der Gruppe >".$gruppen_name."< das Systemrecht ".$systemrecht." NICHT.";
		
		if ( $gruppen[ 0 ] > 0 )
		{
			foreach( $gruppen[ 2 ] as $gruppen_name )
			{
				$ergebnis = besitzt_gruppe_systemrecht( $mandant_name, $gruppen_name, $systemrecht );
				if ( $ergebnis[ 0 ] == 1 )
				{
					$rc = 1;
					$meldung = "Der Benutzer >".$benutzer_anmeldename."< aus dem Mandanten >".$mandant_name."< besitzt über die Mitgliedschaft in der Gruppe >".$gruppen_name."< das Systemrecht ".$systemrecht.".";
					break;
				}
			}
		}
		
		if ( $rc <> 1 )
		{
			$rc = 0;
			$meldung = "Der Benutzer >".$benutzer_anmeldename."< aus dem Mandanten >".$mandant_name."< besitzt das Systemrecht ".$systemrecht." nicht.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.besitzt_benutzer_systemrecht: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
		
	}
	
	function welche_systemrechte_besitzt_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		//xlog( 4, "admin.welche_systemrechte_besitzt_benutzer ----------------- START" );
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			
			$gruppen						= in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename );
			
			$benutzer_final_systemrechte	= array();
			
			if ( $gruppen[ 0 ] > 0 )
			{
				foreach( $gruppen[ 2 ] as $gruppen_name )
				{
					$ergebnis = welche_systemrechte_besitzt_gruppe( $mandant_name, $gruppen_name, $systemrecht );
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach( $ergebnis[ 2 ] as $systemrecht )
						{
							$benutzer_final_systemrechte[ ] = $systemrecht;
						}
					}
				}
				$benutzer_final_systemrechte = array_unique( $benutzer_final_systemrechte );
				sort( $benutzer_final_systemrechte );
				$rc			= count( $benutzer_final_systemrechte );
				$meldung	= "Liefere ".$rc." Systemrechte für den Benutzer ".$benutzer_anmeldename." aus dem Mandanten ".$mandant_name.".";
			}
			else
			{
				$rc			= 0;
				$meldung	= "Der Benutzer ".$benutzer_anmeldename." aus dem Mandanten ".$mandant_name." besitzt keine Systemrechte.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.welche_systemrechte_besitzt_benutzer: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $benutzer_final_systemrechte );
	}
	
	function welche_systemrecht_gruppen_besitzt_gruppe( $mandant_name, $gruppen_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$systemrechte = welche_systemrechte_besitzt_gruppe( $mandant_name, $gruppen_name );
				
				if ( $systemrechte[ 0 ] > 0 )
				{
					
					$STATEMENT = "select distinct rechte_gruppe from ca_systemrecht where mandant_id = ".$ok_1[ 0 ]." and systemrecht in ( ";
					
					foreach	( $systemrechte[ 2 ] as $systemrecht )
					{
						$STATEMENT = $STATEMENT." '".$systemrecht."', ";
					}
					
					$STATEMENT = substr( $STATEMENT, 0, -2 )." )";
					
					//xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					$liste_str = "";
					$liste_arr = array();
					
					if ( count( $ergebnis[ 1 ] ) > 0 )
					{
						foreach( $ergebnis[ 1 ] as $zeile )
						{
							$liste_str = $liste_str.$zeile[ "rechte_gruppe" ].", ";
							$liste_arr[] = $zeile[ "rechte_gruppe" ];
						}
						
						$liste_str = substr( $liste_str, 0, -2 );
					}
					else
					{
						$liste_str = "-keine-";
					}
					
					$rc = count( $ergebnis[ 1 ] );
					$meldung = "Die Gruppe ".$gruppen_name." im Mandanten ".$mandant_name." besitzt folgende Rechtegruppen: ( ".$liste_str." ).";
					$ergebnis = $ergebnis[ 1 ];
				}
				else
				{
					$rc = 0;
					$meldung = "Die Gruppe ".$gruppen_name." im Mandanten ".$mandant_name." besitzt keine Rechtegruppen.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.welche_systemrecht_gruppen_besitzt_gruppe: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $liste_arr );
		
	}
	
	function welche_systemrecht_gruppen_besitzt_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		$gruppen = in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename );
		
		$liste_arr = array();
		
		foreach( $gruppen[ 2 ] as $gruppe )
		{
			$ergebnis = welche_systemrecht_gruppen_besitzt_gruppe( $mandant_name, $gruppe );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach( $ergebnis[ 2 ] as $ksdjf )
				{
					$liste_arr[] = $ksdjf;
				}
			}
		}
		
		$liste_arr = array_unique( $liste_arr );
		
		foreach( $liste_arr as $element )
		{
			$liste_str = $liste_str.$element.", ";
		}
		
		$liste_str = substr( $liste_str, 0, -2 );
		
		$rc = count( $liste_arr );
		$meldung = "Der Benutzer ".$benutzer_anmeldename." besitzt im Mandanten ".$mandant_name." folgende Rechtegruppen: ( ".$liste_str." ).";
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.welche_systemrecht_gruppen_besitzt_benutzer: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $liste_arr );
		
	}
	
	
	
	
	
	
	
	
	function welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, $typ = "", $sysdokuarten_auflisten = false )
	{
		
		if ( $sysdokuarten_auflisten !== true )
		{
			$sysdokuarten_auflisten = false;
		}
		
		$ergebnis = welche_systemrechte_besitzt_benutzer( $mandant_name, $benutzer_anmeldename );
		
		//$sysdokarten = liefere_wertemengen_elemente( $mandant_name, "systemdokarten" );
		
		
		if ( $ergebnis[ 0 ] > 0 )
		{
			
			//     IMPORT
			//     AENDERN
			//     LESEN
			//     LOESCHEN
			$typ = mb_strtoupper( $typ );
			if ( ( $typ == "D" ) || ( $typ == "A" ) || ( strlen( $typ ) == 0 ) )
			{
				
				$i = 0;
				foreach ( $ergebnis[ 2 ] as $systemrecht )
				{
					//xlog( 1, $systemrecht );
					//xlog( 1,  substr( $systemrecht, 2, 1 ) );
				
					$sysrecht = explode( "_", $systemrecht );
					if ( ( count( $sysrecht ) == 3 ) && ( ( $sysrecht[ 2 ] == "IMPORT" ) || ( $sysrecht[ 2 ] == "AENDERN" ) || ( $sysrecht[ 2 ] == "LESEN" ) || ( $sysrecht[ 2 ] == "LOESCHEN" ) ) )
					{
						if ( ! $sysdokuarten_auflisten )
						{
							$enth = ist_element_in_wertemenge( $mandant_name, "systemdokarten", $sysrecht[ 1 ] );
							if ( $enth[ 0 ] > 0 )
							{
								continue;
							}
						}
						
						
						switch( $sysrecht[ 2 ] )
						{
							case "IMPORT":
								if ( strlen ( $typ ) > 0 )
								{
									//xlog( 1, "Typ: ".$typ." sysrecht[ 0 ]: ".$sysrecht[ 0 ]." dokuart ".$sysrecht[ 1 ] );
									if ( $sysrecht[ 0 ] == $typ )
									{
										$ergebnis_IMP[] = $sysrecht[ 1 ];
										$erg_IMP_liste	= $erg_IMP_liste.$sysrecht[ 1 ]."|";
									}
								}
								else
								{
									$ergebnis_IMP[] = $sysrecht[ 1 ];
									$erg_IMP_liste	= $erg_IMP_liste.$sysrecht[ 1 ]."|";
								}
								//xlog( 1, "systemrecht".$systemrecht );
								//xlog( 1, "typ".$typ );
								//xlog( 1, "sysrecht[0]".$sysrecht[0] );
								$i++;
								break;
							case "AENDERN":
								if ( strlen ( $typ ) > 0 )
								{
									if ( $sysrecht[ 0 ] == $typ )
									{
										$ergebnis_AEN[] = $sysrecht[ 1 ];
										$erg_AEN_liste	= $erg_AEN_liste.$sysrecht[ 1 ]."|";
									}
								}
								else
								{
									$ergebnis_AEN[] = $sysrecht[ 1 ];
									$erg_AEN_liste	= $erg_AEN_liste.$sysrecht[ 1 ]."|";
								}
								$i++;
								break;
							case "LESEN":
								if ( strlen ( $typ ) > 0 )
								{
									if ( $sysrecht[ 0 ] == $typ )
									{
										$ergebnis_LES[] = $sysrecht[ 1 ];
										$erg_LES_liste	= $erg_LES_liste.$sysrecht[ 1 ]."|";
									}
								}
								else
								{
									$ergebnis_LES[] = $sysrecht[ 1 ];
									$erg_LES_liste	= $erg_LES_liste.$sysrecht[ 1 ]."|";
								}
								$i++;
								break;
							case "LOESCHEN":
								if ( strlen ( $typ ) > 0 )
								{
									if ( $sysrecht[ 0 ] == $typ )
									{
										$ergebnis_LOE[] = $sysrecht[ 1 ];
										$erg_LOE_liste	= $erg_LOE_liste.$sysrecht[ 1 ]."|";
									}
								}
								else
								{
									$ergebnis_LOE[] = $sysrecht[ 1 ];
									$erg_LOE_liste	= $erg_LOE_liste.$sysrecht[ 1 ]."|";
								}
								$i++;
								break;
						}
					}
				}
				
				if ( strlen( $erg_IMP_liste ) > 0 )
				{
					$erg_IMP_liste = substr( $erg_IMP_liste, 0, strlen( $erg_IMP_liste ) -1 );
				}
				
				if ( strlen( $erg_AEN_liste ) > 0 )
				{
					$erg_AEN_liste = substr( $erg_AEN_liste, 0, strlen( $erg_AEN_liste ) -1 );
				}
				
				if ( strlen( $erg_LES_liste ) > 0 )
				{
					$erg_LES_liste = substr( $erg_LES_liste, 0, strlen( $erg_LES_liste ) -1 );
				}
				
				if ( strlen( $erg_LOE_liste ) > 0 )
				{
					$erg_LOE_liste = substr( $erg_LOE_liste, 0, strlen( $erg_LOE_liste ) -1 );
				}
				
				switch ( $typ )
				{
					case "D":
						$text_dummy = "Dokumentart-Systemrechte";
						break;
					case "A":
						$text_dummy = "Aktenart-Systemrechte";
						break;
					default:
						$text_dummy = "Dok.- und Aktenart-Systemrechte";
						break;
				}
				
				$rc			= $i;
				$meldung	= "Liefere ".$rc." ".$text_dummy." für Benutzer ".$benutzer_anmeldename.".";
			}
			else
			{
				$rc			= -1;
				$meldung	= "Der Typ ".$typ." ist nicht erlaubt.";
			}
		}
		else
		{
			$rc			= $ergebnis[ 0 ];
			$meldung	= $ergebnis[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.welche_dok_akt_rechte_hat_benutzer: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $ergebnis_IMP, $ergebnis_AEN, $ergebnis_LES, $ergebnis_LOE, $erg_IMP_liste, $erg_AEN_liste, $erg_LES_liste, $erg_LOE_liste );
	}
	
	function welche_dokumentartrechte_hat_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "D" );
		
		return $ergebnis;
	}
	
	function welche_dokumentarten_darf_benutzer_importieren( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "D" );
		
		if ( count( $ergebnis[ 2 ] ) == 0 )
		{
			$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		}
		
		//xlog( 4, "admin.welche_dokumentarten_darf_benutzer_importieren: RC ".count( $ergebnis[ 2 ] ).": ".$ergebnis[ 1 ] );
		
		return array( count( $ergebnis[ 2 ] ), $ergebnis[ 2 ] );
	}
	
	function welche_dokumentarten_darf_benutzer_lesen( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "D" );
		
		return array( count( $ergebnis[ 4 ] ), $ergebnis[ 4 ] );
	}
	
	function welche_dokumentarten_darf_benutzer_aendern( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "D" );
		
		return array( count( $ergebnis[ 3 ] ), $ergebnis[ 3 ] );
	}
	
	function welche_dokumentarten_darf_benutzer_loeschen( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "D" );
		
		return array( count( $ergebnis[ 5 ] ), $ergebnis[ 5 ] );
	}
	
	function welche_aktenartrechte_hat_benutzer( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		
		return $ergebnis;
	}
	
	function welche_aktenarten_darf_benutzer_importieren( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		
		return array( count( $ergebnis[ 2 ] ), $ergebnis[ 2 ] );
	}
	
	function welche_aktenarten_darf_benutzer_lesen( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		
		return array( count( $ergebnis[ 4 ] ), $ergebnis[ 4 ] );
	}
	
	function welche_aktenarten_darf_benutzer_aendern( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		
		return array( count( $ergebnis[ 3 ] ), $ergebnis[ 3 ] );
	}
	
	function welche_aktenarten_darf_benutzer_loeschen( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename, "A" );
		
		return array( count( $ergebnis[ 5 ] ), $ergebnis[ 5 ] );
	}
	
	function welche_dokaktenarten_darf_benutzer_lesen( $mandant_name, $benutzer_anmeldename )
	{
		$ergebnis = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename );
		
		return array( count( $ergebnis[ 4 ] ), $ergebnis[ 4 ] );
	}
	
	
	
	
	
	
	
	
	function welche_rechte_hat_benutzer_auf_dokuaktenart( $mandant_name, $benutzer_anmeldename, $dokart_kuerzel )
	{
		$e = welche_dok_akt_rechte_hat_benutzer( $mandant_name, $benutzer_anmeldename );
		
		//xlog( 2, json_encode( $e ) );
		
		$dokart = liefere_dokartinformationen( $mandant_name, $dokart_kuerzel );
		
		$dokart_rechte = array();
		
		if ( ( $e[ 0 ] > 0 ) and ( $dokart[ 0 ] > 0 ) )
		{
			
			foreach( $e[ 2 ] as $recht )
			{
				if ( $recht == $dokart_kuerzel )
				{
					$dokart_rechte[ "IMPORT" ] = "ja";
					break;
				}
			}
			if ( $dokart_rechte[ "IMPORT" ] != "ja" )
			{
				$dokart_rechte[ "IMPORT" ] = "nein";
			}
			
			
			foreach( $e[ 3 ] as $recht )
			{
				if ( $recht == $dokart_kuerzel )
				{
					$dokart_rechte[ "AENDERN" ] = "ja";
					break;
				}
			}
			if ( $dokart_rechte[ "AENDERN" ] != "ja" )
			{
				$dokart_rechte[ "AENDERN" ] = "nein";
			}
			
			
			foreach( $e[ 4 ] as $recht )
			{
				if ( $recht == $dokart_kuerzel )
				{
					$dokart_rechte[ "LESEN" ] = "ja";
					break;
				}
			}
			if ( $dokart_rechte[ "LESEN" ] != "ja" )
			{
				$dokart_rechte[ "LESEN" ] = "nein";
			}
			
			
			foreach( $e[ 5 ] as $recht )
			{
				if ( $recht == $dokart_kuerzel )
				{
					$dokart_rechte[ "LOESCHEN" ] = "ja";
					break;
				}
			}
			if ( $dokart_rechte[ "LOESCHEN" ] != "ja" )
			{
				$dokart_rechte[ "LOESCHEN" ] = "nein";
			}
			
			$rc = 1;
			$meldung = "Liefere Rechte für Benutzer ".$benutzer_anmeldename." auf Dokumentart ".$dokart_kuerzel.".";
			
		}
		else
		{
			$rc = -1;
			$meldung = "Es ist ein Fehler aufgetreten: ".$e[ 1 ]." | ".$dokart[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.welche_rechte_hat_benutzer_auf_dokuaktenart: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $dokart_rechte );
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	function systemrecht_anlegen( $mandant_name, $systemrecht, $rechtegruppe, $ober_systemrecht = "root" )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( strlen( $systemrecht ) > 0 )
			{
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
				}
				
				if ( $exec[ 0 ] == 1 )
				{
					$systemrecht = mb_strtoupper( $systemrecht, "UTF-8" );
					
					if ( strlen( $ober_systemrecht ) == 0 )
					{
						$ober_systemrecht = "root";
					}
					
					if ( ( strlen( $ober_systemrecht ) > 0 ) and ( $ober_systemrecht <> "root" ) )
					{
						$ober_systemrecht = mb_strtoupper( $ober_systemrecht, "UTF-8" );
					}
					
					$STATEMENT = "insert into ca_systemrecht ( mandant_id, ober_systemrecht, systemrecht, rechte_gruppe ) values ( ".$ok_1[ 0 ].", '".mysqli_real_escape_string( $connection, $ober_systemrecht )."', '".mysqli_real_escape_string( $connection, $systemrecht )."', ".mysqli_real_escape_string( $connection, $rechtegruppe )." )";
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc = 0;
						$meldung = "Das Systemrecht ".$systemrecht." wurde unterhalb des Systemrechts ".$ober_systemrecht." im Mandanten ".$mandant_name." angelegt.";
					}
					else
					{
						$rc = -2;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Systemrecht angegeben.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 6;
		}
		mysqli_close( $connection );
		
		xlog( $level, "admin.systemrecht_anlegen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function systemrecht_loeschen( $mandant_name, $systemrecht )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( strlen( $systemrecht ) > 0 )
			{
				if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
				{
					$exec[ 0 ] = 1;
				}
				else
				{
					$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
				}
				
				if ( $exec[ 0 ] == 1 )
				{
					$systemrecht = mb_strtoupper( $systemrecht, "UTF-8" );
					
					$STATEMENT = "delete from ca_systemrecht where mandant_id = ".$ok_1[ 0 ]." and systemrecht = '".$systemrecht."'";
					
					$ergebnis = xdb( $STATEMENT );
					
					$STATEMENT = "delete from ca_gruppe_systemrechte where systemrecht = '".$systemrecht."' and gruppen_id in ( select gruppen_id from ca_gruppe where mandant_id = ".$ok_1[ 0 ]." ) ";
					
					$ergebnis = xdb( $STATEMENT );
					
					
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc = 0;
						$meldung = "Das Systemrecht ".$systemrecht." wurde im Mandanten ".$mandant_name." gelöscht.";
					}
					else
					{
						$rc = -2;
						$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
				}
				else
				{
					$rc = -12;
					$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Systemrecht angegeben.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.systemrecht_loeschen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $masken );
	}
	
	function liefere_alle_systemrechte( $mandant_name )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$systemrechte = array();
			
			$STATEMENT = "select systemrecht from ca_systemrecht where mandant_id = ".$ok_1[ 0 ];
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach ( $ergebnis[ 1 ] as $zeile )
				{
					$systemrechte[ ] = $zeile[ "systemrecht" ];
				}
				
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Liefere ".$rc." Systemrechte im Mandanten ".$mandant_name.".";
			}
			else
			{
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Es wurden keine Systemrechte gefunden oder ein Fehler ist aufgetreten.";
			}
			
			
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		xlog( $level, "admin.liefere_alle_systemrechte: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $systemrechte );
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/*
		Gruppenzugehörigkeiten
	*/
	
	function benutzer_einer_gruppe_hinzufuegen( $mandant_name, $benutzer_anmeldename, $gruppen_name )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$ok_3 = existiert_gruppe( $mandant_name, $gruppen_name );
				
				if ( $ok_3[ 0 ] > 0 )
				{
					if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
					{
						$exec[ 0 ] = 1;
					}
					else
					{
						$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER_GRUPPE" );
					}
					
					if ( $exec[ 0 ] == 1 )
					{
						$STATEMENT = "insert into ca_benutzer_in_gruppe ( mandant_id, benutzer_id, gruppen_id ) values ( ".$ok_1[ 0 ].", ".$ok_2[ 0 ].", ".$ok_3[ 0 ]." )";
						
						$ergebnis = xdb( $STATEMENT );
				
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Der Benutzer >".$benutzer_anmeldename."< (ID ".$ok_2[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") der Gruppe >".$gruppen_name."< (ID ".$ok_3[ 0 ].") zugewiesen.";
						}
						else
						{
							$rc = -4;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -12;
						$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
					}
				}
				else
				{
					$rc			= $ok_3[ 0 ];
					$meldung	= $ok_3[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_einer_gruppe_zuweisen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function benutzer_aus_gruppe_entfernen( $mandant_name, $benutzer_anmeldename, $gruppen_name, $force = false )
	{
		
		if ( ( $force !== true ) && ( $force !== false ) )
		{
			$force = false;
		}
		
		
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			
			if ( ( ! ( ( mb_strtoupper( $benutzer_anmeldename, "UTF-8" ) == "CA_ADMIN" ) and ( mb_strtoupper( $gruppen_name, "UTF-8" ) == "ADMINISTRATOREN" ) ) ) || ( $force === true ) )
			{
				$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
				
				if ( $ok_2[ 0 ] > 0 )
				{
					$ok_3 = existiert_gruppe( $mandant_name, $gruppen_name );
					
					if ( $ok_3[ 0 ] > 0 )
					{
						if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
						{
							$exec[ 0 ] = 1;
						}
						else
						{
							$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER_GRUPPE" );
						}
						
						if ( $exec[ 0 ] == 1 )
						{
							$STATEMENT = "delete from ca_benutzer_in_gruppe where mandant_id = ".$ok_1[ 0 ]." and benutzer_id = ".$ok_2[ 0 ]." and gruppen_id = ".$ok_3[ 0 ];
							
							$ergebnis = xdb( $STATEMENT );
					
							if ( $ergebnis[ 0 ] <> -1 )
							{
								$rc = 0;
								$meldung = "Der Benutzer >".$benutzer_anmeldename."< (ID ".$ok_2[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") aus der Gruppe >".$gruppen_name."< (ID ".$ok_3[ 0 ].") entfernt.";
							}
							else
							{
								$rc = -4;
								$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
							}
						}
						else
						{
							$rc = -12;
							$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
						}
					}
					else
					{
						$rc			= $ok_3[ 0 ];
						$meldung	= $ok_3[ 1 ];
					}
				}
				else
				{
					$rc			= $ok_2[ 0 ];
					$meldung	= $ok_2[ 1 ];
				}
			}
			else
			{
				$rc = -7;
				$meldung = "Der Administrationsbenutzer ca_admin kann nicht aus der Administratorgruppe entfernt werden.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.benutzer_aus_gruppe_entfernen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function gruppe_einer_gruppe_hinzufuegen( $mandant_name, $ober_gruppe, $unter_gruppe )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $ober_gruppe );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$ok_3 = existiert_gruppe( $mandant_name, $unter_gruppe );
				
				if ( $ok_3[ 0 ] > 0 )
				{
					if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
					{
						$exec[ 0 ] = 1;
					}
					else
					{
						$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER_GRUPPE" );
					}
					
					if ( $exec[ 0 ] == 1 )
					{
						$STATEMENT = "insert into ca_gruppe_in_gruppe ( ober_gruppen_id, unter_gruppen_id ) values ( ".$ok_2[ 0 ].", ".$ok_3[ 0 ]." )";
						
						$ergebnis = xdb( $STATEMENT );
				
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Die Gruppe >".$unter_gruppe."< (ID ".$ok_3[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") der Gruppe >".$ober_gruppe."< (ID ".$ok_2[ 0 ].") hinzugefügt.";
						}
						else
						{
							$rc = -4;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -12;
						$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
					}
				}
				else
				{
					$rc			= $ok_3[ 0 ];
					$meldung	= $ok_3[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.gruppe_einer_gruppe_hinzufuegen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function gruppe_aus_einer_gruppe_entfernen( $mandant_name, $ober_gruppe, $unter_gruppe, $force = false )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $ober_gruppe );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$ok_3 = existiert_gruppe( $mandant_name, $unter_gruppe );
				
				if ( $ok_3[ 0 ] > 0 )
				{
					if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
					{
						$exec[ 0 ] = 1;
					}
					else
					{
						$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMIN_BENUTZER_GRUPPE" );
					}
					
					if ( $exec[ 0 ] == 1 )
					{
						$STATEMENT = "delete from ca_gruppe_in_gruppe where ( ober_gruppen_id = ".$ok_2[ 0 ]." and unter_gruppen_id = ".$ok_3[ 0 ]." )";
						
						$ergebnis = xdb( $STATEMENT );
				
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Die Gruppe >".$unter_gruppe."< (ID ".$ok_3[ 0 ].") wurde im Mandant >".$mandant_name."< (ID ".$ok_1[ 0 ].") aus der Gruppe >".$ober_gruppe."< (ID ".$ok_2[ 0 ].") entfernt.";
						}
						else
						{
							$rc = -4;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -12;
						$meldung = "Der Benutzer >".$exekutor."< verfügt nicht über ausreichende Berechtigungen.";
					}
				}
				else
				{
					$rc			= $ok_3[ 0 ];
					$meldung	= $ok_3[ 1 ];
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.gruppe_aus_einer_gruppe_entfernen: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function in_welchen_gruppen_ist_gruppe_mitglied( $mandant_name, $gruppen_name )
	{
		$gruppenliste = array();
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$STATEMENT = "select g.gruppen_name g_name from ca_gruppe g, ca_gruppe_in_gruppe m where m.unter_gruppen_id = ".$ok_2[ 0 ]." and m.ober_gruppen_id = g.gruppen_id";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					foreach ( $ergebnis[ 1 ] as $zeile )
					{
						$gruppenliste[ ] = (string)$zeile[ "g_name" ];
					}
				}
				else
				{
					$rc = -4;
					$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
				
				$rc = count( $gruppenliste );
				$meldung = "Die Gruppe ".$gruppen_name." ist im Mandant >".$mandant_name."< in ".$rc." Gruppen enthalten.";
				
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.in_welchen_gruppen_ist_gruppe_mitglied: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $gruppenliste );
	
	}
	
	function liefere_benutzer_die_in_gruppe_sind( $mandant_name, $gruppen_name )
	{
		$benutzerliste = array();
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_gruppe( $mandant_name, $gruppen_name );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$STATEMENT = "select b.benutzer_id, b.benutzer_anmeldename b_aname from ca_benutzer b, ca_benutzer_in_gruppe g where g.benutzer_id = b.benutzer_id and g.gruppen_id = ".$ok_2[ 0 ];
				//xlog( 5, $STATEMENT );
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					foreach( $ergebnis[ 1 ] as $zeile )
					{
						$benutzerliste[ ] = (string)$zeile[ "b_aname" ];
					}
				}
				
				$rc = count( $benutzerliste );
				$meldung = "Liefere ".$rc." Gruppenmitglieder der Gruppe ".$gruppen_name." (Mandant >".$mandant_name."<).";
				
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_benutzer_die_in_gruppe_sind: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $benutzerliste );
	}
	
	function in_welchen_gruppen_ist_benutzer_mitglied( $mandant_name, $benutzer_anmeldename )
	{
		// return array( $rc, $meldung, $gruppenliste, $direkte_gruppenliste, $indirekte_gruppenliste_gefiltert );
		
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$STATEMENT = "select big.gruppen_id g_id, g.gruppen_name g_name from ca_benutzer_in_gruppe big, ca_gruppe g where big.benutzer_id = ".$ok_2[ 0 ]." and big.gruppen_id = g.gruppen_id;";
				
				//xlog( 4, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				$direkte_gruppenliste		= array();
				
				$indirekte_gruppenliste		= array();
				
				if ( $ergebnis[ 0 ] <> -1 )
				{
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach ( $ergebnis[ 1 ] as $zeile )
						{
							$direkte_gruppenliste[ ] = (string)$zeile[ "g_name" ];
							
							$ergebnis_2 = in_welchen_gruppen_ist_gruppe_mitglied( $mandant_name, (string)$zeile[ "g_name" ] );
							
							$neue_indirekte_gruppenliste = $ergebnis_2[ 2 ];
							
							while ( count( $neue_indirekte_gruppenliste ) > count( $indirekte_gruppenliste ) )
							{
								$indirekte_gruppenliste = $neue_indirekte_gruppenliste;
								
								foreach( $indirekte_gruppenliste as $gruppe )
								{
									$ergebnis_3 = in_welchen_gruppen_ist_gruppe_mitglied( $mandant_name, $gruppe );
									
									$neue_indirekte_gruppenliste = array_unique( array_merge( $ergebnis_3[ 2 ], $neue_indirekte_gruppenliste ) );
								}
							}
						}
					}
					else
					{
						$rc = 0;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." ist im Mandanten ".$mandant_name." in keiner Gruppe Mitglied.";
					}
				}
				else
				{
					$rc = -4;
					$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
				
				$indirekte_gruppenliste_gefiltert = array();
				
				foreach( $indirekte_gruppenliste as $igruppe )
				{
					foreach( $direkte_gruppenliste as $dgruppe )
					{
						if ( $dgruppe == $igruppe )
						{
							$flag = true;
							break;
						}
						else
						{
							$flag = false;
						}
					}
					if ( ! $flag )
					{
						$indirekte_gruppenliste_gefiltert[] = $igruppe;
					}
					
				}
				
				$indirekte_gruppenliste_gefiltert = array_unique( $indirekte_gruppenliste_gefiltert );
				
				$gruppenliste = array_merge( $direkte_gruppenliste, $indirekte_gruppenliste_gefiltert );
				
				$rc = bcadd( count( $direkte_gruppenliste ), count( $indirekte_gruppenliste_gefiltert ), 0 );
				$meldung = "Liefere ".$rc." Gruppen, in denen der Benutzer >".$benutzer_anmeldename."< des Mandants >".$mandant_name."< Mitglied ist (davon ".count( $direkte_gruppenliste )." direkte Gruppenmitgliedschaften und ".count( $indirekte_gruppenliste_gefiltert )." indirekte Gruppenmitgliedschaften).";
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.in_welchen_gruppen_ist_benutzer_mitglied: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $gruppenliste, $direkte_gruppenliste, $indirekte_gruppenliste_gefiltert );
	}
	
	function in_welchen_gruppen_ist_benutzer_nicht_mitglied( $mandant_name, $benutzer_anmeldename )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$gruppenliste = array();
				$STATEMENT = "select gruppen_name from ca_gruppe where mandant_id = ".$ok_1[ 0 ]." and gruppen_id not in ( select gruppen_id from ca_benutzer_in_gruppe where benutzer_id = ".$ok_2[ 0 ]." )";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] <> -1 )
				{
					if ( $ergebnis[ 0 ] > 0 )
					{
						
						
						foreach( $ergebnis[ 1 ] as $zeile )
						{
							$gruppenliste[] = $zeile[ "gruppen_name" ];
						}
						$rc = count( $gruppenliste );
						$meldung = "Der Benutzer ".$benutzer_anmeldename." ist im Mandanten ".$mandant_name." in ".$rc." Gruppen Mitglied.";
					}
					else
					{
						$rc = 0;
						$meldung = "Der Benutzer ".$benutzer_anmeldename." ist im Mandanten ".$mandant_name." in jeder Gruppe Mitglied.";
					}
				}
				else
				{
					$rc = -4;
					$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.in_welchen_gruppen_ist_benutzer_nicht_mitglied: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $gruppenliste );
	}
	
	
	
	
	
	
	
	
	
	/*
		benutzerspezifische Einstellungen
	*/
	
	function liefere_benutzerspezifische_einstellung( $mandant_name, $benutzer_anmeldename, $einstellung )
	{
		// liefert nur den Wert
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$STATEMENT = "select wert from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".$einstellung."'";
					
					
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$rc = $ergebnis[ 1 ][ 0 ][ "wert" ];
					}
					else
					{
						$rc			= "";
					}
				}
				else
				{
					$rc			= "";
				}
			}
			else
			{
				$rc			= "";
			}
		}
		else
		{
			$rc			= "";
		}
		
		
		xlog( 6, "admin.liefere_benutzerspezifische_einstellung: Liefere Wert ".$rc." für die Einstellung ".$einstellung."." );
		
		return $rc;
	}
	
	function liefere_benutzerspezifische_einstellung_2( $mandant_name, $benutzer_anmeldename, $einstellung )
	{
		// liefert ein Array
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$STATEMENT = "select wert from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".$einstellung."'";
					
					//xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$rc			= 0;
						$wert		= $ergebnis[ 1 ][ 0 ][ "wert" ];
						$meldung	= "Die Einstellung >".$einstellung."< ist für den Benutzer >".$benutzer_anmeldename."< im Mandanten >".$mandant_name."< auf folgenden Wert gesetzt: >".$wert."<.";
						
					}
					else
					{
						$rc			= -4;
						$meldung	= "Die Einstellung >".$einstellung."< ist für den Benutzer >".$benutzer_anmeldename."< im Mandanten >".$mandant_name."< nicht gesetzt.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Einstellung angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		
		xlog( 6, "admin.liefere_benutzerspezifische_einstellung_2: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $wert );
	}
	
	function liefere_benutzerspezifische_einstellung_3( $mandant_name, $benutzer_anmeldename, $einstellung )
	{
		// liefert ein Array mit allen Infos über die Einstellung
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$STATEMENT = "select kategorie, einstellung, bezeichnung, wertemenge, benutzer_darf_wert_aendern, beschreibung, benutzer_id, wert from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".$einstellung."'";
					
					xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$rc			= 0;
						$infos		= $ergebnis[ 1 ][ 0 ];
						$meldung	= "Die Einstellung >".$einstellung."< ist für den Benutzer >".$benutzer_anmeldename."< im Mandanten >".$mandant_name."< auf folgenden Wert gesetzt: >".$infos[ "wert" ]."<.";
						
					}
					else
					{
						$rc			= -4;
						$meldung	= "Die Einstellung >".$einstellung."< ist für den Benutzer >".$benutzer_anmeldename."< im Mandanten >".$mandant_name."< nicht gesetzt.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Einstellung angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		
		xlog( 6, "admin.liefere_benutzerspezifische_einstellung_3: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $infos );
	}
	
	
	function liefere_benutzerspezifische_einstellungen_kategorien( $mandant_name, $benutzer_anmeldename )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				$kategorien = array();
				
				$STATEMENT = "select distinct kategorie from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." order by kategorie";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					foreach ( $ergebnis[ 1 ] as $zeile )
					{
						$kategorien[] = $zeile[ "kategorie" ];
					}
					$rc = count( $kategorien );
					$meldung = "Liefere ".$rc." Kategorien für Benutzer  ".$benutzer_anmeldename." im Mandanten ".$mandant_name.".";
				}
				else
				{
					$rc = -4;
					$meldung = "Es wurden keine Einstellungen für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." gefunden.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_benutzerspezifische_einstellungen_kategorien: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $kategorien );
	}
	
	function aktualisiere_benutzerspezifische_einstellung( $mandant_name, $benutzer_anmeldename, $einstellung, $neuer_wert, $kategorie = "Sonstiges", $wertemenge = "", $benutzer_darf_wert_aendern = "ja", $bezeichnung = "Einstellung", $beschreibung = "" )
	{
		// setzt Wertemenge nur, wenn sie angegeben wurde (leere Angabe => keine Änderung der bestehenden Konfiguration), das gleiche gilt für den Parameter "Benutzer darf Wert ändern".
		
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$wert = liefere_benutzerspezifische_einstellung_2( $mandant_name, $benutzer_anmeldename, $einstellung );
					
					if ( $wert[ 0 ] == 0 )
					{
						// Eintrag gefunden
						
						if ( strlen( $wertemenge ) > 0 )
						{
							$STATEMENT_ERW = ", wertemenge = '".mysqli_real_escape_string( $connection, $wertemenge )."'";
						}
						
						if ( strlen( $benutzer_darf_wert_aendern ) > 0 )
						{
							$STATEMENT_ERW = $STATEMENT_ERW.", benutzer_darf_wert_aendern = '".mysqli_real_escape_string( $connection, $benutzer_darf_wert_aendern )."'";
						}
						
						$STATEMENT = "update ca_benutzer_einstellungen set wert = '".mysqli_real_escape_string( $connection, $neuer_wert )."'".$STATEMENT_ERW." where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".$einstellung."'";
						//xlog( 4, $STATEMENT );
						xdb( $STATEMENT );
						
						$rc = 1;
						$meldung = "Die Einstellung ".$einstellung." für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurde auf den Wert >".$neuer_wert."< gesetzt.";
						
					}
					else
					{
						// Eintrag nicht gefunden
						$STATEMENT = "insert into ca_benutzer_einstellungen ( benutzer_id, kategorie, einstellung, wert, wertemenge, benutzer_darf_wert_aendern, beschreibung, bezeichnung ) values ( ".$ok_2[ 0 ].", '".mysqli_real_escape_string( $connection, $kategorie )."', '".mysqli_real_escape_string( $connection, $einstellung )."', '".mysqli_real_escape_string( $connection, $neuer_wert )."', '".mysqli_real_escape_string( $connection, $wertemenge )."', '".mysqli_real_escape_string( $connection, $benutzer_darf_wert_aendern )."', '".mysqli_real_escape_string( $connection, $beschreibung )."', '".mysqli_real_escape_string( $connection, $bezeichnung )."' ) ";
						
						xdb( $STATEMENT );
						
						$rc = 2;
						$meldung = "Die Einstellung ".$einstellung." für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurde auf den Wert >".$neuer_wert."< gesetzt.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Einstellung angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		
		xlog( $level, "admin.aktualisiere_benutzerspezifische_einstellung: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function aktualisiere_benutzerspezifische_einstellung_2( $mandant_name, $benutzer_anmeldename, $einstellung, $neuer_wert, $kategorie = "Sonstiges", $wertemenge, $benutzer_darf_wert_aendern = "ja", $bezeichnung = "", $beschreibung = "" )
	{
		// setzt immer auch die Wertemenge (leere Angabe => setzen von "keine Wertemenge") und das "benutzer darf ändern"-Flag (dito).
		$ok_1 = existiert_mandant( $mandant_name );
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$wert = liefere_benutzerspezifische_einstellung_2( $mandant_name, $benutzer_anmeldename, $einstellung );
					
					if ( $wert[ 0 ] == 0 )
					{
						// Eintrag gefunden
						
						$STATEMENT = "update ca_benutzer_einstellungen set wert = '".mysqli_real_escape_string( $connection, $neuer_wert )."', wertemenge = '".mysqli_real_escape_string( $connection, $wertemenge )."', benutzer_darf_wert_aendern = '".mysqli_real_escape_string( $connection, $benutzer_darf_wert_aendern )."' where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".mysqli_real_escape_string( $connection, $einstellung )."'";
						//xlog( 4, $STATEMENT );
						xdb( $STATEMENT );
						
						$rc = 1;
						$meldung = "Die Einstellung ".$einstellung." für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurde auf den Wert >".$neuer_wert."< gesetzt.";
						
					}
					else
					{
						if ( strlen( $bezeichnung ) == 0 )
						{
							$bezeichnung = "Einstellung ".$einstellung;
						}
						// Eintrag nicht gefunden
						$STATEMENT = "insert into ca_benutzer_einstellungen ( benutzer_id, kategorie, einstellung, wert, wertemenge, benutzer_darf_wert_aendern, beschreibung, bezeichnung ) values ( ".$ok_2[ 0 ].", '".mysqli_real_escape_string( $connection, $kategorie )."', '".mysqli_real_escape_string( $connection, $einstellung )."', '".mysqli_real_escape_string( $connection, $neuer_wert )."', '".mysqli_real_escape_string( $connection, $wertemenge )."', '".mysqli_real_escape_string( $connection, $benutzer_darf_wert_aendern )."', '".mysqli_real_escape_string( $connection, $beschreibung )."', '".mysqli_real_escape_string( $connection, $bezeichnung )."' ) ";
						
						xdb( $STATEMENT );
						
						$rc = 2;
						$meldung = "Die Einstellung ".$einstellung." für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurde auf den Wert >".$neuer_wert."< gesetzt.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Einstellung angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		
		xlog( $level, "admin.aktualisiere_benutzerspezifische_einstellung: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_benutzerspezifische_einstellungen_anhand_kategorie( $mandant_name, $benutzer_anmeldename, $kategorie )
	{
		/*
			Liefert die Einstellungen und die Werte, verzichtet aber auf genauere Informationen (Wertemenge, ...)
		*/
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $kategorie ) > 0 )
				{
					$STATEMENT = "select einstellung, wert from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and kategorie = '".$kategorie."' order by einstellung";
					
					$ergebnis = xdb( $STATEMENT );
					
					$einstellungen = array();
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						foreach( $ergebnis[ 1 ] as $zeile )
						{
							$einstellungen[ $zeile[ "einstellung" ] ] = $zeile[ "wert" ];
						}
						$rc			= count( $einstellungen );
						$meldung	= "Für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurden ".$rc." Einstellungen in der Kategorie ".$kategorie." gefunden.";
					}
					else
					{
						$rc			= -4;
						$meldung	= "Es wurden keine Einstellungen für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." gefunden.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Kategorie angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_benutzerspezifische_einstellungen_anhand_kategorie: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $einstellungen );
	}
	
	function liefere_benutzerspezifische_einstellungen_anhand_kategorie_vollstaendig( $mandant_name, $benutzer_anmeldename, $kategorie )
	{
		/*
			Liefert alle Einstellungen mit allen Parametern (Wertemenge, Benutzer darf Wert ändern, ...)
		*/
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $kategorie ) > 0 )
				{
					$STATEMENT = "select einstellung, bezeichnung, wert, kategorie, wertemenge, benutzer_darf_wert_aendern, beschreibung from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and kategorie = '".$kategorie."' order by einstellung";
					
					$ergebnis = xdb( $STATEMENT );
					
					$einstellungen = array();
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$einstellungen	= $ergebnis[ 1 ];
						$rc				= count( $einstellungen );
						$meldung		= "Für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." wurden ".$rc." Einstellungen in der Kategorie ".$kategorie." gefunden.";
					}
					else
					{
						$rc			= -4;
						$meldung	= "Es wurden keine Einstellungen für den Benutzer ".$benutzer_anmeldename." im Mandanten ".$mandant_name." gefunden.";
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Kategorie angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_benutzerspezifische_einstellungen_anhand_kategorie: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $einstellungen );
	}
	
	function loesche_benutzerspezifische_einstellung( $mandant_name, $benutzer_anmeldename, $einstellung )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		if ( $ok_1[ 0 ] > 0 )
		{
			$ok_2 = existiert_benutzer( $mandant_name, $benutzer_anmeldename );
			
			if ( $ok_2[ 0 ] > 0 )
			{
				if ( strlen( $einstellung ) > 0 )
				{
					$STATEMENT = "delete from ca_benutzer_einstellungen where benutzer_id = ".$ok_2[ 0 ]." and einstellung = '".$einstellung."'";
					
					//xlog( 4, $STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc			= 0;
						$meldung	= "Die Einstellung >".$einstellung."< wurde für den Benutzer >".$benutzer_anmeldename."< im Mandanten >".$mandant_name."< gelöscht.";
						
					}
					else
					{
						$rc			= -4;
						$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es wurde keine Einstellung angegeben.";
				}
			}
			else
			{
				$rc			= $ok_2[ 0 ];
				$meldung	= $ok_2[ 1 ];
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		
		xlog( 4, "admin.loesche_benutzerspezifische_einstellung: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $wert );
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/*
		Arbeitsfunktionen
	*/
	
	function pruefe_password( $mandant_name, $password )
	{
		/****************
		BESCHREIBUNG_____Prüft ein Passwort, ob es die in der DB hinterlegten Richtlinien für Passwörter einhält
		RETURNS_____array( (integer) Returncode, (string) Meldung) ($rc = 0 wenn alles ok, < 0 wenn Fehler)
		****************/
		
		if ( strlen( $password ) <> 0 )
		{
			
			
			$pruefe_grossbuchstaben		= liefere_konfig( $mandant_name, "pwd_rl_grossbuchstaben" );
			$pruefe_kleinbuchstaben		= liefere_konfig( $mandant_name, "pwd_rl_kleinbuchstaben" );
			$pruefe_zahlen				= liefere_konfig( $mandant_name, "pwd_rl_zahlen" );
			$pruefe_sonderzeichen		= liefere_konfig( $mandant_name, "pwd_rl_sonderzeichen" );
			$pruefe_min_laenge			= liefere_konfig( $mandant_name, "pwd_rl_min_laenge" );
			$pruefe_max_laenge			= liefere_konfig( $mandant_name, "pwd_rl_max_laenge" );
			$min_grp					= liefere_konfig( $mandant_name, "pwd_rl_min_zeichgrp" );
			$max_grp					= liefere_konfig( $mandant_name, "pwd_rl_max_zeichgrp" );
			
			// Großbuchstaben
			if ( $pruefe_grossbuchstaben == "ja" )
			{
				if ( preg_match( "/[A-Z]/", $password ) == "1" )
				{
					$ergebnis_grossbuchstaben = "1";
				}
				else
				{
					$ergebnis_grossbuchstaben = "0";
					$fehlermeldung = "Obwohl benötigt, wurden im Passwort keine Großbuchstaben (A, B, C, ...) verwendet.";
				}
			}
			else
			{
				$ergebnis_grossbuchstaben = "1";
			}
			
			
			// Kleinbuchstaben
			if ( ( $pruefe_kleinbuchstaben == "ja" ) )
			{
				if ( $ergebnis_grossbuchstaben == "1" )
				{
					if ( preg_match( "/[a-z]/", $password ) == "1" )
					{
						$ergebnis_kleinbuchstaben = "1";
					}
					else
					{
						$ergebnis_kleinbuchstaben = "0";
						$fehlermeldung = "Obwohl benötigt, wurden im Passwort keine Kleinbuchstaben (a, b, c, ...) verwendet.";
					}
				}
				else
				{
					$ergebnis_kleinbuchstaben = "0";
				}
			}
			else
			{
				$ergebnis_kleinbuchstaben = "1";
			}
			
			
			// Zahlen
			if ( $pruefe_zahlen == "ja" )
			{
				if ( $ergebnis_kleinbuchstaben == "1" )
				{
					if ( preg_match( "/[0-9]/", $password ) == "1" )
					{
						$ergebnis_zahlen = "1";
					}
					else
					{
						$ergebnis_zahlen = "0";
						$fehlermeldung = "Obwohl benötigt, wurden im Passwort keine Zahlen (1, 2, 3, ...) verwendet.";
					}
				}
				else
				{
					$ergebnis_zahlen = "0";
				}
			}
			else
			{
				$ergebnis_zahlen = "1";
			}
			
			
			// Sonderzeichen
			if ( $pruefe_sonderzeichen == "ja" )
			{
				if ( $ergebnis_zahlen == "1" )
				{
					if ( preg_match( "/[!§$%&()=?+#\-_ \[\]\{\}]/", $password ) == "1" )
					{
						$ergebnis_sonderzeichen = "1";
					}
					else
					{
						$ergebnis_sonderzeichen = "0";
						$fehlermeldung = "Obwohl benötigt, wurden im Passwort keine Sonderzeichen ( !§$%&()=?+#-_ []{} ) verwendet.";
					}
				}
				else
				{
					$ergebnis_sonderzeichen = "0";
				}
			}
			else
			{
				$ergebnis_sonderzeichen = "1";
			}
			
			
			// Passwortmindestlänge
			if ( $ergebnis_sonderzeichen == "1" )
			{
				if ( strlen( $password ) >= $pruefe_min_laenge ) 
				{
					$ergebnis_min_laenge = "1";
				}
				else
				{
					$ergebnis_min_laenge = "0";
					$fehlermeldung = "Das Passwort ist zu kurz (mindestens ".$pruefe_min_laenge." Zeichen).";
				}
			}
			else
			{
				$ergebnis_min_laenge = "0";
			}
			
			
			// Passwortmaximumlänge
			if ( $ergebnis_min_laenge == "1" )
			{
				if ( strlen( $password ) <= $pruefe_max_laenge )
				{
					$ergebnis_max_laenge = "1";
				}
				else
				{
					$ergebnis_max_laenge = "0";
					$fehlermeldung = "Das Passwort ist zu lang (maximal ".$pruefe_max_laenge." Zeichen).";
				}
			}
			else
			{
				$ergebnis_max_laenge = "0";
			}
			
			
			
			// Passwort-Zeichengruppen
			$zeichengrp = bcadd( bcadd( preg_match( "/[A-Z]/", $password ), preg_match( "/[a-z]/", $password ) ), bcadd( preg_match( "/[0-9]/", $password ), preg_match( "/[!§$%&()=?+#\-_ \[\]\{\}]/", $password ) ) );
			
			
			if ( $zeichengrp >= $min_grp )
			{
				if ( $zeichengrp <= $max_grp )
				{
					$ergebnis_zeichengrp = "1";
				}
				else
				{
					$ergebnis_zeichengrp = "0";
					$fehlermeldung = "Es wurden zuviele Zeichengruppen (".$zeichengrp.") verwendet (max. erlaubt: ".$max_grp.").";
				}
			}
			else
			{
				$ergebnis_zeichengrp = "0";
				$fehlermeldung = "Es wurden zuwenige Zeichengruppen (".(int)$zeichengrp.") verwendet (min. benötigt: ".$min_grp.").";
			}
			
			
			
			
			
			
			
			
			// Zusammenfassen der einzelnen Prüfungen
			
			$gesamt_ergebnis = $ergebnis_grossbuchstaben.$ergebnis_kleinbuchstaben.$ergebnis_zahlen.$ergebnis_sonderzeichen.$ergebnis_min_laenge.$ergebnis_max_laenge.$ergebnis_zeichengrp;
			
			
			if ( strpos( $gesamt_ergebnis, "0" ) === false )
			{
				// das Ergebnis besteht nur aus Einsen "1", also ist alles gut
				$rc = 0;
				$meldung = "Das Passwort entspricht den Anforderungen.";
			}
			else
			{
				// das Ergebnis enthält Nullen "0", also wurde eine Richtlinie nicht eingehalten.
				$rc = -1;
				$meldung = $fehlermeldung;
			}
			
		}
		else
		{
			$rc = -2;
			$meldung = "Es wurde kein Passwort zur Prüfung übergeben.";
		}
		
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.pruefe_password: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
		
	}
	
	function existiert_dokument( $mandant_name, $dokument_id )
	{
		/****************
		BESCHREIBUNG_____Prüft, ob ein Dokument existiert
		RETURNS_____array( Dokument-ID, Meldung )
		****************/
		
		if ( strlen( $dokument_id ) > 0 )
		{
			
			$ok = existiert_mandant( $mandant_name );
			
			// Feststellen der Dokument-ID zum Gruppennamen
			$STATEMENT = "select i.dok_id from ca_index i, ca_dok_ablage a where i.dok_id = ".$dokument_id." and a.mandant_id = ".$ok[ 0 ]." and i.dok_id = a.dok_id;";
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				if ( $ergebnis[ 0 ] > 0 )
				{
					$rc			= $ergebnis[ 1 ][ 0 ][ "dok_id" ];
					$meldung	= "Das Dokument ".$dokument_id." existiert im Mandanten ".$mandant_name.".";
				}
				else
				{
					$rc = -1;
					$meldung = "Das Dokument ".$gruppen_name." existiert im Mandanten ".$mandant_name." nicht.";
					
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde keine Dokument-ID angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.existiert_dokument: ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	function attribut_anlegen( $mandant_name, $attrib_name, $attrib_db_spalte, $attrib_wertemenge, $attrib_beschreibung )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok = existiert_mandant( $mandant_name );
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $attrib_name ) > 0 )
				{
					if ( strlen( $attrib_db_spalte ) > 0 )
					{
						$raus = false;
						if ( strlen( $attrib_wertemenge ) > 0 )
						{
							$ergebnis = existiert_wertemenge( $mandant_name, $attrib_wertemenge );
							if ( $ergebnis[ 0 ] <> 1 )
							{
								$raus = true;
							}
						}
						
						$a = liefere_attributinformationen( $mandant_name, $attrib_name );
						
						if ( $a[ 0 ] > 0 )
						{
							$raus			= true;
							$ergebnis[ 0 ]	= -3;
							$ergebnis[ 1 ]	= "Das Attribut ".$attrib_name." existiert bereits.";
						}
						
						if ( $raus == false )
						{
							$STATEMENT = "insert into ca_attribut ( mandant_id, attrib_name, attrib_db_spalte, attrib_wertemenge, attrib_beschreibung, attrib_erstellt_am, attrib_geaendert_am ) values ( ".$ok[ 0 ].", '".mysqli_real_escape_string( $connection, $attrib_name )."', '".mysqli_real_escape_string( $connection, $attrib_db_spalte )."', '".mysqli_real_escape_string( $connection, $attrib_wertemenge )."', '".mysqli_real_escape_string( $connection, $attrib_beschreibung )."', '".time()."', '' );";
							
							$ergebnis = xdb( $STATEMENT );
							
							if ( $ergebnis[ 0 ] > 0 )
							{
								$rc = $ergebnis[ 0 ];
								$meldung = "Das Attribut <".$attrib_name."> wurde mit der ID ".$ergebnis[0]." angelegt.";
							}
							else
							{
								$rc			= $ergebnis[ 0 ];
								$meldung	= $ergebnis[ 1 ];
							}
						}
						else
						{
							$rc			= $ergebnis[ 0 ];
							$meldung	= $ergebnis[ 1 ];
						}
					}
					else
					{
						$rc			= -2;
						$meldung	= "Es wurde keine Ziel-DB-Spalte angegeben.";
					}
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es wurde kein Attributname angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.erstelle_attribut: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
		
	}
	
	function liefere_attributinformationen( $mandant_name, $attrib_name )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $attrib_name ) > 0 )
			{
				$STATEMENT = "select mandant_id, attrib_id, attrib_name, attrib_db_spalte, attrib_wertemenge, attrib_beschreibung, attrib_erstellt_am, attrib_geaendert_am from ca_attribut where mandant_id = ".$ok[0]." and attrib_name = '".$attrib_name."';";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$zeile = $ergebnis[ 1 ][ 0 ];
					$attribut_array = array( );
					
					$attribut_array[ "mandant_id" ]							= (int)		$zeile[ "mandant_id" ];
					$attribut_array[ "attrib_id" ]							= (int)		$zeile[ "attrib_id" ];
					$attribut_array[ "attrib_name" ]						= (string)	$zeile[ "attrib_name" ];
					$attribut_array[ "attrib_db_spalte" ]					= (string)	$zeile[ "attrib_db_spalte" ];
					$attribut_array[ "attrib_wertemenge" ]					= (string)	$zeile[ "attrib_wertemenge" ];
					$attribut_array[ "attrib_beschreibung" ]				= (string)	$zeile[ "attrib_beschreibung" ];
					$attribut_array[ "attrib_erstellt_am" ]					= (string)	$zeile[ "attrib_erstellt_am" ];
					
					if ( strlen( $zeile[ "attrib_geaendert_am" ] ) > 0 )
					{
						$attrib_geaendert_am = (string) $zeile[ "attrib_geaendert_am" ];
					}
					else
					{
						$attrib_geaendert_am = "";
					}
					$attribut_array[ "attrib_geaendert_am" ]				= $attrib_geaendert_am;
					
					
					$rc = $attribut_array[ "attrib_id" ];
					$meldung = "Liefere Informationen zum Attribut ".$attrib_name." im Mandanten ".$mandant_name.".";
				}
				else
				{
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc			= 0;
						$meldung	= "Das Attribut ".$attrib_name." wurde nicht gefunden.";
					}
					else
					{
						$rc			= -3;
						$meldung	= "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
					}
					
				}
			}
			else
			{
				$rc			= -1;
				$meldung	= "Es wurde kein Attributname angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_attributinformationen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $attribut_array );
	}
	
	function attribut_loeschen( $mandant_name, $attrib_name )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $attrib_name ) > 0 )
				{
					// Prüfen, in welchen Dokumentarten ein Attribut enthalten ist, bevor es gelöscht wird.
					$erg = in_welchen_dokarten_ist_attribut_enthalten( $mandant_name, $attrib_name );
					
					if ( $erg[ 0 ] == 0 )
					{
						$STATEMENT = "delete from ca_attribut where mandant_id = ".$ok[ 0 ]." and attrib_name = '".$attrib_name."'";
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] == 0 )
						{
							$rc			= 0;
							$meldung	= "Das Attribut ".$attrib_name." wurde im Mandanten ".$mandant_name." gelöscht.";
						}
						else
						{
							$rc			= -2;
							$meldung	= "Das Attribut ".$attrib_name." konnte im Mandanten ".$mandant_name." nicht gelöscht werden. ".$ergebnis[ 1 ];
						}
					}
					else
					{
						if ( $erg[ 0 ] > 0 )
						{
							$rc = -3;
							if ( $erg[ 0 ] == 1 )
							{
								$text = "in der Dokument-/Aktenart ";
							}
							else
							{
								$text = "in den Dokument-/ und Aktenarten ";
							}
							
							$meldung = "Das Attribut ".$attrib_name." kann nicht gelöscht werden, da es noch ".$text.$erg[ 3 ]." enthalten ist.";
						}
					}
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es wurde kein Attributname angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.attribut_loeschen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function attribut_aendern( $mandant_name, $attrib_name_alt, $attrib_db_spalte, $attrib_wertemenge = "", $attrib_beschreibung = "", $attrib_name_neu = "")
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok = existiert_mandant( $mandant_name );
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $attrib_name_neu ) > 0 )
				{
					if ( strlen( $attrib_db_spalte ) > 0 )
					{
						$raus = false;
						if ( strlen( $attrib_wertemenge ) > 0 )
						{
							$ergebnis = existiert_wertemenge( $mandant_name, $attrib_wertemenge );
							if ( $ergebnis[ 0 ] <> 1 )
							{
								$raus = true;
							}
						}
						
						if ( $raus == false )
						{
							$STATEMENT = "update ca_attribut set attrib_name = '".mysqli_real_escape_string( $connection, $attrib_name_neu )."', attrib_db_spalte = '".mysqli_real_escape_string( $connection, $attrib_db_spalte )."', attrib_wertemenge = '".mysqli_real_escape_string( $connection, $attrib_wertemenge )."', attrib_beschreibung = '".mysqli_real_escape_string( $connection, $attrib_beschreibung )."', attrib_geaendert_am = '".time()."' where mandant_id = ".$ok[ 0 ]." and attrib_name = '".mysqli_real_escape_string( $connection, $attrib_name_alt )."';";
							
							$sqlergebnis = xdb( $STATEMENT );
							
							if ( $sqlergebnis[ 0 ] <> -1 )
							{
								$rc = $sqlergebnis[ 0 ];
								if ( ( strlen( $attrib_name_neu ) > 0 ) && ( $attrib_name_neu <> $attrib_name_alt ) )
								{
									$meld = " (vormals ".$attrib_name_alt.")";
								}
								else
								{
									$meld = "";
								}
								$meldung = "Das Attribut ".$attrib_name_neu.$meld." wurde geändert.";
							}
							else
							{
								$rc			= $sqlergebnis[ 0 ];
								$meldung	= $sqlergebnis[ 1 ];
							}
						}
						else
						{
							$rc			= $ergebnis[ 0 ];
							$meldung	= $ergebnis[ 1 ];
						}
					}
					else
					{
						$rc			= -2;
						$meldung	= "Es wurde keine Ziel-DB-Spalte angegeben.";
					}
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es wurde kein Attributname angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.attribut_aendern: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
		
	}
	
	function liefere_attributliste( $mandant_name, $liefere_sysattribs = true )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		$attributliste = array();

		if ( $liefere_sysattribs !== true )
		{
			$liefere_sysattribs = false;
		}
		
		if ( $liefere_sysattribs )
		{
			$where = "";
		}
		else
		{
			$where = " and attrib_name not like '[%]'";
		}
		if ( $ok_1[ 0 ] > 0 )
		{
			$STATEMENT = "select attrib_name from ca_attribut where mandant_id = ".$ok_1[ 0 ].$where." order by attrib_name";
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] <> -1 )
			{
				$rc				= $ergebnis[ 0 ];
				$attributliste	= $ergebnis[ 1 ];
				$meldung = "Liefere ".$rc." Attribute des Mandants ".$mandant_name.".";
			}
			else
			{
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		
		if ( $rc < 0 )
		{
				$level = 2;
		}
		else
		{
				$level = 4;
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_attributliste: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $attributliste );
	}
	
	function attribut_suchen( $mandant_name, $suchstring )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		$attributliste = array();
		
		if ( $ok_1[ 0 ] > 0 )
		{
			
			$STATEMENT = "select attrib_name from ca_attribut where mandant_id = ".$ok_1[ 0 ]." and attrib_name like '%".$suchstring."%' order by attrib_name";
			
			//xlog( 4, $STATEMENT );
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				$rc				= $ergebnis[ 0 ];
				$attributliste	= $ergebnis[ 1 ];
				$meldung = "Liefere ".$rc." Attribute des Mandants ".$mandant_name.".";
			}
			else
			{	
				
				$rc = -1;
				$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
			}
		}
		else
		{
			$rc = $ok_1[ 0 ];
			$meldung = $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.suche_attribut: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $attributliste );
	}
	
	
	
	
	
	
	
	
	function dokart_anlegen( $mandant_name, $dokart_kuerzel, $dokart_name, $dokart_beschreibung, $dokart_typ, $depot, $arr_attribute, $flags )
	{
		$exekutor = $_SESSION[ "benutzer_anmeldename" ];
		$ok = existiert_mandant( $mandant_name );
		$dokart_kuerzel = mb_strtoupper( $dokart_kuerzel );
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $dokart_kuerzel ) > 0 )
				{
					if ( strpos( $dokart_kuerzel, "_" ) === false )
					{
						if ( strlen( $dokart_name ) > 0 )
						{
							if ( ( mb_strtoupper( $dokart_typ ) == "D" ) || ( mb_strtoupper( $dokart_typ ) == "A" ) )
							{
								/*
									Aufbau des $arr_attribute-Arrays:
									array( array( "attrib_name"=>name1, "pflichtfeld"=>pflicht ), array( "attrib_name"=>name2, ....
								*/
								
								if ( count( $arr_attribute ) > 0 )
								{
									$erg = liefere_attributliste( $mandant_name, true );
									
									$breaker = false;
									
									foreach ( $arr_attribute as $attrib )
									{
										$gefunden = false;
										
										foreach ( $erg[ 2 ] as $zeile )
										{
											
											if ( $attrib[ "attrib_name" ] == $zeile[ "attrib_name" ] )
											{
												$gefunden = true;
												break;
											}
										}
										
										if ( $gefunden == false )
										{
											$breaker = true;
											break;
										}
									}
									
									if ( $breaker == false )
									{
										// jetzt kanns losgehen
										
										// parsen der Flags
										/*
										if ( $flags[ "dok_ablage" ] == "D" )
										{
											$insert_flag = "D";
										}
										else
										{
											$insert_flag = "F";
										}
										*/
										// ggf. parsen weiterer Flags....
										
										$dep_ok = liefere_depotinformationen( $mandant_name, $depot );
										
										if ( $dep_ok[ 0 ] > 0 )
										{
											// auffüllen noch nicht verwendeter Flags
											for ( $i = 1; $i <= 15; $i ++ )
											{
												$insert_flag = $insert_flag."0";
											}
											
											$dokart_kuerzel = mb_strtoupper( $dokart_kuerzel );
											
											$STATEMENT = "insert into ca_dokart ( mandant_id, dokart_kuerzel, dokart_name, dokart_beschreibung, dokart_typ, dokart_erstellt_am, flags, dokart_depot, dokart_geaendert_am ) values ( ".$ok[ 0 ].", '".mysqli_real_escape_string( $connection, $dokart_kuerzel )."', '".mysqli_real_escape_string( $connection, $dokart_name )."', '".mysqli_real_escape_string( $connection, $dokart_beschreibung )."', '".mysqli_real_escape_string( $connection, $dokart_typ )."', '".time()."', '".mysqli_real_escape_string( $connection, $insert_flag )."', '".mysqli_real_escape_string( $connection, $depot )."', 0 );";
											
											//xlog(5, $STATEMENT );
											
											$ergebnis = xdb( $STATEMENT );
											
											if ( $ergebnis >= 0 )
											{
												// Jetzt müssen noch die Attribute zur Dokument-/Aktenart hinzugefügt werden.
												
												$fehler = false;
												$pos_in_maske = 0;
												foreach( $arr_attribute as $attrib )
												{
													$pos_in_maske = bcadd( $pos_in_maske, 1 );
													
													$erg = attrib_zu_dokart_hinzufuegen( $mandant_name, $dokart_kuerzel, $attrib[ "attrib_name" ], array(), $pos_in_maske );
													
													if ( $erg[ 0 ] <= 0 )
													{
														$fehler = true;
														break;
													}
												}
												
												// Hinzufügen der Systemrechte
												if ( $fehler == false )
												{
													$ergebnis	= systemrecht_anlegen( $mandant_name, $dokart_typ."_".$dokart_kuerzel, 10, "root" );
													$ergebnis	= systemrecht_anlegen( $mandant_name, $dokart_typ."_".$dokart_kuerzel."_LESEN", 10, $dokart_typ."_".$dokart_kuerzel );
													
													if ( $dokart_kuerzel != "SCHABLONE" )
													{
														$ergebnis	= systemrecht_anlegen( $mandant_name, $dokart_typ."_".$dokart_kuerzel."_LOESCHEN", 10, $dokart_typ."_".$dokart_kuerzel );
														$ergebnis	= systemrecht_anlegen( $mandant_name, $dokart_typ."_".$dokart_kuerzel."_IMPORT", 10, $dokart_typ."_".$dokart_kuerzel );
														$ergebnis	= systemrecht_anlegen( $mandant_name, $dokart_typ."_".$dokart_kuerzel."_AENDERN", 10, $dokart_typ."_".$dokart_kuerzel );
													}
													
													$rc			= 1;
													$meldung	= "Die Dokumentart ".$dokart_name." (".$dokart_kuerzel.") wurde erfolgreich angelegt.";
												}
												else
												{
													$rc			= $erg[ 0 ];
													$meldung	= "Die Dokument-/Aktenart wurde angelegt. Beim Hinzufügen der Attribute gab es einen Fehler: >".$erg[ 1 ]."<";
												}
											}
											else
											{
												$rc			= $ergebnis[ 0 ];
												$meldung	= $ergebnis[ 1 ];
											}
										}
										else
										{
											$rc			= $dep_ok[ 0 ];
											$meldung	= $dep_ok[ 1 ];
										}
									}
									else
									{
										$rc			= -5;
										$meldung	= "Es wurden nicht existente Attribute (".$attrib[ "attrib_name" ].") angegeben.";
									}
									
								}
								else
								{
									$rc			= -4;
									$meldung	= "Es wurden keine Attribute angegeben.";
								}
							}
							else
							{
								$rc			= -3;
								$meldung	= "Es wurde kein korrekter Dokumentarttyp angegeben.";
							}
						}
						else
						{
							$rc			= -2;
							$meldung	= "Es wurde kein Dokumentartname angegeben.";
						}
					}
					else
					{
						$rc			= -6;
						$meldung	= "Das Dokumentartkürzel enthält unerlaubte Unterstriche.";
					}
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es wurde kein Dokumentartkürzel angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.dokumentart_anlegen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
		
	}
	
	function liefere_dokartinformationen( $mandant_name, $dokart_kuerzel, $ausfuehrlich = false )
	{
		$ok = existiert_mandant( $mandant_name );
		$dokart_kuerzel = mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dokart_kuerzel ) > 0 )
			{
				$STATEMENT = "select dokart_kuerzel, dokart_name, dokart_beschreibung, dokart_typ, flags, dokart_depot, dokart_erstellt_am, dokart_geaendert_am from ca_dokart where dokart_kuerzel = '".$dokart_kuerzel."' and mandant_id = ".$ok[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				//xlog( 2, $STATEMENT );
				
				//xlog( 1, "ergebnis ".$ergebnis[ 0 ] );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$zeile = $ergebnis[ 1 ][ 0 ];
					$dokart = array();
					
					$dokart[ "mandant_id" ]					= $ok[ 0 ];
					$dokart[ "dokart_kuerzel" ]				= $zeile[ "dokart_kuerzel" ];
					$dokart[ "dokart_name" ]				= $zeile[ "dokart_name" ];
					$dokart[ "dokart_beschreibung" ]		= $zeile[ "dokart_beschreibung" ];
					$dokart[ "dokart_typ" ]					= $zeile[ "dokart_typ" ];
					$dokart[ "dokart_depot" ]				= $zeile[ "dokart_depot" ];
					$dokart[ "flags" ]						= $zeile[ "flags" ];
					$dokart[ "dokart_erstellt_am" ]			= $zeile[ "dokart_erstellt_am" ];
					$dokart[ "dokart_geaendert_am" ]		= $zeile[ "dokart_geaendert_am" ];
					
					$dokart[ "dokart_dok_ablage" ]			= substr( $zeile[ "flags" ], 0, 1 );
					
					if ( $ausfuehrlich == true )
					{
						$STATEMENT = "select count(*) anzahl from ca_dok_ablage where dokart_kuerzel = '".$zeile[ "dokart_kuerzel" ]."'";
						$anzahl = xdb( $STATEMENT );
						$dokart[ "anzahl_doks" ] = $anzahl[ 1 ][ 0 ][ "anzahl" ];
					}
					else
					{
						$dokart[ "anzahl_doks" ] = "./.";
					}
					
					$attribute = liefere_attribute_zu_dokumentart( $mandant_name, $dokart_kuerzel );
					
					if ( $attribute[ 0 ] > 0 )
					{
						// es wurden Attribute gefunden.
						$dokart[ "attribute" ] = $attribute[ 2 ];
						
						$rc			= $attribute[ 0 ];
						$meldung	= "Liefere Informationen (inklusive ".$rc." Attribute) über Dokument-/Aktenart ".$dokart_kuerzel.".";
					}
					else
					{
						$rc			= 0;
						$meldung	= "Liefere Informationen über Dokument-/Aktenart ".$dokart_kuerzel.".";
					}
				}
				else
				{
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc			= -2;
						$meldung	= "Die Dokument-/Aktenart ".$dokart_kuerzel." wurde nicht im System gefunden.";
					}
					else
					{
						$rc			= -3;
						$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
					}
				}
			}
			else
			{
				$rc			= -1;
				$meldung	= "Es wurde kein Dokument-/Aktenartkürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_dokartinformationen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokart );
	}
	
	function liefere_dokartinformationen_multi( $mandant_name, $dokart_kuerzel_arr, $ausfuehrlich = false )
	{
		$ok = existiert_mandant( $mandant_name );
		//$dokart_kuerzel = mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( is_array( $dokart_kuerzel_arr ) )
			{
				$dokart_kuerzel = " ( ";
				foreach( $dokart_kuerzel_arr as $kuerzel )
				{
					$dokart_kuerzel = $dokart_kuerzel."'".$kuerzel."', ";
				}
				
				$dokart_kuerzel = substr( $dokart_kuerzel, 0, -2 )." ) ";
				
				$STATEMENT = "select dokart_kuerzel, dokart_name, dokart_beschreibung, dokart_typ, flags, dokart_depot, dokart_erstellt_am, dokart_geaendert_am from ca_dokart where dokart_kuerzel in ".$dokart_kuerzel." and mandant_id = ".$ok[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				//xlog( 2, $STATEMENT );
				
				//xlog( 1, "ergebnis ".$ergebnis[ 0 ] );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$e = array();
					foreach( $ergebnis[ 1 ] as $zeile )
					{
						$dokart = array();
						
						$dokart[ "mandant_id" ]					= $ok[ 0 ];
						$dokart[ "dokart_kuerzel" ]				= $zeile[ "dokart_kuerzel" ];
						$dokart[ "dokart_name" ]				= $zeile[ "dokart_name" ];
						$dokart[ "dokart_beschreibung" ]		= $zeile[ "dokart_beschreibung" ];
						$dokart[ "dokart_typ" ]					= $zeile[ "dokart_typ" ];
						$dokart[ "dokart_depot" ]				= $zeile[ "dokart_depot" ];
						$dokart[ "flags" ]						= $zeile[ "flags" ];
						$dokart[ "dokart_erstellt_am" ]			= $zeile[ "dokart_erstellt_am" ];
						$dokart[ "dokart_geaendert_am" ]		= $zeile[ "dokart_geaendert_am" ];
						
						$dokart[ "dokart_dok_ablage" ]			= substr( $zeile[ "flags" ], 0, 1 );
						
						if ( $ausfuehrlich == true )
						{
							$STATEMENT = "select count(*) anzahl from ca_dok_ablage where dokart_kuerzel = '".$zeile[ "dokart_kuerzel" ]."'";
							$anzahl = xdb( $STATEMENT );
							$dokart[ "anzahl_doks" ] = $anzahl[ 1 ][ 0 ][ "anzahl" ];
						}
						else
						{
							$dokart[ "anzahl_doks" ] = "./.";
						}
						
						$attribute = liefere_attribute_zu_dokumentart( $mandant_name, $dokart[ "dokart_kuerzel" ] );
						
						if ( $attribute[ 0 ] > 0 )
						{
							// es wurden Attribute gefunden.
							$dokart[ "attribute" ] = $attribute[ 2 ];
							
							
						}
						
						$e[ $dokart[ "dokart_kuerzel" ] ] = $dokart;
					}
					
					$rc = count( $e );
					$meldung = "Liefere Informationen über die Dokumentarten ".$dokart_kuerzel.".";
					
					
				}
				else
				{
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc			= -2;
						$meldung	= "Die Dokument-/Aktenarten ".$dokart_kuerzel." wurde nicht im System gefunden.";
					}
					else
					{
						$rc			= -3;
						$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
					}
				}
			}
			else
			{
				$rc			= -1;
				$meldung	= "Es wurde keine Dokument-/Aktenartkürzel in Arrayform angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_dokartinformationen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $e );
	}
	
	function dokart_loeschen( $mandant_name, $dokart_kuerzel, $dokumente_loeschen = false )
	{
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		$ok				= existiert_mandant( $mandant_name );
		
		// 1. Dokumente löschen
		// 2. Attribute aus Dokumentart entfernen
		// 3. Systemrechte löschen
		// 4. Dokumentart löschen
		
		$dokart = liefere_dokartinformationen( $mandant_name, $dokart_kuerzel );
		
		if ( $dokart[ 0 ] > 0 )
		{
			// Dokumentart existiert.
			
			// 1. Dokumente löschen (geht das schon?!)
			if ( $dokumente_loeschen == true )
			{
				xlog( 3, "admin.dokart_loeschen: Dokumente löschen geht noch nicht!");
			}
			
			// 2. Attribute aus Dokumentart entfernen
			$fehler = false;
			foreach ( $dokart[ 2 ][ "attribute" ] as $attribut )
			{
				
				$erg = attrib_aus_dokart_loeschen( $mandant_name, $dokart_kuerzel, $attribut[ "attrib_name" ] );
				if ( $erg[ 0 ] < 0 )
				{
					$fehler		= true;
					$rc			= $erg[ 0 ];
					$meldung	= "Es ist ein Fehler aufgetreten: ".$erg[ 1 ];
				}
			}
			
			
			
			if ( $fehler == false )
			{
				// 3. Systemrechte löschen
				
				$ergebnis = systemrecht_loeschen( $mandant_name, $dokart[ 2 ][ "dokart_typ" ]."_".$dokart_kuerzel );
				$ergebnis = systemrecht_loeschen( $mandant_name, $dokart[ 2 ][ "dokart_typ" ]."_".$dokart_kuerzel."_LESEN" );
				$ergebnis = systemrecht_loeschen( $mandant_name, $dokart[ 2 ][ "dokart_typ" ]."_".$dokart_kuerzel."_LOESCHEN" );
				$ergebnis = systemrecht_loeschen( $mandant_name, $dokart[ 2 ][ "dokart_typ" ]."_".$dokart_kuerzel."_IMPORT" );
				$ergebnis = systemrecht_loeschen( $mandant_name, $dokart[ 2 ][ "dokart_typ" ]."_".$dokart_kuerzel."_AENDERN" );
				
				// 4. Dokumentart löschen
				
				$STATEMENT	= "delete from ca_dokart where mandant_id = ".$ok[ 0 ]." and dokart_kuerzel = '".$dokart_kuerzel."'; ";
				$ergebnis	= xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] == 0 )
				{
					$rc			= 0;
					$meldung	= "Die Dokumentart ".$dokart[ 2 ][ "dokart_name" ]." (".$dokart[ 2 ][ "dokart_kuerzel" ].") wurde gelöscht.";
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
				}
				
			}
			
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.dokart_loeschen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokart );
		
	}
	
	function dokart_aendern( $mandant_name, $dokart_kuerzel, $dokart_name, $dokart_beschreibung, $depot, $arr_attribute, $flags )
	{
		// $flags wird aktuell noch nicht ausgewertet.
		$connection = mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( strlen( $dokart_kuerzel ) > 0 )
		{
			$dokart_kuerzel		= mb_strtoupper( $dokart_kuerzel );
			
			$ok					= existiert_mandant( $mandant_name );
		
			if ( $ok[ 0 ] > 0 )
			{
				$dokart = liefere_dokartinformationen( $mandant_name, $dokart_kuerzel );
				
				$STATEMENT = "update ca_dokart set dokart_name = '".mysqli_real_escape_string( $connection, $dokart_name )."', dokart_beschreibung = '".mysqli_real_escape_string( $connection, $dokart_beschreibung )."', dokart_geaendert_am = '".time()."', dokart_depot = '".mysqli_real_escape_string( $connection, $depot )."' where dokart_kuerzel = '".mysqli_real_escape_string( $connection, $dokart_kuerzel )."' and mandant_id = ".$ok[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] == 0 )
				{
					// jetzt noch Attribute aktualisieren
					
					
					// zuerst die löschen, die nicht mehr in der Dokumentart enthalten sind
					foreach( $dokart[ 2 ][ "attribute" ] as $aktuelles_attribut )
					{
						$gefunden = false;
						foreach( $arr_attribute as $neues_attribut )
						{
							if ( $aktuelles_attribut[ "attrib_name" ] == $neues_attribut[ "attrib_name" ] )
							{
								$gefunden = true;
								break;
							}
						}
						if ( $gefunden == false )
						{
							// Lösche das Attribut aus der Dokumentart
							
							$erg = attrib_aus_dokart_loeschen( $mandant_name, $dokart_kuerzel, $aktuelles_attribut[ "attrib_name" ] );
							
						}
					}
					
					
					// dann die hinzufügen, die dazugekommen sind
					
					foreach( $arr_attribute as $neues_attribut )
					{
						$gefunden = false;
						foreach( $dokart[ 2 ][ "attribute" ] as $aktuelles_attribut )
						{
							if ( $aktuelles_attribut[ "attrib_name" ] == $neues_attribut[ "attrib_name" ] )
							{
								$gefunden = true;
								break;
							}
						}
						if ( $gefunden == false )
						{
							// Füge das Attribut der Dokumentart hinzu
							
							$erg = attrib_zu_dokart_hinzufuegen( $mandant_name, $dokart_kuerzel, $neues_attribut[ "attrib_name" ], array(), count( $dokart[ 2 ][ "attribute" ] ) + 1 );
							
						}
					}
						
					$rc = 0;
					$meldung = "Die Dokumentart ".$dokart_name." (".$dokart_kuerzel.") wurde geändert.";
				}
				else
				{
					$rc			= -2;
					$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
				}
			}
		}
		else
		{
			$rc			= -1;
			$meldung	= "Es wurde kein Dokument-/Aktenartkürzel angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		mysqli_close( $connection );
		
		xlog( $level, "admin.dokart_aendern: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_dok_akten_art_liste( $mandant_name, $menge = "", $liefere_sysdokarten = true )
	{
		// $menge => "A" für Aktenarten, "D" für Dokumentarten
		$ok = existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( $liefere_sysdokarten !== true )
			{
				$liefere_sysdokarten = false;
			}
			
			if ( $liefere_sysdokarten )
			{
				$where_2 = "";
			}
			else
			{
				$sysdokarten = liefere_wertemenge_elemente( $mandant_name, "systemdokarten" );
				
				
				
				if ( $sysdokarten[ 0 ] > 0 )
				{
					$where_2 = " and dokart_kuerzel not in ( ";
					foreach ( $sysdokarten[ 2 ] as $dokart_kurz )
					{
						$where_2 = $where_2." '".$dokart_kurz[ "alpha_01" ]."', ";
					}
					$where_2 = substr( $where_2, 0, strlen( $where_2 ) - 2 )." )";
				}
				
			}
			
			if ( strlen( $menge ) > 0 )
			{
				$where = " and dokart_typ = '".$menge."'";
			}
			else
			{
				$where = "";
			}
			
			$STATEMENT = "select dokart_kuerzel, dokart_name, dokart_typ from ca_dokart where mandant_id = ".$ok[ 0 ].$where.$where_2." order by dokart_name";
			
			//xlog( 6, $STATEMENT );
			
			$erg = xdb( $STATEMENT );
			
			if ( $erg[ 0 ] > 0 )
			{
				$rc			= $erg[ 0 ];
				$meldung	= "Liefere ".$rc." Dokument-/Aktenarten für Mandant ".$mandant_name.".";
				$dokart		= $erg[ 1 ];
			}
			else
			{
				if ( $erg[ 0 ] == 0 )
				{
					$rc			= 0;
					$meldung	= "Es wurden im Mandanten ".$mandant_name." keine Dokument-/Aktenarten gefunden.";
				}
				else
				{
					$rc			= $erg[ 0 ];
					$meldung	= "Es ist ein Fehler aufgetreten: ".$erg[ 1 ];
				}
			}
			
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_dok_akten_art_liste: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokart );
	}
	
	function liefere_aktenartliste( $mandant_name )
	{
		$ok = liefere_dok_akten_art_liste( $mandant_name, "A" );
		
		return $ok;
	}
	
	function liefere_dokartliste( $mandant_name )
	{
		$ok = liefere_dok_akten_art_liste( $mandant_name, "D" );
		
		return $ok;
	}
	
	function dokart_suchen( $mandant_name, $suchstring )
	{}
	
	
	
	
	function attrib_zu_dokart_hinzufuegen( $mandant_name, $dokart_kuerzel, $attrib_name, $flags = array(), $pos_in_maske = 9 )
	{
		$exekutor		= $_SESSION[ "benutzer_anmeldename" ];
		$ok				= existiert_mandant( $mandant_name );
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		$connection 	= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( mb_strtoupper( $exekutor, "UTF-8" ) == "SUPERUSER" )
			{
				$exec[ 0 ] = 1;
			}
			else
			{
				$exec = besitzt_benutzer_systemrecht( $mandant_name, $exekutor, "ADMINISTRATOR" );
			}
			
			if ( $exec[ 0 ] == 1 )
			{
				if ( strlen( $dokart_kuerzel ) > 0 )
				{
					$erg = ist_attrib_in_dokart_enthalten( $mandant_name, $dokart_kuerzel, $attrib_name );
					
					if ( $erg[ 0 ] <= 0 )
					{
						// Attribut ist nicht in Dokumentart enthalten. Es kann also hinzugefügt werden.
						
						// Herausfinden der Attribut-ID
						$ergeb = liefere_attributinformationen( $mandant_name, $attrib_name );
						
						if ( $ergeb[ 0 ] > 0 )
						{
							$aid = $ergeb[ 0 ];
							// Herausfinden der Flags
							
							if ( strlen( $flags[ "pflicht" ] ) > 0 )
							{
								$flags_setup = "1";
							}
							else
							{
								$flags_setup = "0";
							}
							
							$flags_setup = $flags_setup."00000000000000"; // 14 Nullen. Eine ist belegt.
							
							$attrib_laenge = "";
							
							if ( strpos( $ergeb[ 2 ][ "attrib_db_spalte" ], "num" ) !== false )
							{
								$sql_attrib_laenge = ", attrib_laenge ";
								$wert_attrib_laenge = ", 3 ";
							}
							else
							{
								$sql_attrib_laenge = "";
								$wert_attrib_laenge = "";
							}
							
							$STATEMENT = "insert into ca_dokart_attrib ( mandant_id, dokart_kuerzel, attrib_id, flags, pos_in_maske, hinzugefuegt_am ".$sql_attrib_laenge." ) values ( ".$ok[ 0 ].", '".mysqli_real_escape_string( $connection, $dokart_kuerzel )."', ".mysqli_real_escape_string( $connection, $aid ).", '".mysqli_real_escape_string( $connection, $flags_setup )."', ".mysqli_real_escape_string( $connection, $pos_in_maske ).", '".time()."' ".$wert_attrib_laenge." );";
							
							$ergebnis = xdb( $STATEMENT );
							
							if ( $ergebnis[ 0 ] >= 0 )
							{
								$rc			= 1;
								$meldung	= "Das Attribut ".$attrib_name." wurde der Dokument-/Aktenart ".$dokart_kuerzel." hinzugefügt.";
							}
							else
							{
								$rc			= $ergebnis[ 0 ];
								$meldung	= $ergebnis[ 1 ];
							}
						}
						else
						{
							$rc			= $ergeb[ 0 ];
							$meldung	= $ergeb[ 1 ];
						}
						
						
					}
					else
					{
						// Attribut ist in Dokumentart enthalten
						$rc			= $erg[ 0 ];
						$meldung	= $erg[ 1 ];
					}
				}
				else
				{
					$rc			= -1;
					$meldung	= "Es wurde kein Dokument-/Aktenartkürzel angegeben.";
				}
			}
			else
			{
				$rc = -12;
				$meldung = "Der ausführende Benutzer >".$exekutor."< besitzt nicht das notwendige Recht.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.attrib_zu_dokuart_hinzufuegen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function ist_attrib_in_dokart_enthalten( $mandant_name, $dokart_kuerzel, $attrib_name )
	{
		$ok				= existiert_mandant( $mandant_name );
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dokart_kuerzel ) > 0 )
			{
				if ( strlen( $attrib_name ) > 0 )
				{
					$erg = liefere_attributinformationen( $mandant_name, $attrib_name );
					//erg2 = function liefere_dokumentartinformationen( $mandant_name, $dokart_kuerzel ); -- fehlt noch, weil die Funktion noch nicht implementiert ist.
					
					if ( $erg[ 0 ] > 0 )
					{
						$STATEMENT = "select count(*) anzahl from ca_dokart_attrib where mandant_id = ".$ok[ 0 ]." and dokart_kuerzel = '".$dokart_kuerzel."' and attrib_id = ".$erg[ 0 ].";";
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							//$zeile = $ergebnis[ 1 ][ 0 ];
							
							if ( $ergebnis[ 1 ][ 0 ][ "anzahl" ] == "0" )
							{
								$rc			= 0;
								$meldung	= "Das Attribut ".$attrib_name." ist nicht in der Dokument-/Aktenart ".$dokart_kuerzel." enthalten.";
							}
							else
							{
								$rc			= $erg[ 0 ];
								$meldung	= "Das Attribut ".$attrib_name." ist in der Dokument-/Aktenart ".$dokart_kuerzel." enthalten.";
							}
						}
						else
						{
							$rc			= -4;
							$meldung	= $ergebnis[ 1 ];
						}
					}
					else
					{
						$rc			= -3;
						$meldung	= "Das angegebene Attribut existiert nicht.";
					}
				}
				else
				{
					$rc			= -2;
					$meldung	= "Es wurde kein Attributname angegeben.";
				}
			}
			else
			{
				$rc			= -1;
				$meldung	= "Es wurde kein Dokument-/Aktenartkürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.ist_attrib_in_dokart_enthalten: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_attribute_zu_dokumentart( $mandant_name, $dokart_kuerzel )
	{
		$ok					= existiert_mandant( $mandant_name );
		$dokart_kuerzel		= mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dokart_kuerzel ) > 0 )
			{
				$STATEMENT = "select a.attrib_id attrib_id, a.dokart_kuerzel dokart_kuerzel, a.pos_in_maske pos_in_maske, a.attrib_laenge attrib_laenge, a.attrib_einheit attrib_einheit, a.flags flags, a.hinzugefuegt_am hinzugefuegt_am, a.mandant_id mandant_id, b.attrib_beschreibung attrib_beschreibung, b.attrib_db_spalte attrib_db_spalte, b.attrib_erstellt_am attrib_erstellt_am, b.attrib_geaendert_am attrib_geaendert_am, b.attrib_name attrib_name, b.attrib_wertemenge attrib_wertemenge from ca_dokart_attrib a, ca_attribut b where a.attrib_id = b.attrib_id and a.mandant_id = b.mandant_id and a.mandant_id = ".$ok[ 0 ]." and a.dokart_kuerzel = '".$dokart_kuerzel."' order by a.pos_in_maske, a.attrib_id";
				
				//xlog( 4, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$dokart_attribs = array();
					foreach( $ergebnis[ 1 ] as $zeile )
					{
						//xlog( 4, $zeile[ "attrib_db_spalte"] );
						
						if ( substr( $zeile[ "flags" ], 0, 1 ) == 0 )
						{
							$pflicht = false;
						}
						else
						{
							$pflicht = true;
						}
						//xlog( 4,  $zeile[ "attrib_db_spalte"] ." => ".substr( $zeile[ "flags" ], 0, 1 )." => ".$pflicht );
						
						
						switch ( substr( $zeile[ "flags" ], 1, 1 ) )
						{
							case "0":
								$farbe = "standard";
								break;
							case "1":
								$farbe = "gruen";
								break;
							case "2":
								$farbe = "blau";
								break;
							case "3":
								$farbe = "gelb";
								break;
							case "4":
								$farbe = "rot";
								break;
							case "5":
								$farbe = "braun";
								break;
						}
						
						switch ( substr( $zeile[ "flags" ], 2, 1 ) )
						{
							/*
								$fett			= Bit 1
								$unterstrichen	= Bit 2
								$kursiv			= Bit 3
							*/
							case "0":
								$fett			= false;
								$unterstrichen	= false;
								$kursiv			= false;
								break;
							case "1":
								$fett			= true;
								$unterstrichen	= false;
								$kursiv			= false;
								break;
							case "2":
								$fett			= false;
								$unterstrichen	= true;
								$kursiv			= false;
								break;
							case "3":
								$fett			= true;
								$unterstrichen	= true;
								$kursiv			= false;
								break;
							case "4":
								$fett			= false;
								$unterstrichen	= false;
								$kursiv			= true;
								break;
							case "5":
								$fett			= true;
								$unterstrichen	= false;
								$kursiv			= true;
								break;
							case "6":
								$fett			= false;
								$unterstrichen	= true;
								$kursiv			= true;
								break;
							case "7":
								$fett			= true;
								$unterstrichen	= true;
								$kursiv			= true;
								break;
						}
						
						if ( substr( $zeile[ "flags" ], 3, 1 ) == 0 )
						{
							$vorhanden = false;
						}
						else
						{
							$vorhanden = true;
						}
						
						if ( substr( $zeile[ "flags" ], 4, 1 ) == 0 )
						{
							$titel = false;
						}
						else
						{
							$titel = true;
						}
						
						
						//$pflicht.$farbe.$fuk.$vorhanden.$titel.$pos_in_maske."000000000";
						
						$pos_in_maske = $zeile[ "pos_in_maske" ];
						
						
						
						
						
						$attrib_typ = explode( "_", $zeile[ "attrib_db_spalte"] );
						if ( mb_strtoupper( $attrib_typ[ 0 ] ) == "P" )
						{
							$attrib_typ = $attrib_typ[ 0 ]."_".$attrib_typ[ 1 ];
						}
						else
						{
							$attrib_typ = $attrib_typ[ 0 ];
						}
						
						
						$dokart_attribs[ $zeile[ "attrib_db_spalte"] ] = array( "attrib_laenge"=>$zeile[ "attrib_laenge"], "attrib_einheit"=>$zeile[ "attrib_einheit"], "attrib_pflicht"=>$pflicht, "attrib_farbe"=>$farbe, "attrib_layout_fett"=>$fett, "attrib_layout_unterstrichen"=>$unterstrichen, "attrib_layout_kursiv"=>$kursiv, "attrib_id"=>$zeile[ "attrib_id"], "dokart_kuerzel"=>$zeile[ "dokart_kuerzel"], "flags"=>$zeile[ "flags"], "hinzugefuegt_am"=>$zeile[ "hinzugefuegt_am"],  "mandant_id"=>$zeile[ "mandant_id"],  "attrib_beschreibung"=>$zeile[ "attrib_beschreibung"],  "attrib_db_spalte"=>$zeile[ "attrib_db_spalte"],  "attrib_erstellt_am"=>$zeile[ "attrib_erstellt_am"],  "attrib_geaendert_am"=>$zeile[ "attrib_geaendert_am"],  "attrib_name"=>$zeile[ "attrib_name"],  "attrib_wertemenge"=>$zeile[ "attrib_wertemenge"], "attrib_vorhandene_werte"=>$vorhanden, "attrib_typ"=>$attrib_typ, "attrib_titel"=>$titel, "attrib_pos_in_maske"=>$pos_in_maske );
					}
					$rc			= count( $dokart_attribs );
					$meldung	= "Liefere ".$rc." Attribute für Dokument-/Aktenart ".$dokart_kuerzel.".";
				}
				else
				{
					if ( $ergebnis[ 0 ] == 0 )
					{
						$rc			= 0;
						$meldung	= "Es wurden keine Attribute für Dokument-/Aktenart ".$dokart_kuerzel." gefunden.";
					}
					else
					{
						$rc			= $ergebnis[ 0 ];
						$meldung	= $ergebnis[ 1 ];
					}
				}
			}
			else
			{
				$rc			= -1;
				$meldung	= "Es wurde kein Dokument-/Aktenartkürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_attribute_zu_dokumentart: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokart_attribs );
		
	}
	
	function attrib_aus_dokart_loeschen( $mandant_name, $dokart_kuerzel, $attrib_name )
	{
		$erg			= ist_attrib_in_dokart_enthalten( $mandant_name, $dokart_kuerzel, $attrib_name );
		
		$ok				= existiert_mandant( $mandant_name );
		
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		
		if ( $erg[ 0 ] > 0 )
		{
			$STATEMENT = "delete from ca_dokart_attrib where dokart_kuerzel = '".$dokart_kuerzel."' and attrib_id = ".$erg[ 0 ]." and mandant_id = ".$ok[ 0 ].";";
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] == 0 )
			{
				$rc			= 0;
				$meldung	= "Das Attribut ".$attrib_name." wurde aus der Dokumentart ".$dokart_kuerzel." gelöscht.";
			}
			else
			{
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Das Attribut ".$attrib_name." wurde nicht aus der Dokumentart ".$dokart_kuerzel." gelöscht: ".$ergebnis[ 1 ];
			}
			
		}
		else
		{
			if ( $erg[ 0 ] == 0 )
			{
				$rc			= 0;
				$meldung	= "Das Attribut ".$attrib_name." ist nicht in der Dokumentart ".$dokart_kuerzel." enthalten.";
			}
			else
			{
				$rc			= $erg[ 0 ];
				$meldung	= "Bei der Verarbeitung ist ein Fehler aufgetreten: ".$erg[ 1 ];
			}
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.attrib_aus_dokart_loeschen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function in_welchen_dokarten_ist_attribut_enthalten( $mandant_name, $attrib_name )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( strlen( $attrib_name ) > 0 )
		{
			$STATEMENT = "select d.dokart_kuerzel dokart_kuerzel from ca_dokart_attrib d, ca_attribut a where d.attrib_id = a.attrib_id and a.attrib_name = '".$attrib_name."' and a.mandant_id = ".$ok[ 0 ];
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach( $ergebnis[ 1 ] as $zeile )
				{
					$dokartliste_arr[]	= $zeile[ "dokart_kuerzel" ];
					$dokartliste_txt	= $dokartliste_txt.$zeile[ "dokart_kuerzel" ]." | ";
				}
				
				$dokartliste_txt = substr( $dokartliste_txt, 0, strlen( $dokartliste_txt ) - 3 );
				
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Das Attribut ".$attrib_name." ist in ".$rc." Dokument-/Aktenarten enthalten.";
			}
			else if ( $ergebnis[ 0 ] == 0 )
			{
				$dokartliste_arr = array();
				
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Das Attribut ".$attrib_name." ist in ".$rc." Dokument-/Aktenarten enthalten.";
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
			}
			
		}
		else
		{
			$rc			= -1;
			$meldung	= "Es wurde kein Attribut angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.in_welchen_dokarten_ist_attribut_enthalten: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokartliste_arr, $dokartliste_txt );
	}
	
	function attrib_in_dokart_konfigurieren( $mandant_name, $dokart_kuerzel, $attrib_name, $flags_arr )
	{
		/*
			erwartet ein Array in der Form:
			
			$flags_arr[ "pflicht" ]			= true
			$flags_arr[ "farbe" ]			= "gruen"
			$flags_arr[ "fett" ]			= false
			$flags_arr[ "unterstrichen" ]	= false
			$flags_arr[ "kursiv" ]			= false
			$flags_arr[ "titel" ]			= false
			$flags_arr[ "einheit" ]			= "km/h";
			$flags_arr[ "anzahl_nachkommastellen" ] = 3;
			
			Falls einer der Werte nicht angegeben wurde, wird auf "standard" bzw. false defaulted.
		*/
		$ok				= existiert_mandant( $mandant_name );
		$connection		= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			$erg			= ist_attrib_in_dokart_enthalten( $mandant_name, $dokart_kuerzel, $attrib_name );
			if ( $erg[ 0 ] > 0 )
			{
				if ( $flags_arr[ "pflicht" ] == true )
				{
					$pflicht = "1";
				}
				else
				{
					$pflicht = "0";
				}
				
				if ( $flags_arr[ "vorhandene_werte" ] == true )
				{
					$vorhanden = "1";
				}
				else
				{
					$vorhanden = "0";
				}
				
				//xlog( 1, "pflicht >".$flags_arr[ "pflicht" ]."< ");
				
				switch ( $flags_arr[ "farbe" ] )
				{
					case "standard":
						$farbe = "0";
						break;
					case "gruen":
						$farbe = "1";
						break;
					case "blau":
						$farbe = "2";
						break;
					case "gelb":
						$farbe = "3";
						break;
					case "rot":
						$farbe = "4";
						break;
					case "braun":
						$farbe = "5";
						break;
					default:
						$farbe = "0";
						break;
				}
				
				////////////////////////////////////
				//xlog(2, "fett >".$flags_arr[ "fett" ]."<" );
				if ( $flags_arr[ "fett" ] == true )
				{
					$fett = "1";
				}
				else
				{
					$fett = "0";
				}
				
				////////////////////////////////////
				//xlog(2, "unterstrichen >".$flags_arr[ "unterstrichen" ]."<" );
				if ( $flags_arr[ "unterstrichen" ] == true )
				{
					$unterstrichen = "1";
				}
				else
				{
					$unterstrichen = "0";
				}
				
				////////////////////////////////////
				//xlog(2, "kursiv >".$flags_arr[ "kursiv" ]."<" );
				if ( $flags_arr[ "kursiv" ] == true )
				{
					$kursiv = "1";
				}
				else
				{
					$kursiv = "0";
				}
				
				////////////////////////////////////
				
				//xlog(2, "kursiv >".$flags_arr[ "titel" ]."<" );
				if ( $flags_arr[ "titel" ] == true )
				{
					$titel = "1";
				}
				else
				{
					$titel = "0";
				}
				
				////////////////////////////////////
				
				
				
				switch ( $kursiv.$unterstrichen.$fett )
				{
					case "000":
						$fuk = "0";
						break;
					case "001":
						$fuk = "1";
						break;
					case "010":
						$fuk = "2";
						break;
					case "011":
						$fuk = "3";
						break;
					case "100":
						$fuk = "4";
						break;
					case "101":
						$fuk = "5";
						break;
					case "110":
						$fuk = "6";
						break;
					case "111":
						$fuk = "7";
						break;
					default:
						$fuk = "0";
						break;
				}
				
				$hochkomma = "'";
				if ( strlen( $flags_arr[ "anzahl_nachkommastellen" ] ) == 0 )
				{
					$flags_arr[ "anzahl_nachkommastellen" ] = "null";
					$hochkomma = "";
				}
				
				$flags = $pflicht.$farbe.$fuk.$vorhanden.$titel."0000000000";
				
				
				$STATEMENT = "update ca_dokart_attrib set attrib_einheit = '".mysqli_real_escape_string( $connection, $flags_arr[ "einheit" ] )."', attrib_laenge = ".$hochkomma.mysqli_real_escape_string( $connection, $flags_arr[ "anzahl_nachkommastellen" ] ).$hochkomma.", flags = '".mysqli_real_escape_string( $connection, $flags )."', pos_in_maske = ".mysqli_real_escape_string( $connection, $flags_arr[ "pos_in_maske" ] )." where mandant_id = ".$ok[ 0 ]." and dokart_kuerzel = '".mysqli_real_escape_string( $connection, $dokart_kuerzel )."' and attrib_id = ".$erg[ 0 ];
				
				//xlog( 1, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] == 0 )
				{
					$rc			= 0;
					$meldung	= "Die Flags des Attributs ".$attrib_name." in der Dokumentart ".$dokart_kuerzel." wurden geändert.";
				}
				else
				{
					$rc			= $ergebnis[ 0 ];
					$meldung	= "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
				}
			}
			else
			{
				// Attribut ist nicht in Dokumentart enthalten oder Fehler.
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Das Attribut ".$attrib_name." ist nicht in der Dokumentart ".$dokart_kuerzel." enthalten oder Fehler: ".$ergebnis[ 1 ];
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.attrib_in_dokart_konfigurieren: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_vorhandene_werte_zu_attrib( $mandant_name, $dokart_kuerzel, $attrib_name )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		$dokart_kuerzel	= mb_strtoupper( $dokart_kuerzel );
		
		if ( $ok[ 0 ] > 0 )
		{
			$erg			= ist_attrib_in_dokart_enthalten( $mandant_name, $dokart_kuerzel, $attrib_name );
			if ( $erg[ 0 ] > 0 )
			{
				$attrib = liefere_attributinformationen( $mandant_name, $attrib_name );
				
				$STATEMENT = "select distinct i.".$attrib[ 2 ][ "attrib_db_spalte" ]." spalte from ca_index i, ca_dok_ablage a where a.mandant_id = ".$ok[ 0 ]." and a.dokart_kuerzel = '".$dokart_kuerzel."' and i.dok_id = a.dok_id order by i.".$attrib[ 2 ][ "attrib_db_spalte" ];
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					foreach ( $ergebnis[ 1 ] as $element )
					{
						$ergebnis_arr[] = $element[ "spalte" ];
						$ergebnis_liste = $ergebnis_liste.$element[ "spalte" ]."|";
					}
					$ergebnis_liste = substr( $ergebnis_liste, 0, strlen( $ergebnis_liste ) - 1 );
					
					$rc			= $ergebnis[ 0 ];
					$meldung	= "Liefere ".$rc." gefundene Elemente.";
				}
				else
				{
					$rc			= 0;
					$meldung	= "Es wurden keine Elemente gefunden.";
					$ergebnis_arr = array();
					$ergebnis_liste = "";
				}
				
			}
			else
			{
				// Attribut ist nicht in Dokumentart enthalten oder Fehler.
				$rc			= $ergebnis[ 0 ];
				$meldung	= "Das Attribut ".$attrib_name." ist nicht in der Dokumentart ".$dokart_kuerzel." enthalten oder Fehler: ".$ergebnis[ 1 ];
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_vorhandene_werte_zu_attrib: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $ergebnis_arr, $ergebnis_liste );
	}
	
	
	
	
	
	
	
	
	function depot_anlegen( $mandant_name, $kuerzel, $typ, $ort, $schranke = 0, $scramble = false, $status="offen", $beschreibung = "" )
	{
		// Schranke: default 2 GB, wird unten gesetzt
		
		$ok				= existiert_mandant( $mandant_name );
		$connection 	= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $kuerzel ) > 0 )
			{
				$kuerzel	= mb_strtoupper( $kuerzel );
				$typ		= mb_strtoupper( $typ );
				$status		= mb_strtolower( $status );
				
				if ( ( $typ == "D" ) || ( $typ == "F" ) )
				{
					$rc = 0;
					if ( $typ == "F" )
					{
						if ( strlen( $ort ) > 0 )
						{
							/*
							// Prüfen ob korrektes Verzeichnis
							$ort_arr = explode( DIRECTORY_SEPARATOR, $ort );
							
							foreach( $ort_arr as $elem )
							{
								if ( strlen( $elem ) > 0 )
								{
									if ( strlen( $ort_fix ) > 0 )
									{
										$ort_fix = $ort_fix.DIRECTORY_SEPARATOR.$elem;
									}
									else
									{
										$ort_fix = $elem;
									}
								}
							}
							*/
							
							if ( is_dir( $ort ) )
							{
								
								$test1	= fopen( $ort.DIRECTORY_SEPARATOR."test.test", "w" );
								$test2	= fwrite( $test1, "123");
								
								if ( ( $test1 !== false ) && ( $test2 !== false ) )
								{
									// alles gut!
									fclose( $test );
									unlink( $ort.DIRECTORY_SEPARATOR."test.test" );
									$ort_fix = $ort.DIRECTORY_SEPARATOR;
								}
								else
								{
									$rc = -3;
									$meldung = "Es gab einen Dateisystemfehler beim Testen des Depot-Verzeichnisses.";
								}
							}
							else
							{
								$rc = -7;
								$meldung = "Der angegebene Speicherort '".$ort."' ist kein gültiges Verzeichnis.";
							}
						}
						else
						{
							$rc = -6;
							$meldung = "Zu einem Dateisystem-Depot wurde kein Ablageort (Verzeichnis auf der Festplatte) angegeben.";
						}
					}
					else
					{
						if ( strlen( $ort ) > 0 )
						{
							// Beim Typ "D" darf kein Ort angegeben sein.
							xlog( 3, "Bei Ablage im Typ 'D' (Datenbank) darf kein Ort angegeben sein. Die Angabe wird ignoriert." );
							$ort = "";
						}
					}
					
					if ( $schranke == 0 )
					{
						$schranke = 2 * 1024 * 1024 * 1024;
					}
					
					if ( $rc == 0 )
					{
						if ( $scramble == true )
						{
							$scramble_wert = "ja";
						}
						else
						{
							$scramble_wert = "nein";
						}
						
						// alles gut, die Tests waren erfolgreich
						$STATEMENT = "insert into ca_depot( mandant_id, ao_kuerzel, ao_typ, ao_ort, ao_erstellt_am, ao_beschreibung, ao_scramble, ao_status, ao_schranke, ao_geaendert_am ) values ( ".$ok[ 0 ].", '".mysqli_real_escape_string( $connection, $kuerzel )."', '".mysqli_real_escape_string( $connection, $typ )."', '".mysqli_real_escape_string( $connection, $ort )."', '".time()."', '".mysqli_real_escape_string( $connection, $beschreibung )."', '".mysqli_real_escape_string( $connection, $scramble_wert )."', '".mysqli_real_escape_string( $connection, $status )."', ".mysqli_real_escape_string( $connection, $schranke ).", '' ); ";
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] == 0 )
						{
							$rc = 0;
							$meldung = "Das Depot '".$kuerzel."' wurde erfolgreich angelegt.";
						}
						else
						{
							$rc = -5;
							$meldung = "Es gab einen Fehler bei Anlage des Depots '".$kuerzel."'.";
						}
					}
					
					// else wurde oben schon gesetzt
					
				}
				else
				{
					$rc = -2;
					$meldung = "Es wurde kein (korrekter) Typ angegeben.";
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Kürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.depot_anlegen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_depotinformationen( $mandant_name, $kuerzel, $ausfuehrlich = false )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $kuerzel ) > 0 )
			{
				$kuerzel	= mb_strtoupper( $kuerzel );
				
				$STATEMENT = "select mandant_id, ao_kuerzel, ao_typ, ao_ort, ao_erstellt_am, ao_beschreibung, ao_geaendert_am, ao_scramble, ao_status, ao_schranke  from ca_depot where mandant_id = ".$ok[ 0 ]." and ao_kuerzel = '".$kuerzel."'";
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] == 1 )
				{
					foreach( $ergebnis[ 1 ] as $dep )
					{
						foreach( $dep as $eigenschaft => $wert )
						{
							
							switch ( $eigenschaft )
							{
								case "ao_geaendert_am":
								case "ao_erstellt_am":
									//$wert_fertig = date( "d.m.Y H:i", $wert )." Uhr";
									$wert_fertig = $wert;
									break;
								case "ao_scramble":
									if ( $wert == "ja" )
									{
										$wert_fertig = true;
									}
									else
									{
										$wert_fertig = false;
									}
									break;
								case "ao_schranke":
									$original_wert = $wert;
									$wert_fertig = $wert / 1024 / 1024;
									break;
								default:
									$wert_fertig = $wert;
									break;
								
							}
							
							if ( $eigenschaft != "mandant_id" )
							{
								$eigenschaft = substr( $eigenschaft, 3 );
							}
							
							$erg_arr[ $eigenschaft ] = $wert_fertig;
						}
					}
					$erg_arr[ "kuerzel" ] = $kuerzel;
					$erg_arr[ "schranke_byte" ] = $original_wert;
					$erg_arr[ "schranke_text" ] = round( $original_wert / 1024 / 1024 , 2)." MB";
					
					if ( $ausfuehrlich == true )
					{
						$STATEMENT = "select sum( groesse ) summe from ca_dok_datei where mandant_id = ".$ok[ 0 ]." and dok_id in ( select dok_id from ca_dok_ablage where depot = '".$kuerzel."' and mandant_id = ".$ok[ 0 ]." )";
						
						//xlog( 4, $STATEMENT );
						
						$ergebnis = xdb( $STATEMENT );
						
						
						if ( strlen( $ergebnis[ 1 ][ 0 ][ "summe" ] ) == 0 )
						{
							$aktuelle_groesse_byte = 0;
						}
						else
						{
							$aktuelle_groesse_byte = $ergebnis[ 1 ][ 0 ][ "summe" ];
						}
						
						
						$erg_arr[ "aktuelle_groesse_byte" ] = $aktuelle_groesse_byte;
						
						//xlog( 1, $aktuelle_groesse_byte );
						
						//$aktuelle_groesse_byte = str_replace( ".", ",", $aktuelle_groesse_byte );
						
						$megabyte = round( $aktuelle_groesse_byte / 1024 / 1024 , 2);
						
						$aktuelle_groesse_text = "0 MB";
						
						if ( $megabyte > 0 )
						{
							$aktuelle_groesse_text = $megabyte." MB ";
						}
						
						$erg_arr[ "aktuelle_groesse_text" ] = $aktuelle_groesse_text;
					}
					else
					{
						$erg_arr[ "aktuelle_groesse_text" ] = "unbekannt.";
						$erg_arr[ "aktuelle_groesse_byte" ] = 0;
					}
					
					
					
					
					$rc = 1;
					$meldung = "Liefere Informationen zu Depot '".$kuerzel."'.";
				}
				else
				{
					$rc = -2;
					$meldung = "Es ist ein Fehler aufgetreten: ".$ergebnis[ 1 ];
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Kürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_depotinformationen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $erg_arr );
	}
	
	function depot_loeschen( $mandant_name, $kuerzel )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $kuerzel ) > 0 )
			{
				$kuerzel	= mb_strtoupper( $kuerzel );
				
				$STATEMENT = "select count(*) anzahl from ca_dok_ablage where mandant_id = ".$ok[ 0 ]." and depot = '".$kuerzel."'";
				
				//xlog( 4, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 1 ][ 0 ][ "anzahl" ] == 0 )
				{
					
					$ergebnis = welche_dokumentarten_verwenden_depot( $mandant_name, $kuerzel );
					
					if ( $ergebnis[ 0 ] == 0 )
					{
						$STATEMENT = "delete from ca_depot where mandant_id = ".$ok[ 0 ]." and ao_kuerzel = '".$kuerzel."'";
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] <> -1 )
						{
							$rc = 0;
							$meldung = "Das Depot '".$kuerzel."' wurde im Mandanten '".$mandant_name."' gelöscht.";
						}
						else
						{
							$rc = -4;
							$meldung = "Es ist ein Fehler aufgetreten: '".$ergebnis[ 1 ]."'.";
						}
					}
					else
					{
						$rc = -3;
						$meldung = "Das Depot '".$kuerzel."' wird noch von den Dokumentarten ".$ergebnis[ 3 ]." verwendet und kann daher nicht gelöscht werden.";
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Das Depot '".$kuerzel."' kann nicht gelöscht werden, weil es noch Dokumente enthält.";
				}
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Kürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.depot_loeschen: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $ergebnis_arr, $ergebnis_liste );
	}
	
	function welche_dokumentarten_verwenden_depot( $mandant_name, $kuerzel )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $kuerzel ) > 0 )
			{
				$kuerzel	= mb_strtoupper( $kuerzel );
				$STATEMENT = "select dokart_kuerzel from ca_dokart where dokart_depot = '".$kuerzel."' and mandant_id = ".$ok[ 0 ];
				
				$ergebnis = xdb( $STATEMENT );
				
				foreach ( $ergebnis[ 1 ] as $zeile )
				{
					$ergebnis_arr[] = $zeile[ "dokart_kuerzel" ];
					$ergebnis_list	= $ergebnis_list.$zeile[ "dokart_kuerzel" ]."|";
				}
				$ergebnis_list = substr( $ergebnis_list, 0, -1 );
				$rc = count( $ergebnis_arr );
				$meldung = "Das Depot '".$kuerzel."' wird von ".$rc." Dokumentarten verwendet.";
				
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Kürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.welche_dokumentarten_verwenden_depot: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $ergebnis_arr, $ergebnis_list );
	}
	
	function depot_aendern( $mandant_name, $kuerzel, $ort, $schranke = 0, $status = "offen", $beschreibung = "" )
	{
		// Scramble und Typ sind nicht änderbar
		// Datenbank-Depots sind ebenfalls nicht änderbar.
		
		$ok				= existiert_mandant( $mandant_name );
		$connection 	= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $kuerzel ) > 0 )
			{
				$kuerzel	= mb_strtoupper( $kuerzel );
				$typ		= mb_strtoupper( $typ );
			
				$rc = 0;
				$depot = liefere_depotinformationen( $mandant_name, $kuerzel );
				
				if ( $depot[ 0 ] > 0 )
				{
					if ( $depot[ 2 ][ "typ" ] == "F" )
					{
						/*
						// Prüfen ob korrektes Verzeichnis
						$ort_arr = explode( DIRECTORY_SEPARATOR, $ort );
						
						foreach( $ort_arr as $elem )
						{
							if ( strlen( $elem ) > 0 )
							{
								if ( strlen( $ort_fix ) > 0 )
								{
									$ort_fix = $ort_fix.DIRECTORY_SEPARATOR.$elem;
								}
								else
								{
									$ort_fix = $elem;
								}
							}
						}
						*/
						
						if ( is_dir( $ort ) )
						{
							
							$test1	= fopen( $ort.DIRECTORY_SEPARATOR."test.test", "w" );
							$test2	= fwrite( $test1, "123");
							
							if ( ( $test1 !== false ) && ( $test2 !== false ) )
							{
								// alles gut!
								fclose( $test );
								unlink( $ort.DIRECTORY_SEPARATOR."test.test" );
								//$ort_fix = $ort.DIRECTORY_SEPARATOR;
							}
							else
							{
								$rc = -3;
								$meldung = "Es gab einen Dateisystemfehler beim Testen des Depot-Verzeichnisses.";
							}
						}
						else
						{
							$rc = -7;
							$meldung = "Der angegebene Speicherort '".$ort."' ist kein gültiges Verzeichnis.";
						}
					}
					
					$status =  mb_strtolower( $status );
					
					if ( ( $status != "offen" ) && ( $status != "geschlossen" ) )
					{
						$rc = -7;
						$meldung = "Es wurde kein korrekter neuer Status ('".$status."') angegeben.";
					}
					
					if ( $schranke == 0 )
					{
						$schranke = 50 * 1024 * 1024;
					}
					
					if ( $rc == 0 )
					{
						// alles gut, die Tests waren erfolgreich
						$STATEMENT = "update ca_depot set ao_ort='".mysqli_real_escape_string( $connection, $ort )."', ao_beschreibung='".mysqli_real_escape_string( $connection, $beschreibung )."', ao_geaendert_am='".time()."', ao_status = '".mysqli_real_escape_string( $connection, $status )."', ao_schranke = ".mysqli_real_escape_string( $connection, $schranke )." where ao_kuerzel = '".mysqli_real_escape_string( $connection, $kuerzel )."' and mandant_id=".$ok[ 0 ];
						
						//xlog( 4, $STATEMENT );
						
						$ergebnis = xdb( $STATEMENT );
						
						if ( $ergebnis[ 0 ] == 0 )
						{
							$rc = 0;
							$meldung = "Das Depot '".$kuerzel."' wurde erfolgreich aktualisiert.";
						}
						else
						{
							$rc = -5;
							$meldung = "Es gab einen Fehler beim Ändern des Depots '".$kuerzel."'.";
						}
					}
				
				}
				else
				{
					$rc = -4;
					$meldung = "Das gewünschte Depot '".$kuerzel."' wurde nicht gefunden und kann daher nicht geändert werden.";
				}
					
					
					
				
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Kürzel angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.depot_aendern: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function welche_depots_gibt_es( $mandant_name )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			$STATEMENT = "select ao_kuerzel from ca_depot where mandant_id = ".$ok[ 0 ];
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( $ergebnis[ 0 ] > 0 )
			{
				foreach( $ergebnis[ 1 ] as $zeile )
				{
					$ergebnis_arr[ ] = $zeile[ "ao_kuerzel" ];
				}
				$rc = count( $ergebnis_arr );
				$meldung = "Liefere ".$rc." Depots für Mandant '".$mandant_name."'.";
			}
			else
			{
				$ergebnis_arr = array();
				$rc = 0;
				$meldung = "Entweder gibt es keine Depots, oder es ist ein Fehler aufgetreten (".$ergebnis[ 1 ].").";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.welche_depots_gibt_es: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $ergebnis_arr );
	}
	
	function lege_dokument_in_depot_ab( $mandant_name, $depot_name, $dok_id, $kennung, $dokument_binary, $optionen = array() )
	{
		$ok				= existiert_mandant( $mandant_name );
		$connection		= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			$depot = liefere_depotinformationen( $mandant_name, $depot_name, true );
			
			if ( $depot[ 0 ] == 1 )
			{
				
				$mime_type					= $optionen[ "mime_type" ];
				$ursprungs_dateiname		= $optionen[ "ursprungs_dateiname" ];
				$zeitstempel				= $optionen[ "zeitstempel" ];
				$neues_dokument				= $optionen[ "neues_dokument" ];
				$datei_erw_typ				= $optionen[ "datei_erw_typ" ];
				$md5						= $optionen[ "md5" ];
				
				$status					= $depot[ 2 ][ "status" ];
				$schranke				= $depot[ 2 ][ "schranke_byte" ];
				$typ					= $depot[ 2 ][ "typ" ];
				$ort					= $depot[ 2 ][ "ort" ];
				$scramble				= $depot[ 2 ][ "scramble" ];
				$aktuelle_groesse_byte	= $depot[ 2 ][ "aktuelle_groesse_byte" ];
				$kuerzel				= $depot[ 2 ][ "kuerzel" ];
				
				// dieses Statement wäre noch zu prüfen, wenn man mal weitere Dateitypen zu einem Dokument (z. B. OCR-Dateien, ....) archivieren will - dann sollte $datei_erw_typ auch andere Werte annehmen können als 0 und 1.
				if ( $datei_erw_typ <> 1 )
				{
					$datei_erw_typ = 0;
				}
				
				
				if ( $scramble )
				{
					$dokument_binary = substr( $dokument_binary, 20 ).substr( $dokument_binary, 0, 20);
					$dokument_binary = str_rot13( $dokument_binary );
				}
				
				$pruef_summe = bcadd( $aktuelle_groesse_byte, strlen( $dokument_binary ) );
				
				if ( $pruef_summe <= $schranke )
				{
					if ( $status == "offen" )
					{
						
						if ( strlen( $dok_id ) == 0 )
						{
							$update	= " kennung = '".mysqli_real_escape_string( $connection, $kennung )."' ";
							
						}
						else
						{
							$update = " dok_id = ".$dok_id;
							
						}
						
						$STATEMENT = "select d_version, dok_id, kennung from ca_dok_ablage where ".$update;
						
						//xlog( 1, $STATEMENT );
						
						$ergebnis = xdb( $STATEMENT );
						
						//xlog( 1, "Anzahl treffer: ".json_encode( $ergebnis ) );
						
						if ( strlen( $ergebnis[ 1 ][ 0 ][ "d_version" ] ) == 0 )
						{
							$version = 0;
						}
						else
						{
							$version		= $ergebnis[ 1 ][ 0 ][ "d_version" ];
						}
						
						$dok_id			= $ergebnis[ 1 ][ 0 ][ "dok_id" ];
						$kennung		= $ergebnis[ 1 ][ 0 ][ "kennung" ];
						$log_erg		= "";
						$j_flag			= 0;
						
						if ( $neues_dokument )
						{
							$ereignis		= "IMPORT";
							$k_version		= "+";
							$d_version		= "+";
							$erw_datei_typ	= "0";
						}
						else
						{
							switch( $datei_erw_typ )
							{
								// sollte man diese Liste von Case-Fällen mal erweitern wollen, z. B. um auch OCR-Dateien ablegen zu können, müßte ebenfalls erzeuge_neuen_versionseintrag() angepasst werden.
								case "1":
									$erw_datei_typ	= "1";
									$j_flag			= 1;
									$k_version		= "";
									$d_version		= "";
									$ereignis		= "PIC_RESIZE";
									$log_erg		= " / ".$ereignis;
									break;
								default:
									$erw_datei_typ	= "0";
									$k_version		= "";
									$d_version		= "+";
									$ereignis		= "NEUE_DATEI";
							}
							
							
							
							
						}
						//erzeuge_neuen_versionseintrag( $dok_id, $ereignis, $d_version = "", $k_version = "", $info = "" )
						$neuer_versionseintrag = erzeuge_neuen_versionseintrag( $dok_id, $ereignis, $d_version, $k_version, "" );
						
						//xlog( 1, json_encode( $neuer_versionseintrag ) );
						
						$neue_d_version = $neuer_versionseintrag[ 2 ];
						
						if ( $neue_d_version > 1 )
						{
							$v_flag = "1";
						}
						else
						{
							$v_flag = "0";
						}
						
						/*
						xlog( 1, "dok_id ".$dok_id );
						xlog( 1, "version ".$version );
						xlog( 1, "kennung ".$kennung );
						xlog( 1, "neue_d_version ".$neue_d_version );
						*/
						
						$groesse = strlen( $dokument_binary );
						
						/// Ablage wo genau?
						if ( $typ == "D" )
						{
							// Datenbank
							$abl_verfahren = 20;
							
							if ( $pic_resize != "gesetzt" )
							{
									
								$STATEMENT = "insert into ca_dok_datei ( mandant_id, dok_id, version, dokument, groesse, mime_type, ursprungs_dateiname, erstellt_am, md5, erw, abl_verfahren, opt_info_1, opt_info_2, opt_info_3, opt_info_4, opt_info_5 ) values ( ".$ok[ 0 ].", ".$dok_id.", ".$neue_d_version.", '".mysqli_real_escape_string( $connection, $dokument_binary )."', ".$groesse.", '".mysqli_real_escape_string( $connection, $mime_type )."', '".mysqli_real_escape_string( $connection, $ursprungs_dateiname )."', '".$neuer_versionseintrag[ 4 ]."', '".$md5."', 0, 0, '' , '' , '' , '' , '' )";
								
								$ergebnis = xdb( $STATEMENT );
								
								//xlog( 1, $STATEMENT );
								//xlog( 1, $ergebnis[ 0 ] );
								
								$STATEMENT = "update ca_dok_ablage set depot = '".mysqli_real_escape_string( $connection, $kuerzel )."', v_flag = '".$v_flag."', abl_verfahren = ".$abl_verfahren." where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
								
								//xlog( 4, $STATEMENT );
								
								$ergebnis2 = xdb( $STATEMENT );
								
								
								
								
								
								if ( $ergebnis[ 0 ] == 0 )
								{
									$rc			= 1;
									$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." wurde im Depot '".$kuerzel."' abgelegt.";
								}
								else
								{
									$rc			= -41;
									$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." konnte nicht im Depot '".$kuerzel."' abgelegt werden: ".$ergebnis[ 1 ];
								}
							}
							else
							{
								$rc			= -42;
								$meldung	= "PIC_RESIZE-Dokumente können nicht in DB-Depots abgelegt werden.";
							}
						}
						else
						{
							// Dateisystem
							$rc = 0;
							$abl_verfahren = 110;
							
							$ablagepfad = liefere_ablagepfad_zu_dokument( $mandant_name, $dok_id, $depot, $neuer_versionseintrag[ 2 ], $erw_datei_typ, $abl_verfahren );
							
							if ( $ablagepfad[ 0 ] == 0 )
							{
								$dateidok	= $ablagepfad[ 2 ];
								$ablagepfad	= $ablagepfad[ 3 ];
								$gesamt		= $ablagepfad[ 4 ];
								
							}
							
							$ergebnis = is_dir( $ablagepfad );
							
							if ( !$ergebnis )
							{
								$ergebnis = mkdir( $ablagepfad, 0777, true );
								
								if ( !$ergebnis )
								{
									$rc = -5;
									$meldung = "Das Ablageverzeichnis existiert nicht, ließ sich aber nicht anlegen.";
								}
							}
							
							if ( $rc == 0 )
							{
								// ab hier sollte das Ablageverzeichnis existieren.
								xlog( 1, "Ablagepfad ". $ablagepfad.$dateidok );
								$ergebnis = file_put_contents( $ablagepfad.$dateidok, $dokument_binary);
								
								if ( $ergebnis !== false )
								{
									$STATEMENT = "insert into ca_dok_datei ( mandant_id, dok_id, version, groesse, mime_type, ursprungs_dateiname, erstellt_am, abl_verfahren, erw, md5, opt_info_1, opt_info_2, opt_info_3, opt_info_4, opt_info_5, dokument  ) values ( ".$ok[ 0 ].", ".$dok_id.", ".$neue_d_version.", ".$groesse.", '".mysqli_real_escape_string( $connection, $mime_type )."', '".mysqli_real_escape_string( $connection, $ursprungs_dateiname )."', '".$neuer_versionseintrag[ 4 ]."', ".$abl_verfahren.", ".$j_flag.", '".$md5."', '' , '' , '' , '' , '', '' )";
									
									//xlog( 1, $STATEMENT );
									//xlog( 1, $ergebnis[ 0 ] );
									
									
									
									$ergebnis = xdb( $STATEMENT );
									
									
									
									$STATEMENT = "update ca_dok_ablage set depot = '".mysqli_real_escape_string( $connection, $kuerzel )."', v_flag = '".$v_flag."', j_flag = '".$j_flag."' where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
									//$STATEMENT = "update ca_dok_ablage set depot = '".mysqli_real_escape_string( $connection, $kuerzel )."', v_flag = '".$v_flag."', j_flag = '".$j_flag."', archivierungsdatum = '".time()."' where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
									//xlog( 5, $STATEMENT );
									$ergebnis = xdb( $STATEMENT );
									
									
									if ( $ergebnis[ 0 ] == 0 )
									{
										$rc			= 1;
										$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." (Version ".$neuer_versionseintrag[ 2 ].$log_erg.") wurde im Depot '".$kuerzel."' abgelegt.";
									}
									else
									{
										unlink( $ablagepfad.$dateidok );
										$rc			= -41;
										$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." (Version ".$neuer_versionseintrag[ 2 ].$log_erg.") konnte nicht im Depot '".$kuerzel."' abgelegt werden: ".$ergebnis[ 1 ];
									}
									
								}
								else
								{
									$rc			= -41;
									$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." konnte nicht im Depot '".$kuerzel."' abgelegt werden: ".$ergebnis[ 1 ];
								}
							}
							
							// else-Zweig unnötig, da $rc oben bereits gesetzt wird.
							
						}
					}
					else
					{
						$rc = -42;
						$meldung = "Die Nutzdatei zu Dokument ".$dok_id." konnte nicht im Depot '".$kuerzel."' abgelegt werden, da das Depot nicht offen ist.";
					}
				}
				else
				{
					$rc			= -3;
					$meldung	= "Der Einlagern dieses Dokuments (ID: ".$dok_id.") in das Depot '".$kuerzel."' würde die maximale Größe des Depots überschreiten.";
				}
				
			}
			else
			{
				$rc			= -2;
				$meldung	= $depot[ 1 ];
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.lege_dokument_in_depot_ab: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $neuer_versionseintrag[ 2 ], $dok_id, $kennung );
	}
	
	function liefere_dokumentbinary( $mandant_name, $benutzer_anmeldename, $dok_id, $optionen = array() )
	{
		/*
			abl_verfahren = 100 => 
			{
				if ( $scramble )
				{
					$dokument_binary = "0000".$dokument_binary;
				}
				
				$dateidok = str_pad( $dok_id, 12, "0", STR_PAD_LEFT);
				
				$ebene_1 = substr( $dateidok, 0, 6 );
				$ebene_2 = substr( $dateidok, 6, 2 );
				$ebene_3 = substr( $dateidok, 8, 4 );
				
				$ablagepfad = $ort.DIRECTORY_SEPARATOR.$ok[ 0 ].DIRECTORY_SEPARATOR.$kuerzel.DIRECTORY_SEPARATOR.$ebene_1.DIRECTORY_SEPARATOR.$ebene_2.DIRECTORY_SEPARATOR;
				
				$ergebnis = file_put_contents( $ablagepfad.$dateidok, $dokument_binary);
			}
			
			abl_verfahren = 102 => 
			{
				if ( $scramble )
				{
					$dokument_binary = substr( $dokument_binary, 20, 0).substr( $dokument_binary, 0, 20);
				}
				
				$dateidok = str_pad( $dok_id, 12, "0", STR_PAD_LEFT);
				
				$ebene_1 = substr( $dateidok, 0, 6 );
				$ebene_2 = substr( $dateidok, 6, 2 );
				$ebene_3 = substr( $dateidok, 8, 4 );
				
				$ablagepfad = $ort.DIRECTORY_SEPARATOR.$ok[ 0 ].DIRECTORY_SEPARATOR.$kuerzel.DIRECTORY_SEPARATOR.$ebene_1.DIRECTORY_SEPARATOR.$ebene_2.DIRECTORY_SEPARATOR;
				
				$ergebnis = file_put_contents( $ablagepfad.$dateidok, $dokument_binary);
			}
			
		*/
		
		$version			= $optionen[ "version" ];
		$erw_datei_typ		= $optionen[ "erw_datei_typ" ];
		
		switch( $erw_datei_typ )
		{
			case "1":
				$erw_datei_typ = "1";
				break;
			default:
				$erw_datei_typ = "0";
				break;
		}
		
		
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			//xlog( 1, "strlen".strlen( $dok_id ));
			//xlog( 1, "is_int".is_int( $dok_id ) );
			if ( strlen( $dok_id ) > 0 )
			{
				
				// Depot feststellen
				// Feststellen, ob typ = D oder typ = F
				// Scramble feststellen
				// Benutzerrechte prüfen
				// ggf. Pfad zusammensetzen
				// Dokument ausliefern
				
				if ( strlen( $version ) > 0 )
				{
					$STATEMENT = "select a.depot depot, c.dokument dokument, c.abl_verfahren abl_verfahren, d.ao_typ typ, d.ao_scramble scramble, d.ao_ort ort, a.dokart_kuerzel dokart_kuerzel, c.ursprungs_dateiname ursprungs_dateiname, c.erw erw, c.mime_type mime_type FROM ca_depot d, ca_dok_ablage a, ca_dok_datei c WHERE c.version = ".$version." and c.dok_id = a.dok_id and a.depot = d.ao_kuerzel AND a.dok_id = ".$dok_id." and d.mandant_id = ".$ok[ 0 ];
				}
				else
				{
					$STATEMENT = "select a.depot depot, c.dokument dokument, a.d_version d_version, c.abl_verfahren abl_verfahren, d.ao_typ typ, d.ao_scramble scramble, d.ao_ort ort, a.dokart_kuerzel dokart_kuerzel, c.ursprungs_dateiname ursprungs_dateiname, c.erw erw, c.mime_type mime_type FROM ca_depot d, ca_dok_ablage a, ca_dok_datei c WHERE c.version = a.d_version and c.dok_id = a.dok_id and a.depot = d.ao_kuerzel AND a.dok_id = ".$dok_id." and d.mandant_id = ".$ok[ 0 ];
				}
				
				//xlog( 1, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				
				if ( $ergebnis[ 0 ] > 0 )
				{
					$sicherungs_arr		= array();
					$ziel_arr			= array();
					
					//xlog( 5, json_encode( $ergebnis[ 1 ]) );
					
					foreach( $ergebnis[ 1 ] as $treffer )
					{
						//xlog( 4, json_encode( $treffer ) );
						if ( $treffer[ "erw" ] == 0 )
						{
							$sicherungs_arr = $treffer;
						}
						
						if ( $treffer[ "erw" ] == $erw_datei_typ )
						{
							$ziel_arr = $treffer;
							break;
						}
					}
					
					if ( count( $ziel_arr ) == 0 )
					{
						$ziel_arr = $sicherungs_arr;
					}
					
					//xlog( 4, json_encode( $ziel_arr) );
					
					( $ziel_arr[ "scramble" ] == "ja" ) ? $scramble = true : $scramble = false;
					$depot					= $ziel_arr[ "depot" ];
					$typ					= $ziel_arr[ "typ" ];
					$ort					= $ziel_arr[ "ort" ];
					$erw					= $ziel_arr[ "erw" ];
					
					if ( $erw == 0 )
					{
						$erw_datei_typ = "0";
					}
					
					//xlog( 1, "Ort ".$ort );
					
					if ( strlen( $version ) > 0 )
					{
						$d_version			= $version;
					}
					else
					{
						$d_version			= $ziel_arr[ "d_version" ];
					}
					$dokart_kuerzel			= $ziel_arr[ "dokart_kuerzel" ];
					$abl_verfahren			= $ziel_arr[ "abl_verfahren" ];
					$dokument_binary		= $ziel_arr[ "dokument" ];
					
					
					$weitere_infos[ "mime_type" ]			= $ziel_arr[ "mime_type" ];
					$weitere_infos[ "ursprungs_dateiname" ]	= $ziel_arr[ "ursprungs_dateiname" ];
					
					
					
					// Check Benutzerrechte
					
					$sysrechte = besitzt_benutzer_systemrecht( $mandant_name, $benutzer_anmeldename, "D_".$dokart_kuerzel."_LESEN" );
					
					if ( $sysrechte[ 0 ] == 1 )
					{
						if ( $typ == "D" )
						{
							$rc = 1;
							$meldung = "Liefere Dokument-Binary zu Dokument ".$dok_id.".";
						}
						else
						{
							switch( $abl_verfahren )
							{
								case "110":
									
									$pfad = liefere_ablagepfad_zu_dokument( $mandant_name, $dok_id, $depot, $d_version, $erw_datei_typ, $abl_verfahren );
									
									
									
									$dokument_binary = file_get_contents( $pfad[ 4 ] );
									
									
									
									if ( $scramble )
									{
										$dokument_binary = str_rot13( $dokument_binary );
										$dokument_binary = substr( $dokument_binary, -20, 20).substr( $dokument_binary, 0, -20 );
										
									}
									else
									{
										$dokument_binary = $dokument_binary;
									}
									
									//xlog( 1, "Länge Dokument-binary ".strlen( $dokument_binary ) );
									break;
							}
							
							$rc = 1;
							$meldung = "Liefere Dokument-Binary zu Dokument ".$dok_id." (Version ".$d_version.").";
						}
					}
					else
					{
						$rc = -3;
						$meldung = "Der Benutzer '".$benutzer_anmeldename."' besitzt nicht das entsprechende Systemrecht, um sich das Dokument ".$dok_id." anzeigen zu lassen.";
						$dokument_binary = file_get_contents( "img/geht_nicht.png" );
						$weitere_infos[ "mime_type" ]			= "image/png";
						$weitere_infos[ "ursprungs_dateiname" ]	= "nix_da.png";
						
					}
				}
				else
				{
					$rc = -2;
					$meldung = "Es ist ein Fehler aufgetreten: ".$ergebnis[ 0 ];
				}
				
			}
			else
			{
				$rc = -4;
				$meldung = "Es wurde keine gültige Dok-ID angegeben ('".$dok_id."').";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_dokumentbinary: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokument_binary, $weitere_infos );
	}
	
	function liefere_ablagepfad_zu_dokument( $mandant_name, $dok_id, $depot, $version = 1, $erw_datei_typ = 0, $ablage_verfahren = 110 )
	{
		
		$ok				= existiert_mandant( $mandant_name );
		//$connection		= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( ! is_array( $depot ) )
			{
				$depot = liefere_depotinformationen( $mandant_name, $depot );
			}
			
			
			if ( $depot[ 0 ] == 1 )
			{
				$ort					= $depot[ 2 ][ "ort" ];
				$kuerzel				= $depot[ 2 ][ "kuerzel" ];
				
				switch ( $ablage_verfahren )
				{
					case 110:
						
						$dateidok = str_pad( $dok_id, 12, "0", STR_PAD_LEFT);
						
						//000001000104
						
						$ebene_1 = substr( $dateidok, 0, 6 );
						$ebene_2 = substr( $dateidok, 6, 3 );
						//$ebene_3 = substr( $dateidok, 8, 4 );
						
						$dateidok = $dateidok.".".$version.".".$erw_datei_typ;
						
						$ablagepfad = $ort.DIRECTORY_SEPARATOR.$ok[ 0 ].DIRECTORY_SEPARATOR.$kuerzel.DIRECTORY_SEPARATOR.$ebene_1.DIRECTORY_SEPARATOR.$ebene_2.DIRECTORY_SEPARATOR;
						
						$vollstaendig = $ablagepfad.$dateidok;
						
						$rc = 0;
						$meldung = "Liefere Ablagepfad zu Dokument ".$dok_id.".";
						break;
						
					default:
						$rc = -3;
						$meldung = "Das Ablageverfahren ".$ablage_verfahren." ist nicht bekannt.";
						break;
				}
			}
			else
			{
				$rc			= -2;
				$meldung	= $depot[ 1 ];
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.liefere_ablagepfad_zu_dokument: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dateidok, $ablagepfad, $vollstaendig );
	}
	
	function liefere_dateien_zu_dokument( $mandant_name, $dok_id )
	{
		$ok				= existiert_mandant( $mandant_name );
		$connection		= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dok_id ) > 0 )
			{
				$dok			= liefere_dokumentinformationen( $mandant_name, $dok_id );
				$depot			= $dok[ 2 ][ "depot" ];
				$abl_verfahren	= $dok[ 2 ][ "abl_verfahren" ];
				
				$versionen		= liefere_versionseintraege( $dok_id );
				if ( $versionen[ 0 ] > 0 )
				{
					foreach ( $versionen[ 2 ] as $version )
					{
						switch( $version[ "ereignis" ] )
						{
							case "IMPORT":
							case "NEUE_DATEI":
							case "PIC_RESIZE":
								$ergebnis = liefere_ablagepfad_zu_dokument( $mandant_name, $dok_id, $depot, $version[ "d_version" ], $version[ "erw" ], $abl_verfahren );
								$dateien[] = $ergebnis[ 4 ];
								break;
						}
					}
					$rc = count( $dateien );
					$meldung = "Zum Dokument ".$dok_id." wurden ".$rc." Dateien gefunden.";
				}
				else
				{
					$rc = -3;
					$meldung = "Zum Dokument ".$dok_id." wurden keine Versionseinträge gefunden oder Fehler: ".$versionen[ 0 ]." / ".$versionen[ 1 ];
				}
				
			}
			else
			{
				$rc = -2;
				$meldung = "Es wurde keine Dokument-ID angegeben.";
			}
			
			
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_dateien_zu_dokument: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dateien );
	}
	
	
	
	function aktualisiere_dokument_attribute( $mandant_name, $dok_id, $neue_attribute_arr, $mehrfachattribute )
	{
		
		$ok				= existiert_mandant( $mandant_name );
		$connection 	= mysqli_connect( "localhost", "ca_db", "ca_db", "ca_system" );
		
		if ( $ok[ 0 ] > 0 )
		{
			// Dokumentart feststellen
			// Feststellen, ob sich Attribute geändert haben
			// alte Attribute sichern
			// alte Attribute aktualisieren
			// fertig.
			
			$dok = liefere_dokumentinformationen( $mandant_name, $dok_id );
			
			$dokart = liefere_dokartinformationen( $mandant_name, $dok[ 2 ][ "dokart_kuerzel" ] );
			
			// Dokumentart:
			//$dokart_attribs[ $zeile[ "attrib_db_spalte"] ] = array( "attrib_pflicht"=>$pflicht, "attrib_farbe"=>$farbe, "attrib_layout_fett"=>$fett, "attrib_layout_unterstrichen"=>$unterstrichen, "attrib_layout_kursiv"=>$kursiv, "attrib_id"=>$zeile[ "attrib_id"], "dokart_kuerzel"=>$zeile[ "dokart_kuerzel"], "flags"=>$zeile[ "flags"], "hinzugefuegt_am"=>$zeile[ "hinzugefuegt_am"],  "mandant_id"=>$zeile[ "mandant_id"],  "attrib_beschreibung"=>$zeile[ "attrib_beschreibung"],  "attrib_db_spalte"=>$zeile[ "attrib_db_spalte"],  "attrib_erstellt_am"=>$zeile[ "attrib_erstellt_am"],  "attrib_geaendert_am"=>$zeile[ "attrib_geaendert_am"],  "attrib_name"=>$zeile[ "attrib_name"],  "attrib_wertemenge"=>$zeile[ "attrib_wertemenge"], "attrib_vorhandene_werte"=>$vorhanden, "attrib_typ"=>$attrib_typ, "attrib_titel"=>$titel, "attrib_pos_in_maske"=>$pos_in_maske );
			
			
			
			
			// Dokument:
			// $ergebnis_arr[ $attribut[ "attrib_db_spalte" ] ] = $ergebnis[ 1 ][ 0 ][ $attribut[ "attrib_db_spalte" ] ];
			
			
			// Neue Attribute:
			// $neue_attribute_arr[ "alpha_01" ] = $alpha_01;
			// $neue_attribute_arr[ "alpha_02" ] = $alpha_02;
			// $neue_attribute_arr[ "alpha_03" ] = $alpha_03;
			
			$aenderung_gefunden = false;
			
			if ( ( is_array( $mehrfachattribute ) ) && ( count( $mehrfachattribute ) > 0 ) )
			{
				// Bei neuen Mehrfachattributen wird immer aktualisiert
				$aenderung_gefunden = true;
			}
			
			if ( ! ( $aenderung_gefunden ) )
			{
				foreach( $dokart[ 2 ][ "attribute" ] as $dokart_attrib )
				{
					//xlog( 3, "spalte ".$dokart_attrib[ "attrib_db_spalte" ] );
					//xlog( 3, "Attribut Dokument: ".$dok[ 2 ][ $dokart_attrib[ "attrib_db_spalte" ] ] );
					//xlog( 3, "neues Attribut   : ".$neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ] );
					
					//xlog( 1, ">".$dok[ 2 ][ $dokart_attrib[ "attrib_db_spalte" ] ]."< >".$neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ]."<" );
					
					
					
					
					if ( $dok[ 2 ][ $dokart_attrib[ "attrib_db_spalte" ] ] != $neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ] )
					{
						$aenderung_gefunden = true;
						break;
					}
					
				}
			}
			
			
			if ( $aenderung_gefunden )
			{
				$versionseintrag = erzeuge_neuen_versionseintrag( $dok_id, "ATTRIB_UPDATE", "", "+" );
				
				// Attribute sichern
				
				$STATEMENT_I	= "insert into ca_index_history ( dok_id, aktualisierungs_zeitpunkt, aktualisierungs_benutzer, version, ";
				$VALUES_I		= $dok_id.", '".$versionseintrag[ 4 ]."', '".$_SESSION[ "benutzer_anmeldename" ]."', ".$versionseintrag[ 3 ].", ";
				
				$STATEMENT_U	= "update ca_index set ";
				
				$mehrfach		= array();
				
				foreach( $dokart[ 2 ][ "attribute" ] as $dokart_attrib )
				{
					
					if ( ! ( substr( $dokart_attrib[ "attrib_db_spalte" ], 0, 2 ) == "p_" ) )
					{
						if ( ( $dokart_attrib[ "attrib_titel" ] == true ) && ( strlen( $neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ] ) > 0 ) )
						{
							$titel = $titel.$neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ]." | ";
						}
						
						$STATEMENT_I	= $STATEMENT_I.$dokart_attrib[ "attrib_db_spalte" ].", ";
						
						switch( $dokart_attrib[ "attrib_typ" ] )
						{
							case "datum":
								if ( strlen( $neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ] ) == 0 )
								{
									$datevalue = "null";
									$anfuehrung = "";
								}
								else
								{
									$datevalue = $neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ];
									$anfuehrung = "'";
								}
								$VALUES_I		= $VALUES_I.$anfuehrung.datum2mysql( $datevalue ).$anfuehrung.", ";
								$STATEMENT_U	= $STATEMENT_U.$dokart_attrib[ "attrib_db_spalte" ]." = ".$anfuehrung.datum2mysql( $datevalue ).$anfuehrung.", ";
								break;
							case "alpha":
							case "geld":
							case "text":
							//case "num":
								$VALUES_I		= $VALUES_I."'".$neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ]."', ";
								$STATEMENT_U	= $STATEMENT_U.$dokart_attrib[ "attrib_db_spalte" ]." = '".$neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ]."', ";
								break;
							case "num":
								$wert			= str_replace( ",", ".", $neue_attribute_arr[ $dokart_attrib[ "attrib_db_spalte" ] ] );
								if ( strlen( $wert ) == 0 )
								{
									$wert = 0;
								}
								$VALUES_I		= $VALUES_I.$wert.", ";
								$STATEMENT_U	= $STATEMENT_U.$dokart_attrib[ "attrib_db_spalte" ]." = ".$wert.", ";
								break;
						}
					}
					else
					{
						$mehrfach[]			= $dokart_attrib;
						$mehrfach_gefunden	= true;
					}
				}
				
				if ( strlen( $titel ) > 0 )
				{
					$titel			= substr( $titel, 0, -3 );
					$titel_lang		= "(".$dokart[ 2 ][ "dokart_name" ].") ".$titel;
				}
				else
				{
					$titel			= ""; //"Dokument-ID ".$dok_id;
					$titel_lang		= "";
				}
				
				$STATEMENT_I = substr( $STATEMENT_I, 0, -2 )." ) values ( ".substr( $VALUES_I, 0, -2 )." )";
				
				$STATEMENT_U = substr( $STATEMENT_U, 0, -2 )." where dok_id = ".$dok_id;
				
				$STATEMENT_A = "update ca_dok_ablage set titel = '".$titel."', titel_lang = '".$titel_lang."' where dok_id = ".$dok_id;
				
				//xlog( 5, $STATEMENT_I );
				//xlog( 5, $STATEMENT_U );
				xdb( $STATEMENT_I );
				xdb( $STATEMENT_U );
				xdb( $STATEMENT_A );
				
				
				if ( $mehrfach_gefunden )
				{
					// Mehrfachattribute
					// $mehrfachattribute hat folgenden Aufbau:
					
					// array( array( p_alpha_01 => "Wert", p_alpha_02 = "Wert", ...), array( p_alpha_01 => "Wert", p_alpha_02 = "Wert"...), array( p_alpha_01 => "Wert", p_alpha_02 => "Wert", ...))
					
					// Nicht ganz einfach, aber was ist schon einfach ???
					
					// Zuerst werden die aktuellen Attribute gelöscht, dann die neuen eingetragen (in ca_posdaten und ca_posdaten_history).
					
					
					$STATEMENT = "delete from ca_posdaten where dok_id = ".$dok_id;
					
					xdb( $STATEMENT );
					
					//xlog( 4, json_encode( $mehrfach ) ) ;
					
					
					
					$pos_ids		= array();
					$pos_ids_text	= "";
					
					foreach( $mehrfachattribute as $attributzeile )
					{
						$p_felder = "";
						$p_werte  = "";
						if ( count( $attributzeile ) > 0 )
						{
							foreach( $attributzeile as $attribut => $wert )
							{
								$p_felder = $p_felder.$attribut.", ";
								
								$attr_typ = substr( $attribut, 2, 4 );
								
								switch ( $attr_typ )
								{
									case "datu":
										//userlog(5, "Datum ".$wert )
										$wert_passend_pos = datum2mysql( $wert );
										$p_werte  = $p_werte."'".mysqli_real_escape_string( $connection, $wert_passend_pos )."', ";
										break;
									case "geld":
										if ( strlen( $wert ) == 0 )
										{
											$wert = "0";
										}
										$wert_passend_pos = str_replace( ",", ".", $wert );
										$p_werte  = $p_werte." ".mysqli_real_escape_string( $connection, $wert_passend_pos ).", ";
										break;
									case "alph":
										$wert_passend_pos = $wert;
										$p_werte  = $p_werte."'".mysqli_real_escape_string( $connection, $wert_passend_pos )."', ";
										break;
									case "num_":
										if ( strlen( $wert ) == 0 )
										{
											$wert = "0";
										}
										$wert_passend_pos = str_replace( ",", ".", $wert );
										$p_werte  = $p_werte." ".mysqli_real_escape_string( $connection, $wert_passend_pos ).", ";
										break;
								}
								
							}
							$STATEMENT = "insert into ca_posdaten ( dok_id, ".substr( $p_felder, 0, strlen( $p_felder ) - 2 ).") values (".$dok_id.", ".substr( $p_werte, 0, strlen( $p_werte ) - 2 )." );";
							
							//xlog( 5, $STATEMENT );
							
							$ergebnis_3 = xdb( $STATEMENT );
							
							$STATEMENT = "insert into ca_posdaten_history ( aktualisierungs_zeitpunkt, aktualisierungs_benutzer, version, pos_id, dok_id, ".substr( $p_felder, 0, strlen( $p_felder ) - 2 ).") values ( '".$versionseintrag[ 4 ]."', '".$_SESSION[ "benutzer_anmeldename" ]."', ".$versionseintrag[ 3 ].", ".$ergebnis_3[ 0 ].", ".$dok_id.", ".substr( $p_werte, 0, strlen( $p_werte ) - 2 )." );";
							
							//xlog( 5, $STATEMENT );
							
							$ergebnis_4 = xdb( $STATEMENT );
							
							$pos_ids[] = $ergebnis_3[ 0 ];
							
							if ( strlen( $pos_ids_text ) == 0 )
							{
								$pos_ids_text = "( ".$ergebnis_3[ 0 ];
							}
							else
							{
								$pos_ids_text = $pos_ids_text." | ".$ergebnis_3[ 0 ];
							}
						}
						else
						{
							xlog( 3, "admin.aktualisiere_dokument_attribute: leere Positionszeile ignoriert (Dokument-ID ".$dok_id.").");
						}
					}
					
					$pos_ids_text = $pos_ids_text." )";
					
					$pos_text = " Erzeugte Positions-IDs (".count($pos_ids)."): ".$pos_ids_text;
				}
				
				
				$rc			= 1;
				$meldung	= "Für das Dokument ".$dok_id." wurde eine neue Attributversion angelegt.".$pos_text;
				
			}
			else
			{
				$rc = -3;
				$meldung = "Es wurden keine geänderten Attribute festgestellt.";
			}
			
			
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.aktualisiere_dokument_attribute: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $dokument_binary, $mime_type );
	}
	
	function erzeuge_neuen_versionseintrag( $dok_id, $ereignis, $d_version = "", $k_version = "", $info = "" )
	{
		
		if ( strlen( $dok_id ) > 0 )
		{
			if ( strlen( $ereignis ) > 0 )
			{
				
				$STATEMENT = "select d_version from ca_dok_history where dok_id = ".$dok_id." and zeitstempel = (select max(zeitstempel) from ca_dok_history where dok_id = ".$dok_id." ) ";
				
				//$STATEMENT = "select d_version, dok_id, kennung from ca_dok_ablage where ".$update;
				
				
				$ergebnis = xdb( $STATEMENT );
				
				$bekannte_d_version = $ergebnis[ 1 ][ 0 ][ "d_version" ];
				
				if ( strlen( $bekannte_d_version ) == 0 )
				{
					$bekannte_d_version = 0;
				}
				
				$STATEMENT = "select k_version from ca_dok_history where dok_id = ".$dok_id." and zeitstempel = (select max(zeitstempel) from ca_dok_history where dok_id = ".$dok_id." ) ";
				
				$ergebnis = xdb( $STATEMENT );
				
				$bekannte_k_version = $ergebnis[ 1 ][ 0 ][ "k_version" ];
				
				if ( strlen( $bekannte_k_version ) == 0 )
				{
					$bekannte_k_version = 0;
				}
				
				if ( $k_version == "+" )
				{
					$bekannte_k_version = bcadd( $bekannte_k_version, 1, 0 );
				}
				
				if ( $d_version == "+" )
				{
					$bekannte_d_version = bcadd( $bekannte_d_version, 1, 0 );
				}
				
				
				
				if ( !( ( $bekannte_k_version == 0 ) || ( $bekannte_d_version == 0 ) ) )
				{
					switch ( $ereignis )
					{
						case "PIC_RESIZE":
							$erw = 1;
							$j_flag_0 = ", j_flag = 0 ";
							break;
						default:
							$erw = 0;
							$j_flag_0 = "";
							break;
					}
					
					
					$zeitstempel = time();
					
					$STATEMENT = "insert into ca_dok_history ( dok_id, ereignis, info, d_version, k_version, zeitstempel, benutzer_anmeldename, erw ) values ( ".$dok_id.", '".$ereignis."', '".$info."', ".$bekannte_d_version.", ".$bekannte_k_version.", ".$zeitstempel.", '".$_SESSION[ "benutzer_anmeldename" ]."', ".$erw." )";
					
					$ergebnis = xdb( $STATEMENT );
					
					
					
					$STATEMENT = "update ca_dok_ablage set d_version = ".$bekannte_d_version.", k_version = ".$bekannte_k_version.$j_flag_0." where dok_id = ".$dok_id;
					
					$ergebnis = xdb( $STATEMENT );
					
					$rc = 0;
					$meldung = "Es wurde ein History-Eintrag für Dokument-ID ".$dok_id." erzeugt (Zeitstempel: ".date( "d.m.Y H:i", $zeitstempel )." Uhr).";
					
				}
				else
				{
					$rc = -3;
					$meldung = "Eine Version 0 kann nicht erzeugt werden: K|D ".$bekannte_k_version."|".$bekannte_d_version.".";
				}
				
				
				
				
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es wurde kein Ereignis angegeben.";
			}
		}
		else
		{
			$rc			= -1;
			$meldung	= "Es wurde keine Dokument-ID angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.erzeuge_neuen_versionseintrag: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $bekannte_d_version, $bekannte_k_version, $zeitstempel );
		
	}
	
	function liefere_versionseintraege( $dok_id )
	{
		
		$ok				= existiert_mandant( $_SESSION[ "mandant_name" ] );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dok_id ) > 0 )
			{
				$STATEMENT = "select h.dok_id, h.ereignis, h.info, h.d_version, h.k_version, h.zeitstempel, h.benutzer_anmeldename, a.groesse, a.mime_type, a.erw from ca_dok_history h, ca_dok_datei a where a.dok_id = ".$dok_id." and h.dok_id = a.dok_id and h.d_version = a.version and h.erw = a.erw order by zeitstempel";
				
				//xlog( 1, $STATEMENT );
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] != 0 )
				{
					$ergebnis_arr	= $ergebnis[ 1 ];
					$rc				= $ergebnis[ 0 ];
					$meldung		= "Liefere ".$rc." Versionseintraege für Dokument-ID ".$dok_id.".";
				}
				else
				{
					$rc			= -3;
					$meldung	= "Zur angegebenen Dokument-ID ".$dok_id." wurde keine Versionen gefunden.";
				}
				
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es wurde keine Dokument-ID angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_versionseintraege: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $ergebnis_arr );
	}
	
	function loesche_dokument( $mandant_name, $dok_id, $hartes_loeschen = false )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dok_id ) > 0 )
			{
				$dok = liefere_dokumentinformationen( $mandant_name, $dok_id );
				
				$ergebnis = besitzt_benutzer_systemrecht( $mandant_name, $_SESSION[ "benutzer_anmeldename" ], $dok[ 2 ][ "dokart_typ" ]."_".$dok[ 2 ][ "dokart_kuerzel" ]."_LOESCHEN" );
				
				if ( $ergebnis[ 0 ] == 1 )
				{
					if ( $hartes_loeschen != true )
					{
						$STATEMENT = "update ca_dok_ablage set status = 'geloescht' where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						$rc			= 1;
						$meldung	= "Das Dokument ".$dok_id." wurde im Mandanten ".$mandant_name." gelöscht.";
					}
					else
					{
						$STATEMENT = "delete from ca_dok_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_dok_datei where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_index where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_index_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_notiz where element_id = ".$dok_id." and element_typ = 'd'"." and element_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_jobs where element = ".$dok_id." and element_typ = 'd'"." and element in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_posdaten where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_posdaten_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_bezug where ( dok_id_1 = ".$dok_id." or dok_id_2 = ".$dok_id." ) and ( ( dok_id_1 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ]." ) ) or ( dok_id_2 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ]." ) ) )";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_wfl_protokoll where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_favoriten where unter_elem = '".$dok_id."' and unter_elem_typ = 'd' and unter_elem in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_postkorb where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_dok_ablage where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						// eigentlich muss jetzt noch die Dokumentdatei gelöscht werden.
						
						$rc			= 2;
						$meldung	= "Das Dokument ".$dok_id." wurde im Mandanten ".$mandant_name." gelöscht (the hard way).";
						
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es ist ein Fehler aufgetreten oder nicht ausreichende Berechtigungen (".$dok_id."): ".$ergebnis[ 1 ];
				}
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es wurde keine Dokument-ID angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.loesche_dokument: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function loesche_dokument_2( $mandant_name, $dok_id, $hartes_loeschen = false )
	{
		// Diese Funktion soll Dokumente inkl. der dazugehörigen Dateien im Dateibaum löschen
		
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( strlen( $dok_id ) > 0 )
			{
				$dok = liefere_dokumentinformationen( $mandant_name, $dok_id );
				
				$ergebnis = besitzt_benutzer_systemrecht( $mandant_name, $_SESSION[ "benutzer_anmeldename" ], $dok[ 2 ][ "dokart_typ" ]."_".$dok[ 2 ][ "dokart_kuerzel" ]."_LOESCHEN" );
				
				if ( $ergebnis[ 0 ] == 1 )
				{
					if ( $hartes_loeschen != true )
					{
						$STATEMENT = "update ca_dok_ablage set status = 'geloescht' where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
						
						$ergebnis = xdb( $STATEMENT );
						
						$rc			= 1;
						$meldung	= "Das Dokument ".$dok_id." wurde im Mandanten ".$mandant_name." gelöscht.";
					}
					else
					{
						// Zuerst die Nutzdatei löschen
						$ergebnis = liefere_dateien_zu_dokument( $mandant_name, $dok_id );
						
						//xlog( 3, "ergebnis ".json_encode( $ergebnis ) );
						
						if ( $ergebnis[ 0 ] > 0 )
						{
							$co = 0;
							$cu = 0;
							foreach( $ergebnis[ 2 ] as $dateipfad )
							{
								//xlog( 3, "Dateipfad ".$dateipfad );
								$dateipfad = realpath( $dateipfad );
								$e = unlink( $dateipfad );
								
								if ( $e == false )
								{
									xlog( 2, "admin.loesche_dokument_2: Die Datei ".$dateipfad." konnte nicht gelöscht werden." );
									$co++;
								}
								else
								{
									$cu++;
									xlog( 3, "admin.loesche_dokument_2: Die Datei ".$dateipfad." wurde gelöscht." );
								}
							}
							
							if ( $co > 0 )
							{
								$dat_meldung_2 = $co." Dateien konnten nicht gelöscht werden (siehe Log).";
							}
							
							$rc = ergebnis[ 0 ];
							$dat_meldung = " Es wurden ".$cu." Dateien gelöscht. ".$dat_meldung_2;
						}
						else
						{
							$dat_meldung = " Es wurden keine Nutzdateien zu Dokument ".$dok_id." gefunden.";
						}
						
						$STATEMENT = "delete from ca_dok_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_dok_datei where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_index where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_index_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_notiz where element_id = ".$dok_id." and element_typ = 'd'"." and element_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_jobs where element = ".$dok_id." and element_typ = 'd'"." and element in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_posdaten where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_posdaten_history where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_bezug where ( dok_id_1 = ".$dok_id." or dok_id_2 = ".$dok_id." ) and ( ( dok_id_1 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ]." ) ) or ( dok_id_2 in ( select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ]." ) ) )";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_wfl_protokoll where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_favoriten where unter_elem = '".$dok_id."' and unter_elem_typ = 'd' and unter_elem in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_postkorb where dok_id = ".$dok_id." and dok_id in (select dok_id from ca_dok_ablage where mandant_id = ".$ok[ 0 ].") ";
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						$STATEMENT = "delete from ca_dok_ablage where dok_id = ".$dok_id." and mandant_id = ".$ok[ 0 ];
						xlog( 6, $STATEMENT );
						$ergebnis = xdb( $STATEMENT );
						
						
						
						
						$rc			= 2;
						$meldung	= "Das Dokument ".$dok_id." wurde im Mandanten ".$mandant_name." gelöscht (the hard way).".$dat_meldung;
						
					}
				}
				else
				{
					$rc			= -5;
					$meldung	= "Es ist ein Fehler aufgetreten oder nicht ausreichende Berechtigungen (".$dok_id."): ".$ergebnis[ 1 ];
				}
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es wurde keine Dokument-ID angegeben.";
			}
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.loesche_dokument: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung );
	}
	
	function liefere_kenndaten_versionseintrag( $mandant_name, $dok_id, $k_version, $dokart_kuerzel = "" )
	{
		$ok				= existiert_mandant( $mandant_name );
		
		if ( $ok[ 0 ] > 0 )
		{
			if ( ( strlen( $dok_id ) > 0 ) && ( strlen( $k_version ) > 0 ) )
			{
				if ( strlen( $dokart_kuerzel ) == 0 )
				{
					$dokument	= liefere_dokumentinformationen( $mandant_name, $dok_id );
					$dokart_kuerzel = $dokument[ 2 ][ "dokart_kuerzel" ];
				}
				
				$dokart		= liefere_dokartinformationen( $mandant_name, $dokart_kuerzel );
				
				$SELECT = "dok_id, aktualisierungs_zeitpunkt, aktualisierungs_benutzer, version, ";
				
				foreach( $dokart[ 2 ][ "attribute" ] as $attribut )
				{
					if ( substr( $attribut[ "attrib_db_spalte" ], 0, 2 ) != "p_" )
					{
						$SELECT = $SELECT.$attribut[ "attrib_db_spalte" ].", ";
					}
					else
					{
						$POS_SELECT = $POS_SELECT.$attribut[ "attrib_db_spalte" ].", ";
					}
				}
				
				$SELECT			= substr( $SELECT, 0, strlen( $SELECT ) - 2 );
				$POS_SELECT		= substr( $POS_SELECT, 0, strlen( $POS_SELECT ) - 2 );
				
				if ( strlen( $POS_SELECT ) > 0 )
				{
					$POS_SELECT = ", ".$POS_SELECT;
				}
				
				$STATEMENT = "select ".$SELECT." from ca_index_history where dok_id = ".$dok_id." and version = ".$k_version;
				
				//xlog( 4, $STATEMENT);
				
				$ergebnis = xdb( $STATEMENT );
				
				if ( $ergebnis[ 0 ] == 1 )
				{
					
					foreach( $ergebnis[ 1 ][ 0 ] as $key => $value )
					{
						$key_split = explode( "_", $key );
						$key_split = mb_strtolower( $key_split[ 0 ] );
						
						switch ( $key_split )
						{
							case "datum":
								$treffer[ $key ] = mysql2datum( $value );
								break;
							default:
								$treffer[ $key ] = $value;
								break;
						}
					}
					
					//xlog( 4, json_encode( $treffer ) );
					
					$STATEMENT = "select pos_id, aktualisierungs_zeitpunkt, aktualisierungs_benutzer, version ".$POS_SELECT." from ca_posdaten_history where dok_id = ".$dok_id." and version = ".$k_version;
					
					xlog( 6, "admin.liefere_kenndaten_versionseintrag: ".$STATEMENT );
					
					$ergebnis = xdb( $STATEMENT );
					
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$i = 0;
						foreach( $ergebnis[ 1 ] as $trefferzeile )
						{
							$i++;
							$zeile = array();
							foreach( $trefferzeile as $feld=>$wert )
							{
								//xlog( 4, $i." Feld ".$feld." Wert ".$wert );
								
								$f = explode( "_", $feld );
								
								$f = $f[ 0 ]."_".$f[ 1 ];
								
								switch ( $f )
								{
									case "p_alpha":
									case "p_num":
									case "p_geld":
										$zeile[ $feld ] = $wert;
										break;
									case "p_datum":
										$zeile[ $feld ] = mysql2datum( $wert );
										break;
								}
								
							}
							$mehrfachattribute[] = $zeile;
						}
					}
					else
					{
						$mehrfachattribute = array();
					}
					
					
					$rc			= 1;
					$meldung	= "Liefere Kenndaten-Version ".$k_version." zur Dokument-ID ".$dok_id.".";
				}
				else
				{
					$rc			= -4;
					$meldung	= "Es ist ein Fehler aufgetreten: RC ".$ergebnis[ 0 ].", Meldung: ".$ergebnis[ 1 ];
				}
				
			}
			else
			{
				$rc			= -3;
				$meldung	= "Entweder Dokument-ID >".$dok_id."< oder Kenndaten-Version >".$k_version."< wurden nicht angegeben.";
			}
			
			
		}
		else
		{
			$rc			= $ok[ 0 ];
			$meldung	= $ok[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.liefere_kenndaten_versionseintrag: RC ".$rc.": ".$meldung );
		
		return array( $rc, $meldung, $treffer, $dokart[ 2 ], $mehrfachattribute );
	}
	
	
	
	
	
	
	
	function exportiere_dokument( $mandant_name, $dok_id, $export_pfad )
	{
		$ok_1 = existiert_mandant( $mandant_name );
		
		
				
			
		
		
		if ( $ok_1[ 0 ] > 0 )
		{
			if ( strlen( $dok_id ) > 0 )
			{
				if ( strlen( $export_pfad ) == 0 )
				{
					$ep = liefere_konfig( $mandant_name, "import_ordner" );
					if ( strlen( $ep ) > 0 )
					{
						$export_pfad = $ep;
						xlog( 3, "admin.exportiere_dokument: Import-Parameter >export_pfad< nicht gesetzt, benutze Konfigurationsoption >import_ordner< (Wert: >".$ep."<." );
					}
				}
				
				if ( strlen( $export_pfad ) > 0 )
				{
					$ergebnis = liefere_dokumentinformationen( $mandant_name, $dok_id );
					
					if ( $ergebnis[ 0 ] > 0 )
					{
						$file_text = "";
						$file_text = $file_text."dokart = \"".$ergebnis[ 2 ][ "dokart_kuerzel" ]."\"\n";
						$file_text = $file_text."mime_type = \"".$ergebnis[ 2 ][ "mime_type" ]."\"\n";
						$file_text = $file_text."kennung = \"".$ergebnis[ 2 ][ "kennung" ]."\"\n";
						$file_text = $file_text."ursprungs_dateiname = \"".$ergebnis[ 2 ][ "ursprungs_dateiname" ]."\"\n";
						
						foreach( $ergebnis[ 2 ] as $eigenschaft=>$wert )
						{
							$key = substr( $eigenschaft, 0, 4 );
							
							switch ( $key )
							{
								case "alph":
								case "datu":
								case "num_":
								case "geld":
									$file_text = $file_text.$eigenschaft." = \"".$ergebnis[ 2 ][ $eigenschaft ]."\"\n";
									break;
								default:
									break;
							}
							
						}
						
						//xlog( 1, $file_text );
						if ( $ergebnis[ 2 ][ "dokart_typ" ] == "D" )
						{
							$optionen[ "erw_datei_typ" ] = 0;
							$dokument	= liefere_dokumentbinary( $mandant_name, $_SESSION[ "benutzer_anmeldename" ], $dok_id, $optionen );
							$ext		= pathinfo( $ergebnis[ 2 ][ "ursprungs_dateiname" ], PATHINFO_EXTENSION );
						}
						else
						{
							$dokument	= array( "", "", "" );
							$ext		= "akte";
						}
						
						// Dateien schreiben
						$dateiname = str_pad( $ok_1[ 0 ], 3, "0", STR_PAD_LEFT )."_".str_pad( $dok_id, 12, "0", STR_PAD_LEFT);
						
						$b = file_put_contents( $export_pfad.DIRECTORY_SEPARATOR.$dateiname.".idx", $file_text );
						
						if ( $b !== false )
						{
							$f = file_put_contents( $export_pfad.DIRECTORY_SEPARATOR.$dateiname.".".$ext, $dokument[ 2 ] );
							
							if ( $f !== false )
							{
								$rc			= 1;
								$meldung	= "Das Dokument ".$dok_id." wurde erfolgreich exporiert.";
							}
							else
							{
								unlink( $export_pfad.DIRECTORY_SEPARATOR.$dateiname.".idx" );
								$rc			= -6;
								$meldung	= "Die Nutzdatei zu Dokument ".$dok_id." konnte nicht geschrieben werden.";
							}
						}
						else
						{
							$rc			= -4;
							$meldung	= "Die Indexdatei zu Dokument ".$dok_id." konnte nicht geschrieben werden.";
						}
					}
					else
					{
						$rc			= $ergebnis[ 0 ];
						$meldung	= $ergebnis[ 1 ];
					}
				}
				else
				{
					$rc = -3;
					$meldung = "Es wurde kein Export-Pfad angegeben und <import_ordner> ist nicht gesetzt.";
				}
				
			}
			else
			{
				$rc			= -2;
				$meldung	= "Es wurde keine Dokument-ID angegeben.";
			}
		}
		else
		{
			$rc			= $ok_1[ 0 ];
			$meldung	= $ok_1[ 1 ];
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 4;
		}
		
		xlog( $level, "admin.exportiere_dokument: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $ergebnis_arr );
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	function sperre_dokument( $dok_id, $benutzer_anmeldename )
	{
		if ( strlen( $dok_id ) > 0 )
		{
			if ( strlen( $benutzer_anmeldename ) > 0 )
			{
				$STATEMENT = "select sperr_status, sperr_beginn, sperr_benutzer from ca_dok_ablage where dok_id = ".$dok_id;
				
				$ergebnis = xdb( $STATEMENT );
				
				//xlog( 1, json_encode( $ergebnis ) );
				
				if ( strlen( $ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ] ) == 0 )
				{
					
					$STATEMENT = "update ca_dok_ablage set sperr_status = '1', sperr_beginn = '".time()."', sperr_benutzer = '".$benutzer_anmeldename."' where dok_id = ".$dok_id;
					
					xdb( $STATEMENT );
					
					$STATEMENT = "select sperr_status, sperr_beginn, sperr_benutzer from ca_dok_ablage where dok_id = ".$dok_id;
					
					$ergebnis = xdb( $STATEMENT );
					
					if ( $ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ] == $benutzer_anmeldename )
					{
						$rc = 1;
						$meldung = "Das Dokument ".$dok_id." wurde vom Benutzer ".$benutzer_anmeldename." gesperrt.";
					}
					else
					{
						$rc = -12;
						$meldung = "Das Dokument wurde zwischenzeitlich vom Benutzer ".$ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ]." gesperrt.";
					}
					
					
				}
				else
				{
					if ( $ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ] == $benutzer_anmeldename )
					{
						$rc = 2;
						$meldung = "Das Dokument ".$dok_id." wurde bereits vom Benutzer ".$benutzer_anmeldename." gesperrt.";
					}
					else
					{
						$rc = -19;
						$meldung = "Das Dokument wurde bereits am ".date( "d.m.Y H:i", (integer)$ergebnis[ 1 ][ 0 ][ "sperr_beginn" ] )." Uhr vom Benutzer ".$ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ]." gesperrt.";
					}
				}
				
			}
			else
			{
				$rc = -1;
				$meldung = "Es wurde kein Benutzer-Name angegeben.";
			}
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde keine Dokument-ID angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.sperre_dokument: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function entsperre_dokument( $dok_id )
	{
		if ( strlen( $dok_id ) > 0 )
		{
			
			$STATEMENT = "update ca_dok_ablage set sperr_status = '0', sperr_beginn = '', sperr_benutzer = '' where dok_id = ".$dok_id;
			
			xdb( $STATEMENT );
			
			$rc = 1;
			$meldung = "Das Dokument ".$dok_id." wurde entsperrt.";
			
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde keine Dokument-ID angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.entsperre_dokument: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung );
	}
	
	function ist_dokument_gesperrt( $dok_id )
	{
		if ( strlen( $dok_id ) > 0 )
		{
			$STATEMENT = "select sperr_status, sperr_beginn, sperr_benutzer from ca_dok_ablage where dok_id = ".$dok_id;
			
			$ergebnis = xdb( $STATEMENT );
			
			if ( strlen( $ergebnis[ 1 ][ 0 ][ "sperr_status" ] ) == 0 )
			{
				$sperr_status = "0";
			}
			else
			{
				$sperr_status = $ergebnis[ 1 ][ 0 ][ "sperr_status" ];
			}
			
			$ergebnis[ "sperr_status" ]			= $sperr_status;
			$ergebnis[ "sperr_beginn_ts" ]		= $ergebnis[ 1 ][ 0 ][ "sperr_beginn" ];
			$ergebnis[ "sperr_beginn" ]			= date( "d.m.Y H:i", $ergebnis[ 1 ][ 0 ][ "sperr_beginn" ] )." Uhr";
			
			$ergebnis[ "sperr_benutzer" ]		= $ergebnis[ 1 ][ 0 ][ "sperr_benutzer" ];
			
			$rc = 0;
			$meldung = "Liefere Informationen zum Sperrstatus des Dokuments ".$dok_id.".";
			
		}
		else
		{
			$rc = -1;
			$meldung = "Es wurde keine Dokument-ID angegeben.";
		}
		
		if ( $rc < 0 )
		{
			$level = 2;
		}
		else
		{
			$level = 6;
		}
		
		xlog( $level, "admin.ist_dokument_gesperrt: RC ".$rc.": ".$meldung );
		return array( $rc, $meldung, $ergebnis );
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	function darf_benutzer_dokument_sehen( $mandant_name, $benutzer_anmeldename, $dok_id )
	{}
	
	function darf_benutzer_dokumente_sehen( $mandant_name, $benutzer_anmeldename, $dok_ids )
	{}
	
	
	
	
	
	
	
	
	
	
	
	
?>