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