import com.dvelop.d3.server.Document
import com.dvelop.d3.server.core.D3Interface
import com.dvelop.d3.server.exceptions.SQLException
import com.dvelop.d3.server.exceptions.D3Exception
import groovy.transform.Field

D3Interface d3 = getProperty("d3");

@Field prg              = "KLEE_werte_loeschen.groovy";
@Field version          = "0.1";
@Field kunde            = "Dr. Kleeberg & Partner GmbH";

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

// Dieses Skript erwartet eine folgendermaßen definierte Tabelle in der d.3-Repositorydatenbank:

// create table dv_akten_loesen (id varchar(10), doku_id varchar(12), status varchar(5) );

// In dieser Tabelle wird festgehalten, welche Dokumente bereits bearbeitet wurden, damit sie bei einem erneuten Skript-Lauf nicht erneut bearbeitet werden


// debug = 0 => es finden Änderungen am Datenbestand statt
// debug = 1 => es finden keine Änderungen am Datenbestand statt
@Field debug = 0;



// zu bearbeitende Dokumentart (Kürzel)
@Field dokumentart = "DDAUE";


// Dokumentbereich untere Grenze:
@Field doku_id_von = "T000543579"


// Dokumentbereich obere Grenze:
@Field doku_id_bis = "T000543591"




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

def debugtext;

switch (debug)
{
        case 0:
                debugtext = "ausgeschaltet";
                break;
        default:
                debugtext = "eingeschaltet (keine Aenderungen am Datenbestand)";
                break;
}



xlog( d3, 4, "************************************************" );
xlog( d3, 4, "* Programm         : " + prg );
xlog( d3, 4, "* Version          : " + version );
xlog( d3, 4, "* Kunde            : " + kunde );
xlog( d3, 4, "* geschrieben von  : calb / d.velop AG" );
xlog( d3, 4, "* (c) d.velop AG" );
xlog( d3, 4, "************************************************" );


xlog( d3, 4, "Parameter: " );
xlog( d3, 4, "* DEBUG               : " + debugtext );
xlog( d3, 4, "* Dokumentart         : " + dokumentart );
xlog( d3, 4, "* Dokumentbereich von : " + doku_id_von );
xlog( d3, 4, "* Dokumentbereich bis : " + doku_id_bis );





xlog( d3, 4, "************************************************" );



def sqlQuery = "select top 99999 doku_id from firmen_spezifisch where kue_dokuart = '" + dokumentart + "' and doku_id >= '" + doku_id_von + "' and doku_id <= '" + doku_id_bis + "' and doku_id not in (select doku_id from dv_akten_loesen)";

resultRows = d3.sql.executeAndGet( (String) sqlQuery );

if ( resultRows.size() > 0 )
{
	xlog( d3, 4, " Es wurden " + resultRows.size() + " Treffer gefunden." );
	xlog( d3, 4, "************************************************" );
	
	def j;
	def sqlStatement = "";
	def dokStatus = "";
	def anzahl;
	
	for ( i = 0; i < resultRows.size(); i++ )
	{
		
		j = i + 1;
		xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": bearbeite Doku-ID " + resultRows[ i ].doku_id );
		
		// Prüfung, ob überhaupt etwas zu tun ist
		// zu tun ist etwas, wenn ein Dokument mehr als einen Eintrag in den 60er-Feldern hat.
		
		sqlStatement = "select * from firm_spez_mult_val where doku_id = '" + resultRows[ i ].doku_id + "' and field_no = 60 and value_char is not null ";
		
		anzahl = d3.sql.executeAndGet( (String) sqlStatement );
		
		if ( anzahl.size() > 1 )
		{
			
			def ueberdoks = d3.call.link_get_parents( resultRows[ i ].doku_id, "Master" );
			
			def ziel_dok_ids = "";
			if ( ueberdoks.size() > 0 )
			{
				
				ueberdoks.each
				{
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Kind: " + resultRows[ i ].doku_id + ", gefundenes Elternelement: " + it );
					
					ziel_dok_ids = ziel_dok_ids + "'" + it + "',";
				}
				
				ziel_dok_ids = ziel_dok_ids.substring( 0, ziel_dok_ids.length( ) - 1 );
				
				xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Elternelemente: " + ziel_dok_ids );
				
				def STATEMENT = "select dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_10, dok_dat_feld_13, dok_dat_feld_21 from firmen_spezifisch where doku_id in ( " + ziel_dok_ids + " ) ";
						
				def resultRows2 = d3.sql.executeAndGet( STATEMENT );
				
				// Schreiben der Verknüpfungen an das Dokument:
					
				def currentDoc = d3.archive.getDocument( resultRows[ i ].doku_id );
				
				// Vor dem Leeren der Felder werden diese nochmal aufgelistet:
				
				def meld_anz = true;
				
				for ( int k = 1 ; k <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); k++ )
				{
					if ( ( (currentDoc.field[ 60 ][ k ]) || (currentDoc.field[ 61 ][ k ]) || (currentDoc.field[ 62 ][ k ]) || (currentDoc.field[ 63 ][ k ]) || (currentDoc.field[ 64 ][ k ]) ) )
					{
						if ( meld_anz == true )
						{
							xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktuelle Informationen (werden gleich geloescht): " );
							meld_anz = false;
						}
						
						xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantennamen (DDF60)          : " + currentDoc.field[ 60 ][ k ] ); // Mandantennamen
						xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantennummern (DDF61)        : " + currentDoc.field[ 61 ][ k ] ); // Mandantennummern
						xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantengruppennummern (DDF62) : " + currentDoc.field[ 62 ][ k ] ); // Mandantengruppennummern
						xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Aktennamen (DDF63)              : " + currentDoc.field[ 63 ][ k ] ); // Aktennamen
						xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Aktennummern (DDF64)            : " + currentDoc.field[ 64 ][ k ] ); // Aktennummern
					}
					else
					{
						
					}
				}
				
				
				// Die Felder werden vor dem Füllen geleert, damit - für den Fall, dass weniger neue Werte reingeschrieben werden als vorher drin waren - keine
				// deplazierten Restwerte in den Feldern stehen bleiben. (Könnte man vielleicht auch eleganter lösen.)
				// Felder leeren:
				
				xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mehrfachindexfelder fuer Mandant und Akte (60, 61, 62, 63, 64) werden geleert." );
				
				for ( int k = 1 ; k <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); k++ )
				{
					currentDoc.field[ 60 ][ k ] = ""; // Mandantennamen
					currentDoc.field[ 61 ][ k ] = ""; // Mandantennummern
					currentDoc.field[ 62 ][ k ] = ""; // Mandantengruppennummern
					currentDoc.field[ 63 ][ k ] = ""; // Aktennamen
					currentDoc.field[ 64 ][ k ] = ""; // Aktennummern
				}
				
				// Jetzt Felder füllen mit den gefundenen Werten:
				for ( int m = 1 ; m <= resultRows2.size(); m++ )
				{
					currentDoc.field[ 60 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_2; // Mandantennamen
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantennamen (DDF60)          Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_2 );
					
					currentDoc.field[ 61 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_1; // Mandantennummern
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantennummern (DDF61)        Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_1 );
					
					currentDoc.field[ 62 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_13; // Mandantengruppennummern
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantengruppennummern (DDF62) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_13 );
					
					currentDoc.field[ 63 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_21; // Aktennamen
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktennamen (DDF63)              Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_21 );
					
					currentDoc.field[ 64 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_10; // Aktennummern
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktennummern (DDF64)            Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_10 );
				}
				
				if ( debug == 0 )
				{
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktualisiere Dokument." );
					currentDoc.updateAttributes( "Master" );
					dokStatus = "FINISHED";
				}
				else
				{
					xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Debug-Modus eingeschaltet => Es wird keine weitere Aktion durchgefuehrt." );
				}
			}
			else
			{
				xlog( d3, 3, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": keine Elternelemente gefunden. => Es wird keine weitere Aktion durchgeführt." );
				dokStatus = "NOPARENT";
			}
		}
		else
		{
			xlog( d3, 3, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Weniger als zwei 60er-Feld-Eintraege gefunden. => Es wird keine weitere Aktion durchgefuehrt." );
			dokStatus = "JUSTONE";
		}
		
		if ( debug == 0 )
		{
			sqlStatement  = "insert into dv_akten_loesen ( id, doku_id, status ) values ( '" + String.format( "%05d", j ) + "', '" + resultRows[ i ].doku_id + "', '" + dokStatus + "'  )";
			def sqlResultRows = d3.sql.execute( (String) sqlStatement );
		}
		
		xlog( d3, 4, "------------------------------" );
	}

}
else
{
	xlog( d3, 4, "Es wurden keine Treffer gefunden." );
	xlog( d3, 4, "************************************************" );
}



























def xlog( D3Interface d3, int loglevel, String logtext )
{
        def logdatei            = "d:\\d3\\apps\\" + prg + ".txt";
        def g_loglevel          = 5;
        def g_logdirect         = "BEIDE";  // BEIDE oder D3LOG oder DATEI
        def date                = new Date();
        def zeitstempel         = date.format( "yyyy.MM.dd HH:mm:ss", TimeZone.getTimeZone('CET') );
        def loglevel_lang       = "[INFO ]";
        
        
        
        
        
        if ( loglevel <= g_loglevel )
        {
                switch ( loglevel )
                {
                        case 1:
                                loglevel_lang   = "[FATAL]";
                                
                                if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
                                {
                                        d3.log.critical( logtext );
                                }
                                break;
                        case 2:
                                loglevel_lang   = "[ERROR]";
                                
                                if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
                                {
                                        d3.log.error( logtext );
                                }
                                break;
                        case 3:
                                loglevel_lang   = "[WARN ]";
                                
                                if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
                                {
                                        d3.log.warn( logtext );
                                }
                                break;
                        case 4:
                                loglevel_lang   = "[INFO ]";
                                
                                if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
                                {
                                        d3.log.info( logtext );
                                }
                                break;
                        case 5:
                                loglevel_lang   = "[DEBUG]";
                                // Da die d.3 Server i.d.R. nicht im Debug-Modus laufen, erscheinen DEBUG-Meldungen nicht im Log.
                                if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
                                {
                                        d3.log.debug( logtext );
                                }
                                break;
                }
                
        }
        
        if ( ( g_logdirect == "DATEI" ) || ( g_logdirect == "BEIDE" ) )
        {
                new File( logdatei ).append( zeitstempel + " " + loglevel_lang + " " + logtext + "\n", "UTF8" );
        }
        
        
        return 0;
}