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              = "mehrfachfelder_einrichten.groovy";
@Field version          = "0.1";
@Field kunde            = "Dr. Kleeberg & Partner GmbH";


// Dieses Skript soll bei allen Dokumenten innerhalb der Mandatenakte die verknüpften Akten in 60er-Felder eintragen, damit die Dokumente bei einer passenden Suche gefunden werden.
// Dabei wird festgehalten, welche Dokumente bereits aktualisiert wurden.


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


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


@Field suffix = Math.abs( new Random().nextInt() % (99999 - 10000) ) + 10000;



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

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, "************************************************" );


def i, ergebniszeilen, ergebnistext;

def dokumentarten = "'DBERA', 'DBETR', 'DDAUE', 'DDEBD', 'DFIBU', 'DABSC', 'DLOHN', 'DLSTD', 'DSTEU' ";


def sqlQuery = "select top (10000) doku_id, kue_dokuart from firmen_spezifisch where kue_dokuart in ( " + dokumentarten +  " ) and doku_id not in ( select doku_id from dv_mehrf_feld) order by kue_dokuart";

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

if ( DB_Zeilen.size() > 0 )
{
        xlog( d3, 4, " Es wurde(n) " + DB_Zeilen.size() + " Treffer gefunden." );
        xlog( d3, 4, "************************************************" );
        
        for ( i = 0; i < DB_Zeilen.size(); i++ )
		{
			def docChild = DB_Zeilen[ i ].doku_id;
			
			xlog( d3, 4, i + ": bearbeite Doku-ID " + docChild );
			
			def ueberdoks = d3.call.link_get_parents( docChild, "Master" );
			//xlog( d3, 4, i + ": bearbeite ueberdoks-ID " + ueberdoks + " " + ueberdoks.size() );
			
			def ziel_dok_ids = "";
			if ( ueberdoks.size() > 0 )
			{
				ueberdoks.each
				{
					xlog( d3, 4, i + ": => Kind: " + docChild + " 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, i + ": Ziel-Dok_IDs: " + ziel_dok_ids );
				
				def STATEMENT = "select kue_dokuart, 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 resultRows = d3.sql.executeAndGet( STATEMENT );
				
				if ( resultRows.size() > 0 )
				{
					// Schreiben der Verknüpfungen an das Dokument:
					
					def currentDoc = d3.archive.getDocument( docChild );
					
					// 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:
					for ( int m = 1 ; m <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); m++ )
					{
						currentDoc.field[ 60 ][ m ] = ""; // Mandantennamen
						currentDoc.field[ 61 ][ m ] = ""; // Mandantennummern
						currentDoc.field[ 62 ][ m ] = ""; // Mandantengruppennummern
						currentDoc.field[ 63 ][ m ] = ""; // Aktennamen
						currentDoc.field[ 64 ][ m ] = ""; // Aktennummern
					}
					
					// Jetzt Felder füllen mit den gefundenen Werten:
					for ( int j = 1 ; j <= resultRows.size(); j++ )
					{
						currentDoc.field[ 60 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_2; // Mandantennamen
						currentDoc.field[ 61 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_1; // Mandantennummern
						currentDoc.field[ 62 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_13; // Mandantengruppennummern
						currentDoc.field[ 63 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_21; // Aktennamen
						currentDoc.field[ 64 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_10; // Aktennummern
						xlog( d3, 4, i + ": Dokument " + docChild + ": Info-Zeile " + j + " gesetzt: <" + resultRows[ j - 1 ].kue_dokuart + "> <" + resultRows[ j - 1 ].dok_dat_feld_2 + "> <" + resultRows[ j - 1 ].dok_dat_feld_1 + "> <" + resultRows[ j - 1 ].dok_dat_feld_13 + "> <" + resultRows[ j - 1 ].dok_dat_feld_21 + "> <" + resultRows[ j - 1 ].dok_dat_feld_10 + ">" );
					}
					
					currentDoc.updateAttributes( "Master" );
					dokument_fertig(  d3, docChild, "Aktualisierung erfolgt." );
					xlog( d3, 4, i + ": Dokument " + docChild + ": Aktualisierung erfolgt." );
				}
				
			}
			else
			{
				dokument_fertig(  d3, docChild, "keine uebergeordneten Akten" );
				xlog( d3, 3, i + ": Dokument " + docChild + " hat keine uebergeordneten Akten." );
			}
			xlog( d3, 4, "************************************************" );
		}
        
        
}
else
{
	xlog( d3, 3, "Es wurden keine passenden Treffer gefunden!" );
}
















def dokument_fertig( D3Interface d3, String doku_id, String meldung )
{
	def meldung_db;
	
	if ( meldung.length() > 200 )
	{
		meldung_db = meldung.substring( 0, 199 );
	}
	else
	{
		meldung_db = meldung;
	}
	
	if ( debug == 0 )
	{
		//xlog( d3, 4, "Angekommen" );
		sql = "insert into  dv_mehrf_feld (doku_id, status) values ( '" + doku_id + "', '" + meldung + "' )";
		d3.sql.execute( sql );
	}
	
	
}










def xlog( D3Interface d3, int loglevel, String logtext )
{
        def logdatei            = "d:\\d3\\logs\\" + prg + "_" + suffix + ".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;
}