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

def prg			= "migration_akte_dauerakte.groovy";
def version		= "0.1";
def 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;



// In welcher Tabelle soll nach den zu erstellenden Akten gesucht werden?
@Field zieltabelle = "mig_dauerakte";


// Konfiguration der Aktenartkürzel
@Field dokuart_sammelakte        = "AMAND"; //Es gibt keine Sammelakte fuer Dauerakten, daher werden die Infos aus der Mandantenakte ermittelt
@Field dokuart_hauptakte         = "ADAUR";
@Field dokuart_oberregisterakte  = "AOREG";
@Field dokuart_registerakte      = "AREGS";
@Field dokuart_unterregisterakte = "AUREG";



// der hier konfigurierte Wert wird verwendet, wenn kein sonstiger Hauptaktenname gefunden wird.
@Field standard_hauptaktenname  = "Dauerakte";


// DDF 1 / ADM_Aktentyp aus der Aktenart ADM_Verwaltung Mandantenakte (AVMNT) - mit diesem Schlüssel werden die benötigten (Ober-)Register aus den Stammdaten in der Aktenart AVMNT ermittelt.
@Field aktenschluessel  = "Dauerakte";




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

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, "* Aktenart Sammelakte       : " + dokuart_sammelakte );
xlog( d3, 4, "* Aktenart Hauptakte        : " + dokuart_hauptakte );
xlog( d3, 4, "* Aktenart Oberregisterakte : " + dokuart_oberregisterakte );
xlog( d3, 4, "* Aktenart Registerakte     : " + dokuart_registerakte );
xlog( d3, 4, "* Zieltabelle               : " + zieltabelle );
xlog( d3, 4, "* Standard-Hauptaktenname   : " + standard_hauptaktenname );
xlog( d3, 4, "* Aktenschluessel           : " + aktenschluessel );




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




def sqlQuery = "select top (100) id,ddf1,ddf48,ddf10,ddf21,ddf22,ddf25,ddf37,ddf42,ddf60,ddf69 from " + zieltabelle + " where fehler is null and doku_id is null";

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

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

if ( treffer.size() > 0 )
{
	for ( i = 0; i < treffer.size(); i++ )
	{
		// Prüfung, ob die Mandantnummer in der Aktennummer zu der Mandantnummer aus der Tabelle passt - andernfalls Fehler.
		
		def mandantnr_aus_aktennr = treffer[ i ].ddf10.substring( 0, 5 );
		
		
		//JFEL toString eingefügt, da der Vergleich sonst scheitert.
		//if ( mandantnr_aus_aktennr == treffer[ i ].ddf1 )
		if ( mandantnr_aus_aktennr == treffer[ i ].ddf1.toString() )
		{
			// Es wird eine neue Hauptakte erstellt
			
			def newDocfield_1, newDocfield_2, newDocfield_10, newDocfield_13, newDocfield_21, newDocfield_22, newDocfield_25, newDocfield_37, newDocfield_42, newDocfield_48, newDocfield_60 = [ ], newDocfield_69 = [ ];
			xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Mandantennummer DDF1              : [" + treffer[ i ].ddf1 + "]" );
			
			//JFEL toString eingefügt, da sonst später beim wegschreiben ein Java-Class-Error auftritt.
			//newDocfield_1	= treffer[ i ].ddf1;
			newDocfield_1	= treffer[ i ].ddf1.toString();
			
			xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Aktennummer DDF10                 : [" + treffer[ i ].ddf10 + "]" );
			newDocfield_10	= treffer[ i ].ddf10;

			if ( treffer[ i ].ddf21 )
			{
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Aktenname DDF21                   : [" + treffer[ i ].ddf21 + "]" );
				newDocfield_21 = treffer[ i ].ddf21;
			}
			else
			{
				xlog( d3, 3, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenname wurde nicht gefunden. Setze Standardbezeichnung '" + standard_hauptaktenname + "'." );
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Aktenname DDF21                   : <" + standard_hauptaktenname + ">" );
				newDocfield_21 = standard_hauptaktenname;
			}
			
			xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze physischer Aufbewahrungsort DDF22 : [" + treffer[ i ].ddf22 + "]" );
			newDocfield_22	= treffer[ i ].ddf22;
			
			if ( treffer[ i ].ddf25 )
			{
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Geschaeftsfuehrer DDF25           : [" + treffer[ i ].ddf25 + "]" );
				newDocfield_25	= treffer[ i ].ddf25;
			}
			else
			{
				def STATEMENT = "select dok_dat_feld_25 from firmen_spezifisch where kue_dokuart = 'AMAND' and dok_dat_feld_1 = '" + newDocfield_1 + "'";
				def treffer_STATEMENT = d3.sql.executeAndGet( (String) STATEMENT );
				
				if ( treffer_STATEMENT.size() > 0 )
				{
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Geschaeftsfuehrer DDF25 aus M.-Akte  : [" + treffer_STATEMENT[ 0 ].dok_dat_feld_25 + "]" );
					newDocfield_25 = treffer_STATEMENT[ 0 ].dok_dat_feld_25;
				}
				else
				{
					xlog( d3, 3, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Es konnte kein Wert für Geschaeftsfuehrer / DDF25 gefunden werden." );
				}
			}
			
			if ( treffer[ i ].ddf37 )
			{
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Auftragsverantwortlicher DDF37    : [" + treffer[ i ].ddf37 + "]" );
				newDocfield_37	= treffer[ i ].ddf37;
			}
			else
			{
				def STATEMENT = "select dok_dat_feld_37 from firmen_spezifisch where kue_dokuart = 'AMAND' and dok_dat_feld_1 = '" + newDocfield_1 + "'";
				def treffer_STATEMENT = d3.sql.executeAndGet( (String) STATEMENT );
				
				if ( treffer_STATEMENT.size() > 0 )
				{
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Auftragsverantwortlicher DDF37 aus M.-Akte: [" + treffer_STATEMENT[ 0 ].dok_dat_feld_37 + "]" );
					newDocfield_37 = treffer_STATEMENT[ 0 ].dok_dat_feld_37;
				}
				else
				{
					xlog( d3, 3, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Es konnte kein Wert für Auftragsverantwortlicher / DDF37 gefunden werden." );
				}
			}
			
			xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Briefkopf DDF42                   : [" + treffer[ i ].ddf42 + "]" );
			newDocfield_42	= treffer[ i ].ddf42;

			xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Unique-ID Migration DDF48         : [" + treffer[ i ].ddf48 + "]" );
			newDocfield_48	= treffer[ i ].ddf48;
			
			// Postempfänger
			if ( treffer[ i ].ddf60 )
			{
				def splitted_str_array = treffer[ i ].ddf60.split( ';' );
				for ( int j = 0; j < splitted_str_array.length; j++ )
				{
					def filler = " ";
					if ( j >= 10 )
					{
						filler = "";
					}
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Setze Postempfaenger DDF60 / " + filler + j + "         : [" + splitted_str_array[ j ] + "]" );
					newDocfield_60[ j ] = splitted_str_array[ j ];
				}
			}
			
			
			// Berechtigter:
			if ( treffer[ i ].ddf69 )
			{
				def splitted_str_array = treffer[ i ].ddf69.split( ';' );
				for ( int j = 0; j < splitted_str_array.length; j++ )
				{
					def filler = " ";
					if ( j >= 10 )
					{
						filler = "";
					}
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Setze Berechtigter DDF69 / " + filler + j + "           : [" + splitted_str_array[ j ] + "]" );
					newDocfield_69[ j ] = splitted_str_array[ j ];
				}
			}
			
			
			// Prüfung, ob zu dieser Hauptakte eine passende Sammelakte existiert
			// Falls ja: Übernahme der Mandantenstammdaten der entsprechenden Akte
			// Falls nein: Fehler in DB eintragen und Abbruch der Verarbeitung dieses Treffers
			
			sqlQuery = "select doku_id, dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_13 from firmen_spezifisch where kue_dokuart = '" + dokuart_sammelakte + "' and dok_dat_feld_1 = '" + treffer[ i ].ddf1 + "'";
			
			ergebnis = d3.sql.executeAndGet( (String) sqlQuery );
			
			if ( ergebnis.size() > 0 )
			{
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Mandantenname DDF2                : [" + ergebnis[ 0 ].dok_dat_feld_2 + "]" );
				newDocfield_2		= ergebnis[ 0 ].dok_dat_feld_2;
				
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": setze Mandantengruppennummer DDF13      : [" + ergebnis[ 0 ].dok_dat_feld_13 + "]" );
				newDocfield_13		= ergebnis[ 0 ].dok_dat_feld_13;
				
				// Akte mit Stammdaten und Infos aus der Tabelle "zieltabelle" erstellen
				// Registerstruktur unterhalb ebenfalls erstellen
				
				Document newDoc = d3.archive.newDocument();
				newDoc.type = dokuart_hauptakte;
				
				newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING;
				newDoc.editor = "dvelop";
				
				newDoc.field[  1 ] = newDocfield_1;
				newDoc.field[  2 ] = newDocfield_2;
				newDoc.field[ 10 ] = newDocfield_10;
				newDoc.field[ 13 ] = newDocfield_13;
				newDoc.field[ 21 ] = newDocfield_21;
				newDoc.field[ 22 ] = newDocfield_22;
				newDoc.field[ 25 ] = newDocfield_25;
				newDoc.field[ 37 ] = newDocfield_37;
				newDoc.field[ 42 ] = newDocfield_42;
				newDoc.field[ 48 ] = newDocfield_48;
				
				for ( int i = 0; i < newDocfield_60.size(); i++ )
				{
					newDoc.field[ 60 ][ i + 1 ] = newDocfield_60[ i ];
				}
				
				for ( int i = 0; i < newDocfield_69.size(); i++ )
				{
					newDoc.field[ 69 ][ i + 1 ] = newDocfield_69[ i ];
				}
				
				
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": =============================" );
				
				//Pruefung ob die anzulegende Akte ggf. schon im System angelegt wurde
				sqlQuery = "select doku_id from firmen_spezifisch where kue_dokuart = '" + dokuart_hauptakte + "' and dok_dat_feld_1 = '" + newDocfield_1 + "' AND dok_dat_feld_10 = '" + newDocfield_10 + "'";
				ergebnis = d3.sql.executeAndGet( (String) sqlQuery );
				if ( ergebnis.size() > 0 ) {
					fehler( d3, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage [" + newDoc.field[ 10 ] + "] nicht durchgefuehrt da die Akte bereits existiert, doku_id: " + ergebnis[ 0 ].doku_id, (int) treffer[ i ].id );
					continue;
				}
				
				def aktenanlage_erfolgreich = true;
				
				if ( debug == 0 )
				{
					try
					{
						newDoc = d3.archive.importDocument( newDoc );
					}
					catch ( D3Exception e )
					{
						fehler( d3, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Akte [" + newDoc.field[ 10 ] + "] konnte nicht erzeugt werden: " + e.message, (int) treffer[ i ].id );
						aktenanlage_erfolgreich = false;
					}
					
					if ( aktenanlage_erfolgreich )
					{
						// sichern der erzeugten Doku-ID
						if ( debug == 0 )
						{
							sqlQuery = "update " + zieltabelle + " set doku_id = '" + newDoc.id + "' where id = " + treffer[ i ].id;
							d3.sql.execute( sqlQuery );
							xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage [" + newDoc.field[ 10 ] + "] erfolgreich, doku_id: [" + newDoc.id + "]" );
						}
					}
				}
				else
				{
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Keine Aktenanlage fuer [" + newDoc.field[ 10 ] + "] (Debug-Modus eingeschaltet)." );
				}
				
				
				if ( aktenanlage_erfolgreich )
				{
					
					
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": =============================" );
					
					//////////////////////////////////////////
					// Ebene unterhalb der Hauptakte anlegen
					// Dokumentart: Hauptakten-Oberregisterakte, darin alle in den Stammdaten angelegten Oberregister
					
					sqlQuery = "select distinct dok_dat_feld_2 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = '" + aktenschluessel + "'";
					
					def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
					
					if ( resultRows.size() > 0 )
					{
						resultRows.each
						{
							//xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": erstelle Oberregister-Akte: [" + it.dok_dat_feld_2 + "]" );
							
							Document newDocOReg = d3.archive.newDocument();
							
							newDocOReg.type = dokuart_oberregisterakte;
							
							newDocOReg.status = Document.DocStatus.DOC_STAT_PROCESSING;
							newDocOReg.editor = "dvelop";
							
							newDocOReg.field[  1 ] = newDocfield_1;
							newDocOReg.field[  2 ] = newDocfield_2;
							newDocOReg.field[  3 ] = it.dok_dat_feld_2; // Oberregister
							newDocOReg.field[ 10 ] = newDocfield_10;
							newDocOReg.field[ 13 ] = newDocfield_13;
							newDocOReg.field[ 21 ] = newDocfield_21;
							newDocOReg.field[ 25 ] = newDocfield_25;
							newDocOReg.field[ 37 ] = newDocfield_37;
							newDocOReg.field[ 42 ] = newDocfield_42;
							
							
							
							
							for ( int i = 0; i < newDocfield_69.size(); i++ )
							{
								newDocOReg.field[ 69 ][ i + 1 ] = newDocfield_69[ i ];
							}
							
							if ( debug == 0 )
							{
								try
								{
									newDocOReg = d3.archive.importDocument( newDocOReg );
								}
								catch ( D3Exception e )
								{
									xlog( d3, 2, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Akte [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "] konnte nicht erzeugt werden: " + e.message );
									aktenanlage_erfolgreich = false;
								}
							}
							else
							{
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Keine Aktenanlage fuer [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "] (Debug-Modus eingeschaltet)." );
							}
							
							if ( ( aktenanlage_erfolgreich ) && ( debug == 0 ) )
							{
								//xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage erfolgreich, doku_id: [" + newDoc.id + "][" + newDocOReg.id + "]" );
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage erfolgreich, doku_id: [" + newDoc.id + "][" + newDocOReg.id + "] Register: [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "]" );
							}
						}
					}
				}
				else
				{
					xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Weitere Akten werden wegen Fehler nicht angelegt." );
				}
				
				xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": =============================" );
				
				if ( aktenanlage_erfolgreich )
				{
					//////////////////////////////////////////
					// Ebene unterhalb der Hauptakten-Oberregisterakte anlegen
					// Dokumentart: Hauptakten-Registerakte, darin alle in den Stammdaten angelegten Register
					
					sqlQuery = "select distinct dok_dat_feld_2, dok_dat_feld_3 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = '" + aktenschluessel + "' and dok_dat_feld_3 != ''";
					
					def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
					
					if ( resultRows.size() > 0 )
					{
						resultRows.each
						{
							//xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": erstelle Register-Akte: [" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "]" );
							
							Document newDocReg = d3.archive.newDocument();
							
							newDocReg.type = dokuart_registerakte;
							
							newDocReg.status = Document.DocStatus.DOC_STAT_PROCESSING;
							newDocReg.editor = "dvelop";
							
							newDocReg.field[  1 ] = newDocfield_1;
							newDocReg.field[  2 ] = newDocfield_2;
							newDocReg.field[  3 ] = it.dok_dat_feld_2; // Oberregister
							newDocReg.field[  4 ] = it.dok_dat_feld_3; // Register
							newDocReg.field[ 10 ] = newDocfield_10;
							newDocReg.field[ 13 ] = newDocfield_13;
							newDocReg.field[ 21 ] = newDocfield_21;
							newDocReg.field[ 25 ] = newDocfield_25;
							newDocReg.field[ 37 ] = newDocfield_37;
							newDocReg.field[ 42 ] = newDocfield_42;
							
							
							
							for ( int i = 0; i < newDocfield_69.size(); i++ )
							{
								newDocReg.field[ 69 ][ i + 1 ] = newDocfield_69[ i ];
							}
							
							if ( debug == 0 )
							{
								try
								{
									newDocReg = d3.archive.importDocument( newDocReg );
								}
								catch ( D3Exception e )
								{
									xlog( d3, 2, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Akte [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "] konnte nicht erzeugt werden: " + e.message );
									aktenanlage_erfolgreich = false;
								}
							}
							else
							{
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Keine Aktenanlage fuer [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "] (Debug-Modus eingeschaltet)." );
							}
							
							if ( ( aktenanlage_erfolgreich ) && ( debug == 0 ) )
							{
								sqlQuery = "select doku_id from firmen_spezifisch where kue_dokuart = '" + dokuart_oberregisterakte + "' and dok_dat_feld_10 = '" + newDoc.field[ 10 ] + "' and dok_dat_feld_3 = '" + it.dok_dat_feld_2 + "'";
								//xlog( d3, 3, sqlQuery );
								e = d3.sql.executeAndGet( sqlQuery );
								def oregdokuid;
								if ( e.size() > 0 ) 
								{
									oregdokuid = e[0].doku_id;
								}
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage erfolgreich, doku_id: [" + newDoc.id + "][" + oregdokuid + "][" + newDocReg.id + "] Register: [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "]" );
							}
						}
					}
				}
				
				if ( aktenanlage_erfolgreich )
				{
					//////////////////////////////////////////
					// Ebene unterhalb der Hauptakten-Oberregisterakte anlegen
					// Dokumentart: Hauptakten-Registerakte, darin alle in den Stammdaten angelegten Unterregister
					
					sqlQuery = "select distinct dok_dat_feld_2, dok_dat_feld_3, dok_dat_feld_4 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = '" + aktenschluessel + "' and dok_dat_feld_4 != ''";
					
					def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
					
					if ( resultRows.size() > 0 )
					{
						resultRows.each
						{
							//xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": erstelle Register-Akte: [" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "][" + it.dok_dat_feld_4 + "]" );
							
							Document newDocUReg = d3.archive.newDocument();
							
							newDocUReg.type = dokuart_unterregisterakte;
							
							newDocUReg.status = Document.DocStatus.DOC_STAT_PROCESSING;
							newDocUReg.editor = "dvelop";
							
							newDocUReg.field[  1 ] = newDocfield_1;
							newDocUReg.field[  2 ] = newDocfield_2;
							newDocUReg.field[  3 ] = it.dok_dat_feld_2; // Oberregister
							newDocUReg.field[  4 ] = it.dok_dat_feld_3; // Register
							newDocUReg.field[ 10 ] = newDocfield_10;
							newDocUReg.field[ 13 ] = newDocfield_13;
							newDocUReg.field[ 21 ] = newDocfield_21;
							newDocUReg.field[ 23 ] = it.dok_dat_feld_4; // Unterregister
							newDocUReg.field[ 25 ] = newDocfield_25;
							newDocUReg.field[ 37 ] = newDocfield_37;
							newDocUReg.field[ 42 ] = newDocfield_42;
							
							
							
							for ( int i = 0; i < newDocfield_69.size(); i++ )
							{
								newDocUReg.field[ 69 ][ i + 1 ] = newDocfield_69[ i ];
							}
							
							if ( debug == 0 )
							{
								try
								{
									newDocUReg = d3.archive.importDocument( newDocUReg );
								}
								catch ( D3Exception e )
								{
									xlog( d3, 2, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Akte [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "][" + it.dok_dat_feld_4 + "] konnte nicht erzeugt werden: " + e.message );
									aktenanlage_erfolgreich = false;
								}
							}
							else
							{
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Keine Aktenanlage fuer [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "][" + it.dok_dat_feld_4 + "] (Debug-Modus eingeschaltet)." );
							}
							
							if ( ( aktenanlage_erfolgreich ) && ( debug == 0 ) )
							{
								sqlQuery = "select doku_id from firmen_spezifisch where kue_dokuart = '" + dokuart_oberregisterakte + "' and dok_dat_feld_10 = '" + newDoc.field[ 10 ] + "' and dok_dat_feld_3 = '" + it.dok_dat_feld_2 + "' and dok_dat_feld_23 = '" + it.dok_dat_feld_4 + "'";
								//xlog( d3, 3, sqlQuery );
								e = d3.sql.executeAndGet( sqlQuery );
								def oregdokuid;
								if ( e.size() > 0 ) 
								{
									oregdokuid = e[0].doku_id;
								}
								xlog( d3, 4, treffer[ i ].ddf10 + " / " + treffer[ i ].id + ": Aktenanlage erfolgreich, doku_id: [" + newDoc.id + "][" + oregdokuid + "][" + newDocUReg.id + "] Register: [" + newDoc.field[ 10 ] + "][" + it.dok_dat_feld_2 + "][" + it.dok_dat_feld_3 + "]" );
							}
						}
					}
				}
				
			}
			else
			{
				fehler( d3, "Es wurde keine passende Mandantenakte gefunden. [" + treffer[ i ].ddf10 + "]", (int) treffer[ i ].id );
			}
			
			xlog( d3, 4, "************************************************" );
			
			
		}
		else
		{
			// Fehler
			fehler( d3, "Mandantennummer in Tabelle und in Aktennummer unterscheiden sich.", (int) treffer[ i ].id );
		}
		
		
		
	}
	
	
}





















def fehler( D3Interface d3, String meldung, int id )
{
	def meldung_db;
	
	if ( meldung.length() > 250 )
	{
		meldung_db = meldung.substring( 0, 249 );
	}
	else
	{
		meldung_db = meldung;
	}
	
	if ( debug == 0 )
	{
		sql = "update " + zieltabelle + " set fehler = '" + meldung_db + "' where id = " + id;
		d3.sql.execute( sql );
	}
	
	xlog( d3, 2, meldung );
}






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


