

//////////////////////////////////
//
// leere Akten löschen
//
// geschrieben von calb / 2020.07.01
//
// (c) d.velop AG 2020
//
//////////////////////////////////


//////////////////////////////////
//
// Dieses Skript löscht leere Akten. Dazu ist eine Aktenart konfigurierbar. Das Skript iteriert dann über die Akten dieser Aktenart
// und löscht die Akten, die kene Kind-Elemente haben, d.h. leer sind.
//
vars vers = "0.1 calb d.AG/PS 2020.07.01 Initialversion"
//
//	create table d3_loesch_akten 
//	(
//	doku_id varchar(50),
//	status varchar(20)
//	);
//
//	create unique index idx_doku_idx on d3_komplett (doku_id);
//////////////////////////////////

// Konfiguration


// debug = 1 => es werden keine Änderungen an der DB durchgeführt
// debug = 0 => es werden Änderungen an der DB durchgeführt
vars debug = 0

// Aktenart der zu löschenden Akten
vars aktenart_kuerzel = "ADEB"

// Anzahl der Dokumente, die in einem Skriptdurchlauf bearbeitet werden
vars anzahl_doks_pro_durchlauf = 4

//////////////////////////////////

vars ergebnis, dokart_lang



call bkklog( 4, "*********************************************" )
call bkklog( 4, "* FUN_loesch_akten.jpl                      *" )
call bkklog( 4, "* calb/d.velop AG 25.06.2020                *" )
call bkklog( 4, "*********************************************" )
call bkklog( 4, "* " ## vers )
call bkklog( 4, "* DEBUG                      : " ## debug )

ergebnis = api_function( "document_type_get_long", aktenart_kuerzel )

if ( ergebnis == 0 )
{
	dokart_lang = api_single_info
}
else
{
	call bkklog( 2, "* Aktenart konnte nicht korrekt bestimmt werden: " ## ergebnis )
	call bkklog( 2, "* FUN_loesch_akten.jpl beendet sich ..." )
	return ergebnis
}
call bkklog( 4, "* Aktenart                   : " ## dokart_lang ## " (" ## aktenart_kuerzel ## ")")
call bkklog( 4, "* anzahl_doks_pro_durchlauf  : " ## anzahl_doks_pro_durchlauf )

// Los geht's ......

call bkklog( 4, "*********************************************" )
///////////////////////////////////////////////////////////////////////

vars anzahl, ergebnis, i

vars d3db = "d3" ## d3fc_server_kuerzel ## ".INFORMATION_SCHEMA.TABLES"

anzahl = pruefe_ob_tabelle_existiert( "d3_loesch_akten" )

if ( anzahl == 0 )
{
	// Tabelle existiert nicht, wird angelegt
	call bkklog( 1, "DB-Tabelle d3_loesch_akten nicht gefunden. Lege Tabelle an ...")
	dbms sql create table d3_loesch_akten ( doku_id varchar(50), status varchar(20) )
	dbms sql create unique index idx_doku_idx on d3_loesch_akten (doku_id)
	
	anzahl = pruefe_ob_tabelle_existiert( "d3_loesch_akten" )
	
	if ( anzahl == 0 )
	{
		call bkklog( 2, "Es gab ein Problem beim Anlegen der Tabelle. Bitte legen Sie die Tabelle manuell an und starten das Skript erneut.")
	}
	else
	{
		call bkklog( 1, "DB-Tabelle d3_loesch_akten wurde angelegt.")
	}
}
else
{
	call bkklog( 4, "DB-Tabelle d3_loesch_akten gefunden.")
}

call bkklog( 4, "*********************************************" )


vars doku_id[ anzahl_doks_pro_durchlauf ]
vars i


dbms alias doku_id
dbms sql select doku_id from firmen_spezifisch where kue_dokuart = :+aktenart_kuerzel and doku_id not in (select doku_id from d3_loesch_akten )
anzahl = @dmrowcount
dbms alias

for i = 1 while i <= anzahl step 1
{
	// Prüfen, ob die Akte Kind-Elemente hat
	
	// falls ja: nächste
	// falls nein: Löschen
	
	ergebnis = api_function( "link_get_children", doku_id[ i ], "Master" )
	if ( ergebnis == 0 )
	{
		// Das Ermitteln der Kind-Elemente hat funktioniert.
		// Jetzt wird geprüft, ob die Anzahl 0 (null) oder > 0 ist.
		
		if ( api_single_info == 0 )
		{
			// Keine Kinder gefunden. Akte wird gelöscht:
			if ( debug == 0 )
			{
				ergebnis = api_function( "document_delete", "leere Akten nach Kd.-Nr.-Änderung", 1, 1, doku_id[ i ], "Master" )
				if ( ergebnis == 0 )
				{
					call bkklog( 4, "Nr. " ## i ## ": Akte " ## doku_id[ i ] ## " wurde gelöscht." )
				}
				else
				{
					call bkklog( 4, "Nr. " ## i ## ": Akte " ## doku_id[ i ] ## " konnte nicht gelöscht werden: RC " ## ergebnis )
				}
			}
			else
			{
				call bkklog( 4, "Nr. " ## i ## ": Akte " ## doku_id[ i ] ## " wurde nicht gelöscht wegen eingeschaltetem DEBUG-Modus." )
			}
		}
		else
		{
			// Die Akte hat Kind-Elemente, darf nicht gelöscht werden. Die Akte wird in die Tabelle eingetragen, damit sie beim nächsten
			// Durchlauf nicht mehr berücksichtigt wird.
			dbms sql insert into d3_loesch_akten ( doku_id, status ) values ( :+doku_id[ i ], '0' )
			
			call bkklog( 4, "Nr. " ## i ## ": Akte " ## doku_id[ i ] ## " hat Kind-Elemente und wurde zurückgelegt.")
		}
	}
	else
	{
		// Es gab ein Problem beim Ermitteln der Kind-Elemente. Die Akte wird mit Fehlerstatus zurückgelegt.
		dbms sql insert into d3_loesch_akten ( doku_id, status ) values ( :+doku_id[ i ], :+ergebnis )
		
		call bkklog( 4, "Nr. " ## i ## ": Akte " ## doku_id[ i ] ## ": Fehler beim Ermitteln der Kind-Elemente; Akte wurde mit RC " ## ergebnis ## " zurückgelegt.")
	}
	
	
}
























string proc pruefe_ob_tabelle_existiert( tab_name )
{
	vars anzahl
	dbms alias anzahl
	dbms sql select count(*) anzahl from :d3db where table_name = :+tab_name;
	dbms alias
	return anzahl
}




proc bkklog( loglevel, message )
{
	vars l_logdirect = "BEIDE"
	vars l_logdatei = "D\:\\d3\\apps\\log.txt"
	vars l_loglevel = 5
	
	vars zeitstempel, loglevel_lang, d3loglevel, logmessage
	
	if ( loglevel == 5 )
	{
			loglevel_lang   = "DEBUG"
			// Da die d.3 Server i.d.R. nicht im Debug-Modus laufen, erscheinen DEBUG-Meldungen nicht im Log.
			d3loglevel              = 9
	}
	
	if ( loglevel == 4 )
	{
			loglevel_lang   = "INFO."
			d3loglevel              = 6
	}
	
	if ( loglevel == 3 )
	{
			loglevel_lang   = "WARN."
			d3loglevel              = 6
	}
	
	if ( loglevel == 2 )
	{
			loglevel_lang   = "ERROR"
			d3loglevel              = 0
	}
	
	if ( loglevel == 1 )
	{
			loglevel_lang   = "FATAL"
			d3loglevel              = 0
	}
	
	if ( loglevel <= l_loglevel )
	{
			
			
			if ( ( l_logdirect == "DATEI" ) || ( l_logdirect == "BEIDE" ) )
			{
					// Ausgabe in Datei
					zeitstempel             = sm_sdtime( "n%4y.%0m.%0d %0h\:%0M\:%0s" )
					logmessage              = zeitstempel ## " " ## loglevel_lang ## " " ## message
					call api_function( "file_add_line", l_logdatei, logmessage, "APPEND" )
			}
			
			if ( ( l_logdirect == "D3LOG" ) || ( l_logdirect == "BEIDE" ) )
			{
					// Ausgabe im d.3 Log
					logmessage = loglevel_lang ## " " ## message
					call api_log( d3loglevel, logmessage )
			}
	}
	
}

