From 227755e5980a5b75341bb749c1288f79a93452bc Mon Sep 17 00:00:00 2001 From: Christian Albers Date: Mon, 2 Jun 2025 17:10:23 +0200 Subject: [PATCH] =?UTF-8?q?Hermes=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hermes/.DS_Store | Bin 0 -> 6148 bytes .../AddContractDocumentInfoFolder 1.classpath | 1 + .../AddContractDocumentInfoFolder 1.groovy | 497 ++++ Hermes/CMC/CreateFolder 1.classpath | 2 + Hermes/CMC/CreateFolder 1.groovy | 2332 +++++++++++++++++ .../DeleteTermsContractsCaseManager.groovy | 353 +++ 6 files changed, 3185 insertions(+) create mode 100644 Hermes/.DS_Store create mode 100644 Hermes/CMC/AddContractDocumentInfoFolder 1.classpath create mode 100644 Hermes/CMC/AddContractDocumentInfoFolder 1.groovy create mode 100644 Hermes/CMC/CreateFolder 1.classpath create mode 100644 Hermes/CMC/CreateFolder 1.groovy create mode 100644 Hermes/CMC/DeleteTermsContractsCaseManager.groovy diff --git a/Hermes/.DS_Store b/Hermes/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..995e7561960bb3fbf4ff06d0e78566045cb6ee5b GIT binary patch literal 6148 zcmeHK%}N6?5Kh{vSw!eTLGTjrBvfq0O2Nz8)}t3!^q^9^ZqdcFFuZU zAHiqv2}EyBlBrgz9;L_(Oul3?lTE&aWQQ@v%e|n$Se7v+KsBZuD83QhuXRFFXqg4% zdW=rXkCYFs2fsDpO@?V?K<{0eRoFhO`2F$yi^5JfpMT=1bY^CDP6#nC&b%wt_qz3N zuT!qKPju^0smLGI>;6&L=-0A~6%}{uVcck&fG}u)%jt0#2dZCIy*TKYSkHC{$8l=e zmBC%s$m{>Gd2NWg+0L*~d2-I~hp<^VXi&xddq3y@ zUxTPc3=jkViUFRfdet&43E$R<#p$wvlw=YB literal 0 HcmV?d00001 diff --git a/Hermes/CMC/AddContractDocumentInfoFolder 1.classpath b/Hermes/CMC/AddContractDocumentInfoFolder 1.classpath new file mode 100644 index 0000000..aa77df2 --- /dev/null +++ b/Hermes/CMC/AddContractDocumentInfoFolder 1.classpath @@ -0,0 +1 @@ +D:\Temp\libs\commons-io-2.11.0.jar \ No newline at end of file diff --git a/Hermes/CMC/AddContractDocumentInfoFolder 1.groovy b/Hermes/CMC/AddContractDocumentInfoFolder 1.groovy new file mode 100644 index 0000000..4a052b0 --- /dev/null +++ b/Hermes/CMC/AddContractDocumentInfoFolder 1.groovy @@ -0,0 +1,497 @@ +import com.dvelop.d3.server.Document +import com.dvelop.d3.server.DocumentType +import com.dvelop.d3.server.core.D3Interface +import com.dvelop.d3.server.User +import groovy.sql.* +import groovy.transform.Field +import org.apache.commons.io.FileUtils; +import java.text.SimpleDateFormat + +/* + * Beschreibung: Liesst die Dokumente an + * + */ + //Pfade zur Auslesen und Ablegen der Vertragsdateien inkl. JPL + @Field String path = "E:\\WORK_LCM_MIGR\\export\\part0" + @Field String TargetPath = "E:\\WORK_LCM_MIGR\\export\\Import_Folder\\" + //@Field String TargetPath = "E:\\d3work\\Import\\D3D\\Vertragsdok_Unt\\" + + /* Modus der Dokument Migration + * All_Dok - Migriert alle in Ordner @path liegenden Dokumente. Dokumente ohne bestehenden Vertrag, + * bekommen keine Vertragsnummer intern und sind somit nicht verknuepft + * Only_Available - Migriert nur die vertragsdokumente die zu den Vertraegen der LCM Nummern des Filters @SQLQueryFilter gehoeren. + */ + @Field String modus = "All_Dok"//"Only_Available" + //Filter zur Eingrenzung der Dokumente. Diese Variable wird nur im Modus @modus - Only_Available verwendet. + @Field String SQLQueryFilter = " WHERE O.FK_TBL_VERTRAG IN ('13220','14141','14170','14174','14176','14177','14178','14179','14180','16256','16395','16397','16399','16400','16401','16402','16403','16404','16406','16407','16446','16450','16451','16452','16453','16454','16455','17358','21240','21295','21573','13705','16712','15120','16052','12301','18970')" + //Beinhaltet die Vertragsnummer von Vertraegen die mehrere Vertragsdokumente im LCM besitzen. Diese Dokumente werden dann Vertragsunterlagen mit dem Typ Vertrag + @Field List contractMap + + public class constanten + { + // Logging + static String logDirPath = "./log/" + static File logFile = new File(logDirPath + System.currentTimeMillis() + "DokumentenImportDCM.log") + } + + D3Interface d3 = getProperty("d3") + d3.log.info("Start Dokumente in Vertrag ablegen"); + getContractWithMoreContractDocs(d3) + getDocuments(d3) + d3.log.info("Ende Dokumente in Vertrag ablegen"); + + def getDocuments (D3Interface d3) + { + if(modus == "All_Dok") + { + d3.log.info("Start getDocuments - All_Dok Modus"); + File folder = new File(path); + findAllFilesInFolder(d3,folder) + copyFiles(d3) + d3.log.info("Ende getDocuments - All_Dok Modus"); + } + else if(modus == "Only_Available") + { + d3.log.info("Start getDocuments - Only_Available Modus"); + getOnlyDocumentsForDefinedContracts(d3) + d3.log.info("Ende getDocuments - Only_Available Modus"); + } + else + { + throw new Exception ("Fehler: Es wurde ein falscher Modus verwendet. Bitte nur 'Only_Available' oder 'All_Dok' verwenden."); + } + } + + def copyFiles(D3Interface d3) + { + File source = new File(path); + File dest = new File(TargetPath); + try { + FileUtils.copyDirectory(source, dest); + } + catch (IOException e) + { + d3.log.error("Fehler: " + e) + } + } + + def findAllFilesInFolder(D3Interface d3, File folder) + { + d3.log.info("Start findAllFilesInFolder"); + for (File file : folder.listFiles()) { + d3.log.info("Dokument ist in Ordner vorhanden"); + if (!file.isDirectory()) { + d3.log.info("FileName: " + file.getName()); + // Auslesen der Dokument ID + String fileName = file.getName(); + //Number-------- + int ende = fileName.indexOf("."); + int start = fileName.indexOf("_")+1; + String substring = fileName.substring(start , ende); + d3.log.info("substring: " + substring); + getFolderNumber(d3, substring, fileName) + } else { + findAllFilesInFolder(d3, file); + } + } + d3.log.info("Ende findAllFilesInFolder"); + } + + def getFolderNumber(D3Interface d3, String document_Number, String OriginalFileName) + { + d3.log.info("Start getContract"); + + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def lSQLConnection + try + { + String SQLQuery = "Select db.fk_tbl_dokument_id, db.filename, o.titel, O.FK_TBL_VERTRAG, O.FK_REF_DOKUMENTENTYP, da.FK_REF_ATTDL1 , da.FK_REF_ATTDL2, da.FK_REF_ATTDL4, da.FK_REF_ATTDL5, o.FK_REF_DOKUMENT_STATUS, vd.FK_TBL_ORDNER, ORD.BEZEICHNUNG FROM DMS.tbl_dokument_binary db FULL OUTER JOIN DMS.tbl_dokument O ON O.id = db.FK_TBL_DOKUMENT_ID FULL OUTER JOIN LCMDESIGNER.tbl_dokument_attribute da ON da.fk_tbl_dokument = O.id FULL OUTER JOIN LCM.TBL_VERTRAG_DOKUMENT VD ON VD.fk_tbl_dokument = O.id FULL OUTER JOIN DMS.TBL_ORDNER ORD ON ORD.ID = vd.FK_TBL_ORDNER WHERE db.fk_tbl_dokument_id = $document_Number" + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + lSQLConnection.eachRow(SQLQuery) { row -> + d3.log.info("id: ${row.fk_tbl_dokument_id}, Dok Name: ${row.filename}, Vertrag: ${row.FK_TBL_VERTRAG}") + def LCM_Number = "LCM-${row.FK_TBL_VERTRAG}" + d3.log.info("LCM_Number: " + LCM_Number) + def VertInt = getVertragsnummer_Intern(d3, LCM_Number) + d3.log.info("Vertragsnummer Intern: " + VertInt) + def dokType = row.FK_REF_DOKUMENTENTYP + d3.log.info("dokType: " + dokType) + def dok_Status = row.FK_REF_DOKUMENT_STATUS + + createJPLFileForFile(d3, VertInt, OriginalFileName, path, dokType, dok_Status, row) + createActionFileForFile(d3, OriginalFileName, path) + } + } + catch(Exception e) + { + d3.log.error("Fehler beim SQL Verbindungsaufbau:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende getContract"); + } + + def getVertragsnummer_Intern(D3Interface d3, def LCM_Number) + { + d3.log.info("Start getVertragsnummer_Intern $LCM_Number") + + String query = "SELECT dok_dat_feld_11 AS VertragsIntern FROM firmen_spezifisch WHERE kue_dokuart = ? AND dok_dat_feld_12 = ?"; + GroovyRowResult resultRow = d3.sql.firstRow(query, ["A1LE3", LCM_Number]); + if(resultRow != null && resultRow.containsKey("VertragsIntern" ) && resultRow.getProperty("VertragsIntern") != null) { + String VertInt = resultRow.getProperty("VertragsIntern"); + d3.log.info("VertInt: " + VertInt) + return VertInt + } + d3.log.info("Ende getVertragsnummer_Intern") + return "" + } + + def getOnlyDocumentsForDefinedContracts(D3Interface d3) + { + d3.log.info("Start getOnlyDocumentsForDefinedContracts"); + + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def lSQLConnection + try + { + String SQLQuery = "Select db.fk_tbl_dokument_id, db.filename, o.titel, O.FK_TBL_VERTRAG, O.FK_REF_DOKUMENTENTYP, da.FK_REF_ATTDL1 , da.FK_REF_ATTDL2, da.FK_REF_ATTDL4, da.FK_REF_ATTDL5, o.FK_REF_DOKUMENT_STATUS, vd.FK_TBL_ORDNER, ORD.BEZEICHNUNG FROM DMS.tbl_dokument_binary db FULL OUTER JOIN DMS.tbl_dokument O ON O.id = db.FK_TBL_DOKUMENT_ID FULL OUTER JOIN LCMDESIGNER.tbl_dokument_attribute da ON da.fk_tbl_dokument = O.id FULL OUTER JOIN LCM.TBL_VERTRAG_DOKUMENT VD ON VD.fk_tbl_dokument = O.id FULL OUTER JOIN DMS.TBL_ORDNER ORD ON ORD.ID = vd.FK_TBL_ORDNER $SQLQueryFilter" + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + lSQLConnection.eachRow(SQLQuery) { row -> + d3.log.info("Start------------------------------------------------------------") + def LCM_Number = "LCM-${row.FK_TBL_VERTRAG}" + d3.log.info("Vertrag LCM Nummer: " + LCM_Number) + def VertInt = getVertragsnummer_Intern(d3, LCM_Number) + d3.log.info("Vertragsnummer intern zur LCM Nummer: " + VertInt) + if(VertInt != null && VertInt != "") + { + String documentId = row.fk_tbl_dokument_id + def dokType = row.FK_REF_DOKUMENTENTYP + def dok_Status = row.FK_REF_DOKUMENT_STATUS + d3.log.info("Dokumenten Typ: " + dokType) + File[] allDocs = findOnlyDefinedFilesInFolder(d3, new File(path), documentId ); + if(allDocs?.size() == 1) + { + d3.log.info("Anzahl gefundener Dokumente: " + allDocs.size() + " zu Vertrag: " + VertInt) + try + { + if(contractMap.contains(VertInt)) + { + log("Der Vertrag " + VertInt + " enthaelt mehrere Vertragsdokumente. Somit werden diese Dokumente nun zu Unterlagen") + dokType = 1234 + } + d3.log.info("UebergabeParameter vor Aufruf: " + dokType + " - " + dok_Status) + def fileName = allDocs[0].getName(); + createJPLFileForFile(d3, VertInt, fileName , path, dokType, dok_Status, row) + createActionFileForFile(d3, fileName, path) + } + catch(Exception ex) + { + d3.log.error("Fehler beim generieren der Import Dateien fuer den Vertrag " + VertInt +": " + ex) + } + } + else if(allDocs?.size() > 1) + { + d3.log.warn("Fuer den Vertrag $VertInt wurden " + allDocs?.size() + " Dokumente mit der Dokumenten ID $documentId gefunden. Es darf nur ein Dokument vorhanden sein.") + } + else if(allDocs?.size() == 0) + { + d3.log.info("Fuer den Vertrag $VertInt wurden keine Dokumente gefunden.") + } + } + else + { + d3.log.info("Es konnte keine Vertragsnummer intern zur LCM Nummer $LCM_Number gefunden werden.") + } + } + d3.log.info("Ende+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") + } + catch(Exception e) + { + d3.log.error("Fehler beim SQL Verbindungsaufbau: " + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende getOnlyDocumentsForDefinedContracts"); + } + + def findOnlyDefinedFilesInFolder(D3Interface d3, File folder, String num_Prafix) + { + if(folder.isDirectory()) + { + //list all files on directory + File[] files = folder.listFiles(new FilenameFilter() { + + //apply a filter + @Override + public boolean accept(File doc, String name) { + boolean result; + if(name.endsWith("jpl")) + { + return false; + } + else + { + def checkName = name.substring(name.indexOf("_") + "_".length(), name.indexOf(".")); + if(checkName == num_Prafix){ + result=true; + } + else{ + result=false; + } + return result; + } + } + }); + return files; + } + return null; + } + + //Erzeugt nur fuer die uebergebenen Dokumente eine action Datei + def createActionFileForFile(D3Interface d3, String fileName, String targetPath) + { + d3.log.info("START createActionFileForFile"); + + PrintWriter out = null; + d3.log.error("Dateiname fuer Action Datei: " + fileName) + def extension = fileName + if(fileName != "" && fileName != null) + { + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + extension = extension.substring(extension.lastIndexOf('.')+1, extension.length()); + if((fileName == "" || fileName == null) && (extension == "" || extension != null)) + { + throw new Exception ("Fehler: Es konnte kein File Name oder keine Dateierweiterung extrahiert werden."); + } + } + try + { + out = new PrintWriter(targetPath + "\\" + fileName + ".action"); + out.println("import_file_ext = '${extension}'"); + } + catch(Exception e) + { + d3.log.error("ERROR: createActionFileForFile = " + e); + } + finally + { + if (out != null) + { + out.flush(); + out.close(); + } + } + + + d3.log.info("ENDE createActionFileForFile"); + } + + //Erzeugt nur fuer die uebergebenen Dokumente eine JPL Datei + def createJPLFileForFile(D3Interface d3, def vertragsnummerIntern, String fileName, String targetPath, def dokType, def dok_status, def row) + { + d3.log.info("START createJPLFileForFile"); + d3.log.info("Uebergabeparameter -- dokType: " + dokType + " -- dok_status: " + dok_status); + String logiVerzeichnis = "Fr"; + PrintWriter out = null; + d3.log.info("Dateiname: " + fileName) + if(fileName != "" && fileName != null && fileName.contains(".")) + { + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + if(fileName == "" || fileName == null) + { + throw new Exception ("Fehler: Es konnte kein JPL File Name extrahiert werden."); + } + } + try + { + out = new PrintWriter(targetPath + "\\" + fileName + ".jpl"); + //out.println("zeich_nr = '${doc.id()}'"); -> nur bei Versionierung + if(dokType == 1002) + { + out.println("dokuart = 'D1LE5'"); + out.println("dok_dat_feld[1] = 'Vertrag'"); + } + else + { + out.println("dokuart = 'D1LE6'"); + if(dokType == 1001) + { + out.println("dok_dat_feld[1] = 'Mustervertrag'"); + } + else if(dokType == 1009) + { + out.println("dok_dat_feld[1] = 'Verpflichtung Mindestlohn'"); + } + else if(dokType == 1003) + { + out.println("dok_dat_feld[1] = 'Anlage'"); + } + else if(dokType == 1005) + { + out.println("dok_dat_feld[1] = 'Kündigung'"); + } + else if(dokType == 1004) + { + out.println("dok_dat_feld[1] = 'Nachtrag/Änderungsvereinbarung'"); + } + else if(dokType == 1007) + { + out.println("dok_dat_feld[1] = 'Geheimhaltungsvereinbarung'"); + } + else if(dokType == 1008) + { + out.println("dok_dat_feld[1] = 'Sonstiges'"); + } + else if(dokType == 1006) + { + out.println("dok_dat_feld[1] = 'Zusatzvereinbarung'"); + } + else if(dokType == 1050) + { + out.println("dok_dat_feld[1] = 'DS Dienstleister Audit'"); + } + else if(dokType == 1030) + { + out.println("dok_dat_feld[1] = 'Vertrauliches Dokument'"); + } + else if(dokType == 1234)// Dieser Wert ist als DokType nicht vorhanden. Er wird nur zur Eindeutigkeit verwendet um aus dem Dokument eine Unterlage mit Typ Vertrag zu machen. Das ist notwendig, da es Vertraeg mit mehreren Vertragsdokumente gibt. + { + out.println("dok_dat_feld[1] = 'Vertrag'"); + } + else + { + out.println("dok_dat_feld[1] = 'Sonstiges'"); + d3.log.info("Die Dokumentvariante konnte nicht bestimmt werden. Mapping Nummer: " + dokType) + } + } + if(dok_status == null || dok_status == "" || dok_status == 1002) + { + out.println("dok_dat_feld[34] = 'Aktiv'"); + } + else if(dok_status == 5) + { + out.println("dok_dat_feld[34] = 'Archiviert'"); + } + else if(dok_status == 1000) + { + out.println("dok_dat_feld[34] = 'Beendet'"); + } + else if(dok_status == 1001) + { + out.println("dok_dat_feld[34] = 'Durch einen Nachtrag ersetzt'"); + } + else + { + d3.log.error("Fehler: Der Dokumentenstatus "+ dok_status +" ist nicht definiert."); + } + out.println("logi_verzeichnis = '${logiVerzeichnis}'"); + out.println("dok_dat_feld[11] = '${vertragsnummerIntern}'"); + def titel = row.titel; + out.println("dok_dat_feld[26] = '${titel}'"); + def i = 1; + if(row.FK_REF_ATTDL1 == 1000 || row.FK_REF_ATTDL1 == 1002) + { + out.println("dok_dat_feld_68[${i}] = 'Change of Control'"); + i++ + } + if(row.FK_REF_ATTDL2 == 1000) + { + out.println("dok_dat_feld_68[${i}] = 'AV-Vereinbarungen'"); + i++ + } + if(row.FK_REF_ATTDL5 == 1000) + { + out.println("dok_dat_feld_68[${i}] = 'Standardvertragsklauseln'"); + i++ + } + if(row.FK_REF_ATTDL4 == 1000) + { + out.println("dok_dat_feld_68[${i}] = 'Code of Conduct'"); + i++ + } + + def ordner = row.BEZEICHNUNG + if(ordner != null && ordner != "") + { + out.println("dok_dat_feld[28] = '${ordner}'"); + } + } + catch(Exception e) + { + d3.log.error("ERROR: createJPLFileForFileArray = " + e); + } + finally + { + if (out != null) + { + out.flush(); + out.close(); + } + } + + + d3.log.info("ENDE createJPLFileForFile"); + } + + def getContractWithMoreContractDocs(D3Interface d3) + { + d3.log.info("Start getContractWithMoreContractDocs"); + + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def lSQLConnection + contractMap = new LinkedList(); + try + { + String SQLQuery = """select FK_TBL_VERTRAG from DMS.TBL_DOKUMENT where FK_REF_DOKUMENTENTYP = '1002' group by FK_TBL_VERTRAG, FK_REF_DOKUMENTENTYP Having count(*) >1"""; + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + lSQLConnection.eachRow(SQLQuery) { row -> + String Vertragsnummer = row.FK_TBL_VERTRAG + contractMap.add(Vertragsnummer); + } + } + catch(Exception e) + { + d3.log.error("Fehler beim SQL Verbindungsaufbau: " + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende getContractWithMoreContractDocs"); + } + + /** + * Function to log given message to log file and to console + * @param message + */ + void log(String message) { + String messageWithTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(System.currentTimeMillis())) + " : ${message}" + if(!constanten.logFile.exists()) { + // check if directory exists + // check if directory "Log" exists + File logDir = new File(constanten.logDirPath) + if(!logDir.exists() || !logDir.isDirectory()) { + // create directory for log files + logDir.mkdirs() + } + + constanten.logFile.createNewFile() + } + constanten.logFile.append(messageWithTimestamp + "\n") + } + \ No newline at end of file diff --git a/Hermes/CMC/CreateFolder 1.classpath b/Hermes/CMC/CreateFolder 1.classpath new file mode 100644 index 0000000..3fc7299 --- /dev/null +++ b/Hermes/CMC/CreateFolder 1.classpath @@ -0,0 +1,2 @@ +D:\Temp\libs\json-simple-1.1.1.jar +D:\Temp\libs\ojdbc8.jar \ No newline at end of file diff --git a/Hermes/CMC/CreateFolder 1.groovy b/Hermes/CMC/CreateFolder 1.groovy new file mode 100644 index 0000000..6bd2120 --- /dev/null +++ b/Hermes/CMC/CreateFolder 1.groovy @@ -0,0 +1,2332 @@ +import com.dvelop.d3.server.Document +import com.dvelop.d3.server.DocumentType +import com.dvelop.d3.server.core.D3Interface +import com.dvelop.d3.server.User + +import org.json.simple.JSONObject +import org.json.simple.JSONValue +import org.json.simple.JSONArray + +import java.util.Calendar; +import java.text.SimpleDateFormat + +import groovy.json.JsonOutput +import groovy.json.JsonSlurper +import java.io.OutputStream + +import java.time.* + +import groovy.sql.* +import groovy.time.TimeCategory; +import groovy.transform.Field + +/* + * Beschreibung: + * + * Benoetigte Bibliotheken (siehe classpath-Datei): + * + json-simple-1.1.1.jar (fuer JSON Verarbeitung) + * + ojdbc8.jar (für DB Zugriff) + */ + + // Enthaelt alle zur verfuegung stehenden Partner aus der CSV Datei + @Field Map partnerMap + // IDP ID fuer den Fall das kein Benutzer fuer einen Vertrag gefunden werden kann + @Field String fallbackIDPUser = "8d53812a-fc57-49da-8ce2-4c0f22744893"//"3231e568-d85b-49ca-8be5-3016353d941e" + + @Field List IDP_User + // Filter um die auszulesenden Vertraege einzugrenzen + //@Field String SQLQueryFilter = "" //" WHERE V.VT_NUMMER IN ('LCM-17179','LCM-16205')" + + //Alle Testvertraege + @Field String SQLQueryFilter = " WHERE V.VT_NUMMER IN ('LCM-15111','LCM-15112','LCM-15113','LCM-15114','LCM-15115')" + + //,'LCM-15116','LCM-15117','LCM-15118','LCM-15119','LCM-15120','LCM-15122','LCM-15124','LCM-15125','LCM-15127','LCM-15128','LCM-15129','LCM-15130','LCM-15131','LCM-15132','LCM-15134','LCM-15135','LCM-15136','LCM-15137','LCM-15138','LCM-15139','LCM-15140','LCM-15141','LCM-15142','LCM-15143','LCM-15144','LCM-15145','LCM-15146','LCM-15147','LCM-15148','LCM-15149','LCM-15150','LCM-15151','LCM-15152','LCM-15153','LCM-15154','LCM-15155','LCM-15156','LCM-15157','LCM-15158','LCM-15159','LCM-15161','LCM-15163','LCM-15165','LCM-15166','LCM-15167','LCM-15168','LCM-15169','LCM-15170','LCM-15171','LCM-15172','LCM-15173','LCM-15174','LCM-15175','LCM-15176','LCM-15178','LCM-15179','LCM-15180','LCM-15181','LCM-15182','LCM-15183','LCM-15184','LCM-15186','LCM-15187','LCM-15188','LCM-15189','LCM-15190','LCM-15191','LCM-15193','LCM-15194','LCM-15195','LCM-15196','LCM-15197','LCM-15198','LCM-15199','LCM-15200','LCM-15201','LCM-15202','LCM-15203','LCM-15204','LCM-15205','LCM-15206','LCM-15207','LCM-15208','LCM-15209','LCM-15210','LCM-15211','LCM-15212','LCM-15213','LCM-15214','LCM-15215','LCM-15216','LCM-15217','LCM-15218','LCM-15220','LCM-15221','LCM-15222','LCM-15223','LCM-15224','LCM-15225','LCM-15226','LCM-15227','LCM-15228','LCM-15229','LCM-15230','LCM-15231','LCM-15232','LCM-15233','LCM-15234','LCM-15235','LCM-15236','LCM-15237','LCM-15238','LCM-15239','LCM-15240','LCM-15241','LCM-15242','LCM-15243','LCM-15244','LCM-15245','LCM-15246','LCM-15247','LCM-15248','LCM-15249','LCM-15250','LCM-15251','LCM-15252','LCM-15253','LCM-15254','LCM-15255','LCM-15256','LCM-15257','LCM-15258','LCM-15259','LCM-15260','LCM-15261','LCM-15263','LCM-15264','LCM-15265','LCM-15266','LCM-15267','LCM-15268','LCM-15269','LCM-15270','LCM-15271','LCM-15273','LCM-15274','LCM-15275','LCM-15276','LCM-15277','LCM-15278','LCM-15279','LCM-15280','LCM-15281','LCM-15282','LCM-15283','LCM-15284','LCM-15285','LCM-15286','LCM-15287','LCM-15288','LCM-15289','LCM-15290','LCM-15291','LCM-15292','LCM-15293','LCM-15294','LCM-15295','LCM-15296','LCM-15298','LCM-15300','LCM-15301','LCM-15302','LCM-15303','LCM-15304','LCM-15305','LCM-15306','LCM-15307','LCM-15308','LCM-15309','LCM-15310','LCM-15311','LCM-15312','LCM-15313','LCM-15314','LCM-15315','LCM-15316','LCM-15317','LCM-15318','LCM-15319','LCM-15320','LCM-15321','LCM-15322','LCM-15323','LCM-15324','LCM-15325','LCM-16121','LCM-16122','LCM-16123','LCM-16124','LCM-16125','LCM-16126','LCM-16127','LCM-16128','LCM-16129','LCM-16130','LCM-16131','LCM-16132','LCM-16133','LCM-16134','LCM-16135','LCM-16136','LCM-16137','LCM-16138','LCM-16139','LCM-16140','LCM-16141','LCM-16142','LCM-16143','LCM-16144','LCM-16145','LCM-16146','LCM-16148','LCM-16149','LCM-16150','LCM-16151','LCM-16152','LCM-16153','LCM-16154','LCM-16155','LCM-16156','LCM-16157','LCM-16158','LCM-16159','LCM-16160','LCM-16161','LCM-16162','LCM-16163','LCM-16164','LCM-16165','LCM-16166','LCM-16167','LCM-16168','LCM-16170','LCM-16171','LCM-16172','LCM-16173','LCM-16174','LCM-16175','LCM-16176','LCM-16177','LCM-16178','LCM-16179','LCM-16180','LCM-16181','LCM-16182','LCM-16183','LCM-16185','LCM-16186','LCM-16188','LCM-16189','LCM-16191','LCM-16192','LCM-16193','LCM-16194','LCM-16195','LCM-16197','LCM-16198','LCM-16199','LCM-16201','LCM-16202','LCM-16203','LCM-16204','LCM-16205','LCM-16206','LCM-16207','LCM-16208','LCM-16209','LCM-16210','LCM-16211','LCM-16212','LCM-16214','LCM-16215','LCM-16216','LCM-16217','LCM-16218','LCM-16219','LCM-16220','LCM-16221','LCM-16222','LCM-16223','LCM-16224','LCM-16225','LCM-16226','LCM-16227','LCM-16228','LCM-16229','LCM-16230','LCM-16231','LCM-16232','LCM-16233','LCM-16234','LCM-16236','LCM-16237','LCM-16238','LCM-16239','LCM-16240','LCM-16241','LCM-16242','LCM-16243','LCM-16244','LCM-16245','LCM-16246','LCM-16247','LCM-16248','LCM-16249','LCM-16250','LCM-16252','LCM-16253','LCM-16254','LCM-16255','LCM-16256','LCM-16257','LCM-16258','LCM-16259','LCM-16260','LCM-16261','LCM-16262','LCM-16263','LCM-16264','LCM-16266','LCM-16267','LCM-16268','LCM-16269','LCM-16270','LCM-16271','LCM-16272','LCM-16273','LCM-16274','LCM-16275','LCM-16277','LCM-16278','LCM-16279','LCM-16280','LCM-16281','LCM-16282','LCM-16283','LCM-16284','LCM-16285','LCM-16286','LCM-16287','LCM-16288','LCM-16290','LCM-16291','LCM-16293','LCM-16294','LCM-16295','LCM-16296','LCM-16297','LCM-16298','LCM-16299','LCM-16300','LCM-16301','LCM-16302','LCM-16303','LCM-16306','LCM-16308','LCM-16309','LCM-16310','LCM-16311','LCM-16312','LCM-16313','LCM-16314','LCM-16315','LCM-16316','LCM-16317','LCM-16319','LCM-16320','LCM-16321','LCM-16322','LCM-16323','LCM-16324','LCM-16325','LCM-16326','LCM-16327','LCM-16328','LCM-16329','LCM-16330','LCM-16331','LCM-16332','LCM-16334','LCM-16335','LCM-16337','LCM-16338','LCM-16339','LCM-16340','LCM-17001','LCM-17002','LCM-17003','LCM-17004','LCM-17005','LCM-17006','LCM-17007','LCM-17008','LCM-17010','LCM-17011','LCM-17012','LCM-17013','LCM-17041','LCM-17043','LCM-17044','LCM-17045','LCM-17046','LCM-17047','LCM-17048','LCM-17049','LCM-17050','LCM-17051','LCM-17052','LCM-17053','LCM-17054','LCM-17055','LCM-17056','LCM-17058','LCM-17059','LCM-17060','LCM-17061','LCM-17062','LCM-17063','LCM-17064','LCM-17065','LCM-17066','LCM-17067','LCM-17068','LCM-17069','LCM-17070','LCM-17071','LCM-17072','LCM-17073','LCM-17074','LCM-17075','LCM-17076','LCM-17077','LCM-17078','LCM-17079','LCM-17082','LCM-17083','LCM-17088','LCM-17089','LCM-17090','LCM-17091','LCM-17092','LCM-17093','LCM-17094','LCM-17095','LCM-17096','LCM-17097','LCM-17098','LCM-17099','LCM-17100','LCM-17101','LCM-17102','LCM-17103','LCM-17104','LCM-17105','LCM-17106','LCM-17107','LCM-17108','LCM-17109','LCM-17110','LCM-17111','LCM-17112','LCM-17113','LCM-17114','LCM-17115','LCM-17116','LCM-17117','LCM-17118','LCM-17119','LCM-17120','LCM-17122','LCM-17123','LCM-17124','LCM-17125','LCM-17126','LCM-17127','LCM-17128','LCM-17129','LCM-17130','LCM-17131','LCM-17135','LCM-17136','LCM-17138','LCM-17139','LCM-17140','LCM-17141','LCM-17142','LCM-17143','LCM-17144','LCM-17145','LCM-17146','LCM-17147','LCM-17148','LCM-17149','LCM-17150','LCM-17151','LCM-17152','LCM-17153','LCM-17154','LCM-17155','LCM-17156','LCM-17158','LCM-17159','LCM-17160','LCM-17161','LCM-17162','LCM-17163','LCM-17164','LCM-17165','LCM-17166','LCM-17167','LCM-17168','LCM-17169','LCM-17170','LCM-17171','LCM-17172','LCM-17173','LCM-17174','LCM-17176','LCM-17177','LCM-17178','LCM-17179','LCM-17180','LCM-17181','LCM-17182','LCM-17183','LCM-17185','LCM-17186','LCM-17188','LCM-17190','LCM-17191','LCM-17192','LCM-17193','LCM-17194','LCM-17195','LCM-17196','LCM-17197','LCM-17199','LCM-17200','LCM-17201','LCM-17202','LCM-17203','LCM-17204','LCM-17205','LCM-17206','LCM-17207','LCM-17208','LCM-17209','LCM-17210','LCM-17211','LCM-17212','LCM-17213','LCM-17214','LCM-17215','LCM-17216','LCM-17217','LCM-17218','LCM-17219','LCM-17220','LCM-17221','LCM-17224','LCM-17225','LCM-17226','LCM-17227','LCM-17228','LCM-17229','LCM-17230','LCM-17231','LCM-17232','LCM-17233','LCM-17234','LCM-17235','LCM-17236','LCM-17237','LCM-17239','LCM-17240','LCM-17241','LCM-17242','LCM-17243','LCM-17244','LCM-17245','LCM-17246','LCM-17248','LCM-17249','LCM-17250','LCM-17251','LCM-18002','LCM-18003','LCM-18004','LCM-18005','LCM-18006','LCM-18007','LCM-18008','LCM-18009','LCM-18010','LCM-18011','LCM-18012','LCM-18013','LCM-18015','LCM-18017','LCM-18018','LCM-18019','LCM-18020','LCM-18021','LCM-18022','LCM-18023','LCM-18024','LCM-18025','LCM-18026','LCM-18028','LCM-18030','LCM-18031','LCM-18032','LCM-18033','LCM-18034','LCM-18035','LCM-18037','LCM-18039','LCM-18040','LCM-18041','LCM-18042','LCM-18043','LCM-18044','LCM-18045','LCM-18046','LCM-18049','LCM-18050','LCM-18051','LCM-18052','LCM-18053','LCM-18054','LCM-18055','LCM-18056','LCM-18057','LCM-18058','LCM-18059','LCM-18060','LCM-18061','LCM-18062','LCM-18063','LCM-18065','LCM-18066','LCM-18067','LCM-18068','LCM-18069','LCM-18070','LCM-18072','LCM-18074','LCM-18075','LCM-18076','LCM-18077','LCM-18078','LCM-18079','LCM-18080','LCM-18081','LCM-18082','LCM-18083','LCM-18084','LCM-18085','LCM-18086','LCM-18087','LCM-18088','LCM-18089','LCM-18090','LCM-18091','LCM-18092','LCM-18093','LCM-18094','LCM-18095','LCM-18096','LCM-18097','LCM-18098','LCM-18099','LCM-18100','LCM-18101','LCM-18102','LCM-18103','LCM-18105','LCM-18106','LCM-18107','LCM-18108','LCM-18109','LCM-18110','LCM-18111','LCM-18112','LCM-18113','LCM-18114','LCM-18115','LCM-18116','LCM-18118','LCM-18119','LCM-18120','LCM-18121','LCM-18122','LCM-18123','LCM-18125','LCM-18126','LCM-18127','LCM-18130','LCM-18131','LCM-18132','LCM-18133','LCM-18134','LCM-18135','LCM-18136','LCM-18137','LCM-18138','LCM-18139','LCM-18140','LCM-18141','LCM-18142','LCM-18143','LCM-18144','LCM-18145','LCM-18146','LCM-18147','LCM-18149','LCM-18150','LCM-18151','LCM-18152','LCM-18153','LCM-18154','LCM-18155','LCM-18156','LCM-18157','LCM-18158','LCM-18159','LCM-18160','LCM-18161','LCM-18162','LCM-18163','LCM-18164','LCM-18165','LCM-18166','LCM-18167','LCM-18168','LCM-18169','LCM-18170','LCM-18171','LCM-18172','LCM-18173','LCM-18174','LCM-18175','LCM-18176','LCM-18177','LCM-18178','LCM-18179','LCM-18180','LCM-18181','LCM-18182','LCM-18183','LCM-18184','LCM-18185','LCM-18186','LCM-18187','LCM-18188','LCM-18189','LCM-18190','LCM-18191','LCM-18192','LCM-18193','LCM-18194','LCM-18195','LCM-18197','LCM-18198','LCM-18199','LCM-18200','LCM-18201','LCM-18202','LCM-18208','LCM-18209','LCM-18210','LCM-18211','LCM-18212','LCM-18213','LCM-18214','LCM-18215','LCM-18216','LCM-18217','LCM-18218','LCM-18219','LCM-18220','LCM-18221','LCM-18222','LCM-18223','LCM-18224','LCM-20001','LCM-20002','LCM-20003','LCM-20004','LCM-20005','LCM-20006','LCM-20007','LCM-20008','LCM-20009','LCM-20010','LCM-20011','LCM-20012','LCM-20014','LCM-20015','LCM-20016','LCM-20017','LCM-20018','LCM-20019','LCM-20020','LCM-20021','LCM-20022','LCM-20023','LCM-20024','LCM-20026','LCM-20027','LCM-20028','LCM-20030','LCM-20032','LCM-20033','LCM-20034','LCM-20035','LCM-20036','LCM-20037','LCM-20038','LCM-20039','LCM-20040','LCM-20041','LCM-20042','LCM-20043','LCM-20044','LCM-20045','LCM-20046','LCM-20047','LCM-20049','LCM-20050','LCM-20051','LCM-20052','LCM-20053','LCM-20055','LCM-20056','LCM-20057','LCM-20058','LCM-20059','LCM-20060','LCM-20061','LCM-20062','LCM-20063','LCM-20064','LCM-20065','LCM-20066','LCM-20067','LCM-20068','LCM-20070','LCM-20072','LCM-20073','LCM-20074','LCM-20075','LCM-20076','LCM-20077','LCM-20078','LCM-20079','LCM-20080','LCM-20081','LCM-20082','LCM-20083','LCM-20084','LCM-20085','LCM-20086','LCM-20087','LCM-20088','LCM-20089','LCM-20090','LCM-20091','LCM-20092','LCM-20093','LCM-20094','LCM-20095','LCM-20096','LCM-20097','LCM-20098','LCM-20099','LCM-20100','LCM-20101','LCM-20102','LCM-20103','LCM-20104','LCM-20105','LCM-20106','LCM-20107','LCM-20108','LCM-20109','LCM-20110','LCM-20112','LCM-20115','LCM-20116','LCM-20117','LCM-20118','LCM-20119','LCM-20120','LCM-20121','LCM-20122','LCM-20123','LCM-20125','LCM-20126','LCM-20127','LCM-20128','LCM-20130','LCM-20131','LCM-20132','LCM-20133','LCM-20134','LCM-20135','LCM-20136','LCM-20137','LCM-20138','LCM-20139','LCM-20140','LCM-20141','LCM-20142','LCM-20143','LCM-20145','LCM-20146','LCM-20147','LCM-20149','LCM-20151','LCM-20152','LCM-20153','LCM-20154','LCM-20155','LCM-20156','LCM-20157','LCM-20158','LCM-20159','LCM-20161','LCM-20162','LCM-20163','LCM-20164','LCM-20165','LCM-20166','LCM-20167','LCM-20168','LCM-20170','LCM-20171','LCM-20174','LCM-20175','LCM-20176','LCM-20177','LCM-20178','LCM-20179','LCM-20180','LCM-20181','LCM-20182','LCM-20183','LCM-20184','LCM-20185','LCM-20186','LCM-20187','LCM-20188','LCM-20189','LCM-20190','LCM-20191','LCM-20193','LCM-20195','LCM-20196','LCM-20197','LCM-20198','LCM-20199','LCM-20200','LCM-20201','LCM-20202','LCM-20203','LCM-20204','LCM-20205','LCM-20206','LCM-20207','LCM-20208','LCM-20209','LCM-20210','LCM-20213','LCM-20214','LCM-20215','LCM-20216','LCM-20217','LCM-20218','LCM-20219','LCM-20220','LCM-20221','LCM-20222','LCM-20223','LCM-20224') OR V.VT_NUMMER IN ('LCM-21584','LCM-21575','LCM-21484','LCM-20494','LCM-19451','LCM-10472','LCM-21345','LCM-21554','LCM-21686','LCM-20999','LCM-20998','LCM-20988','LCM-13220','LCM-14141','LCM-14170','LCM-14174','LCM-14176','LCM-14177','LCM-14178','LCM-14179','LCM-14180','LCM-16395','LCM-16397','LCM-16399','LCM-16400','LCM-16401','LCM-16402','LCM-16403','LCM-16404','LCM-16406','LCM-16407','LCM-16446','LCM-16450','LCM-16451','LCM-16452','LCM-16453','LCM-16454','LCM-16455','LCM-17358','LCM-21240','LCM-21295','LCM-21573','LCM-13705','LCM-16712','LCM-15120','LCM-16052','LCM-12301','LCM-18970','LCM-19305','LCM-18489','LCN-20835','LCM-10008','LCM-10009','LCM-10010','LCM-10011','LCM-10012','LCM-10014','LCM-10015','LCM-10016','LCM-10017','LCM-10018','LCM-10019','LCM-10020','LCM-10022','LCM-10023','LCM-10024','LCM-10025','LCM-10026','LCM-10027','LCM-10028','LCM-10029','LCM-10030','LCM-10031','LCM-10032','LCM-10033','LCM-10034','LCM-10035','LCM-10036','LCM-10037','LCM-10038','LCM-10039','LCM-10040','LCM-10041','LCM-10042','LCM-10043','LCM-10044','LCM-10045','LCM-10046','LCM-10047','LCM-10048','LCM-10049','LCM-10050','LCM-10051','LCM-10052','LCM-10053','LCM-10054','LCM-10055','LCM-10056','LCM-10057','LCM-10058','LCM-10059','LCM-10060','LCM-10061','LCM-10062','LCM-10063','LCM-10064','LCM-10065','LCM-10066','LCM-10067','LCM-10068','LCM-10069','LCM-10070','LCM-10071','LCM-10073','LCM-10074','LCM-10075','LCM-10076','LCM-10077','LCM-10078','LCM-10079','LCM-10080','LCM-10081','LCM-10082','LCM-10083','LCM-10084','LCM-10085','LCM-10086','LCM-10087','LCM-10088','LCM-10089','LCM-10090','LCM-10091','LCM-10092','LCM-10093','LCM-10094','LCM-10095','LCM-10096','LCM-10097','LCM-10098','LCM-10099','LCM-10100','LCM-10101','LCM-10102','LCM-10103','LCM-10104','LCM-10105','LCM-10106','LCM-10107','LCM-10108','LCM-10109','LCM-10110','LCM-15001','LCM-15002','LCM-15003','LCM-15004','LCM-15005','LCM-15006','LCM-15007','LCM-15008','LCM-15009','LCM-15010','LCM-15011','LCM-15013','LCM-15014','LCM-15015','LCM-15017','LCM-15018','LCM-15019','LCM-15020','LCM-15021','LCM-15022','LCM-15023','LCM-15024','LCM-15025','LCM-15026','LCM-15027','LCM-15028','LCM-15030','LCM-15031','LCM-15032','LCM-15033','LCM-15034','LCM-15035','LCM-15036','LCM-15037','LCM-15038','LCM-15039','LCM-15041','LCM-15042','LCM-15043','LCM-15044','LCM-15045','LCM-15046','LCM-15047','LCM-15048','LCM-15049','LCM-15050','LCM-15051','LCM-15052','LCM-15053','LCM-15054','LCM-15055','LCM-15056','LCM-15057','LCM-15058','LCM-15059','LCM-15060','LCM-15061','LCM-15062','LCM-15063','LCM-15064','LCM-15065','LCM-15067','LCM-15068','LCM-15069','LCM-15070','LCM-15071','LCM-15072','LCM-15073','LCM-15074','LCM-15075','LCM-15076','LCM-15077','LCM-15079','LCM-15080','LCM-15081','LCM-15082','LCM-15083','LCM-15084','LCM-15085','LCM-15086','LCM-15087','LCM-15088','LCM-15089','LCM-15090','LCM-15091','LCM-15092','LCM-15093','LCM-15094','LCM-15095','LCM-15096','LCM-15097','LCM-15099','LCM-15100','LCM-15101','LCM-15102','LCM-15103','LCM-15104','LCM-15105','LCM-15106','LCM-15107','LCM-16001','LCM-16002','LCM-16003','LCM-16004','LCM-16005','LCM-16006','LCM-16007','LCM-16008','LCM-16009','LCM-16010','LCM-16011','LCM-16012','LCM-16013','LCM-16014','LCM-16015','LCM-16016','LCM-16017','LCM-16018','LCM-16019','LCM-16020','LCM-16021','LCM-16022','LCM-16023','LCM-16024','LCM-16025','LCM-16026','LCM-16027','LCM-16028','LCM-16029','LCM-16030','LCM-16031','LCM-16032','LCM-16033','LCM-16034','LCM-16035','LCM-16036','LCM-16037','LCM-16038','LCM-16039','LCM-16041','LCM-16042','LCM-16043','LCM-16044','LCM-16045','LCM-16047','LCM-16048','LCM-16049','LCM-16050','LCM-16051','LCM-16052','LCM-16054','LCM-16055','LCM-16056','LCM-16058','LCM-16060','LCM-16061','LCM-16062','LCM-16063','LCM-16064','LCM-16065','LCM-16066','LCM-16067','LCM-16068','LCM-16069','LCM-16071','LCM-16072','LCM-16073','LCM-16074','LCM-16075','LCM-16076','LCM-16077','LCM-16079','LCM-16080','LCM-16082','LCM-16085','LCM-16086','LCM-16087','LCM-16088','LCM-16089','LCM-16090','LCM-16091','LCM-16092','LCM-16093','LCM-16094','LCM-16095','LCM-16096','LCM-16097','LCM-16098','LCM-16099','LCM-16100','LCM-16102','LCM-16103','LCM-16104','LCM-16105','LCM-16106','LCM-16107','LCM-16109','LCM-16110','LCM-16111','LCM-16112','LCM-19001','LCM-19002','LCM-19003','LCM-19004','LCM-19005','LCM-19006','LCM-19007','LCM-19008','LCM-19009','LCM-19010','LCM-19011','LCM-19012','LCM-19013','LCM-19014','LCM-19015','LCM-19016','LCM-19017','LCM-19018','LCM-19019','LCM-19020','LCM-19021','LCM-19022','LCM-19023','LCM-19024','LCM-19025','LCM-19026','LCM-19027','LCM-19028','LCM-19029','LCM-19030','LCM-19033','LCM-19034','LCM-19035','LCM-19036','LCM-19037','LCM-19038','LCM-19039','LCM-19040','LCM-19041','LCM-19043','LCM-19044','LCM-19045','LCM-19046','LCM-19047','LCM-19048','LCM-19049','LCM-19050','LCM-19051','LCM-19052','LCM-19053','LCM-19054','LCM-19055','LCM-19056','LCM-19057','LCM-19058','LCM-19059','LCM-19060','LCM-19061','LCM-19062','LCM-19063','LCM-19065','LCM-19066','LCM-19067','LCM-19068','LCM-19069','LCM-19070','LCM-19071','LCM-19072','LCM-19073','LCM-19074','LCM-19076','LCM-19077','LCM-19078','LCM-19079','LCM-19081','LCM-19082','LCM-19083','LCM-19084','LCM-19085','LCM-19087','LCM-19088','LCM-19089','LCM-19090','LCM-19091','LCM-19092','LCM-19093','LCM-19094','LCM-19095','LCM-19097','LCM-19098','LCM-19099','LCM-19100','LCM-19101','LCM-19102','LCM-19103','LCM-19104','LCM-19106','LCM-19107','LCM-19108','LCM-19109','LCM-21001','LCM-21002','LCM-21003','LCM-21005','LCM-21006','LCM-21007','LCM-21008','LCM-21009','LCM-21010','LCM-21011','LCM-21013','LCM-21014','LCM-21016','LCM-21017','LCM-21018','LCM-21019','LCM-21020','LCM-21025','LCM-21026','LCM-21027','LCM-21028','LCM-21029','LCM-21030','LCM-21031','LCM-21032','LCM-21033','LCM-21034','LCM-21035','LCM-21036','LCM-21037','LCM-21039','LCM-21040','LCM-21041','LCM-21042','LCM-21043','LCM-21044','LCM-21045','LCM-21046','LCM-21051','LCM-21053','LCM-21054','LCM-21055','LCM-21056','LCM-21057','LCM-21058','LCM-21059','LCM-21060','LCM-21061','LCM-21062','LCM-21063','LCM-21067','LCM-21081','LCM-21083','LCM-21086','LCM-21087','LCM-21088','LCM-21089','LCM-21090','LCM-21091','LCM-21092','LCM-21095','LCM-21096','LCM-21097','LCM-21099','LCM-21100','LCM-21101','LCM-21102','LCM-21109','LCM-21111','LCM-21112','LCM-21113','LCM-21117','LCM-21118','LCM-21119','LCM-21122','LCM-21123','LCM-21124','LCM-21127','LCM-21129','LCM-21131','LCM-21132','LCM-21134','LCM-21135','LCM-21136','LCM-21137','LCM-21139','LCM-21140','LCM-21141','LCM-21142','LCM-21143','LCM-21144','LCM-21145','LCM-21148','LCM-21149','LCM-21150','LCM-21151','LCM-21152','LCM-21153','LCM-21154','LCM-21155','LCM-21490','LCM-21435','LCM-21442')" + + @Field String baseUri = "https://d3.dev.otc.hlg.de" + @Field String repo_id = "d1564eeb-4686-525b-b789-6c264014825c" + // Dieser Benutzer legt die Vertraege im System an. Der API Key muss im Vorfeld im Identity Provider angelegt werden. + // Der Benutzer muss auf die Dokumentart Einzelvertrag/Rahmenvertrag schreibend berechtigt sein + @Field String apiKeyUser = "QkSq/0aXYN4/PUiLHrN/Rz7Q1TphBRO1z/khSj9dF/y4EVPcOdSiJc9Y1sdQ6er/YCFOUBC9VnFSJztr4RZSMQkqR4ccnXW8Q2jkSgsMxIQ=&_z_A0V5ayCSke2KhoCt7spaf51D1gKkv7GEL68yClMR1LitCKgBRs6h2IfHiGS9jcWUSClEjKReHWqw7IhHWUV8hewtyrYwk" + + public class constanten + { + // Logging + static String logDirPath = "./log/" + static File logFile = new File(logDirPath + System.currentTimeMillis() + "Vertragsmigration.log") + static File logFileDLCMN = new File(logDirPath + System.currentTimeMillis() + "DefectLCM_Number.txt") + static File logFileDLCMNTerms = new File(logDirPath + System.currentTimeMillis() + "DefectLCM_Number.txt") + + } + + public class PartnerData + { + String LCMNumber + String LCMPartnerName + String partnerNumber + String partnerAdress + + def PartnerData() + {} + + def PartnerData(def partnerNum, def partnerAdr, def LCMNum, def LCMName) + { + this.partnerNumber = partnerNum + this.partnerAdress = partnerAdr + this.LCMNumber = LCMNum + this.LCMPartnerName = LCMName + } + + def getPartnerNumber () + { + return this.partnerNumber; + } + + def getPartnerAdress () + { + return this.partnerAdress; + } + + def getLCMNumber () + { + return this.LCMNumber; + } + + def getLCMName () + { + return this.LCMPartnerName; + } + + } + + D3Interface d3 = getProperty("d3") + d3.log.info("Auslesen der Partnerstammdaten"); + partnerMap = readCSVPartnerFile(d3); + d3.log.info("Auslesen der berechtigten DCM User"); + IDP_User = getDCMJustifiedUsers(d3) + d3.log.info("Start Vertragsuebername"); + log("Start Vertragsuebername"); + getContract(d3) + d3.log.info("Ende Vertragsuebername"); + log("Ende Vertragsuebername"); + + /* Anlage eines Vertrags per Rest Call gegen die CMC Applikation + * + */ + def boolean createContract (D3Interface d3, def id_Number, String JsonVertrag) + { + d3.log.info("Start createContract"); + if(JsonVertrag == "" || JsonVertrag == null) + { + throw new Exception ("Fehler: Keine Vertragsdaten vorhanden"); + } + + try + { + // Anlegen eines Vertrags + URL url = new URL(baseUri+"/dbscase/rest/file/contract"); + HttpURLConnection httpPost = (HttpURLConnection) url.openConnection(); + try + { + httpPost.setRequestMethod("POST"); + httpPost.setRequestProperty ("Authorization", "Bearer ${apiKeyUser}"); + httpPost.setRequestProperty("Accept", "application/json") + httpPost.setRequestProperty("Content-Type", "application/json") + httpPost.setRequestProperty("x-dv-cm-repo-id", repo_id) + httpPost.setDoOutput(true); + httpPost.getOutputStream().write(JsonVertrag.getBytes("UTF-8")); + int getRC = httpPost.getResponseCode(); + if(getRC == HttpURLConnection.HTTP_OK) + { + String response = httpPost.getInputStream().getText(); + + JSONObject jObjectresponse = (JSONObject) JSONValue.parse(response); + JSONObject jObjectMasterData = (JSONObject) jObjectresponse.get("masterData"); + + def jObjectinternalNumber = jObjectMasterData.get("internalNumber"); + def jResponsibles = jObjectMasterData.get("responsibles"); + def newRepString = "" + jResponsibles.each + { + if(newRepString != "") + { + newRepString = newRepString + it.get("id") + "," + } + else + { + newRepString = it.get("id") + } + } + jResponsibles = newRepString + def jContractTyp = jObjectMasterData.get("type"); + d3.log.info("-------Informationen aus neuem Vertrag-----------"); + d3.log.info("Vertragstyp: " + jContractTyp); + d3.log.info("Interne Vertragsnummer: " + jObjectinternalNumber); + d3.log.info("Verantwortliche: " + jResponsibles); + JSONObject jObjectPeriod = (JSONObject) jObjectresponse.get("period"); + def jDurationType = jObjectPeriod.get("durationType"); + d3.log.info("Laufzeittyp: " + jDurationType); + d3.log.info("Frist ID: " + id_Number); + def jStatus = jObjectMasterData.get("status"); + d3.log.info("-------------------------------------------------"); + log("Vertrag wurde erfolgreich angelegt: $jObjectinternalNumber --- LCM Nummer: LCM-$id_Number") + httpPost.disconnect(); + try + { + if(jStatus == "Aktiv" && jDurationType != null ) + { + handleTermInformation(d3, jObjectinternalNumber, jResponsibles, jDurationType, jContractTyp, id_Number, jStatus); + //handleOtherTermInformation(d3, jObjectinternalNumber, jResponsibles, jDurationType, jContractTyp, id_Number, jStatus); //-> Die Sonderfristen werden nicht benoetigt + handleProlongationTermInformation(d3, jObjectinternalNumber, jResponsibles, jDurationType, jContractTyp, id_Number, jStatus); + } + else + { + d3.log.info("Der Vertrag " + jObjectinternalNumber + " ist beendet oder hat keine Laufzeit. Somit wird keine Frist übernommen.") + log("Der Vertrag " + jObjectinternalNumber + " ist beendet oder hat keine Laufzeit. Somit wird keine Frist übernommen.") + } + } + catch(Exception ex) + { + d3.log.error("Fehler bei der Erstellung der Fristen eines Vertrags.") + } + } + else + { + String header = httpPost.getHeaderField("CM_ExceptionCause"); + log("ERROR: Bei Anlage eines Vertrags: " + getRC + " --- Grund: " + header) + logDefectLCMNumber("LCM-" + id_Number); + d3.log.error("ERROR | - createContract = Fehler bei Anlage eines Vertrags : " + getRC + " --- Grund: " + header + " - " + JsonVertrag); + } + return true; + } + catch(Exception e) + { + d3.log.error("ERROR: " + e); + logDefectLCMNumber("LCM-" + id_Number); + log("ERROR: Bei Anlage eines Vertrags: " + e) + return false; + } + finally + { + if(httpPost != null) { + httpPost.disconnect(); + } + } + } + catch (Exception ex) + { + d3.log.error("ERROR | Create Contract = " + ex ); + logDefectLCMNumber("LCM-" + id_Number); + log("ERROR: Bei Anlage eines Vertrags: " + ex) + return false; + } + } + + /* Anlage eines Vertrags per Rest Call gegen die CMC Applikation + * Hier wird nur die Kommunikation mit der terms App durchgefuehrt. + * Es wird davon ausgegangen, dass man das JSON File korrekt angeliefert bekommt. + */ + def boolean createTerm (D3Interface d3, String JsonTerm, def internalContractNumber, def Termtyp) + { + if(JsonTerm == "" || JsonTerm == null) + { + throw new Exception("Es wurde keine Frist zur Analge übergeben.") + } + + d3.log.info("Start createTerm"); + try + { + URL url = new URL(baseUri+"/terms/rest/terms"); + HttpURLConnection httpPut = (HttpURLConnection) url.openConnection(); + try + { + httpPut.setRequestMethod("PUT"); + d3.log.info("setRequestMethod") + httpPut.setRequestProperty ("Authorization", "Bearer ${apiKeyUser}"); + httpPut.setRequestProperty("Accept", "application/json") + httpPut.setRequestProperty("Content-Type", "application/json") + httpPut.setRequestProperty("x-dv-cm-repo-id", repo_id) + + httpPut.setDoOutput(true); + httpPut.getOutputStream().write(JsonTerm.getBytes("UTF-8")); + + int getRC = httpPut.getResponseCode(); + if(getRC == HttpURLConnection.HTTP_OK) + { + String response = httpPut.getInputStream().getText(); + JSONObject jObjectresponse = (JSONObject) JSONValue.parse(response); + def jDescription = jObjectresponse.get("description"); + def jVertragsID = jObjectresponse.get("objectId"); + //log("Die Frist $jDescription wurde für den Vertrag $jVertragsID angelegt."); + httpPut.disconnect(); + return true; + } else { + d3.log.error("ERROR | - createTerm = Fehler bei Anlage einer Frist : " + getRC + " : " + JsonTerm); + log("ERROR: Bei Anlage einer Frist: " + getRC) + } + return true; + } + catch(Exception e) + { + d3.log.error("ERROR: " + e); + log("ERROR: Bei Anlage einer Frist: " + e) + logDefectTermsLCMNumber(Termtyp + ": " + internalContractNumber + " - ") + return false; + } + finally + { + if(httpPut != null) { + httpPut.disconnect(); + } + } + } + catch (Exception ex) + { + d3.log.error("ERROR | Create Term = " + ex); + log("ERROR: Bei Anlage einer Frist: " + ex) + return false; + } + } + + /* + * Holt die Verantwortlichen eines Vertrags. + */ + def getResponsiblesForContract (D3Interface d3, def LCM_Number) + { + d3.log.info("Start getResponsiblesForContract"); + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def UserNames = ""; + def lSQLConnection; + d3.log.info("Beginne mit Auslesen der verantwortlichen User"); + try + { + + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + def sqlQuery = + "SELECT LISTAGG(P.NAME || ', ' || P.VORNAME, '|') WITHIN GROUP (ORDER BY P.NAME) AS ALLNAMES FROM LCM.TBL_VERTRAG V FULL OUTER JOIN LCM.tbl_vertrag_ansprech VAN on V.id = VAN.fk_tbl_vertrag FULL OUTER JOIN LCM.tbl_int_person P on VAN.fk_tbl_person = p.id WHERE V.VT_NUMMER = '" + LCM_Number + "' GROUP BY V.VT_NUMMER ORDER BY V.VT_NUMMER ASC" + lSQLConnection.eachRow(sqlQuery) + { it -> + if(it.ALLNAMES != " , " || it.ALLNAMES != ", " || it.ALLNAMES != ", ") + { + UserNames = it.ALLNAMES + } + } + return UserNames; + d3.log.info("Abschluss Auslesen der verantwortlichen User."); + } + catch(Exception e) + { + d3.log.error("Fehler beim Auslesen der verantwortlichen User:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende getResponsiblesForContract"); + } + + /*def handleOtherTermInformation (D3Interface d3, def internalContractNumber, def Responsibles, def DurationType, def ContractTyp, def id_Number, def status) + { + d3.log.info("Start handleOtherTermInformation"); + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def createdJson; + def lSQLConnection; + d3.log.info("Beginne mit Auslesen der sonstigen Fristen"); + try + { + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + def sqlQuery = "SELECT fk_ref_frist_art, bemerkung, beginn AS STICHTAG, jahre, monate, tage, automverlaengerung_jn, verljahre, verlmonate FROM LCM.TBL_Vertrag_Frist WHERE FK_TBL_VERTRAG = '" + id_Number + "'" + + lSQLConnection.eachRow(sqlQuery) + { it -> + def OtherJson = defineOtherTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status); + if(OtherJson != "" && OtherJson != null) + { + createTerm (d3, OtherJson) + } + } + d3.log.info("Abschluss Anlage von Prolongationen."); + } + catch(Exception e) + { + d3.log.error("Fehler beim Erstellen von Sonstigen Fristen:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende handleOtherTermInformation"); + return createdJson; + + }*/ + + + //Die Funktion halt moegliche Prolongationen aus der DB Tabelle, + //verarbeitet diese in eine Json Datei und übergibt diese an die + //Funktion zur Anlage einer Frist. + def handleProlongationTermInformation (D3Interface d3, def internalContractNumber, def Responsibles, def DurationType, def ContractTyp, def id_Number, def status) + { + d3.log.info("Start handleProlongationTermInformation"); + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def createdJson; + def lSQLConnection; + d3.log.info("Beginne mit Auslesen der Prolongationen"); + try + { + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + def sqlQuery = "SELECT V.ID,VLZ.FK_TBL_VERTRAG, VO.FK_TBL_VERTRAG_LAUFZEIT, VO.NUMMER, VO.OPTIONSENDE, VO.FRISTDATUM, VO.BEMERKUNG, VO.VERLAENGERUNGSFRIST_JN, VO.OPTION_AUSUEBEN_JN FROM LCM.TBL_VERTRAG_OPTION VO JOIN LCM.TBL_VERTRAG_LAUFZEIT VLZ ON VO.FK_TBL_VERTRAG_LAUFZEIT = VLZ.ID JOIN LCM.TBL_VERTRAG V ON VLZ.FK_TBL_VERTRAG = V.ID WHERE V.ID = '" + id_Number + "' ORDER BY VO.NUMMER ASC" + + lSQLConnection.eachRow(sqlQuery) + { it -> + def prolongationsJson = "" + prolongationsJson = defineProlongationTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status); + if(prolongationsJson != "" && prolongationsJson != null) + { + createTerm (d3, prolongationsJson, internalContractNumber, "Prolongation") + } + } + d3.log.info("Abschluss Anlage von Prolongationen."); + } + catch(Exception e) + { + d3.log.error("Fehler beim Erstellen von Prolongationen:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende handleProlongationTermInformation"); + return createdJson; + } + + /* Erzeugt eine Sonstige Frist + * + */ + /*def defineOtherTerm (D3Interface d3, def it, String InternalNumber, def Responsibles, def DurationType, def ContractTyp, def status) + { + d3.log.info("Start defineOtherTerm"); + def fristart = it.fk_ref_frist_art + def bemerkung = it.bemerkung + def description = "" + if(fristart == "1000") + { + description = "Projekt" + } + else if(fristart == "1001") + { + description = "Gewährleistung" + } + else if(fristart == "1002") + { + description = "Sonderkündigung" + } + else + { + description = "Sonstiges" + } + description = description + " " + (it.bemerkung != null) ? it.bemerkung : "" + + if(description.length() < 250) + { + d3.log.warn("Der Text in Fristbeschreibung wird auf 250 Zeichen gekürzt." ); + description = description.take(250); + } + SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS" ); + sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + def stichtagDatum = sdf.format( it.STICHTAG ) ; + + def years = it.jahre ?: 0; + def yearsInDays = 365 * years; + def months = it.monate ?: 0; + def monthInDays = 31 * months + def days = it.tage ?: 0 + def daysSum = days + monthInDays + yearsInDays + + try + { + def reminderDate = "" + if(status == "Aktiv") + { + reminderDate = dateCalculate(d3, stichtagDatum, "yyyy-MM-dd'T'HH:mm:ss.SSS", Calendar.DATE, -29) + } + SimpleDateFormat startsdf = new SimpleDateFormat( "yyyy-MM-dd'T'00:00:00.000" ); + def deadline = startsdf.format( it.STICHTAG ); + + def sonstigeFrist = """{\"termType\":\"OTHER\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":true,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":$daysSum,\"countUnit\":\"Day\",\"timepoint\":\"TargetDate\",\"targetDateInitial\":\"$stichtagDatum\",\"rhythmCount\":0,\"targetDateCurrent\":\"$stichtagDatum\"},\"end\":{\"end\":\"$stichtagDatum\",\"deadline\":\"$deadline\"},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + d3.log.info("Ende defineOtherTerm"); + return sonstigeFrist; + } + catch(Exception e) + { + d3.log.error("Fehler beim Berechnung der Sonstigen Frist: " + e) + } + }*/ + + //Erzeugt einen JSON String, welcher einer Prolongation entspricht. + def defineProlongationTerm(D3Interface d3, def it, String InternalNumber, def Responsibles, def DurationType, def ContractTyp, def status) + { + d3.log.info("Start defineProlongationTerm"); + def description = "Prolongation" + it.NUMMER + def prolongationsFrist; + + def option = it.OPTIONSENDE + def frist = it.FRISTDATUM + + if(option != null && option != "" && frist != null && frist != "") + { + SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS" ); + def optionsDatum = sdf.format( option ) ; + def FristDatum = sdf.format(frist); + + try + { + Date optionsDatumPar = sdf.parse(optionsDatum); + Date FristDateumPar = sdf.parse(FristDatum); + + def differenceInDays = use(groovy.time.TimeCategory){ + def duration=(optionsDatumPar - FristDateumPar).days; + return duration; + } + + def targetDateInitial = sdf.format( option ); + SimpleDateFormat startsdf = new SimpleDateFormat( "yyyy-MM-dd'T'00:00:00.000" ); + def deadline = startsdf.format( frist ); + def reminderDate = "" + if(status == "Aktiv") + { + reminderDate = dateCalculate(d3, deadline, "yyyy-MM-dd'T'HH:mm:ss.SSS", Calendar.DATE, -29) + } + prolongationsFrist = """{\"termType\":\"OTHER\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":true,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":$differenceInDays,\"countUnit\":\"Day\",\"timepoint\":\"TargetDate\",\"targetDateInitial\":\"$targetDateInitial\",\"rhythmCount\":0,\"targetDateCurrent\":\"$targetDateInitial\"},\"end\":{\"end\":\"$targetDateInitial\",\"deadline\":\"$deadline\"},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + d3.log.info("Ende defineProlongationTerm"); + return prolongationsFrist; + } + catch(Exception e) + { + d3.log.error("Fehler beim Berechnung der Prolongationsdaten: " + e) + } + } + else if(option != null && option != "" && (frist == null || frist == "")) + { + SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS" ); + sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + def optionsDatum = sdf.format( option ) ; + + try + { + def reminderDate = "" + if(status == "Aktiv, aber gekündigt") + { + reminderDate = dateCalculate(d3, optionsDatum, "yyyy-MM-dd'T'HH:mm:ss.SSS", Calendar.DATE, -29) + } + SimpleDateFormat startsdf = new SimpleDateFormat( "yyyy-MM-dd'T'00:00:00.000" ); + def deadline = startsdf.format( option ); + + prolongationsFrist = """{\"termType\":\"OTHER\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":true,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":0,\"countUnit\":\"Day\",\"timepoint\":\"TargetDate\",\"targetDateInitial\":\"$optionsDatum\",\"rhythmCount\":0,\"targetDateCurrent\":\"$optionsDatum\"},\"end\":{\"end\":\"$optionsDatum\",\"deadline\":\"$deadline\"},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + d3.log.info("Ende defineProlongationTerm"); + return prolongationsFrist; + } + catch(Exception e) + { + d3.log.error("Fehler beim Berechnung der Prolongationsdaten: " + e) + } + } + } + + + def handleTermInformation (D3Interface d3, def internalContractNumber, def Responsibles, def DurationType, def ContractTyp, def id_Number, def status) + { + d3.log.info("Start handleTermInformation"); + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def createdJson; + def lSQLConnection; + + try + { + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + def sqlQuery = "SELECT VL.FK_TBL_VERTRAG, VL.befristet_jn, VL.kuendigungsfrist_jn, VL.kuendigung_zum_monate, VL.kuendigung_zum_tage, VL.kuendigungsdatum, VL.fk_ref_kuendigung_zum, VL.bemerkung, VL.naechstes_kuendigungsdatum, VL.naechstes_Vertragsende, VL.mindestlaufzeit_jn, VL.ende_mindestlaufzeit, VL.vertragsende_datum, VL.verlaengerung_jn, VL.verlaengerung_jahre, VL.verlaengerung_monate, VT.FK_REF_VERTRAGSSTATUS FROM LCM.TBL_VERTRAG_LAUFZEIT VL FULL OUTER JOIN LCM.TBL_VERTRAG VT ON VT.ID = VL.FK_TBL_VERTRAG WHERE VL.FK_TBL_VERTRAG = '" + id_Number +"'" + + lSQLConnection.eachRow(sqlQuery) + { it -> + checkAndCreateWhichTermMustBeCreated(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status); + } + } + catch(Exception e) + { + d3.log.error("Fehler beim Erstellen von Fristen:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + return createdJson; + d3.log.info("Ende handleTermInformation"); + } + + + def checkAndCreateWhichTermMustBeCreated(D3Interface d3, def it, String internalContractNumber, def Responsibles, def DurationType, def ContractTyp, def status) + { + d3.log.info("Start checkAndCreateWhichTermMustBeCreated"); + + //Ueberpruefen ob Kuendigungsfrist angelegt werden muss + def kuendigungsfrist = it.kuendigungsfrist_jn + def mindestvertragslaufzeit = it.mindestlaufzeit_jn + def verlaengerungsfristEnt = it.verlaengerung_jn + def kuen_Ref = it.fk_ref_kuendigung_zum + def befristet = it.befristet_jn + def vertragsende = it.vertragsende_datum + def naechstes_Vertragsende = it.naechstes_Vertragsende + def endeMindestvertragslaufzeit = it.ende_mindestlaufzeit + + + //Einmal ein Kuendigung wenn befristet nein + Mindestvertragslaufzeit gesetzt und naechste mögliches Vertragsende = Ende Mindestvertragslaufzeit ist. Es darf keine verlaengerungsoption da sein. + //-> Dann ein Jederzeit Kuendigung mit Mindestvertragslaufzeit. + if((kuendigungsfrist == 0 || kuendigungsfrist == null) && kuen_Ref != null ) // -1 ist schon gekündigt und darf somit nicht mehr angelegt werden + { + // Erstelle Kuendigung + d3.log.info("Erstelle Kuendigung...") + def TerminationTerm = "" + TerminationTerm = defineTerminationTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status) + if(TerminationTerm != "" && TerminationTerm != null) + { + createTerm (d3, TerminationTerm, internalContractNumber, "Kuendigung") + } + } + else if(mindestvertragslaufzeit == -1 && (endeMindestvertragslaufzeit != null && endeMindestvertragslaufzeit != "")) + { + d3.log.info("Erstelle Kuendigung nur zur Abbildung einer Mindestvertragslaufzeit...") + def EveryTerminationTerm = "" + EveryTerminationTerm = defineEveryTerminationTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp) + d3.log.error("Weiter") + if(EveryTerminationTerm != "" && EveryTerminationTerm != null) + { + createTerm (d3, EveryTerminationTerm, internalContractNumber, "Kuendigung") + } + } + else if (kuendigungsfrist == -1) + { + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Erstelle Kuendigung + d3.log.info("Erstelle Kuendigung...") + def TerminationTerm = "" + TerminationTerm = defineTerminationTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status) + if(TerminationTerm != "" && TerminationTerm != null) + { + createTerm (d3, TerminationTerm, internalContractNumber, "Kuendigung") + } + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + } + else + { + d3.log.info("Keine Kuendigung...") + } + + //Ueberpruefen ob Verlaengerung erstellt werden soll + if(verlaengerungsfristEnt == -1 && (befristet != 0 || (befristet == 0 && (vertragsende != null || naechstes_Vertragsende!= null)))) + { + // Erstelle Verlaengerung + d3.log.warn("Erstelle Verlaengerung...") + def ExtendTerm = "" + ExtendTerm = defineExtendTerm(d3, it, internalContractNumber, Responsibles, DurationType, ContractTyp, status) + d3.log.warn("Json Verlaengerung: " + ExtendTerm) + if(ExtendTerm != null && ExtendTerm != "") + { + createTerm (d3, ExtendTerm, internalContractNumber , "Verlaengerung") + } + } + else + { + d3.log.warn("Keine Verlaengerung...") + } + d3.log.info("Ende checkWhichTermMustBeCreated"); + } + + //Erzeugt einen JSON String, welcher zur Anlage einer Kuendigungsfrist mit Mindestvertragslaufzeit genutzt wird. + def defineEveryTerminationTerm(D3Interface d3, def it, String InternalNumber, def Responsibles, def DurationType, def ContractTyp) + { + def timepoint = it.fk_ref_kuendigung_zum; + if(timepoint == 4 || timepoint == "" || timepoint == null) + { + SimpleDateFormat sdfEndDay = new SimpleDateFormat( "yyyy-MM-dd'T'23:59:59.SSS'Z'" ); + sdfEndDay.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + def ende_min = sdfEndDay.format( it.ende_mindestlaufzeit ); + + //mindestvertragslaufzeit identifizieren + def mindestvertragslaufzeitDateKu = dateCalculate(d3, ende_min, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -1) + + jederzeitKuendigungsfrist = """{\"termType\":\"NOTICE\",\"timeZone\":\"Europe/Berlin\",\"description\":\"Mindestvertragslaufzeit\",\"repetition\":\"Anytime\",\"activeMinimumTerm\":true,\"minimumDuration\":\"$mindestvertragslaufzeitDateKu\",\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":false,\"reminderUser\":[\"$Responsibles\"],\"interval\":{\"rhythmCount\":0},\"end\":{},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + return jederzeitKuendigungsfrist; + } + else + { + d3.log.error("Kündigungsfrist jederzeit ist in sich nicht konsistent. ") + } + } + + //Erzeugt einen JSON String, welcher zur Anlage einer Kuendigungsfrist genutzt wird. + def defineTerminationTerm(D3Interface d3, def it, String InternalNumber, def Responsibles, def DurationType, def ContractTyp, def status) + { + def kuendigungsfrist = it.kuendigungsfrist_jn + + def mindestvertragslaufzeit = it.mindestlaufzeit_jn + def description = "Kündigung" + def reminderUser = Responsibles + + def activeMinimumTermPhrase = "\"activeMinimumTerm\":false," + if(mindestvertragslaufzeit == -1) // Kuendigung mit Mindestvertragslaufzeit + { + SimpleDateFormat sdfEndDay = new SimpleDateFormat( "yyyy-MM-dd'T'23:59:59.SSS'Z'" ); + sdfEndDay.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + def ende_min = sdfEndDay.format( it.ende_mindestlaufzeit ); + d3.log.info("ende_mindestlaufzeit: " + ende_min) + + //mindestvertragslaufzeit identifizieren + def mindestvertragslaufzeitDate = dateCalculate(d3, ende_min, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -1) + + activeMinimumTermPhrase = "\"minimumDuration\":\"$mindestvertragslaufzeitDate\",\"activeMinimumTerm\":true," + + } + // Kuendigung ohne Mindestvertragslaufzeit + + def referenz = it.fk_ref_kuendigung_zum + def timepoint = "" + if(referenz == 1) + { + timepoint = "EndOfYear" + } + else if (referenz == 2) + { + timepoint = "EndOfMonth" + } + else if (referenz == 3) + { + timepoint = "EndOfQuarter" + } + else if (referenz == 4) //ToDo: Jederzeit -> Muss nochmal bedacht werden + { + d3.log.info("Der Zeitpunkt ist Jederzeit und wird in dieser Kuendigungsfrist anders verarbeitet.") + } + else if (referenz == 5) + { + if(DurationType == "Undetermined") + { + timepoint = "TargetDate" + } + else + { + timepoint = "EndOfContract" + } + } + else if (referenz == 6) + { + timepoint = "EndOfHalfYear" + } + + //Berechnung aus Count und CountUnit + def kuendigung_zum_tage = it.kuendigung_zum_tage + def kuendigung_zum_monate = it.kuendigung_zum_monate + def count = "" + def countUnit = "" + if(kuendigung_zum_tage == null && kuendigung_zum_monate != null) // Kuendigung in Monaten + { + count = kuendigung_zum_monate + countUnit = "Month" + } + else if(kuendigung_zum_tage != null && kuendigung_zum_monate == null) // Kuendigung in Tagen + { + count = kuendigung_zum_tage + countUnit = "Day" + } + else if(kuendigung_zum_tage != null && kuendigung_zum_monate != null) //Sonderfall: Sowohl Tage als auch Monate vorhanden + { + def day = kuendigung_zum_tage + def month = kuendigung_zum_monate + def monthInDays = 31 * month; + def newDays = day + monthInDays + d3.log.info("Umrechnung des Anzahl da sowohl in Monaten als auch Tagen gerechnet wurde. Vorher: Monate: $month -- Tage: $day || Nachher: Tage: $newDays") + count = newDays + countUnit = "Day" + } + else if(kuendigungsfrist == -1 && (it.kuendigungsdatum != null && it.kuendigungsdatum != "") && (it.vertragsende_datum != null && it.vertragsende_datum != "") ) + { + d3.log.info("Es wird eine Differenz Kuendigungsfrist gearbeitet") + SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS" ); + def kuenDatum = sdf.format( it.kuendigungsdatum ) ; + def VEndDatum = sdf.format(it.vertragsende_datum); + + try + { + Date kuenDatumPar = sdf.parse(kuenDatum); + Date VEndDatumPar = sdf.parse(VEndDatum); + + def differenceInDays = use(groovy.time.TimeCategory){ + def duration=(VEndDatumPar - kuenDatumPar).days; + return duration; + } + count = differenceInDays + countUnit = "Day" + } + catch(Exception ex) + { + d3.log.error("Fehler beim Berechnen der Differenz fuer die Frist.") + } + } + + + SimpleDateFormat sdfEndDay = new SimpleDateFormat( "yyyy-MM-dd'T'23:59:59.SSS'Z'" ); + sdfEndDay.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + + //Vertragsende pruefen + def end = sdfEndDay.format( it.naechstes_Vertragsende ); + + //Ueberpruefen + def reminderDate = "" + def deadline + if(status == "Aktiv") // Wenn der Vertrag Aktiv, aber gekuendigt ist, soll er nicht mehr benachrichtigen oder eskalieren. + { + if(it.naechstes_kuendigungsdatum != null ) + { + deadline = sdfEndDay.format( it.naechstes_kuendigungsdatum); + def naechstes_kuendigungsdatumFor = sdfEndDay.format( it.naechstes_kuendigungsdatum ); + reminderDate = dateCalculate(d3, naechstes_kuendigungsdatumFor, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -29) + } + else if(it.naechstes_Vertragsende != null && (it.KUENDIGUNGSDATUM == null || it.KUENDIGUNGSDATUM == "")) + { + deadline = sdfEndDay.format( it.naechstes_Vertragsende ); + int cur_count = count *-1 + if(countUnit == "Day") + { + reminderDate = dateCalculate(d3, end, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, cur_count) + } + else if(countUnit == "Month") + { + reminderDate = dateCalculate(d3, end, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.MONTH, cur_count) + } + } + else if(it.KUENDIGUNGSDATUM == null != null ) + { + deadline = sdfEndDay.format( it.KUENDIGUNGSDATUM ); + int cur_count = count *-1 + if(countUnit == "Day") + { + reminderDate = dateCalculate(d3, end, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, cur_count) + } + else if(countUnit == "Month") + { + reminderDate = dateCalculate(d3, end, "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.MONTH, cur_count) + } + } + } + if(timepoint == "TargetDate") + { + kuendigungFrist =""" {\"termType\":\"NOTICE\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"repetition\":\"Term\",$activeMinimumTermPhrase\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":true,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":$count,\"countUnit\":\"$countUnit\",\"timepoint\":\"TargetDate\",\"targetDateInitial\":\"$end\",\"rhythmCount\":0,\"targetDateCurrent\":\"$end\"},\"end\":{\"end\":\"$end\",\"deadline\":\"$deadline\"},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + return kuendigungFrist; + } + else + { + + kuendigungFrist =""" {\"termType\":\"NOTICE\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"repetition\":\"Term\",$activeMinimumTermPhrase\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"remindUser\":true,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":$count,\"countUnit\":\"$countUnit\",\"timepoint\":\"$timepoint\",\"rhythmCount\":0},\"end\":{\"end\":\"$end\",\"deadline\":\"$deadline\"},\"_links\":{\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + return kuendigungFrist; + } + } + + //Erzeugt einen JSON String, welcher zur Anlage einer Verlaengerungsfrist genutzt wird. + def defineExtendTerm(D3Interface d3, def it, String InternalNumber, def Responsibles, def DurationType, def ContractTyp, def status) + { + if(DurationType == "End_Date") // Befristete Vertrage -> somit sind alle Fristtypen erlaubt + { + def vertragsende_datum = it.vertragsende_datum + def naechstes_Vertragsende = it.naechstes_Vertragsende + def vertrag_Status = it.FK_REF_VERTRAGSSTATUS + + //Pruefung ob eine Verlängerungsfrist erstellt werden soll. Wenn der Vertrags noch aktiv ist soll eine Verlaengerung erstellt werden. + if(vertrag_Status == 1) + { + def verlaengerungsfristEnt = it.verlaengerung_jn + if(verlaengerungsfristEnt == -1) + { + def description = "Rollierende Verlängerung" + def renewalUnitCount + def renewalUnit + def repetition = "Rolling" + def autoExecution = true + def startpoint + def deadline + def reminderDate + def remindUser = true + + SimpleDateFormat sdfEndDay = new SimpleDateFormat( "yyyy-MM-dd'T'23:59:59.SSS'Z'" ); + sdfEndDay.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); + + // Wenn die Daten nicht gleich sind, wurde der Vertrag schon verlaengert und man muss das naechste Vertragsende als Vertragsende definieren. + if(vertragsende_datum != naechstes_Vertragsende ) + { + nextContractEnd = sdfEndDay.format( it.naechstes_Vertragsende ); + deadline = dateCalculate(d3, sdfEndDay.format( it.naechstes_Vertragsende ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -1) + // Wenn der Vertrag schon gekuendigt wurde, aber der Vertrag aktuell noch Bestand hat, muss eine Frist erstellt werden. Diese darf aber nicht erinnern. + if(status == "Aktiv") + { + reminderDate = dateCalculate(d3, sdfEndDay.format( it.naechstes_Vertragsende ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -29) + remindUser = false + } + def verlaengerung_Jahr = it.verlaengerung_jahre + def verlaengerung_Monate = it.verlaengerung_monate + if(verlaengerung_Jahr != null && verlaengerung_Monate == null) + { + renewalUnitCount = verlaengerung_Jahr + int removeTime = renewalUnitCount * -1 + renewalUnit = "Year" + startpoint = dateCalculate(d3, sdfEndDay.format( it.naechstes_Vertragsende ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.YEAR, removeTime); + } + else if(verlaengerung_Jahr == null && verlaengerung_Monate != null) + { + renewalUnitCount = verlaengerung_Monate + int removeTime = renewalUnitCount * -1 + renewalUnit = "Month" + startpoint = dateCalculate(d3, sdfEndDay.format( it.naechstes_Vertragsende ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.MONTH, removeTime); + } + } + else + { + nextContractEnd = sdfEndDay.format( it.vertragsende_datum ); + deadline = dateCalculate(d3, sdfEndDay.format( it.vertragsende_datum ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -1) + // Wenn der Vertrag schon gekuendigt wurde, aber der Vertrag aktuell noch Bestand hat, muss eine Frist erstellt werden. Diese darf aber nicht erinnern. + if(status == "Aktiv") + { + reminderDate = dateCalculate(d3, sdfEndDay.format( it.vertragsende_datum ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.DATE, -29) + remindUser = false + } + def verlaengerung_Jahr = it.verlaengerung_jahre + def verlaengerung_Monate = it.verlaengerung_monate + if(verlaengerung_Jahr != null && verlaengerung_Monate == null) + { + renewalUnitCount = verlaengerung_Jahr + int removeTime = renewalUnitCount * -1 + renewalUnit = "Year" + startpoint = dateCalculate(d3, sdfEndDay.format( it.vertragsende_datum ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.YEAR, removeTime); + } + else if(verlaengerung_Jahr == null && verlaengerung_Monate != null) + { + renewalUnitCount = verlaengerung_Monate + int removeTime = renewalUnitCount * -1 + renewalUnit = "Month" + startpoint = dateCalculate(d3, sdfEndDay.format( it.vertragsende_datum ), "yyyy-MM-dd'T'23:59:59.SSS'Z'", Calendar.MONTH, removeTime); + } + } + + // Es wird als Stichtag immer ein Tag vor Vertragende gewaehlt. + verlaengerungsfrist = """{\"termType\":\"RENEWAL\",\"timeZone\":\"Europe/Berlin\",\"description\":\"$description\",\"remindUser\":$remindUser,\"reminderUser\":[\"$Responsibles\"],\"reminderDate\":\"$reminderDate\",\"escalateOn\":\"\",\"interval\":{\"count\":1,\"countUnit\":\"Day\",\"timepoint\":\"EndOfContract\"},\"renewalUnitCount\":$renewalUnitCount,\"renewalUnit\":\"$renewalUnit\",\"end\":{\"deadline\":\"$deadline\",\"end\":\"$nextContractEnd\"},\"originalEndDate\":null,\"startTimepoint\":\"$startpoint\",\"caseOrContractType\":\"$ContractTyp\",\"docTypeId\":1,\"repetition\":\"$repetition\",\"autoExecute\":$autoExecution,\"numberOfExecutions\":0,\"_links\":{\"renewal\":{\"href\":\"/dbscase/rest/termsCallback/renew\"},\"reminder\":{\"href\":\"/dbscase/rest/termsCallback/reminder\"},\"escalation\":{\"href\":\"/dbscase/rest/termsCallback/escalation\"},\"updated_end\":{\"href\":\"/dbscase/rest/termsCallback/updated_end\"}},\"appId\":\"dbscase\",\"objectId\":\"$InternalNumber\"}""" + return verlaengerungsfrist; + } + else + { + d3.log.info("Es gibt keine Verlangerung die Angelegt werden konnte, da die Kombination der Fristdaten fachlich nicht korrekt ist.") + } + } + else + { + d3.log.warn("Es wird einen Verlaengerung angelegt. Das ursprüngliche Vertragsende entspricht nicht dem naechsten Vertragsende.") + } + } + } + + /* + * Addiert oder subtrahierte eine Anzahl von Tagen auf eine Datum drauf/ab. + */ + def dateCalculate(def d3, String dateString, String dateFormat, def einheit, int days) + { + d3.log.info("Start dateCalculate") + Calendar cal = Calendar.getInstance(); + SimpleDateFormat s = new SimpleDateFormat(dateFormat); + try + { + cal.setTime(s.parse(dateString)); + } + catch (Exception e) + { + d3.log.error("Fehler:" + e.printStackTrace()); + } + cal.add(einheit, days); + def retValue = s.format(cal.getTime()); + d3.log.info("Ende dateCalculate") + return retValue + } + + + def getContract (D3Interface d3) + { + d3.log.info("Start getContract"); + + def lDBUser = "US_DEVELOP_RO" + def lDBPasssword = "US_DEVELOP_RO" + def lSQLConnection; + + try + { + + lSQLConnection = Sql.newInstance( "jdbc:oracle:thin:@//olxdedevoradb01.dev.otc.hlg.de:1521/SD011A", lDBUser, lDBPasssword, "oracle.jdbc.driver.OracleDriver" ); + + String SQL_Statement = "SELECT V.ID, V.VT_NUMMER, V.BEZEICHNUNG, VL.VERTRAGSBEGINN, VL.befristet_jn, VL.vertragsende_datum, VL.naechstes_vertragsende, VL.KUENDIGUNGSDATUM, V.FK_REF_VERTRAGSSTATUS, V.FK_REF_VERTRAGSTYP, VAB.ABTEILUNG, VA.VERTRAGSART_0, DVA.FK_REF_ATT_KONZERNVERTR, DVA.FK_REF_ATT_L1, DVA.FK_REF_ATT_KONZERNVERRE, V.STANDARDVERTRAG_JN, DVA.FK_REF_ATT_HVDHAFTUNG_JN, DVA.HVDHAFT_TEXT, V.BEMERKUNG, V.ANGELEGTAM, V.VERTRAULICH_JN, DVA.TS1, DVA.AKTENZEICHEN, LISTAGG(VTP.FK_TBL_Person, '|') WITHIN GROUP (ORDER BY VTP.FK_REF_VP_FUNKTION) as PartnerNumbers, LISTAGG(VTP.FK_REF_VP_FUNKTION, '|') WITHIN GROUP (ORDER BY VTP.FK_REF_VP_FUNKTION) as PartnerRolle, VRE.FK_TBL_VERTRAG_RAHMEN, AOK.GEKUENDIGT_ZUM, VL.verlaengerung_jn, VL.BEMERKUNG AS FRISTBEMERKUNG FROM LCM.TBL_VERTRAG V FULL OUTER JOIN LCM.TBL_VERTRAG_LAUFZEIT VL ON V.ID = VL.FK_TBL_VERTRAG FULL OUTER JOIN LCM.REF_ABTEILUNG VAB ON V.FK_REF_ABTEILUNG = vab.id FULL OUTER JOIN LCM.REF_VERTRAGSART VA ON V.FK_REF_VERTRAGSART = va.id FULL OUTER JOIN LCMDESIGNER.tbl_vertrag_attribute DVA ON v.id = dva.fk_tbl_vertrag FULL OUTER JOIN LCM.tbl_vertrag_ansprech VAN on V.id = VAN.fk_tbl_vertrag FULL OUTER JOIN LCM.TBL_VERTRAG_PARTNER VTP on VTP.fk_tbl_Vertrag = v.id FULL OUTER JOIN LCM.TBL_VERTRAG_RAHMEN_EINZEL VRE ON V.ID = VRE.FK_TBL_VERTRAG_EINZEL FULL OUTER JOIN LCM.TBL_VERTRAG_AO_KUENDIGUNG AOK ON V.ID = AOK.fk_tbl_vertrag $SQLQueryFilter Group BY v.ID, V.VT_NUMMER, V.BEZEICHNUNG, VL.VERTRAGSBEGINN, VL.befristet_jn, VL.vertragsende_datum, VL.naechstes_vertragsende, VL.KUENDIGUNGSDATUM, V.FK_REF_VERTRAGSSTATUS, V.FK_REF_VERTRAGSTYP, VAB.ABTEILUNG, VA.VERTRAGSART_0, DVA.FK_REF_ATT_KONZERNVERTR, DVA.FK_REF_ATT_L1, DVA.FK_REF_ATT_KONZERNVERRE, V.STANDARDVERTRAG_JN, DVA.FK_REF_ATT_HVDHAFTUNG_JN, DVA.HVDHAFT_TEXT, V.BEMERKUNG, V.ANGELEGTAM, V.VERTRAULICH_JN, DVA.TS1, DVA.AKTENZEICHEN, VRE.FK_TBL_VERTRAG_RAHMEN, AOK.GEKUENDIGT_ZUM, VL.verlaengerung_jn, VL.BEMERKUNG Order by V.FK_REF_VERTRAGSTYP desc, v.id asc" + + lSQLConnection.eachRow(SQL_Statement) + { it -> + d3.log.info("--------------------------------------------"); + def ID_Number = it.ID; + def vertragsJson = defineJsonVertragObject(d3, it); + if(vertragsJson != null) + { + //d3.log.info("Aktuelles Json Vertrag Nummer: " + ID_Number + " JSON file:" + vertragsJson); + createContract (d3, ID_Number, vertragsJson); + } + else + { + d3.log.error("Fehler bei der Erstellung der Vertragsdaten für die Schnittstelle: $ID_Number") + } + } + + } + catch(Exception e) + { + d3.log.error("Fehler:" + e); + } + finally + { + if(lSQLConnection != null) + { + lSQLConnection.close(); + } + } + d3.log.info("Ende getContract"); + } + + def mapOrganisationUnit (def d3, def orgUnit) + { + if(orgUnit == "HG-SK (KAM, BS, CM)") + { + return "HG-SK"// pruef + } + else if(orgUnit == "HE-IT") + { + return "HE-IT" + } + else if(orgUnit == "HG-SK-SA (Regional Sales)") + { + return ""// fehlt + } + else if(orgUnit == "HG-RF (Real Estate & Facility Mgmt.)") + { + return "HG-RF"// pruef + } + else if(orgUnit == "HG-GAM Nord") + { + return "HG-GAM" + } + else if(orgUnit == "HG-FC (Finance & Controlling)") + { + return "HG-FC"// pruefen + } + else if(orgUnit == "HG-IT") + { + return "HG-IT"// pruefen + } + else if(orgUnit == "HG-CP (Central Procurement & Fleet Mgmt.)") + { + return "HG-CP" + } + else if(orgUnit == "HG-HL-SE (Corp. Security)") + { + return "HG-HL-SE"// pruef + } + else if(orgUnit == "HG-CE-MA (Marketing)") + { + return "HG-CE-MA"// pruefen + } + else if(orgUnit == "HG-OS (Operations Development)") + { + return ""// fehlt + } + else if(orgUnit == "pM – primeMail") + { + return ""// fehlt + } + else if(orgUnit == "HG Dummy") + { + return ""// fehlt + } + else if(orgUnit == "SCS (Suppliers)") + { + return ""// fehlt + } + else if(orgUnit == "HG-HL-HR (Human Resources)") + { + return "HG-HL-HR"// pruef + } + else if(orgUnit == "HG-GHV") + { + return ""// Fehlt + } + else if(orgUnit == "Hermes BorderGuru (HBG)") + { + return ""// Fehlt + } + else if(orgUnit == "HInt") + { + return "Hint"// pruef + } + else if(orgUnit == "Hermes AUT – Hermes Logistik") + { + return ""// fehlt + } + else if(orgUnit == "HTK – Hermes Technischer Kundendienst") + { + return ""// fehlt + } + else if(orgUnit == "HE-CO") + { + return "HE-CO"// pruef + } + else if(orgUnit == "HE-GM") + { + return ""// fehlt + } + else if(orgUnit == "HG-HL-CR (Compliance & Respons.)") + { + return ""// fehlt + } + else if(orgUnit == "HE-GHV") + { + return ""// fehlt + } + else if(orgUnit == "Otto") + { + return "Otto"// pruef + } + else if(orgUnit == "HG-SCS-DE (Supply Chain Solution / Germany)") + { + return ""// fehlt + } + else if(orgUnit == "HG-CS (Customer Service)") + { + return "HG-CS" + } + else if(orgUnit == "HG-SK-SM (SAM Konzern)") + { + return ""// fehlt + } + else if(orgUnit == "HG-CE-DS (Dig. Chann. & Services)") + { + return "HG-CE-DS"// pruefen + } + else if(orgUnit == "HG-SK-SM (SAM+Amazon)") + { + return ""// fehlt + } + else if(orgUnit == "2. HTS") + { + return ""// fehlt + } + else if(orgUnit == "HF – Hermes Fulfilment") + { + return ""// fehlt + } + else if(orgUnit == "HG-CO (Corp. Communications)") + { + return "HG-CO"// pruefen + } + else if(orgUnit == "HG-CE-PP (Product/Partnermgmt.)") + { + return ""// fehlt + } + else if(orgUnit == "HG-CE-PM (POS Mgmt.)") + { + return ""// fehlt + } + else if(orgUnit == "Legal - Musterverträge ") + { + return ""// fehlt + } + else if(orgUnit == "HG-HL-LE (Legal)") + { + return "HG-HL-LE"// pruef + } + else if(orgUnit == "LieferFactory GmbH") + { + return ""// fehlt + } + else if(orgUnit == "Hermes RUS - Hermes B2C Russia") + { + return ""// fehlt + } + else if(orgUnit == "HE-SI") + { + return ""// fehlt + } + else if(orgUnit == "Hermes MD") + { + return ""// fehlt + } + else if(orgUnit == "HG-SCS-BD (Business Development)") + { + return ""// fehlt + } + else if(orgUnit == "Hermes UK – Hermes Parcelnet") + { + return ""// fehlt + } + else if(orgUnit == "HG-SC (Strategy & Cons.)") + { + return "HG-SC"// pruef + } + else if(orgUnit == "Hermes ITA – Hermes ITALIA") + { + return ""// fehlt + } + else if(orgUnit == "HG-HL-LE-DP (Data Privacy)") + { + return "HG-HL-LE"// Pruefen + } + else if(orgUnit == "Zitra GmbH") + { + return ""// fehlt + } + else if(orgUnit == "HNT – Hermes NexTec") + { + return ""// fehlt + } + else if(orgUnit == "ParcelLock GmbH") + { + return ""// fehlt + } + else if(orgUnit == "HG-HL-IA (Internal Audit)") + { + return ""// fehlt + } + //Ab hier keine Eintraege als Altdaten vorhanden + else if(orgUnit == "Hermes NexTec LLC") + { + return ""// fehlt + } + else if(orgUnit == "HG Greater China") + { + return ""// fehlt + } + else if(orgUnit == "HG-GHV") + { + return ""// fehlt + } + else if(orgUnit == "HGS BVG") + { + return ""// fehlt + } + else if(orgUnit == "Prüfinstitut Hansecontrol GmbH") + { + return ""// fehlt + } + else if(orgUnit == "Send&Store GmbH") + { + return ""// fehlt + } + else + { + d3.log.error("Es konnte keine Organisationseinheit anhand der Daten des Altvertrags gefunden werden."); + return "" + } + } + + + def defineJsonVertragObject (D3Interface d3, def it ) + { + d3.log.info("Start defineJsonVertragObject: " + it.VT_NUMMER) + try + { + def jsonSlurper = new JsonSlurper() + + def Vertragsbezeichnung = it.BEZEICHNUNG; + if(Vertragsbezeichnung != null && Vertragsbezeichnung != "") + { + Vertragsbezeichnung = Vertragsbezeichnung.replaceAll('\n','|').replaceAll('\r','').replaceAll("\"","'").replaceAll('\t',''); + if(Vertragsbezeichnung.length() > 250) + { + d3.log.warn("Der Text in der Vertragsbezeichnung wird auf 250 zeichen gekürzt" ); + log("Der Text in der Vertragsbezeichnung wird auf 250 zeichen gekuerzt"); + Vertragsbezeichnung = Vertragsbezeichnung.take(250); + } + } + def LCM_Vertragsnummer = it.VT_NUMMER; + def Vertragstyp = "" + if(it.VERTRAGSART_0 == "" && it.VERTRAGSART_0 == null) + { + throw new Exception("Vertragstyp ist ein Pflichtfeld und darf nicht leer sein.") + } + else + { + if(it.VERTRAGSART_0 == "Gesellschaftsvertrag") + { + Vertragstyp = Gesellschaft; + d3.log.info("Der Vertragstyp wird von Gesellschaftsvertrag auf Gesellschaft geaendert.") + } + Vertragstyp = it.VERTRAGSART_0; + } + def vertragsstatus = it.FK_REF_VERTRAGSSTATUS; + + if(vertragsstatus == 1) + { + Vertragsstatus = "Aktiv"; + } + else if(vertragsstatus == 3) + { + Vertragsstatus = "beendet"; + } + else if(vertragsstatus == 1001) + { + Vertragsstatus = "Aktiv, aber gekündigt"; + } + else + { + throw new Exception("Vertragsstatus ist ein Pflichtfeld und darf nicht leer sein.") + } + + //Organisationseinheit = it.ABTEILUNG; + //TODO: Einmal einkommentieren + def mappedOrgValue = "HG-CE-IT"//mapOrganisationUnit (d3, it.ABTEILUNG); + def Organisationseinheit + if(mappedOrgValue != "") + { + Organisationseinheit = mappedOrgValue + } + else + { + Organisationseinheit = "LCM-Migration" // Fuer eine spaetere Bereinigung + } + + def allRecipientes = getResponsiblesForContract (d3, it.VT_NUMMER) + d3.log.info("Verantwortliche: " + allRecipientes); + def allRecipientesString + def allTechnicalRecipientesString = "" + def allRecipientesList = new ArrayList(); + + if(allRecipientes != "") + { + if(allRecipientes.contains("|")) + { + //mehrere Verantwortliche + def NameArray = allRecipientes?.tokenize( '|' ) + for(def currentName : NameArray) + { + //Fachlicher Ansprechpartner schreiben + if(allTechnicalRecipientesString == "") + { + if(currentName != "" && currentName != null) + { + allTechnicalRecipientesString = currentName + } + else + { + d3.log.warn("Der fachliche Verantwortliche wird nicht geschrieben, da der Name leer ist.") + } + } + else + { + if(currentName != "" && currentName != null) + { + allTechnicalRecipientesString = allTechnicalRecipientesString + "," + currentName ; + } + else + { + d3.log.warn("Der fachliche Verantwortliche wird nicht geschrieben, da der Name leer ist.") + } + } + //IDP User schreiben + def IDPId_User = getCurrentUser(d3, currentName); // Erste Pruefung anhand des Eintrags + if(IDPId_User != "" && IDPId_User != null) + { + if(IDP_User.contains(IDPId_User)) + { + if(!allRecipientesList.contains(IDPId_User)) + { + allRecipientesList.add(IDPId_User) + } + else + { + d3.log.info("Der Benutzer " + currentName + " ist als Empfaenger schon vorhanden. Jeder kann nur einmal Empfaenger sein.") + } + } + else + { + d3.log.warn("Der Benutzer " + currentName +" wurde gefunden, besitzt aber keine DCM Lizenz. Somit wird der Benuzter nicht gesetzt.") + } + } + else + { + d3.log.warn("Der Benutzer " + currentName + " wird nicht im d.3 Identity Provider gefunden.") + } + } + } + else + { + // nur ein Verantwortlicher + allTechnicalRecipientesString = allRecipientes; + def IDPId_User = getCurrentUser(d3, allRecipientes); // Erste Pruefung anhand des Eintrags + if(IDPId_User != "" && IDPId_User != null) + { + if(IDP_User.contains(IDPId_User)) + { + if(!allRecipientesList.contains(IDPId_User)) + { + allRecipientesList.add(IDPId_User) + } + else + { + d3.log.info("Der Benutzer " + allRecipientes + " ist als Empfaenger schon vorhanden. Jeder kann nur einmal Empfaenger sein.") + } + } + else + { + d3.log.warn("Der Benutzer " + allRecipientes +" wurde gefunden, besitzt aber keine DCM Lizenz. Somit wird der Benuzter nicht gesetzt.") + } + } + else + { + d3.log.warn("Der Benutzer " + allRecipientes + " wird nicht im d.3 Identity Provider gefunden.") + } + } + } + + if(allRecipientesList.size() <= 0 ) + { + d3.log.warn("Kein Vertragsverantwortlicher vorhanden. Es wird ein Verantwortlichen aus der Organistion gesetzt"); + def userNameFromJunction = getJunctionUser(d3, Organisationseinheit); + if(userNameFromJunction != "") + { + if(IDP_User.contains(userNameFromJunction)) + { + if(!allRecipientesList.contains(userNameFromJunction)) + { + allRecipientesList.add(userNameFromJunction) + } + else + { + d3.log.warn("Der Benutzer ist schon in der Empfaengerliste vorhanden. Dies kann an dem Verwenden eines Defaults liegen.") + } + } + else + { + d3.log.warn("Der Fallback Benutzer der Organisationseinheit" + Organisationseinheit + " wird nicht im d.3 Identity Provider gefunden.") + } + } + + //------------------------------------------------------------------------------ + if(allRecipientesList.size() <= 0 ) + { + d3.log.warn("Es konnte bisher aus den Vertragsverantwortlichen kein Benutzer identifiziert werden. Es wird nun ein Default Wert gesetzt."); + allRecipientesList.add(fallbackIDPUser) + } + } + + allRecipientesString = allRecipientesList.join(",") + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + def Vertragsverantwortlich = allRecipientesString + def FachlicherAnsprechpartner = allTechnicalRecipientesString; + + def PartnerId = "" + def PartnerRolle = "" + String oldPartnerNumber = it.PartnerNumbers; + d3.log.info("oldPartnerNumber: " + oldPartnerNumber) + String oldPartnerRolles = it.PartnerRolle; + d3.log.info("oldPartnerRolles: " + oldPartnerRolles) + + def PartnerNumberArray = oldPartnerNumber?.tokenize('|') + def PartnerRolleArray = oldPartnerRolles?.tokenize('|') + def setDefaultPartner = false + if(PartnerRolleArray == null || PartnerRolleArray == "" ) + { + setDefaultPartner = true + } + + int i = 0 + for(String currentPartnerNumber : PartnerNumberArray) + { + def createRole = true + def partnerRoll = "" + if(setDefaultPartner) + { + partnerRoll = "1003" + d3.log.error("Die Partnerrolle konnte nicht eindeutig ermittelt werden. Somit einmal den Partner " + currentPartnerNumber + " pruefen.") + log("Die Partnerrolle konnte nicht eindeutig ermittelt werden. Somit einmal den Partner " + currentPartnerNumber + " pruefen.") + } + else + { + partnerRoll = PartnerRolleArray[i]; + } + + d3.log.info("Aktuelle Partner Rolle: " + partnerRoll) + def currentPartnerRoll = "" + if(partnerRoll == "1002") + { + currentPartnerRoll = "Externer Partner" + } + else if(partnerRoll == "1003") + { + currentPartnerRoll = "Hermes-Vertragseigner" + } + d3.log.info("Uebersetze Partner Rolle: " + currentPartnerRoll) + if(currentPartnerNumber != null && currentPartnerNumber != "") + { + d3.log.info("Partnernummer zur Pruefung: " + currentPartnerNumber) + if(partnerMap.containsKey(currentPartnerNumber)) + { + PartnerData currentPartner = partnerMap.get(currentPartnerNumber) + + def partnerIDComarch = currentPartner*.getPartnerNumber(); + def LCM_NUMxy = currentPartner*.getLCMNumber(); + d3.log.info("partnerIDComarch aus Java Partner Object: " + partnerIDComarch + " LCM Nummer: " + LCM_NUMxy) + if(partnerIDComarch[0] != null && partnerIDComarch[0] != "" && partnerIDComarch[0] != "#NV (#NV)") + { + if(PartnerId == "") + { + PartnerId = partnerIDComarch[0] + } + else + { + PartnerId = PartnerId + "\",\"" + partnerIDComarch[0] + } + } + else + { + d3.log.warn("Es konnte kein Comarch Partner gefunden werden.") + def newD3PartnerID = createPartnerFolder(d3, currentPartner ) + if(newD3PartnerID != "" && newD3PartnerID != null) + { + if(PartnerId == "") + { + PartnerId = newD3PartnerID + } + else + { + PartnerId = PartnerId + "\",\"" + newD3PartnerID + } + + partnerMap.put(currentPartnerNumber, new PartnerData(newD3PartnerID, "" ,"", "" )) + } + else + { + d3.log.error("Es konnte kein d.3 Partner erstellt werden.") + } + } + } + else + { + d3.log.warn("Key $currentPartnerNumber nicht enthalten.") + createRole = false + log("Der Vertrag enthält einen Partner der im LCM nicht mehr vorhanden ist und somit nicht gemappt oder neu angelegt werden kann"); + } + } + if(createRole) + { + if(PartnerRolle == "") + { + PartnerRolle = currentPartnerRoll + } + else + { + PartnerRolle = PartnerRolle + "\",\"" + currentPartnerRoll + } + } + i++ + } + + def Ansprechpartner = "" + def Ablageort = it.TS1 == null ? "" : it.TS1; + def Vertragswert = "" // Kein Vertragswert + + String LCM_Rahmenvertragsnummer = it.FK_TBL_VERTRAG_RAHMEN + def Rahmenvertragsnummer = "" + if(LCM_Rahmenvertragsnummer != null && LCM_Rahmenvertragsnummer !="") + { + Rahmenvertragsnummer = getDCMRahmenvertragsnummer(d3, LCM_Rahmenvertragsnummer) + } + + def Bemerk = it.BEMERKUNG + if(Bemerk != null && Bemerk != "") + { + Bemerk = Bemerk.replaceAll('\n','|').replaceAll('\r','').replaceAll('\t','').replaceAll("\"","'").replaceAll(":","\\:"); + } + else + { + Bemerk = "" + } + def FristBemerkung = "Bemerkung der Fristen: " + if(it.FRISTBEMERKUNG != null && it.FRISTBEMERKUNG != "") + { + FristBemerkung = FristBemerkung + " " + it.FRISTBEMERKUNG + FristBemerkung = FristBemerkung.replaceAll('\n','|').replaceAll('\r','').replaceAll('\t','').replaceAll("\"","'").replaceAll(":","\\:"); + if(Bemerk != null && Bemerk != "") + { + Bemerk = Bemerk + " - " + FristBemerkung + } + else + { + Bemerk = FristBemerkung + } + } + + def ZusaetlicheErlaeuterung = Bemerk; + def Vertraulich = "" + def vertraulichkeitsstufe = it.VERTRAULICH_JN; + + if(vertraulichkeitsstufe == -1) + { + Vertraulich = "Ja"; + } + else if(vertraulichkeitsstufe == 0) + { + Vertraulich = "Nein"; + } + + def Standardvertrag = "" + def standardv = it.STANDARDVERTRAG_JN; + if(standardv == -1) + { + //Standardvertrag = "Ja, unverändert"; + Standardvertrag = "Ja"; + } + else if(standardv == 0) + { + Standardvertrag = "Nein"; + } + else if(standardv == null) + { + d3.log.warn("Standardvertrag war vorher leer-> Nein" ); + Standardvertrag = "Nein"; + } + + def Standardhaftung = "" + def stanHaft = it.FK_REF_ATT_HVDHAFTUNG_JN + if(stanHaft == 1000) + { + Standardhaftung = "Ja" + } + else if(stanHaft == 1001) + { + Standardhaftung = "Nein" + } + else if(stanHaft == 1002) + { + Standardhaftung = "Nicht relevant" + } + else if(stanHaft == null) + { + d3.log.info("Standardhaftung ist leer" ); + } + + def AbweichendeHaftungsvereinbarung = "" + def abweichende_haftungsver = it.HVDHAFT_TEXT; + if(abweichende_haftungsver != null && abweichende_haftungsver != "" ) + { + abweichende_haftungsver = abweichende_haftungsver.replaceAll('\n',' | ').replaceAll('\r',' ').replaceAll('\t','').replaceAll("\"","'").replaceAll(":","\\:"); + + if(abweichende_haftungsver.length() > 250) + { + d3.log.warn("Der Text in den abweichenden Haftungsvereinbarungen wird auf 250 zeichen gekürzt" ); + log("Der Text in den abweichenden Haftungsvereinbarungen wird auf 250 zeichen gekürzt"); + AbweichendeHaftungsvereinbarung = abweichende_haftungsver.take(245); + } + else + { + AbweichendeHaftungsvereinbarung = abweichende_haftungsver; + } + } + def Konzernvertrag = "" + def konzernv = it.FK_REF_ATT_KONZERNVERTR; + if(konzernv == 1000) + { + Konzernvertrag = "Ja" + } + else if(konzernv == 1001) + { + Konzernvertrag = "Nein" + } + else if(konzernv == null) + { + d3.log.warn("Konzernvertrag war vorher leer: Nein" ); + Konzernvertrag = "Nein" + } + + def Konzernverrechnung = "" + def konzernverr = it.FK_REF_ATT_KONZERNVERRE; + + if(konzernverr == 1000) + { + Konzernverrechnung = "Ja"; + } + else if(konzernverr == 1001) + { + Konzernverrechnung = "Nein"; + } + else if(konzernverr == null) + { + d3.log.warn("Konzernverrechnung war vorher leer->ddf8: Nein" ); + Konzernverrechnung = "Nein"; + } + + def aktenzeichen = it.AKTENZEICHEN == null ? "" : it.AKTENZEICHEN; + + def Dublette = "" + def dubl = it.FK_REF_ATT_L1; + if(dubl == 1000) + { + Dublette = "Ja" + } + else if(dubl == 1001) + { + Dublette = "Nein" + } + else if(dubl == null) + { + d3.log.warn("Dublette war vorher leer->ddf7: Nein" ); + Dublette = "Nein" + } + + + //Laufzeit + def checkLaufzeit = it.VERTRAGSBEGINN + def periodValue = "" + if(checkLaufzeit != null && checkLaufzeit != "") + { + //Definition welcher Laufzeittyp + d3.log.info("Definition der Laufzeiten" ); + SimpleDateFormat sdfStartDay = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ); + SimpleDateFormat sdfEndDay = new SimpleDateFormat( "yyyy-MM-dd'T'21:59:59.999'Z'" ); + SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ); + sdfStartDay.setTimeZone( TimeZone.getTimeZone( "Europe/Berlin+1" ) ); + + def Vertragsbeginn = sdfStartDay.format( it.VERTRAGSBEGINN ); + def Unterzeichnet = ""//sdf.format( it.ANGELEGTAM );Muss raus, da es hierbei falsche Werte inkl. unpassneder Interpretationen gibt. Somit besser leer + def Kuendigungsdatum = null + if(it.GEKUENDIGT_ZUM != null) + { + Kuendigungsdatum = sdf.format( it.GEKUENDIGT_ZUM ); + } + + //Wenn keine Verlaengerungsoption oder Prolongation vorhanden ist, soll trotzdem ein unbefristeter Vertrag gesetzt werden -> Das ist eine weitere Option und erweitert die bisherige Logik + def befristet = it.befristet_jn + def verlaengerungsoption = it.verlaengerung_jn + if(befristet == -1 || (befristet == 0 && ( it.vertragsende_datum != null || it.naechstes_vertragsende != null) && verlaengerungsoption == -1 )) + { + //urspruengliches Vertragsende + d3.log.info("Der Vertrag ist befristet") + def Vertragsende = "" + def n_Vertragsende = "" + if(it.vertragsende_datum != null && it.vertragsende_datum != "") + { + Vertragsende = sdfEndDay.format( it.vertragsende_datum ); + } + if(it.naechstes_vertragsende != null && it.naechstes_vertragsende != "") + { + n_Vertragsende = sdfEndDay.format( it.naechstes_vertragsende ); + } + + if(Vertragsende != "" && n_Vertragsende != "") + { + def dateTime1 = (Date)sdf.parse(Vertragsende); + def dateTime2 = (Date)sdf.parse(n_Vertragsende); + + if(Vertragsstatus == "Aktiv" && dateTime2 > dateTime1) + { + d3.log.warn("Das naechste Vertragsende $n_Vertragsende ist groesser als das Vertragsende. Somit wird das naechste Vertragsende gesetzt.") + Vertragsende = sdfEndDay.format( it.naechstes_vertragsende ); + } + else + { + d3.log.info("Das urspruengliche Vertragsende $Vertragsende wird gesetzt") + } + } + else if(Vertragsende == "" && n_Vertragsende != "") // Es ist aktuell nur ein neues Vertragsende gesetzt. Somit wird dieses zum Vertragende + { + d3.log.warn("Es ist nur das naechste Vertragsende $n_Vertragsende vorhanden. Somit wird dies als Vertragsende gesetzt.") + Vertragsende = sdfEndDay.format( it.naechstes_vertragsende ); + } + + if(Vertragsstatus != "Aktiv" && Kuendigungsdatum != null) + { + + periodValue = """\"timeZone\":\"Europe/Berlin\",\"durationType\":\"End_Date\",\"start\":\"$Vertragsbeginn\",\"signing\":\"$Unterzeichnet\",\"end\":\"$Vertragsende\",\"terminationDate\":\"$Kuendigungsdatum\",\"durationCount\":0,\"terminatedByUser\":null""" + } + else + { + periodValue = """\"timeZone\":\"Europe/Berlin\",\"durationType\":\"End_Date\",\"start\":\"$Vertragsbeginn\",\"signing\":\"$Unterzeichnet\",\"end\":\"$Vertragsende\",\"durationCount\":0""" + } + } + else if(befristet == 0) + { + d3.log.info("Der Vertrag ist unbefristet") + if(Vertragsstatus != "Aktiv" && Kuendigungsdatum != null) + { + + periodValue = """\"timeZone\":\"Europe/Berlin\",\"durationType\":\"Undetermined\",\"start\":\"$Vertragsbeginn\",\"signing\":\"$Unterzeichnet\",\"terminationDate\":\"$Kuendigungsdatum\",\"durationCount\":0,\"terminatedByUser\":null""" + } + else + { + periodValue = """\"timeZone\":\"Europe/Berlin\",\"durationType\":\"Undetermined\",\"start\":\"$Vertragsbeginn\",\"signing\":\"$Unterzeichnet\",\"durationCount\":0""" + } + } + else + { + d3.log.error("Es sind keine Informationen ($befristet) zu einer Befristung vorhanden. Somit kann keine Laufzeit erfasst werden."); + } + } + else + { + d3.log.info("Der Vertrag " + LCM_Vertragsnummer + " hat keine Laufzeitinformationen. Somit werden auch keine Fristen angelegt") + } + + def IsRahmenvertrag = "" + def typ = it.FK_REF_VERTRAGSTYP; + if(typ == 1) + { + IsRahmenvertrag = "" + } + else if(typ == 2) + { + IsRahmenvertrag = ",\"frame\":true" + } + + //Erstelltes Json zur Vertragsanlage + def jsonString = """{\"masterData\":{\"description\":\"$Vertragsbezeichnung\",\"externalNumber\":\"$LCM_Vertragsnummer\",\"type\":\"$Vertragstyp\",\"status\":\"$Vertragsstatus\",\"responsibles\":[\"$Vertragsverantwortlich\"],\"partnerIds\":[\"$PartnerId\"],\"roles\":[\"$PartnerRolle\"],\"contactPersons\":[\"$Ansprechpartner\"],\"contactPersons\":[null],\"orgaUnit\":\"$Organisationseinheit\",\"storageLocation\":\"$Ablageort\",\"contractValue\":\"$Vertragswert\",\"blanketAgreement\":\"$Rahmenvertragsnummer\" $IsRahmenvertrag},\"additionalExplanation\":{\"text\":\"$ZusaetlicheErlaeuterung\"},\"advMasterData\":{\"additionalSingleValueData\":{\"7\":\"$Dublette\",\"8\":\"$Konzernverrechnung\",\"10\":\"$AbweichendeHaftungsvereinbarung\",\"13\":\"$Vertraulich\",\"14\":\"$Konzernvertrag\",\"16\":\"$aktenzeichen\",\"17\":\"$Standardvertrag\",\"18\":\"$Standardhaftung\"},\"additionalMultiValueData\":{\"67\":[\"$FachlicherAnsprechpartner\"]}},\"period\":{$periodValue}}""" + + // Ende Mapping + def output = jsonSlurper.parseText(jsonString); + d3.log.info("Ende defineJsonVertragObject") + return jsonString; + } + catch(Exception e) + { + d3.log.error("Fehler beim Mapping: " + e) + return null; + } + return null; + } + + + + def getJunctionUser (D3Interface d3, def orgUnit) + { + switch(orgUnit) + { + case ("HG-CO-RN-HAM") : + return "862be782-6a87-4744-8aad-39e26ddabb7f" + break; + case ("HG-CO-RN-HAJ") : + return "32d53587-e712-479e-b25b-2ee8f8d48ebd" + break; + case ("HG-CO-RN-CGN") : + return "9bdcf060-4163-4dc5-917a-01ee73234f60" + break; + case ("HG-CO-RN-DN") : + return "526b2090-3cba-45a7-a051-4a5a34b65d5d" + break; + case ("HG-CO-RN-LP") : + return "22427e58-d6c6-4d93-b00c-0f06280013e8" + break; + case ("HG-CO-RO-BER") : + return "4164e368-76dd-4bde-a057-b0353e6d8ca5" + break; + case ("HG-CO-RO-KSF") : + return "985a91a1-9e06-457b-b9a7-cbb892c047db" + break; + case ("HG-CO-RO-LEJ") : + return "ad768a67-40f7-4d17-9f3c-97c690de2892" + break; + case ("HG-CO-RS-MNZ") : + return "a534ad43-2d60-4701-a3cd-1708c3f667b7" + break; + case ("HG-CO-RS-STR") : + return "27c952e4-3133-4e53-834b-3d4cf36f7e24" + break; + case ("HG-CO-RS-NUE") : + return "d798eb24-a0fd-4845-b64b-c77768c0aa51" + break; + case ("HG-CO-RS-MUC") : + return "2fd06165-1210-4314-b091-327fca671b98" + break; + case ("HG-CO-OC") : + return "526b2090-3cba-45a7-a051-4a5a34b65d5d" + break; + case ("HG-CS-SK-SM") : + return "aa59deae-fc48-4586-9d3e-65c8c0d1c5e0" + break; + case ("HG-CS-SK-KM") : + return "937d314f-ac45-4eb0-a90c-c872b39e6a90" + break; + case ("HG-CS-SK-CP") : + return "f27fba0c-acec-4d8a-8a08-2026cafe4cad" + break; + case ("HG-CS-SK-CX") : + return "aa59deae-fc48-4586-9d3e-65c8c0d1c5e0" + break; + case ("HG-CS-SK-CM") : + return "6907c7c1-c925-4bfc-94d2-65c8de214361" + break; + case ("HG-CS-CE-MA") : + return "1d3aab5d-8ec4-4eb4-b78a-1b131ca241dc" + break; + case ("HG-CS-CE-DS") : + return "d7e9f70a-8e8d-42f7-951d-cd9cf8cea118" + break; + case ("HG-CS-CE-PP") : + return "ccf4bd83-fffd-4732-acff-012f656cbb51" + break; + case ("HG-CS-CE-PM") : + return "05f37d5f-aa4e-4ab7-a6b3-add2db506cb4" + break; + case ("HG-CS-CE-LC") : + return "1d3aab5d-8ec4-4eb4-b78a-1b131ca241dc" + break; + case ("HG-CS-CC") : + return "543da15c-b8fe-47cc-8a04-3f11ef79c3ee" + break; + case ("HG-CS-CL") : + return "552653d5-36fb-4672-9617-06eda4b7f215" + break; + case ("HG-CS-SD") : + return "8dfb06c2-ca92-499d-a036-adb96cb1fa54" + break; + case ("HG-CF-CU") : + return "750580d3-7e8e-400f-a234-9cf168792ea1" + break; + case ("HG-CF-FC-GL ") : + return "2e330088-7ea7-4476-9ce4-45ecd15d37c7" + break; + case ("HG-CF-FC-SU") : + return "19834214-2177-4144-9e9c-ffdba6d6ce02" + break; + case ("HG-CF-FC-CC") : + return "e415b7cb-ca4d-47cb-81bb-2525ba1a3b09" + break; + case ("HG-CF-HL-HS") : + return "be9d6b45-61ef-46bf-8f1d-40481e016d43" + break; + case ("HG-CF-HL-LE-DP") : + return "563796d6-b15a-4568-88ca-87342fb75247" + break; + case ("HG-CF-HL-SE") : + return "41950f64-a3b2-4896-9590-4368913f29f8" + break; + case ("HG-CF-CP") : + return "4b94205a-f3ac-4341-96c9-866c8e97868c" + break; + case ("HG-CF-RF") : + return "a9666e7b-25c1-4584-ab28-cadd772ddef7" + break; + case ("HG-CF-ST") : + return "750580d3-7e8e-400f-a234-9cf168792ea1" + break; + case ("HG-CE-IT-CS") : + return "d98ebf9f-e30b-4e37-9aba-a5a7282a3a85" + break; + case ("HG-CE-IT-BI") : + return "7703506a-f988-4921-9d8d-97f4dac6a95d" + break; + case ("HG-CE-IT-SO") : + return "ce638d93-9e9a-47b9-bc62-5b090cf18311" + break; + case ("HG-CE-IT-GO") : + return "01130ca3-4c51-45e3-bf10-0eb917323a63" + break; + case ("HG-CE-IT-PS") : + return "5bc3455e-7c40-4e1a-b209-6335dac99d78" + break; + case ("HG-CE-IT-IB") : + return "f3c4e4c3-3c65-44f9-8905-4a93c785227a" + break; + case ("HG-CE-CO") : + return "275fcbd8-678e-47cd-ab19-5ccd4aa5590b" + break; + case ("HG-CE-SC") : + return "687c9ded-3854-4437-a6c7-83da3150a859" + break; + case ("HG-CO-TOM-LDD") : + return "7762e472-b3a0-4d93-9979-52624a53b91a" + break; + case ("HG-CO-TOM-ND") : + return "8156fabf-8fe9-4773-8a05-1f7b6be009ce" + break; + case ("HG-CO-TOM-QY") : + return "b3895d2a-555a-43d1-b7c6-f23601999fff" + break; + case ("HG-CO-TOM-LMD") : + return "559662d0-2fe2-443b-abd9-7d3477b73c0a" + break; + case ("HINT-HBG") : + return "d75c2d8c-b332-4f37-999a-d786d36c60f0" + break; + case ("HG-HINT-SCS") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HG-FC") : + return "e415b7cb-ca4d-47cb-81bb-2525ba1a3b09" + break; + case ("2. HTS") : + return "22427e58-d6c6-4d93-b00c-0f06280013e8" + break; + case ("H-AUT") : + return "d75c2d8c-b332-4f37-999a-d786d36c60f0" + break; + case ("HE") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HE-GHV") : + return "4f5d24bd-982d-4401-861d-b803e7aefcd8" + break; + case ("HE-GM") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HE-IT") : + return "4f5d24bd-982d-4401-861d-b803e7aefcd8" + break; + case ("Hermes Asia") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Hermes Italia") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Hermes MD") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Hermes Russia") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Hermes Shanghai") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Hermes UK, Parcelnet") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("HE-SI") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HF") : + return "3433ecab-e5b6-4af3-93a5-c50111862e84" + break; + case ("HG Dummy") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("HG Greater China") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("HG-GAM Nord") : + return "862be782-6a87-4744-8aad-39e26ddabb7f" + break; + case ("HG-GF-CEO") : + return "f453670f-5bce-4529-a6d6-3e617cad2d39" + break; + case ("HG-GF-CF") : + return "830296c8-394f-45c0-825a-817c5e27acbf" + break; + case ("HG-GF-CO") : + return "3e8ecf52-4d21-4973-99d9-34467437722a" + break; + case ("HG-GF-CS") : + return "82cd9354-e7c0-4389-ba2b-ce02c9194bcb" + break; + case ("HG-GF-HINT") : + return "d75c2d8c-b332-4f37-999a-d786d36c60f0" + break; + case ("HG-GHV") : + return "4f5d24bd-982d-4401-861d-b803e7aefcd8" + break; + case ("HG-OS (Operations Development)") : + return "559662d0-2fe2-443b-abd9-7d3477b73c0a" + break; + case ("HGS BVG") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("HG-SCS-BD (Business Development)") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HG-SCS-DE (Supply Chain Solution / Germany)") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HG-SK-SM (SAM+Amazon)") : + return "aa59deae-fc48-4586-9d3e-65c8c0d1c5e0" + break; + case ("HINT-HBG") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HINT-IT") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HINT-SCS") : + return "59d04ed9-18d8-4f3d-b17e-9e5cb7d58a15" + break; + case ("HNT") : + return "3433ecab-e5b6-4af3-93a5-c50111862e84" + break; + case ("HTK – Hermes Technischer Kundendienst ") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Legal - Musterverträge") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("LIEF") : + return "229e9ca8-3af6-42d0-b4a2-5488afd4ba27" + break; + case ("Otto") : + return "563796d6-b15a-4568-88ca-87342fb75247" + break; + case ("PL") : + return "3433ecab-e5b6-4af3-93a5-c50111862e84" + break; + case ("pM – primeMail") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Prüfinstitut Hansecontrol GmbH") : + return "3433ecab-e5b6-4af3-93a5-c50111862e84" + break; + case ("Send&Store GmbH") : + return "a4a6e8d3-1601-4cdb-97a7-1c731102a9bf" + break; + case ("Zitra GmbH") : + return "3433ecab-e5b6-4af3-93a5-c50111862e84" + break; + default: + d3.log.warn("Es konnte keine Organisationseinheit gefunden werden.") + return "" + break; + } + return ""; + } + + //Default Benutzer muss noch umgestellt werden. + def getCurrentUser (D3Interface d3, def name) + { + //Default IDP Id wenn es einen Benutzer in den Vertraegen gibt die nicht in der IDP gefunden werdne + def IDP_ID = "" + String API_KEY = "QkSq/0aXYN4/PUiLHrN/Rz7Q1TphBRO1z/khSj9dF/y4EVPcOdSiJc9Y1sdQ6er/YCFOUBC9VnFSJztr4RZSMQkqR4ccnXW8Q2jkSgsMxIQ=&_z_A0V5ayCSke2KhoCt7spaf51D1gKkv7GEL68yClMR1LitCKgBRs6h2IfHiGS9jcWUSClEjKReHWqw7IhHWUV8hewtyrYwk"; + String baseUrl = "https://d3.dev.otc.hlg.de"; + + try { + //Auslesen der IDP Benutzer IDs + //def displayname = userShouldChanged(d3, name) + def displayname = name + + def getUserIdUrl = new URL(baseUrl + "/identityprovider/scim/users?filter=DisplayName eq $displayname").openConnection(); + getUserIdUrl.setRequestProperty("Authorization", "Bearer " + API_KEY); + getUserIdUrl.setRequestProperty("Accept", "application/json"); + + int getRC = getUserIdUrl.getResponseCode(); + if(getRC == HttpURLConnection.HTTP_OK) + { + def response = getUserIdUrl.getInputStream().getText(); + JSONObject jObjectLinks = (JSONObject) JSONValue.parse(response); + IDP_ID = jObjectLinks.get("id"); + d3.log.info("IDP ID " + IDP_ID + " zu Name " + displayname + " ermittelt.") + } + }catch(Exception e) { + d3.log.error("###-> Returnwert Fehler Ermittlung IDPId " + e.getMessage()) + } + + return IDP_ID; + } + + /** Erstellt einen neuen d.3 Partner um diesen in d.cm zu verwenden. + * + */ + def createPartnerFolder(D3Interface d3, PartnerData currentPartner) + { + d3.log.info("Erstellung Vertragspartner in d.cm"); + + def newPartner = d3.archive.newDocument(); + newPartner.type = "A1LE4"; + newPartner.status = Document.DocStatus.DOC_STAT_RELEASE; + + //Generische Daten Dokumentarten + newPartner.field[2] = "" + newPartner.field[3] = "" + newPartner.field[4] = "" + newPartner.field[5] = "" + + def currentPartnerNumber = currentPartner*.getLCMName() + def partnerName = currentPartner.getLCMName(); + d3.log.info("currentPartnerNumber: " + currentPartnerNumber[0]); + def newPartnerNumber = (String) getNewPartnerNumber(d3); + while (newPartnerNumber.length() < 8) + { + newPartnerNumber = "0"+newPartnerNumber; + } + def newPartnerNumberWithPrafix = "DCM" + newPartnerNumber + //Partner ID + newPartner.field[6] = newPartnerNumberWithPrafix; + //Partner Name + newPartner.field[7] = currentPartnerNumber[0] + + //Ansprechpartner Liste + newPartner.field[60][1] = "" + //Vorgangstyp des Partners + newPartner.field[64][1] = "CONTRACT" + //E-Mail + newPartner.field[65][1] = "" + //Postanschrift + newPartner.field[66][1] = currentPartner.getPartnerAdress()[0]; + //Telefon + newPartner.field[67][1] = "" + + try + { + def generatedPartner = d3.archive.importDocument(newPartner); + return partnerName + " (" + newPartnerNumberWithPrafix + ")"; + } + catch(Exception ex) + { + d3.log.error("Fehler bei Partnererstellung: " +ex) + return "" + } + d3.log.info("Erstellung der Partnerakte abgeschlossen"); + } + + /* Holt eine Vertragsnummer intern eines Rahmenvertrags bei Anlage eines + * Einzelvertrags, sofern eine Verknuepfung zu einem Rahmenvertrag vorhanden + * ist. + */ + def getDCMRahmenvertragsnummer(D3Interface d3, String LCM_Rahmenvertragsnummer) + { + def LCM_Nummer = "LCM-" + LCM_Rahmenvertragsnummer + d3.log.info("Start getDCMRahmenvertragsnummer $LCM_Nummer") + String query = "SELECT dok_dat_feld_11 AS VertragsIntern FROM firmen_spezifisch WHERE kue_dokuart = ? AND dok_dat_feld_12 = ?"; + GroovyRowResult resultRow = d3.sql.firstRow(query, ["A1LE2", LCM_Nummer]); + d3.log.info("resultRow: " + resultRow) + int number = 0; + if(resultRow != null && resultRow.containsKey("VertragsIntern" ) && resultRow.getProperty("VertragsIntern") != null) { + String VertInt = resultRow.getProperty("VertragsIntern"); + return VertInt + } + + d3.log.info("Ende getDCMRahmenvertragsnummer") + return "" + } + + /** Funktion liesst eine bereitgestellte CSV Datei ein und setzt deren Werte formatiert in einer Map + * + */ + def readCSVPartnerFile(D3Interface d3) + { + def file = new File("D:\\d3\\d3server.prg\\ext_groovy\\Mapping_Partnerdaten.csv") + Map m1 = [:] + file.splitEachLine(";") {fields -> + //0 - LCM Nummer + //1 - Comarch Nummer + //2 - LCM Name + //3 - Comarch Name + //4 - LCM PLZ + //5 - LCM Ort + //6 - LCM Strasse + String name = fields[3] + name = name.replaceAll('\n','|').replaceAll('\r','').replaceAll("\"","'").replaceAll('\t',''); + String DCM_name = fields[2] + DCM_name = DCM_name.replaceAll('\n','|').replaceAll('\r','').replaceAll("\"","'").replaceAll('\t',''); + m1.put((String)fields[0], new PartnerData(name + " (" + fields[1] + ")", fields[6] + " , " + fields[4] + " " + fields[5] ,(String)fields[0], DCM_name )) + } + return m1 + } + + def getDCMJustifiedUsers(D3Interface d3) + { + d3.log.info("Start getDCMJustifiedUsers") + List IDP_IDs = new ArrayList(); + String query = "SELECT [id] FROM [dbsCase_idp_entities] WHERE id_type = 'USER'"; + def resultRows = d3.sql.executeAndGet( query ); + resultRows?.each{ IDP_IDs.add(it.id) } + d3.log.info("Ende getDCMJustifiedUsers") + return IDP_IDs + } + + + + def getNewPartnerNumber(D3Interface d3) + { + d3.log.info("Start getNewPartnerNumber") + def prefix = "DCM" + String query = "select max( dok_dat_feld_6 ) as docNumberCount from firmen_spezifisch where kue_dokuart = ? and (dok_dat_feld_6 like ?)"; + d3.log.info("query: " + query) + GroovyRowResult resultRow = d3.sql.firstRow(query, ["A1LE4", (prefix + "%")]); + d3.log.info("resultRow: " + resultRow) + int number = 0; + if(resultRow != null && resultRow.containsKey("docNumberCount" ) && resultRow.getProperty("docNumberCount") != null) { + Integer result = Integer.parseInt(resultRow.getProperty("docNumberCount").substring( prefix.length())); + d3.log.info("result: " + result) + number = result != null ? result : 0; + d3.log.info("number: " + number) + } + number++; + d3.log.info("Ende getNewPartnerNumber") + return number + } + + void logDefectTermsLCMNumber(String message) { + String messageWithTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(System.currentTimeMillis())) + " : ${message}" + if(!constanten.logFileDLCMNTerms.exists()) { + // check if directory exists + // check if directory "Log" exists + File logDir = new File(constanten.logDirPath) + if(!logDir.exists() || !logDir.isDirectory()) { + // create directory for log files + logDir.mkdirs() + } + + constanten.logFileDLCMNTerms.createNewFile() + } + constanten.logFileDLCMNTerms.append(message + "\n") + } + + void logDefectLCMNumber(String message) { + String messageWithTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(System.currentTimeMillis())) + " : ${message}" + if(!constanten.logFileDLCMN.exists()) { + // check if directory exists + // check if directory "Log" exists + File logDir = new File(constanten.logDirPath) + if(!logDir.exists() || !logDir.isDirectory()) { + // create directory for log files + logDir.mkdirs() + } + + constanten.logFileDLCMN.createNewFile() + } + constanten.logFileDLCMN.append(",'" + message + "'") + } + + + /** + * Function to log given message to log file and to console + * @param message + */ + void log(String message) { + String messageWithTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(System.currentTimeMillis())) + " : ${message}" + if(!constanten.logFile.exists()) { + // check if directory exists + // check if directory "Log" exists + File logDir = new File(constanten.logDirPath) + if(!logDir.exists() || !logDir.isDirectory()) { + // create directory for log files + logDir.mkdirs() + } + + constanten.logFile.createNewFile() + } + constanten.logFile.append(messageWithTimestamp + "\n") + } + diff --git a/Hermes/CMC/DeleteTermsContractsCaseManager.groovy b/Hermes/CMC/DeleteTermsContractsCaseManager.groovy new file mode 100644 index 0000000..4e9dd44 --- /dev/null +++ b/Hermes/CMC/DeleteTermsContractsCaseManager.groovy @@ -0,0 +1,353 @@ +import com.dvelop.d3.server.core.D3Interface +import com.dvelop.d3.server.exceptions.D3Exception +import com.google.gson.Gson +import groovy.json.JsonSlurper +import groovy.transform.Field +import org.apache.http.HttpEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpDelete +import org.apache.http.client.methods.HttpGet +import org.apache.http.client.methods.HttpPost +import org.apache.http.entity.StringEntity +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClientBuilder +import org.apache.http.util.EntityUtils +import java.nio.charset.StandardCharsets + +/* + * Dieses Skript loescht alle Fristen und Aufgaben fuer einen bestimmten Vertrag aus dem DBS Case Manager Contract. + * + * Erstellung: 12.2024 d.velop/mtiel + * Optimierung: 05.2025 + */ + +// Start of script +D3Interface d3 = getProperty("d3") as D3Interface +def scriptName = getClass().getName() +d3.log.info("groovyhook - START Script ${scriptName}") + + +// Konfiguration +def batchSize = 100 // Größe der Batches für SQL-Abfrage und Verarbeitung +def ddfIntContractNo = 11 // DB-Position der Eigenschaft interne Vertragsnummer + +def onlyTerms = false // Wenn nur die Fristen geloescht werden sollen, dann true setzen +def onlyTasks = false // Wenn nur die Aufgaben geloescht werden sollen, dann true setzen + +def logDirectory = new File("E:\\d3work\\LOGS\\LOG_$scriptName") // Bitte hier den Pfad zum Logverzeichnis eintragen + +@Field String baseUri = "https://d3dev.int.hlg.de" // Bitte hier die Basis URL eintragen +@Field String apiKey = "OJRD7qrEhuoIzM5Pt6M59qApakhyNrA/8My81PPx0/ULs+IisvBdZC6GnhcGTzKRwf4ndOtcsQmNby8YPa+D+mfUFsJGjkEsqhLX3h0N8sg=&_z_A0V5ayCRMk4iQs2RWKEDd9HrFriKdSm-G67jqTxNwqW1jZf2OP2l5b7LkBOKnISHL4YtCPCOz81OVhQgE0TQsWylfWnv1" +// Bitte in der oberen Zeile den API Key fuer den User (wie d3ddecsTaskAPIKey) zum Suchen und Loeschen von Aufgaben eintragen +// Ende Konfiguration + + +def today = new Date() +def formattedDate = today.format("yyyyMMdd") + +if (!logDirectory.exists()) { + logDirectory.mkdir() +} +@Field StringBuilder logBuilder = new StringBuilder() +def logFile = new File(logDirectory.path + "\\${formattedDate}_${System.currentTimeMillis()}_${scriptName}.txt") +logBuilder.append("Info:\t$scriptName - Logfile" + System.getProperty("line.separator")) + +def offset = 0 // Offset für die SQL-Abfrage (zur Batch-Verarbeitung) + +// Schleife zur Verarbeitung der SQL-Abfrage in Batches +while (true) { + def internalContractNumbers = d3.sql.executeAndGet(""" +WITH Vertragsnummern AS ( + SELECT DISTINCT t.object_id AS intContractNo + FROM terms_term t + WHERE NOT EXISTS ( + SELECT 1 FROM firmen_spezifisch f WHERE f.dok_dat_feld_$ddfIntContractNo = t.object_id + ) + UNION ALL + SELECT DISTINCT d.internal_contract_number AS intContractNo + FROM dbsCase_activity d + WHERE NOT EXISTS ( + SELECT 1 FROM firmen_spezifisch f WHERE f.dok_dat_feld_$ddfIntContractNo = d.internal_contract_number + ) +) +SELECT DISTINCT intContractNo +FROM Vertragsnummern +ORDER BY intContractNo +OFFSET ? ROWS FETCH NEXT ? ROWS ONLY +""", [offset, batchSize]) + + if (internalContractNumbers?.isEmpty()) { + break // Keine weiteren Daten vorhanden, Schleife beenden + } + + internalContractNumbers?.each { + def internalContractNo = it.intContractNo + + //Loeschen der Fristen fuer die Vertragsnummer + if (!onlyTasks) { + d3.log.info("groovyhook - Es sollen die Fristen fuer den Vertrag ${internalContractNo} geloescht werden!") + logBuilder.append("Info:\tEs sollen die Fristen fuer den Vertrag ${internalContractNo} geloescht werden!" + System.getProperty("line.separator")) + + def termIds = d3.sql.executeAndGet("SELECT DISTINCT id FROM terms_term WHERE object_id = ?", [internalContractNo]) + + if (!termIds || termIds.isEmpty()) { + d3.log.info("groovyhook - Keine Fristen fuer den Vertrag ${internalContractNo} gefunden.") + logBuilder.append("Info:\t\tKeine Fristen fuer den Vertrag ${internalContractNo} gefunden." + System.getProperty("line.separator")) + } else { + // Tabellen und Abhaengigkeiten + def termTables = ["terms_idp_ids" : "Term_id", + "terms_term_metadata": "Term_id", + "terms_term_rem_esc" : "term_id", + "terms_term_callback": "term_id", + "terms_term_links" : "Term_id", + "terms_term" : "id", + "terms_interval" : "id"] + + termIds."id"?.each { id -> + termTables.each { table, column -> + try { + def deleteQuery = "DELETE FROM ${table} WHERE ${column} = ?" + if (d3.sql.execute(deleteQuery, [id]) == 1) { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht." + System.getProperty("line.separator")) + } else { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} nicht gefunden.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} nicht gefunden." + System.getProperty("line.separator")) + } + } catch (D3Exception e) { + error = true + d3.log.error("groovyhook - Fehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}") + logBuilder.append("Error:\t\tFehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}" + System.getProperty("line.separator")) + + } + } + } + } + logBuilder.append("\t\t--------------------------------------------------------------------------------" + System.getProperty("line.separator")) + } + + + // Loeschen von Aufgaben fuer die Dokumenten ID + if (!onlyTerms) { + logBuilder.append("Info\tEs sollen die Aktivitaeten fuer den Vertrag ${internalContractNo} geloescht werden!" + System.getProperty("line.separator")) + + def activityIds = d3.sql.executeAndGet("SELECT DISTINCT id FROM terms_activity WHERE context_id = ?", [internalContractNo]) + + if (!activityIds || activityIds.isEmpty()) { + d3.log.info("groovyhook - Keine Aktivitaeten fuer den Vertrag ${internalContractNo} gefunden.") + logBuilder.append("Info:\t\tKeine Aktivitaeten fuer den Vertrag ${internalContractNo} gefunden." + System.getProperty("line.separator")) + } + + def activityTables = ["terms_activity_detail": "activity_id", + "terms_activity_data" : "id", + "terms_activity" : "id"] + + activityIds."id"?.each { id -> + activityTables.each { table, column -> + try { + def deleteQuery = "DELETE FROM ${table} WHERE ${column} = ?" + if (d3.sql.execute(deleteQuery, [id]) == 1) { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht." + System.getProperty("line.separator")) + } else { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} nicht gefunden.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} nicht gefunden." + System.getProperty("line.separator")) + } + } catch (D3Exception e) { + error = true + d3.log.error("groovyhook - Fehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}") + logBuilder.append("Error:\t\tFehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}" + System.getProperty("line.separator")) + + } + } + } + + logBuilder.append("\t\t--------------------------------------------------------------------------------" + System.getProperty("line.separator")) + + logBuilder.append("Info:\tEs sollen die Aufgaben fuer den Vertrag ${internalContractNo} geloescht werden!" + System.getProperty("line.separator")) + + def caseActivityIds = d3.sql.executeAndGet("SELECT DISTINCT act_id FROM dbsCase_activity WHERE internal_contract_number = ?", [internalContractNo]) + + def caseActivityTables = ["dbsCase_activity_recip": "activity_id", + "dbsCase_activity_cond" : "act_id", + "dbsCase_activity" : "act_id"] + + caseActivityIds."act_id"?.each { id -> + caseActivityTables.each { table, column -> + try { + def deleteQuery = "DELETE FROM ${table} WHERE ${column} = ?" + if (d3.sql.execute(deleteQuery, [id]) == 1) { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} erfolgreich geloescht." + System.getProperty("line.separator")) + } else { + if (table == "dbsCase_activity_cond") { + d3.log.debug("groovyhook - Es gibt keine Bedingungen für die CMC Aufgabe ${id}.") + logBuilder.append("Info:\t\tEs gibt keine Bedingungen für die CMC Aufgabe ${id}." + System.getProperty("line.separator")) + } else { + d3.log.debug("groovyhook - Eintrag aus Tabelle ${table} mit ID ${id} nicht gefunden.") + logBuilder.append("Info:\t\tEintrag aus Tabelle ${table} mit ID ${id} nicht gefunden." + System.getProperty("line.separator")) + } + } + } catch (D3Exception e) { + error = true + d3.log.error("groovyhook - Fehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}") + logBuilder.append("Error:\t\tFehler beim Loeschen der Eintraege aus Tabelle ${table} mit ID ${id}: ${e}" + System.getProperty("line.separator")) + + } + } + } + + def sessionApiKey = getAuthSession(d3) + + //Ermitteln der Task ID + def uriTaskSearch = "${baseUri}/task/api/tasks/search" + + CloseableHttpClient client = HttpClientBuilder.create().build() + + try { + HttpPost post = new HttpPost(uriTaskSearch) + + // JSON Inhalt + def body = """{ + "orderBy": "received", + "orderDir": "ASC", + "filter": { + "metadata": { + "key": [ + "internalCaseNumber" + ], + "values": [ + "$internalContractNo" + ] + } + } + }""" + StringEntity params = new StringEntity(body, "UTF-8") + + post.addHeader("authorization", "Bearer " + sessionApiKey) + post.addHeader("content-type", "application/json") + post.setEntity(params) + + CloseableHttpResponse response = client.execute(post) + + try { + if (response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 201) { + def js = new JsonSlurper() + def parsedJson = js.parseText(EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8)) + def taskIds = parsedJson.tasks?.id?.collect { it.toString() } + def taskSubjects = parsedJson.tasks?.subject?.collect { it.toString() } + if (!taskIds || taskIds.isEmpty()) { + d3.log.info("groovyhook - Es gibt keine Aufgaben zum Vertrag ${internalContractNo}") + logBuilder.append("Info:\t\tEs gibt keine Aufgaben zum Vertrag ${internalContractNo}" + System.getProperty("line.separator")) + } else { + for (def taskId : taskIds) { + for (def taskSubject : taskSubjects) { + d3.log.info("groovyhook - Task ID zum Vertrag ${internalContractNo}: ${taskId}") + logBuilder.append("Info:\t\tTask ID zum Vertrag ${internalContractNo}: ${taskId}" + System.getProperty("line.separator")) + + //Loeschen der Aufgabe + def uriTaskDelete = "${baseUri}/task/tasks/${taskId}" + + def delete = new HttpDelete(uriTaskDelete) + delete.addHeader("authorization", "Bearer " + sessionApiKey) + + response = client.execute(delete) + + try { + if (response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 201) { + d3.log.info("groovyhook - Task $taskSubject zum Vertrag ${internalContractNo} wurde erfoglreich geloescht") + logBuilder.append("Info:\t\tTask $taskSubject zum Vertrag ${internalContractNo} wurde erfoglreich geloescht" + System.getProperty("line.separator")) + } else if (!(response.getStatusLine().getStatusCode() == 404)) { + d3.log.error("groovyhook - Task $taskId zum Vertrag ${internalContractNo} mit Betreff $taskSubject konnte nicht geloescht werden: HTTP ${response.getStatusLine().getStatusCode()}") + logBuilder.append("Error:\t\tTask $taskId zum Vertrag ${internalContractNo} mit Betreff $taskSubject konnte nicht geloescht werden: HTTP ${response.getStatusLine().getStatusCode()}" + System.getProperty("line.separator")) + } + } catch (D3Exception e) { + d3.log.error("groovyhook - Fehler beim Ausführen von TaskDelete: ${e}") + logBuilder.append("Error:\t\tFehler beim Ausführen von TaskDelete: ${e}" + System.getProperty("line.separator")) + } + finally { + response.close() + } + } + } + } + } else { + d3.log.error("groovyhook - Task ID zum Vertrag ${internalContractNo} konnte nicht ermittelt werden: HTTP ${response.getStatusLine().getStatusCode()}") + logBuilder.append("Error:\t\tTask ID zum Vertrag ${internalContractNo} konnte nicht ermittelt werden: HTTP ${response.getStatusLine().getStatusCode()}" + System.getProperty("line.separator")) + } + } finally { + response.close() + } + } catch (D3Exception e) { + d3.log.error("groovyhook - Fehler beim Ausführen von TaskSearch: ${e}") + logBuilder.append("Error:\t\tFehler beim Ausführen von TaskSearch: ${e}" + System.getProperty("line.separator")) + } + logBuilder.append("\t\t--------------------------------------------------------------------------------" + System.getProperty("line.separator")) + } + } + + offset += batchSize // Offset für den nächsten Batch erhöhen +} + +d3.log.info("groovyhook - END Script ${scriptName}") +logBuilder.append("Info:\tEND Script ${scriptName}" + System.getProperty("line.separator")) + +logFile.write(logBuilder.toString()) + +def getAuthSession(D3Interface d3) { + + def lAuthSession = null + def lSessionExpire = null + + HashMap returnMap = doLogin(d3) + + if (returnMap != null) { + lAuthSession = returnMap.get("AuthSessionId") + lSessionExpire = returnMap.get("Expire") + } + + if (lAuthSession == null || lAuthSession == "") { + d3.log.error("groovyhook - Keine AuthSession erhalten!") + logBuilder.append("Error:\t\tKeine AuthSession erhalten!" + System.getProperty("line.separator")) + + } + + return lAuthSession +} + +def doLogin(D3Interface d3) { + HashMap returnMap = null + def loginStatusCode = 0 + + CloseableHttpClient client = HttpClientBuilder.create().build() + try { + HttpGet loginCall = new HttpGet(baseUri + "/identityprovider/login") + loginCall.addHeader("authorization", "Bearer " + apiKey) + loginCall.addHeader("origin", baseUri) + loginCall.addHeader("accept", "application/json") + loginCall.addHeader("charset", "utf-8") + + CloseableHttpResponse loginResponse = client.execute(loginCall) + try { + loginStatusCode = loginResponse.getStatusLine().getStatusCode() + + if (loginStatusCode == 200 || loginStatusCode == 201) { + HttpEntity entity = loginResponse.getEntity() + String json = EntityUtils.toString(entity, StandardCharsets.UTF_8) + Gson gson = new Gson() + returnMap = gson.fromJson(json, HashMap.class) + } else { + d3.log.error("Error ${loginStatusCode} waehrend des Logins!") + logBuilder.append("Error:\t\tError ${loginStatusCode} waehrend des Logins!" + System.getProperty("line.separator")) + } + } finally { + loginResponse.close() + } + } catch (Exception e) { + d3.log.error("groovyhook - Fehler waehrend des Logins: ${e}") + logBuilder.append("Error:\t\tFehler waehrend des Logins: ${e}" + System.getProperty("line.separator")) + } finally { + client.close() + } + return returnMap +} \ No newline at end of file