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					= "anlegen_equipm_akten.groovy";
@Field version				= "0.1";
@Field kunde				= "Optima";


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




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


// Dokumente pro Durchlauf
// Gibt an, wie viele Dokumente maximal pro Durchlauf verarbeitet werden
@Field dokumente_pro_durchlauf = 1000000;




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

def debugtext;

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

def aktengruppe = ['AG101', 'AG102', 'AG103'];
//def aktengruppe = ['Projektorganisation', 'Spezifikation', 'Technik'];

def ag_sortmap = [ "AG101":"50", "AG102":"60", "AG103":"70" ];
def ua_sortmap = [ "AK029":"51", "AK007":"52", "AK008":"53", "AK016":"54", "AK003":"55", "AK024":"61", "AK012":"62", "AK013":"63", "AK028":"64", "AK006":"71", "AK018":"72", "AK015":"73", "AK001":"74", "AK020":"75", "AK023":"76", "AK019":"77" ];


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, "* Dokumente pro Durchlauf		: " + dokumente_pro_durchlauf );


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

def sqlQuery = "select top " + dokumente_pro_durchlauf + " doku_id, dok_dat_feld_9 from firmen_spezifisch where kue_dokuart = 'AEQUI'";

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




if ( resultRows.size() > 0 )
{
	xlog( d3, 4, " Es wurden " + resultRows.size() + " Treffer gefunden." );
	xlog( d3, 4, "********************************************************" );
	
	def i = 0;
	def allesgut = true;
	
	
	for ( i = 0; i < resultRows.size(); i++ )
	{
		xlog( d3, 4, "Nr. " + (i+1) + ": Equipmentakte Doku-ID " + resultRows[ i ].doku_id + " / E-Nr. " + resultRows[ i ].dok_dat_feld_9 );
		xlog( d3, 4, "*************************************" );
		// Lade Equipment:
		
		def eq_akte = d3.archive.getDocument( resultRows[ i ].doku_id );
		
		// Lege die Aktengruppe-Akten an:
		
		def doku_id_eq;
		
		aktengruppe.each
		{
			//xlog( d3, 3, "Nr. " + (i+1) + ": Aktengruppe. " + it );
			
			// Prüfen, ob diee Aktengruppe bereits für dieses Equipment existiert
			
			xlog( d3, 4, "Nr. " + (i+1) + ": pruefe: Equpmentaktegruppe | DDF16 = " + it + " | DDF9 = " + eq_akte.field[  9 ] );
			
			def STATEMENT_1 = "select doku_id from firmen_spezifisch where kue_dokuart = 'AEQE1' and dok_dat_feld_9 = '" + eq_akte.field[ 9 ] + "' and dok_dat_feld_16 = '" + it + "'";
			
			xlog( d3, 5, "Nr. " + (i+1) + ": " + STATEMENT_1 );
			
			def ergebnis_1 = d3.sql.executeAndGet( STATEMENT_1 );
			
			if ( ergebnis_1.size() == 0 )
			{
				xlog( d3, 4, "Nr. " + (i+1) + ": Equipmentaktengruppe. " + it + " existiert nicht. Lege Aktengruppe an ..." )
				Document neue_akte = d3.archive.newDocument();
				
				neue_akte.type		= "AEQE1";
				neue_akte.status	= Document.DocStatus.DOC_STAT_RELEASE;
				//neue_akte.editor	= "d3tadm";
				
				neue_akte.field[  9 ] = eq_akte.field[  9 ];		// Equipmentnummer
				xlog( d3, 4, "Nr. " + (i+1) + ": Equipmentnummer		: " + neue_akte.field[  9 ] );
				neue_akte.field[ 22 ] = eq_akte.field[ 22 ];		// Kundennummer
				xlog( d3, 4, "Nr. " + (i+1) + ": Kundennummer			: " + neue_akte.field[ 22 ] );
				neue_akte.field[ 36 ] = eq_akte.field[ 36 ];		// Linie
				xlog( d3, 4, "Nr. " + (i+1) + ": Linie				: " + neue_akte.field[ 36 ] );
				neue_akte.field[ 12 ] = eq_akte.field[ 12 ];		// Netzplan_Nr
				xlog( d3, 4, "Nr. " + (i+1) + ": Netzplan_Nr			: " + neue_akte.field[ 12 ] );
				neue_akte.field[ 19 ] = eq_akte.field[ 19 ];		// Projekt-Nr
				xlog( d3, 4, "Nr. " + (i+1) + ": Projekt-Nr			: " + neue_akte.field[ 19 ] );
				neue_akte.field[  2 ] = eq_akte.field[  2 ];		// PSP-Element
				xlog( d3, 4, "Nr. " + (i+1) + ": PSP-Element			: " + neue_akte.field[  2 ] );
				neue_akte.field[  1 ] = eq_akte.field[  1 ];		// SAP-Status
				xlog( d3, 4, "Nr. " + (i+1) + ": SAP-Status			: " + neue_akte.field[  1 ] );
				neue_akte.field[ 40 ] = eq_akte.field[ 40 ];		// Beschreibung
				xlog( d3, 4, "Nr. " + (i+1) + ": Beschreibung			: " + neue_akte.field[ 40 ] );
				neue_akte.field[ 28 ] = eq_akte.field[ 28 ];		// Buchungskreis
				xlog( d3, 4, "Nr. " + (i+1) + ": Buchungskreis		: " + neue_akte.field[ 28 ] );
				neue_akte.field[ 35 ] = eq_akte.field[ 35 ];		// Equipmenttyp
				xlog( d3, 4, "Nr. " + (i+1) + ": Equipmenttyp			: " + neue_akte.field[ 35 ] );
				neue_akte.field[ 23 ] = eq_akte.field[ 23 ];		// Kunden_Name
				xlog( d3, 4, "Nr. " + (i+1) + ": Kunden_Name			: " + neue_akte.field[ 23 ] );
				neue_akte.field[ 37 ] = eq_akte.field[ 37 ];		// Submission
				xlog( d3, 4, "Nr. " + (i+1) + ": Submission			: " + neue_akte.field[ 37 ] );
				neue_akte.field[  3 ] = eq_akte.field[  3 ];		// Prozess
				xlog( d3, 4, "Nr. " + (i+1) + ": Prozess				: " + neue_akte.field[  3 ] );
				neue_akte.field[ 16 ] = it;							// Aktengruppe
				xlog( d3, 4, "Nr. " + (i+1) + ": Aktengruppe			: " + it );
				neue_akte.field[ 30 ] = ag_sortmap[ it ] ;				// Sortierreihenfolge
				xlog( d3, 4, "Nr. " + (i+1) + ": Sortierreihenfolge	: " + neue_akte.field[ 30 ] );
				
				
				//xlog( d3, 4, "Nr. " + (i+1) + ": Setze Mehrfachfelder Regionalorganisation und Intercompany ..." );
				
				for ( int j = 1; j <= Integer.valueOf( d3.config.value( "CUR_60er_FIELD_NR" ) ); j++ )
				{
					neue_akte.field[ 68 ][ j ] = eq_akte.field[ 68 ][ j ];	// Intercompany
					neue_akte.field[ 67 ][ j ] = eq_akte.field[ 67 ][ j ];	// Regionalorganisation
				}
				
				xlog( d3, 4, "Nr. " + (i+1) + ": Setze Mehrfachfelder Regionalorganisation und Intercompany => fertig." );
				
				allesgut = true;
				
				try
				{
					if ( debug == 0 )
					{
						neue_akte = d3.archive.importDocument( neue_akte );
						xlog( d3, 4, "Nr. " + (i+1) + ": Aktengruppe. " + it + " angelegt mit Doku-ID " + neue_akte.id() );
						doku_id_eq = neue_akte.id();
					}
					else
					{
						xlog( d3, 3, "Nr. " + (i+1) + ": keine Aktenanlage, da DEBUG-Modus eingeschaltet. " );
					}
				}
				catch ( D3Exception e )
				{
					xlog( d3, 2, "Nr. " + (i+1) + ": Akte konnte nicht angelegt werden: " + e.message )
					allesgut = false;
				}
				
				
			}
			else
			{
				xlog( d3, 3, "Nr. " + (i+1) + ": Aktengruppe " + it + " existiert mit Doku-ID " + ergebnis_1[ 0 ].doku_id + ". Keine Aktion erforderlich." )
				doku_id_eq = ergebnis_1[ 0 ].doku_id;
			}
			
			if ( allesgut )
			{
				
				xlog( d3, 4, "Nr. " + (i+1) + ": Doku_id Equipmentaktengruppe: " + doku_id_eq );
				xlog( d3, 4, "*************************************" );
				// Lege nun die Unterakten an:
				
				// Feststellen, welche Unterakten angelegt werden müssen:
				def STATEMENT_2 = "select dok_dat_feld_26 from firmen_spezifisch where kue_dokuart = 'aafol' and dok_dat_feld_45 = 'DEQUI' and dok_dat_feld_48 = '" + it + "' ";
				
				def ergebnis_2 = d3.sql.executeAndGet( STATEMENT_2 );
				
				if ( ergebnis_2.size() > 0 )
				{
					for ( int m = 0; m < ergebnis_2.size(); m++ )
					{
						xlog( d3, 4, "Nr. " + (i+1) + ":    pruefe: Equpmentunterakte | DDF16 = " + it + " | DDF9 = " + eq_akte.field[  9 ] + " | DDF48 = " + ergebnis_2[ m ].dok_dat_feld_26 );
						
						// Feststellen, ob die Unterakte bereits existiert
						
						def STATEMENT_3 = " select doku_id from firmen_spezifisch where kue_dokuart = 'AEQE2' and dok_dat_feld_16 = '" + it + "' and dok_dat_feld_9 = '" + eq_akte.field[  9 ] + "' and dok_dat_feld_48 = '" + ergebnis_2[ m ].dok_dat_feld_26 + "'";
						xlog( d3, 5, "Nr. " + (i+1) + ":    Statement zum Test ob Unterakte existiert: " + STATEMENT_3 );
						
						def ergebnis_3 = d3.sql.executeAndGet( STATEMENT_3 );
						
						if ( ergebnis_3.size() == 0 )
						{
							xlog( d3, 4, "Nr. " + (i+1) + ":    Equipmentunterakte " + it + " / " + ergebnis_2[ m ].dok_dat_feld_26 + " existiert nicht. Lege Equipmentunterakte an ..." )
							Document eua = d3.archive.newDocument();
							
							eua.type		= "AEQE2";
							//eua.status	= Document.DocStatus.DOC_STAT_PROCESSING;
							eua.status		= Document.DocStatus.DOC_STAT_RELEASE;
							//eua.editor	= "d3tadm";
							
							eua.field[  9 ] = eq_akte.field[  9 ];		// Equipmentnummer
							xlog( d3, 4, "Nr. " + (i+1) + ":    Equipmentnummer	: " + eq_akte.field[  9 ] );
							eua.field[ 16 ] = it;						// Aktengruppe
							xlog( d3, 4, "Nr. " + (i+1) + ":    Aktengruppe		: " + it );
							eua.field[ 48 ] = ergebnis_2[ m ].dok_dat_feld_26;	// Akte
							xlog( d3, 4, "Nr. " + (i+1) + ":    Akte				: " + ergebnis_2[ m ].dok_dat_feld_26 );
							eua.field[ 30 ] = ua_sortmap[ ergebnis_2[ m ].dok_dat_feld_26 ] ;				// Sortierreihenfolge
							xlog( d3, 4, "Nr. " + (i+1) + ":    Sortierreihenfolge: " + eua.field[ 30 ] );
							
							
							try
							{
								if ( debug == 0 )
								{
									eua = d3.archive.importDocument( eua );
									xlog( d3, 4, "Nr. " + (i+1) + ":    Equipmentunterakte " + eua.field[ 16 ] + " / Akte " + eua.field[ 48 ] + " angelegt mit Doku-ID " + eua.id() );
								}
								else
								{
									xlog( d3, 3, "Nr. " + (i+1) + ": keine Aktenanlage, da DEBUG-Modus eingeschaltet. " );
								}
							}
							catch ( D3Exception e )
							{
								xlog( d3, 2, "Nr. " + (i+1) + ":    Equipmentunterakte konnte nicht angelegt werden: " + e.message )
							}
							
							xlog( d3, 4, "***************************" );
							
						}
						else
						{
							xlog( d3, 3, "Nr. " + (i+1) + ":    Kombination existiert bereits mit Doku-ID " + ergebnis_3[ 0 ].doku_id );
						}
						
					}
				}
				else
				{
					xlog( d3, 2, "Nr. " + (i+1) + ": keine Unterakten fuer " + it + " gefunden." );
				}
			}
		
			
			xlog( d3, 4, "*************************************" );
		}
		
		
		
	}
	
	xlog( d3, 4, "*************************************************" );
	
	
}




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
































