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

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


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






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

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 sqlQuery = "select top (100) id,unique_id_doc,unique_id_fol,ddf10,ddf3,ddf4,ddf23,ddf17,ddf32 from mig_link_docs_2 where doku_id_target_fol is null and ddf3 is not null and ddf10 like '%DA%' and fehler is null and id < 177869  ";

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

xlog( d3, 4, " Es wurden " + resultRows.size() + " Treffer gefunden." );
xlog( d3, 4, "************************************************" );

if ( resultRows.size() > 0 )
{
	for( int i = 0 ; i <= resultRows.size() - 1 ; i++ )
	{
		def dummy_ddf3, dummy_ddf4, dummy_ddf23, dummy_ddf17, dummy_ddf32;
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": pruefen, ob folgende Aktenstruktur existiert:" );
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Unique-ID Dokument           : [" + resultRows[ i ].unique_id_doc + "]" );
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF10 / Aktennummer          : [" + resultRows[ i ].ddf10 + "]" );
		
		if ( ( ! resultRows[ i ].ddf3 ) || ( resultRows[ i ].ddf3 == "null" ) )
		{
			dummy_ddf3 = "";
		}
		else
		{
			dummy_ddf3 = resultRows[ i ].ddf3;
		}
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF03 / Oberregister         : [" + dummy_ddf3  + "]" );
		
		if ( ( ! resultRows[ i ].ddf4 ) || ( resultRows[ i ].ddf4 == "null" ) )
		{
			dummy_ddf4 = "";
		}
		else
		{
			dummy_ddf4 = resultRows[ i ].ddf4;
		}
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF04 / Register             : [" + dummy_ddf4  + "]" );
		
		if ( ( ! resultRows[ i ].ddf23 ) || ( resultRows[ i ].ddf23 == "null" ) )
		{
			dummy_ddf23 = "";
		}
		else
		{
			dummy_ddf23 = resultRows[ i ].ddf23;
		}
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF23 / Unterregister        : [" + dummy_ddf23 + "]" );
		
		if ( ( ! resultRows[ i ].ddf17 ) || ( resultRows[ i ].ddf17 == "null" ) )
		{
			dummy_ddf17 = "";
		}
		else
		{
			dummy_ddf17 = resultRows[ i ].ddf17;
		}
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF17 / 2. Unterregister     : [" + dummy_ddf17 + "]" );
		
		if ( ( ! resultRows[ i ].ddf32 ) || ( resultRows[ i ].ddf32 == "null" ) )
		{
			dummy_ddf32 = "";
		}
		else
		{
			dummy_ddf32 = resultRows[ i ].ddf32;
		}
		xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": DDF32 / 3. Unterregister     : [" + dummy_ddf32 + "]" );
		
		def typ = resultRows[ i ].ddf10.substring(5, 7);
		
		xlog( d3, 5, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": erkannter Typ: " + typ );
		
		def orakte, rakte, urakte, urakte2, urakte3;
		
		
		switch ( typ )
		{
			case "FI":
				akte	= "AFIBA";
				orakte	= "AFIOR";
				rakte	= "AFIRA";
				urakte	= "AFIUR";
				urakte2	= "AFIU2";
				urakte3	= "";
				break;
			case "DA":
				akte	= "ADAUR";
				orakte	= "AOREG";
				rakte	= "AREGS";
				urakte	= "AUREG";
				urakte2	= "AURG2";
				urakte3	= "AURG3";
				break;
			case "ST":
				akte	= "ASTEU";
				orakte	= "ASTOR";
				rakte	= "ASTRA";
				urakte	= "ASTUR";
				urakte2	= "ASTU2";
				urakte3	= "";
				break;
			case "BE":
				akte	= "ABERB";
				orakte	= "ABERO";
				rakte	= "ABERA";
				urakte	= "ABEUR";
				urakte2	= "ABEU2";
				urakte3	= "";
				break;
			case "BP":
				akte	= "ABETR";
				orakte	= "ABEOR";
				rakte	= "ABEPA";
				urakte	= "ABPUR";
				urakte2	= "ABPU2";
				urakte3	= "";
				break;
			case "LO":
				akte	= "ALOJA";
				orakte	= "ALBOR";
				rakte	= "ALBRE";
				urakte	= "ALJUR";
				urakte2	= "ALJR2";
				urakte3	= "";
				break;
			case "LS":
				akte	= "ALBSA";
				orakte	= "ALBSO";
				rakte	= "ALORE";
				urakte	= "ALOUR";
				urakte2	= "ALBU2";
				urakte3	= "";
				break;
			case "JA":
				akte	= "AJAAA";
				orakte	= "AJAOB";
				rakte	= "AJAAB";
				urakte	= "AJAUR";
				urakte2	= "AJAU2";
				urakte3	= "";
				break;
			case "RE":
				akte	= "AAURE";
				orakte	= "AAURR";
				rakte	= "AAURA";
				urakte	= "AAURU";
				urakte2	= "AAUR2";
				urakte3	= "";
				break;
		}
		
		
		
		
		def schritt_1 = [ "kue_dokuart":  orakte, "dok_dat_feld_10": resultRows[ i ].ddf10, "dok_dat_feld_3": dummy_ddf3 ];
		def schritt_2 = [ "kue_dokuart":   rakte, "dok_dat_feld_10": resultRows[ i ].ddf10, "dok_dat_feld_3": dummy_ddf3, "dok_dat_feld_4": dummy_ddf4 ];
		def schritt_3 = [ "kue_dokuart":  urakte, "dok_dat_feld_10": resultRows[ i ].ddf10, "dok_dat_feld_3": dummy_ddf3, "dok_dat_feld_4": dummy_ddf4, "dok_dat_feld_23": dummy_ddf23 ];
		def schritt_4 = [ "kue_dokuart": urakte2, "dok_dat_feld_10": resultRows[ i ].ddf10, "dok_dat_feld_3": dummy_ddf3, "dok_dat_feld_4": dummy_ddf4, "dok_dat_feld_23": dummy_ddf23, "dok_dat_feld_17": dummy_ddf17  ];
		def schritt_5 = [ "kue_dokuart": urakte3, "dok_dat_feld_10": resultRows[ i ].ddf10, "dok_dat_feld_3": dummy_ddf3, "dok_dat_feld_4": dummy_ddf4, "dok_dat_feld_23": dummy_ddf23, "dok_dat_feld_17": dummy_ddf17, "dok_dat_feld_32": dummy_ddf32  ];
		
		def schritte = [ schritt_1, schritt_2, schritt_3, schritt_4, schritt_5 ];
		
		def gemerkte_doku_id;
		def lege_akte_an;
		
		for ( int m = 0; m <= schritte.size() - 1 ; m++ )
		{
			
			// Zusammenbauen des Such-Statements:
			
			def STATEMENT = "select doku_id from firmen_spezifisch where ";
			def log = "Suche nach folgenden Kriterien : ";
			def x = 0;
			def und;
			def kein_problem = true;
			lege_akte_an = true;
			
			schritte[ m ].each { eintrag ->
			
				//xlog( d3, 3, "Key [" + eintrag.key + "] Value [" + eintrag.value + "]" );
				if ( x > 0 )
				{
					und = " and ";
				}
				else
				{
					und = "";
					x = 1;
				}
				
				if ( ( eintrag.value == "" ) || ( eintrag.value == null ) )
				{
					kein_problem = false;
				}
				
				if ( ( eintrag.key == "kue_dokuart" ) && ( eintrag.value == "" ) )
				{
					kein_problem = false;
				}
				
				STATEMENT = STATEMENT + und + eintrag.key + " = '" + eintrag.value + "' ";
				log = log + "[" + eintrag.key + "] => [" + eintrag.value + "]  ";
			}
			
			if ( kein_problem )
			{
				xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": " + log );
				
				xlog( d3, 5, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": " + STATEMENT );
				
				def ergebnis = d3.sql.executeAndGet( (String) STATEMENT );
				
				if ( ergebnis.size() > 0 )
				{
					// Akte existiert
					// Doku-ID merken:
					gemerkte_doku_id	= ergebnis[ 0 ].doku_id;
					xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Akte existiert, gemerkte Doku-ID: [" + gemerkte_doku_id + "]" );
					
					//def updatesql = "update mig_verknuepfung set ziel_dok = '" + ergebnis[ 0 ].doku_id + "' where id = " + resultRows[ i ].id;
					
				}
				else
				{
					xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Akte existiert nicht, muss angelegt werden." );
					
					
					// Akte existiert nicht, muss angelegt werden:
					Document newDoc = d3.archive.newDocument();
					//xlog( d3, 2, "Schritte kue_dokuart = [" +  schritte[ m ] + "]");
					
					xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze Dokumentart						[" + schritte[ m ].kue_dokuart + "]" );
					
					newDoc.type = schritte[ m ].kue_dokuart;
					
					
					
					newDoc.status = Document.DocStatus.DOC_STAT_RELEASE;
					//newDoc.editor = "dvelop";
					
					// Mit diesem Statement wird versucht, die Hauptakte zu finden, um von dieser dann Eigenschaftswerte zu lesen. Kann diese Akte nicht gefunden werden, ist das ein Fehlerzustand,
					// der am Datensatz in der Quelle festgehalten wird.
					STATEMENT = "select doku_id, dok_dat_feld_25, dok_dat_feld_42, dok_dat_feld_21, dok_dat_feld_2, dok_dat_feld_13, dok_dat_feld_37, dok_dat_feld_1 from firmen_spezifisch where kue_dokuart = '" + akte + "' and dok_dat_feld_10 = '" + resultRows[ i ].ddf10 + "'";
					
					def erg = d3.sql.executeAndGet( (String) STATEMENT );
					//xlog( d3, 5, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": " + STATEMENT );
					
					if ( schritte[ m ].dok_dat_feld_1 )  // Mandantnummer
					{
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF1 / Mandantnummer				[" + schritte[ m ].dok_dat_feld_1 + "]" );
						newDoc.field[  1 ] = schritte[ m ].dok_dat_feld_1;
					}
					
					
					if ( erg.size() > 0 )
					{
						if ( ( erg[ 0 ].dok_dat_feld_1 ) && ( ! schritte[ m ].dok_dat_feld_1 ) )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF1  / Mandantnummer				[" + erg[ 0 ].dok_dat_feld_1 + "]" );
							newDoc.field[ 1 ] = erg[ 0 ].dok_dat_feld_1;
						}
						
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF10 / Aktennummer				[" + resultRows[ i ].ddf10 + "]" );
						newDoc.field[ 10 ] = resultRows[ i ].ddf10;
						
						if ( erg[ 0 ].dok_dat_feld_25 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF25 / Geschaeftsfuehrer			[" + erg[ 0 ].dok_dat_feld_25 + "]" );
							newDoc.field[ 25 ] = erg[ 0 ].dok_dat_feld_25;
						}
						
						if ( erg[ 0 ].dok_dat_feld_42 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF42 / Briefkopf					[" + erg[ 0 ].dok_dat_feld_42 + "]" );
							newDoc.field[ 42 ] = erg[ 0 ].dok_dat_feld_42;
						}
						
						if ( erg[ 0 ].dok_dat_feld_21 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF21 / Aktenname					[" + erg[ 0 ].dok_dat_feld_21 + "]" );
							newDoc.field[ 21 ] = erg[ 0 ].dok_dat_feld_21;
						}
						
						if ( erg[ 0 ].dok_dat_feld_2 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF2  / Mandantname				[" + erg[ 0 ].dok_dat_feld_2 + "]" );
							newDoc.field[ 2 ] = erg[ 0 ].dok_dat_feld_2;
						}
						
						if ( erg[ 0 ].dok_dat_feld_13 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF13 / Mandantgruppennummer		[" + erg[ 0 ].dok_dat_feld_13 + "]" );
							newDoc.field[ 13 ] = erg[ 0 ].dok_dat_feld_13;
						}
						
						if ( erg[ 0 ].dok_dat_feld_37 )
						{
							xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF37 / Mandatsverantwortlicher	[" + erg[ 0 ].dok_dat_feld_37 + "]" );
							newDoc.field[ 37 ] = erg[ 0 ].dok_dat_feld_37;
						}
						
					}
					else
					{
						lege_akte_an = false;
					}
					
					
					if ( schritte[ m ].dok_dat_feld_3 )  // Oberregister
					{
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF3  / Oberregister				[" + schritte[ m ].dok_dat_feld_3 + "]" );
						newDoc.field[  3 ] = schritte[ m ].dok_dat_feld_3;
					}
					
					if ( schritte[ m ].dok_dat_feld_4 )  // Register
					{
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF4  / Register					[" + schritte[ m ].dok_dat_feld_4 + "]" );
						newDoc.field[  4 ] = schritte[ m ].dok_dat_feld_4;
					}
					
					if ( schritte[ m ].dok_dat_feld_23 )  // Unterregister
					{
						
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF23 / Unterregister				[" + schritte[ m ].dok_dat_feld_23 + "]" );
						newDoc.field[ 23 ] = schritte[ m ].dok_dat_feld_23;
					}
					
					if ( schritte[ m ].dok_dat_feld_17 )  // 2. Unterregister
					{
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF17 / 2. Unterregister			[" + schritte[ m ].dok_dat_feld_17 + "]" );
						newDoc.field[ 17 ] = schritte[ m ].dok_dat_feld_17;
					}
					
					if ( schritte[ m ].dok_dat_feld_32 )  // 3. Unterregister
					{
						xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Setze DDF32 / 3. Unterregister			[" + schritte[ m ].dok_dat_feld_32 + "]" );
						newDoc.field[ 32 ] = schritte[ m ].dok_dat_feld_32;
					}
					
					def fehler = false;
					
					if ( debug == 0 )
					{
						if ( lege_akte_an )
						{
							try
							{
								newDoc = d3.archive.importDocument( newDoc );
							}
							catch ( D3Exception e )
							{
								xlog( d3, 2, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Akte konnte nicht erzeugt werden: " + e.message );
								fehler = true;
							}
							
							if ( ! fehler )
							{
								xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Doku-ID der erzeugten Akte : [" + newDoc.id + "]" );
								gemerkte_doku_id = newDoc.id;
								xlog( d3, 4, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Akte existiert, gemerkte Doku-ID: [" + gemerkte_doku_id + "]" );
							}
						}
						else
						{
							xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Hauptakte wurde nicht gefunden => Akte wurde nicht erzeugt." );
							break;
						}
					}
					else
					{
						xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Akte wurde nicht erzeugt / Debug-Modus eingeschaltet." );
					}
				}
				
				xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ":****************************" );
				
			}
		}
		
		
		if ( gemerkte_doku_id )
		{
			
			def USTATEMENT = "update mig_link_docs_2 set doku_id_target_fol = '" + gemerkte_doku_id + "' where id = '" + resultRows[ i ].id + "'";
			if ( debug == 0 )
			{
				xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": setze gemerkte Doku-ID [" + gemerkte_doku_id + "] fuer ID " + resultRows[ i ].id );
				d3.sql.executeAndGet( (String) USTATEMENT );
			}
			else
			{
				xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Debug-Modus eingeschaltet, [" + gemerkte_doku_id + "] fuer ID " + resultRows[ i ].id + " wurde nicht gesetzt.");
			}
		}
		
		if ( ! lege_akte_an )
		{
			def USTATEMENT = "update mig_link_docs_2 set fehler = 'Die Hauptakte existiert nicht.' where id = '" + resultRows[ i ].id + "'";
			if ( debug == 0 )
			{
				xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": setze Fehler 'Die Hauptakte existiert nicht.' fuer ID " + resultRows[ i ].id );
				d3.sql.executeAndGet( (String) USTATEMENT );
			}
			else
			{
				xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ": Debug-Modus eingeschaltet, Fehler 'Die Hauptakte existiert nicht.' fuer ID " + resultRows[ i ].id + " wurde nicht gesetzt.");
			}
		}
		
		xlog( d3, 3, resultRows[ i ].ddf10 + " / " + resultRows[ i ].id + ":*******************************************************" );
	}
	
}




























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;
}