// -------------------------------------------------------------------------------------------------------- // Hooks.groovy // -------------------------------------------------------------------------------------------------------- // Historie: // 29.04.2019 imue/dvelop Initiale Umstellung einzelner Einstiegspunkte auf Groovy // // -------------------------------------------------------------------------------------------------------- import com.dvelop.d3.server.Document import com.dvelop.d3.server.DocumentType import com.dvelop.d3.server.Entrypoint import com.dvelop.d3.server.User import com.dvelop.d3.server.core.D3Interface import com.dvelop.d3.server.core.D3.Archive import groovy.sql.GroovyRowResult import java.sql.Timestamp; import java.text.SimpleDateFormat import com.dvelop.d3.server.PhysicalVersion import com.dvelop.d3.server.PhysicalVersion.FileLocalisation import com.dvelop.d3.server.UserOrUserGroup; public class Hooks { // global benötigte Arrays / Variablen List gAREGIChild // für Updateprozess: Da die Verknüpfung vor dem Exit Hook gelöst wird müssen die Children früher ermittelt werden /* * Dokumentanlage (ImportDocument) * beinhaltet: * + hook_hostimp_entry_10 (nicht in Nutzung) * + hook_insert_entry_10 (aktiv) * + hook_insert_entry_20 (aktiv seit Groovy) * + hook_insert_exit_10 (nicht in Nutzung seit Groovy, wird jetzt im insertEntry20 ausgeführt) * + hook_insert_exit_20 (aktiv) * + hook_insert_exit_30 (aktiv) */ @Entrypoint( entrypoint = "hook_insert_entry_10" ) public int insertEntry10_Kernprozess(D3Interface d3, User user, DocumentType docType, Document doc) { d3.log.info("insertEntry10All gestartet"); def lTextMig = doc.getText(4) def userName = "" if(user != null) { userName = user.id(); } // Validierung der Administrativen Akten if(docType.getId().equals(Const.gDTS_AAFOL) || docType.getId().equals(Const.gDTS_AZTXT)) { int resultValidate = Functions.validateAdminFolder(d3, doc, "INSERT") if(resultValidate == 1) { return -170 } } //Validieren der Prozessart Functions.validateProcess(d3, doc) //jleu 06.08.2020 - Mapping für Dateisystemablage über d.3one if(user != null && userName != null && !userName.equals("d3_async") && !userName.equals("hostimp")) { Functions.validateD3oneMapping(d3, doc); } if( lTextMig.equals("Migration") && ( user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) || userName.equals("d3_async") ) ) { // mache nix } else { d3.log.info("Start proc insertEntry10 - pUser = ${userName}, pDocTypeShort = ${docType.getId()}, text " + lTextMig) int lReturn def lReturn2 def lRetCode def lOppNR def lLength def lWhereClause = "" if( docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) { lReturn = Functions.validateWeitKundLiefNo(d3, doc, docType); if(lReturn != null && lReturn == -170) { return lReturn; } } if( docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DLONT) || docType.getId().equals(Const.gDTS_DKUMA) || docType.getId().equals(Const.gDTS_DERZ1) ) { def sqlStatement = "SELECT abteilung as lDep, benutzer_feld_2 as lBuKr FROM benutzer WHERE benutzername = '${userName}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if( sqlResult != null && sqlResult.size() > 0 ) { def lDep = sqlResult.getAt(0).get("lDep") def lBuKr = sqlResult.getAt(0).get("lBuKr") if( lDep != null ) { doc.field[Const.gDFF_ABTEILUNG] = lDep } if( lBuKr != null ) { doc.field[Const.gDDF_BUCHKREIS] = lBuKr } } } // 22.08.2016/phoer d-velop: Anpassung ausschließlich für das Q-System zur Einführung des SAP-Systemklon vom Produktivsystem if( docType.getId().equals(Const.gDTS_AREGI) && doc.getText(4).equals("SAP-Systemklon") ) { def lOppANNo = doc.field[Const.gDDF_OPPANNr] if( lOppANNo != null && !lOppANNo.substring(0,4).equals("Neue") && !lOppANNo.substring(0,4).equals("") ) { String[] splittedString = lOppANNo.split("\\.") doc.field[Const.gDDF_HAUPTOPPANNR] = splittedString[0] } else { d3.log.error("Bei der Akte handelt es sich um eine neue Angebotsversion und diese kann nicht zugeordnet werden") } } if( docType.getId().equals(Const.gDTS_APROJ) ) { //Setze die nächste freie Projektnummer für Organisationsprojekte Functions.setNextProjnr(d3, doc, Const.gDDF_PROJNR, 3, "INSERT") //Vorbelegung des Prozesses und der Prozessgruppe anhand der Projektart doc.field[Const.gDDF_PROZESS] = "010301" //Setzen des Attributs Hauptprojekt mit der Projektnummer ohne Suffix def lProjNr = doc.field[Const.gDDF_PROJNR].substring(0,11) doc.field[Const.gDDF_HAUPTPROJEKT] = lProjNr } if( docType.getId().equals(Const.gDTS_DKUKO) ) { String lKukoID = doc.field[Const.gDDF_KONTAKTNUMMER] if(lKukoID != null) { String[] splittedStringKuko = lKukoID.split("\\|"); if(splittedStringKuko != null && splittedStringKuko.size() > 1) { lKukoID = splittedStringKuko[2]; if(lKukoID != null) { doc.field[Const.gDDF_KONTAKTNUMMER] = lKukoID; } } def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_BUCHKREIS} as lBuchkrDKUKO " + "FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${lKukoID}' " + "AND kue_dokuart = '${Const.gDTS_AKONT}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if(sqlResult != null && sqlResult.size() > 0) { def lBuchkrDKUKO = sqlResult.getAt(0).get("lBuchkrDKUKO") doc.field[Const.gDDF_BUCHKREIS] = lBuchkrDKUKO } } } // Splitten des zusammengesetzten Strings Projektnr, Projektname nach Projektnummer für das Feld Projektnummer ==> Organisationsprojektdokumente if( docType.getId().equals(Const.gDTS_AMEIS) || docType.getId().equals(Const.gDTS_DPROO) || docType.getId().equals(Const.gDTS_APROJ) ) { def returnSplitProjekt = Functions.splitProjekt(d3, doc, docType, user, "INSERT"); if (docType.getId().equals(Const.gDTS_DPROO)) { def returngetOrgUn = Functions.getOrgUnitByID(d3, doc, docType) } } // 21.10.2019 Auslagerung des Splits für Eigenschaft Opportunitynummer, Hauptopportunity, Submission in die Functions def returnSplitOppSub = Functions.splitOpportunitySubmission(d3, doc, docType); // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_ASERE) ) { Functions.splitServSrId(d3, doc, docType); int resultCheckSrId = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereSRIDID); if(resultCheckSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "SR_ID in Zeile ${resultCheckSrId} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "SR_ID in line ${resultCheckSrId} exists multiple") } return -170; } int resultValidateSrId = Functions.validateSrId(d3, doc); if(resultValidateSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere SR_ID in Zeile ${resultValidateSrId} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further SR_ID in line ${resultValidateSrId} ") } return -170; } } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) ) { Functions.splitServBelegnummer(d3, doc, docType); int resultCheckBelegNr = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } int resultValidateBelegNr = Functions.validateBelegNr(d3, doc); if(resultValidateBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere Belegnummer in Zeile ${resultValidateBelegNr} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further actitivy no in line ${resultValidateBelegNr} ") } return -170 } if( doc.field[Const.gDDF_BELEGTYP] == null ) { String belegNrTemp = doc.field[Const.gDDF_BELEGNUMMER]; String sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as belegTyp FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${belegNrTemp}' " + "AND kue_dokuart = '${Const.gDTS_ASEBE}' "; List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null && sqlResult.size() > 0) { String lBelegTyp = sqlResult.getAt(0).get("belegTyp"); if( lBelegTyp != null && !lBelegTyp.equals("") && docType.getId().equals(Const.gDTS_DSEBE) ) { doc.field[Const.gDDF_BELEGTYP] = lBelegTyp; } } } } // imue: Validierung doppelter Einträge für weitere Belegnummer Einkauf if( docType.getId().equals(Const.gDTS_DEINK) ) { int resultCheckBelegNr = Functions.checkPurchaseNr(d3, doc, SystemSpecificConst.gWeitereEinkaufBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } } // imue: Validierung der Belegart für den Service if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegNrID) && Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegArtID)) { Functions.validateBelegart(d3, doc); } // imue: Validierung der Belegart für den Einkauf if(Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEinkaufsBelegNrID)) { Functions.validateBelegart(d3, doc); } // imue 26.08.2020 - Ergänzung für Equipment if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "INSERT"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, true); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment Zeile ${resultValidateEquipment} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further equipment in line ${resultValidateEquipment} ") } return -170; } } if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "INSERT"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, false); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipment") } return -170; } } // imue 12.12.2022 if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentsID) == true ) { Functions.splitEquipments(d3, doc, docType); int resultValidateEquipment = Functions.validateEquipments(d3, doc, user); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipments prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipments") } return -170; } } // 21.10.2019 Auslagerung des Splits für Eigenschaft Projektnummer in die Functions def returnSplitProjnr = Functions.splitProjektnummer(d3, doc, docType); // 21.10.2019 Auslagerung des Splits für Eigenschaft Opportunity-Nummern (Mehrfachfeld) in die Functions def returnSplitOppoMehr = Functions.splitOpportunityMehrf(d3, doc, docType) if(returnSplitOppoMehr == -170) { return -170 } // Prüfung der Kommunikationsrichtung bei Ablage über Outlook int returnValueMailProperties = Functions.checkMailProperties(d3, doc, docType); // phoer 20170803: Geändert, Ergebnisdokument wird nur auf "Nein" gesetzt, wenn es beim Import leer ist if( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gErgebnisDokID) && doc.field[Const.gDDF_ERGEBNISDOK] == null ) { doc.field[Const.gDDF_ERGEBNISDOK] = "Nein" } // Wenn es sich um ein Ergebnisdokument handelt und ein Angebotsdokument ist, muss die übergeordnete Angebotsversion "in Arbeit" sein. if( docType.getId().equals(Const.gDTS_DOPPD) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && doc.field[Const.gDDF_ARCDOCID] == null ) { lReturn = Functions.validateErgebnisdokumenteAngebot(d3, doc, user); if(lReturn == -170) { return -170; } } // 21.10.2019 Auslagerung des Splits für Eigenschaft Lieferantenname, Lieferantennummer in die Functions if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gLieferantNrID)) { def returnSplitLieferant = Functions.splitLieferant(d3, doc, docType, user, "insert", null); if(returnSplitLieferant == -170) { return -170 } } if( ( docType.getId().equals(Const.gDTS_DKUKO) && doc.field[Const.gDDF_KNR] != null ) || docType.getId().equals(Const.gDTS_DKUMA) || docType.getId().equals(Const.gDTS_AKUMA) || docType.getId().equals(Const.gDTS_ASERE) || docType.getId().equals(Const.gDTS_ASEBE) ) { int returnValidateKunden = Functions.validateKunden(d3, doc, docType, user, "insert") if(returnValidateKunden == -170) { return -170 } } // Lieferantenaktivitätsdokuemnte if( docType.getId().equals(Const.gDTS_DLONT) ) { def returnSplitKundenkontaktbe = Functions.splitLieferantenkontaktbeschreibung(d3, doc, docType); if( returnSplitKundenkontaktbe == -170) { return -170 } } // dkle, 01.02.2016 - Ausschluß des Benutzers hostimp entfernt, statt dessen : Systemuser für Benutzer ohne Abteilung eingeführt if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAbteilungOrgID)) { def userDepartment = user.getDepartment() if( userDepartment != null ) { doc.field[Const.gDFF_ABTEILUNG] = userDepartment // d3.log.info("Abteilung = " + userDepartment) } else { if(docType != null && docType.id().equals(Const.gDTS_DBAUD)) { // Dokumentart "Baudokumente" erlaubt keine zusätzlichen Eingaben zur Wertemenge. Daher darf nur Part 1 erfolgen! } else { String userNameTemp = "${userName}: Systemuser"; doc.field[Const.gDFF_ABTEILUNG] = userNameTemp; } // d3.log.errpr("Der Benutzerkontext für die Vergabe des Attributs Abteilung konnte nicht geladen werden!") } } // Insert Entry: Vererbung der Verkaufsphase auf die Dokumente einer Opportunity beim Import // es handelt sich dabei um ein SQL Statement if( docType.getId().equals(Const.gDTS_DOPPD) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DVERD) ) { Functions.inheritSalesProcess(d3, doc) } // Ermittlung des Buchungskreises anhand Opportunity_Nr, Projekt_Nr oder Kundenkontakt_ID // 19.02.2020 Für Service Ermittlung über SR_ID oder Belegnummer // 31.08.2020 Für Equipment Ermittlung über Equipment Nummer if( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBuchungskreisID) || Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBuchungskreiseID) ) { Functions.validateBuchungskreisInsert(d3, doc, docType); } // Angebotsdokumente: Angebot_Nr in den Zusatztitel einfügen, wenn die Angebot_Nr nicht "Neue" oder "9999" ist if( docType.getId().equals(Const.gDTS_DOPPD) ) { Functions.setAdditionalTitle(d3, doc); } // Splitten der Kundenaktivitäts-ID beim Import | Wenn mit Termin und Beschreibung gearbeitet wird, ergänze ggf. die ID if( docType.getId().equals(Const.gDTS_DKUKO) ) { lReturn = Functions.validateKuKoID( d3, doc, user, "Insert" ); if( lReturn == -170 ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT014049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT014001) } d3.log.error( "Bitte geben Sie eine gueltige Kundenkontakt-ID ein." ) return -170 } } //Wenn weder eine Auftrags- noch eine Opportunity-Nr. eingetragen wird, verhindere die Ablage if( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gOpportunityNrID) && Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gProjektNrID) ) { def lReturnString = Functions.validateOppProjNr( d3, doc ) if( lReturnString.equals("WITHOUTPROJOPP") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT012049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT012001) } d3.log.error( "Sie versuchen ein Dokument zu importieren, ohne entweder eine Projekt- oder eine Opportunitynummer eingetragen zu haben. Bitte korrigieren Sie Ihre Eingabe." ) return -170 } else if( lReturnString.equals("PROJOPP") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT013049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT013001) } d3.log.error( "Sie versuchen ein Dokument zu importieren, und haben sowohl eine Projekt- als auch eine Opportunitynummer eingetragen. Bitte korrigieren Sie Ihre Eingabe." ) return -170 } } //Maschinenprojekt Prototyp 4: Wenn beim Import die Dokumentgruppe Medien gewählt wurde, aber das Feld Akte leer ist, gib einen Fehler aus //Schlüsselumstellung "Medien" -> DG074 if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) && doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && doc.field[Const.gDDF_SUBJECT] == null ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT015049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT015001) } d3.log.error( "Sie versuchen ein Dokument mit der Dokumentgruppe Medien abzulegen, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe" ) return -170 } else if ( docType.getId().equals(Const.gDTS_DPRST) && doc.field[Const.gDDF_SUBJECT].equals(Const.gAK_Projektorganisation) ) { doc.field[Const.gDDF_SUBJECT] = "" } // Anpassung Maschinenprojekt, bei der Ablage einer Unterakte ECR soll das Feld ECR-Status auf "neu" und im Feld Sortierreihenfolge der Wert "32" gesetzt werden if( docType.getId().equals(Const.gDTS_AMECR) && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) ) { doc.field[Const.gDDF_ECRSTATUS] = "neu" doc.field[Const.gDDF_SORTIERUNG] = "32" // 05.07.2021 imue: Wenn ein Anwender auf eine bestehende Unterakte ECR/ChangeOrder Akte kliegt und Neue Akte unterhalb anlegt, werden fälschlicherweise Eigenschaften übernommen und müssen daher geleert werden if(doc.field[Const.gDDF_REFERENZNR] != null) { doc.field[Const.gDDF_REFERENZNR] = null; } if(doc.field[Const.gDDF_REFERENZOBJ] != null) { doc.field[Const.gDDF_REFERENZOBJ] = null; } // Bei einer neuen ECR: ECR Aktivitäts_ID für diese Projekt_Nr ermitteln -- "Neuer ECR >höchste Nummer für dieses Projekt< :lDateTime" // if( dok_dat_feld[gDDF_AKTIVITAETSID] == "" || dok_dat_feld[gDDF_AKTIVITAETSID] == "0000000000" ) Functions.fillActivityId(d3, doc) } // 30.08.2016 dkle: Plausibilitätsprüfung/Ermittlung Projekt_Nr, Aktivitäts-ID und Beschreibung ECR Dokumente und Unterakte ECR // Split der ECR Aktivitäts_ID und ECR Beschreibung, führend ist die ECR Aktivitäts_ID // SQL Abfrage an die Unterakte ECR, anhand Projekt_Nr und ECR Aktivitäts_ID def invalidData = 0 if( docType.getId().equals(Const.gDTS_DMECR) && doc.field[Const.gDDF_AUFTRNR] != null ) { // Split Aktivitäts-ID und Beschreibung, sowie Überprüfung der Daten invalidData = Functions.validateActivity( d3, doc, "Insert" ) } else if( docType.getId().equals(Const.gDTS_DMECR) && ( doc.field[Const.gDDF_AKTIVITAETSID] != null || doc.field[Const.gDDF_BESCHREIBUNG] != null ) && doc.field[Const.gDDF_AUFTRNR] == null ) { invalidData = 2 } if( docType.getId().equals(Const.gDTS_DMECR) && invalidData == 1 ) { // Meldung an den Benutzer, dass die Projektnummer gefüllt werden muss if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT002049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT002001) } d3.log.error( Const.gADITXT002049 ) return -170 } else if( docType.getId().equals(Const.gDTS_DMECR) && invalidData == 2 ) { // Meldung an den Benutzer, dass die Projektnummer gefüllt werden muss if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT001049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT001001) } d3.log.error( Const.gADITXT001049 ) return -170 } // PSP-Element, Netzplan_Nr und Projekt_Nr auf Plausibilität prüfen und ergänzen if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIKO) ) && doc.field[Const.gDDF_AUFTRNR] != null ) { invalidData = 0 invalidData = Functions.validateNetzPSP( d3, doc ) if( invalidData != 0 ) { return -170 } } // ECR-Dokumente und Ergebnisdokument dürfen nicht in genehmigte ECRs importiert werden. if( docType.getId().equals(Const.gDTS_DMECR) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && doc.field[Const.gDDF_ARCDOCID] == null ) { int resultvalidateErgebnisdokumente = Functions.validateErgebnisdokumenteECR(d3, doc, user); if(resultvalidateErgebnisdokumente == -170) { return -170 } } int returnvalueMM = Functions.validateMustermaterialNr(d3, doc, null, docType, "Insert") if(returnvalueMM == -170) { return -170; } // Split Attribut Funktion bei Technikdokumenten im Import if( docType.getId().equals(Const.gDTS_DMDOK) && doc.field[Const.gDDF_FUNKTION] != null ) { String lReturnString = Functions.splitFunction( d3, doc, docType.getId() ) if( lReturnString.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT005049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT005001) } d3.log.error( "Bitte waehlen Sie eine gültige Funktion aus." ) return -170 } } // Split Attribut Modul bei Technikdokumenten im Import if( docType.getId().equals(Const.gDTS_DMDOK) && doc.field[Const.gDDF_MODUL] != null ) { String lReturnString = Functions.splitModule( d3, doc, docType.getId() ) if( lReturnString.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT006049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT006001) } d3.log.error( "Bitte waehlen Sie eine gültige Modulnummer aus." ) return -170 } } // Prüfung des ausgewählten Lieferanten bei der Ablage if( !userName.equals("d3_async") && !userName.equals("hostimp") && ( docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_ALONT) || docType.getId().equals(Const.gDTS_DLIMA) ) ) { String lReturnString = Functions.validateLiefName( d3, doc, "Insert" ) if( lReturnString.equals("OK") ) { // Es handelt sich um einen validen Wert } else if( lReturnString.equals("Fehler") ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT016049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT016001) } d3.log.error( "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." ) return -170 } } // imue 12.06.2019 - Prüfung das bei Anlage einer Lieferantenaktivität ALONT die Akte in Kombiniation Beschreibung, Termin und Kategorie nicht bereits existiert if( docType.getId().equals(Const.gDTS_ALONT) ) { def docIdAlont def docIdsAlontCount def sqlStatement = "SELECT doku_id as docIdAlont " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_ALONT}' " + "AND dok_dat_feld_${Const.gDDF_LNR} = '${doc.field[Const.gDDF_LNR]}' " + "AND dok_dat_feld_${Const.gDDF_KONTAKTBESCH} = '${doc.field[Const.gDDF_KONTAKTBESCH]}' " + "AND dok_dat_feld_${Const.gDDF_LIEFAKTKAT} = '${doc.field[Const.gDDF_LIEFAKTKAT]}' " + "AND dok_dat_feld_${Const.gDDF_KONTAKTDATE} = '${doc.field[Const.gDDF_KONTAKTDATE]}' " List sqlResult = d3.sql.executeAndGet(sqlStatement); docIdsAlontCount = sqlResult.size() if( sqlResult != null && docIdsAlontCount > 0 ) { docIdAlont = sqlResult.getAt(0).get("docIdAlont") d3.log.error("Akte darf NICHT angelegt werden") if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Die Akte existiert bereits mit der Dokument-ID ${docIdAlont}") } else { d3.hook.setProperty("additional_info_text", "The file already exists with Document-ID ${docIdAlont}") } return -170 } else { // Alles in Ordnung - Akte exisitert noch nicht } } // 17.01.2023 - Neue Validierung der Materialnummer if(doc.getType().getId().equals(Const.gDTS_DMATE) && doc.field[Const.gDDF_MATERIALNUMMER] != null) { String returnValueMatNo = Functions.validateMaterialNum(d3, doc); if(returnValueMatNo != null && returnValueMatNo.equals("ERROR")) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte geben Sie eine Material_Nr ein, zu der bereits eine Materialakte existiert."); } else { d3.hook.setProperty("additional_info_text", "Please enter a material no. for which a mertial file already exists."); } return -170; } } d3.log.info("Ende proc insertEntry10_Kernprozess - pUser = ${userName}, pDocTypeShort = ${docType.getId()}") } return 0; } // 16.12.2019 imue - Doppelte Registrierung möglich @Entrypoint( entrypoint = "hook_insert_entry_10" ) public int insertEntry10_UnterProzess(D3Interface d3, User user, DocumentType docType, Document doc) { def lTextMig = doc.getText(4) d3.log.info("insertEntry10_UnterProzess gestartet"); //Validieren der Prozessart Functions.validateProcess(d3, doc) if( lTextMig.equals("Migration") && ( user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) || user.id().equals("d3_async") ) ) { // mache nix } else { //Alle Dokumente, die über d.3one abgelegt werden, im Status Fr importieren // 31.07.2017 Durch Attributmapping noch notwendig if( user != null && !user.id().equals("d3_async") && !user.id().equals("hostimp") && !user.id().equals("Master") ) { try { if( d3.remote.getVersion()[0..2].equals(SystemSpecificConst.gApp_D3one) ) { doc.setStatus("Freigabe") } } catch(Exception e) { d3.log.error("insertEntry10_UnterProzess Ermittlung getVersion() schlug fehl - " + e); } } //jleu 21.05.2021 ITSM Dokumente if( docType.getId().equals(Const.gDTS_DITSM) ) { def RetVal = Functions.checkITSMNumber(d3, doc) if (RetVal == 10) { // Meldung an den Benutzer, dass eine unbekannte ITSM ID verwendet wird if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT025049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT025001) } return -170 } } //jleu 25.04.2018 Hauptvorgaenge if( docType.getId().equals(Const.gDTS_AHAUP) ) { Functions.entryFunctionMainfolder(d3, doc, user, 1) } //jleu 16.05.2018 Dossier if( docType.getId().equals(Const.gDTS_DOSSI) ) { Functions.splitDossierValue(d3, doc, docType, "INSERTENTRY") } //jleu 11.10.2017 Daten von Abteilungsakte validieren für Abteilungsdokumente //02.2020 Abteilungsdokumente heißen nun Teamsitzugnsdokumente if( docType.getId().equals(Const.gDTS_DABTE) ) { def sqlStatement = "SELECT doku_id as lDokuID, dok_dat_feld_${Const.gDDF_VOROWNER} as lCaseOwner, dok_dat_feld_${Const.gDDF_ZUGRIFF} as lAccess " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_AREME}' " + "AND dok_dat_feld_${Const.gDDF_CASE} = '${doc.field[Const.gDDF_CASE]}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) def lCaseOwner def lAccess def lDokuID if( sqlResult != null ) { if( sqlResult.size() > 0 ) { lCaseOwner = sqlResult.getAt(0).get("lCaseOwner") lAccess = sqlResult.getAt(0).get("lAccess") lDokuID = sqlResult.getAt(0).get("lDokuID") } if( lDokuID != null ) { Document docTempAreme = d3.archive.getDocument(lDokuID); doc.field[Const.gDDF_ZUGRIFF] = lAccess doc.field[Const.gDDF_VOROWNER] = lCaseOwner for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { doc.field[Const.gDDF_D3USER67][i] = docTempAreme.field[Const.gDDF_D3USER67][i]; } } } } //Ende Regelmeetings - Abteilungsdokumente //jleu 23.08.2017 Vertrauliche Vorgangsakten und Abteilungsprozessakten if( docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_AREME) ) { //jleu 30.08.2017 Regelmeetings - Abteilungsdokumente if( docType.getId().equals(Const.gDTS_AREME) ) { doc.field[Const.gDDF_PROZESS] = "010302" doc.field[Const.gDDF_BUCHKREIS68][1] = user.getOptField(2) //doc.field[Const.gDFF_ABTEILUNG] = user.getOptField(10) -> Feld gibt es nicht mehr } if( docType.getId().equals(Const.gDTS_AVEVO) ) { doc.field[Const.gDDF_GLAKTYP] = "Vertrauliche Dokumente" } doc.field[Const.gDDF_VOROWNER] = user.id(); def sqlStatement = "SELECT * FROM firmen_spezifisch where kue_dokuart = '${docType.getId()}' and dok_dat_feld_${Const.gDDF_CASE} = '${doc.field[Const.gDDF_CASE]}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if( sqlResult != null && sqlResult.size() > 0 ) { return -171 } } // Ende Vertrauliche Vorgangsakten //jleu 13.09.2017 vertrauliche Dokumente //Prüfen, ob Ereignisdatum und Dokumenttitel gefüllt sind, ansonsten mit Dateidatum und Dateiname befüllen if( docType.getId().equals(Const.gDTS_DVEDO) ) { Date date = new Date(); Timestamp timestamp = new java.sql.Timestamp(date.getTime()); if( doc.field[Const.gDDF_DOKTITLE] == null || doc.field[Const.gDDF_DOKTITLE].equals("") ) { doc.field[Const.gDDF_DOKTITLE] = doc.getFilename() } if( doc.field[Const.gDDF_ERDATE] == null || doc.field[Const.gDDF_ERDATE].equals("") ) { doc.field[Const.gDDF_ERDATE] = timestamp } } //Ende vertrauliche Dokumente //jleu 08.03.2017 Marketingprojekt if( docType.getId().equals(Const.gDTS_AMARK) ) { doc.field[Const.gDDF_PROZESS] = "PZ001" SimpleDateFormat dateFormatYear = new SimpleDateFormat("yyyy"); SimpleDateFormat dateFormatMonth = new SimpleDateFormat("MM"); if( doc.field[Const.gDDF_JAHR] == null || doc.field[Const.gDDF_JAHR].equals("") ) { doc.field[Const.gDDF_JAHR] = dateFormatYear.format(new Date()) } if( doc.field[Const.gDDF_MONAT] == null || doc.field[Const.gDDF_MONAT].equals("") ) { doc.field[Const.gDDF_MONAT] = dateFormatMonth.format(new Date()) } if( doc.field[Const.gDDF_ANFORDERER] != null && !doc.field[Const.gDDF_ANFORDERER].equals("") ) { String[] splittedString = doc.field[Const.gDDF_ANFORDERER].split("\\(") String convertedString = splittedString[1].replace(")", "") def sqlStatement = "SELECT abteilung as lDep, benutzer_feld_2 as lBuKr FROM benutzer WHERE benutzername = '${convertedString}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if( sqlResult != null && sqlResult.size() > 0 ) { def lDep = sqlResult.getAt(0).get("lDep") def lBuKr = sqlResult.getAt(0).get("lBuKr") if( lDep != null && !lDep.equals("") ) { doc.field[Const.gDFF_ABTEILUNG] = lDep } if( lBuKr != null && !lBuKr.equals("") ) { doc.field[Const.gDDF_BUCHKREIS] = lBuKr } } } } if( docType.getId().equals(Const.gDTS_DMARK) || docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_DVEDO) || docType.getId().equals(Const.gDTS_AREME) || docType.getId().equals(Const.gDTS_AMARK) || docType.getId().equals(Const.gDTS_AHAUP) || docType.getId().equals(Const.gDTS_DSCHU) ) { def ld3user for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( doc.field[Const.gDDF_D3USER67][i] != null && !doc.field[Const.gDDF_D3USER67][i].equals("") ) { ld3user = doc.field[Const.gDDF_D3USER67][i] String[] splittedString = ld3user.split("\\=") def lReturn = splittedString.size() if( lReturn > 0 ) { doc.field[Const.gDDF_D3USER67][i] = splittedString[0] } } } } if( docType.getId().equals(Const.gDTS_DLOEH) ) { Functions.sixty2single(d3, doc) } if( docType.getId().equals(Const.gDTS_DWISS) ) { // 31.07.2017 Generell: Überprüfung, ob es für bestimmte Dokumentarten Sinn macht auszulagern // 10.08.2016 jleu: Anpassung Feld Themen für Caption aus 60er Feld Thema Wissensdokumente //Füllen von Themen anhand 60er Feld Thema def themen doc.field[Const.gDDF_THEMEN] = "" for( int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++ ) { if( doc.field[Const.gDDF_THEMA][i] != null && !doc.field[Const.gDDF_THEMA][i].equals("") ) { def tmp = doc.field[Const.gDDF_THEMA][i] if(tmp != null && !tmp.equals("")) { if( themen.equals("") || themen == null ) { themen = tmp; } else { themen = themen + " I " + tmp; } } } } if(themen.toString().length() > 250) { themen = themen.substring(0,248); } doc.field[Const.gDDF_THEMEN] = themen; //jleu 23.12.2016 Reihenfolge doc.field[Const.gDDF_REIHENFOLGE] = "01" //jleu - 08.11.2016 - Alle neuen Wissensdokumente bekommen die Ordnung Aktuell doc.field[Const.gDDF_ORDNUNG] = "Neu eingestellt" } //jleu 23.12.2016 Reihenfolge if( docType.getId().equals(Const.gDTS_DSCHU) ) { doc.field[Const.gDDF_REIHENFOLGE] = "01" } //jleu 06.10.2016 Ergebnisdokumente auf Nein setzen, falls Feld leer bleibt für Baudokumente if( docType.getId().equals(Const.gDTS_DBAUD) ) { if( doc.field[Const.gDDF_ERGEBNISDOK] == null || doc.field[Const.gDDF_ERGEBNISDOK].equals("") ) { doc.field[Const.gDDF_ERGEBNISDOK] = "Nein" } } if( docType.getId().equals(Const.gDTS_ABAUP) ) { doc.field[Const.gDDF_PROZESS] = "PZ003" } if( docType.getId().equals(Const.gDTS_AITSM) || docType.getId().equals(Const.gDTS_DITSM) ) { doc.field[Const.gDDF_PROZESS] = "PZ081" } //jleu 15.11.2017 Anpassung Organisationseinheit für Case Manager Contract if( docType.getId().equals(Const.gDTS_MNDNT) ) { if( doc.field[Const.gDDF_ORGEINHEIT] != null && !doc.field[Const.gDDF_ORGEINHEIT].equals("") ) { doc.field[Const.gDDF_ORGEINHEIT] = Functions.splitBuKrs(doc.field[Const.gDDF_ORGEINHEIT]) } } } return 0; } @Entrypoint( entrypoint = "hook_insert_entry_20" ) public int insertEntry20(D3Interface d3, Document doc, DocumentType docType, User user) { d3.log.info("insertEntry20 gestartet für Dokumentart ${docType.id()} und User ${user.id()} "); /* * Ausführungsbeschreibung: * Prüfung, ob das Dokument bereits im d.3 existiert (über HashValue), falls ja wird es nicht importiert. * Datenbank -> files_datentraeger: Eindeutig ist nur der file_hash */ def userName = "" if(user != null) { userName = user.id() } // Umstellung -> In JPL wurde die Erstellung durch bestimmte Nutzer ausgeführt // in Groovy müssen wir dies über das Bemerkungsfeld lösen if( doc.field[Const.gDDF_ARCDOCID] == null && !userName.equals("d3_async") && !userName.equals("hostimp") && !userName.equals("d3_rs") && !userName.equals("d3_content") && !userName.equals("d3_exch") && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) && (doc.getText(4) == null || (doc.getText(4) != null && !doc.getText(4).equals("cloned") && !doc.getText(4).equals("ECR cloned") && !doc.getText(4).equals("Ergebnisdokument cloned"))) && !docType.getId().equals(Const.gDTS_DALTD) ) { // 08.2020 Sonderbindung für Equipment if( !docType.getId().equals(Const.gDTS_DEQUI) ) { String fileHash List foundDocIDs = new ArrayList<>(); int lDocCount def lResult String lFileExtension lFileExtension = doc.getFileExtension() //d3.log.error("Dublettenprüfung - lFileExtension = ${lFileExtension}") if( !lFileExtension.equals("D3L") ) { // Ermittlung des HashValue PhysicalVersion[] pv = doc.getPhysicalVersions(); // Initialer Import if(pv.size() == 1) { fileHash = pv[0].getFileHash() //d3.log.error("Dublettenprüfung - fileHash : " + fileHash); // 28.07.2022 imue: Änderung für Vorlagenmanagement // Umsetzungsbeschreibung Herr Kopp: // Wenn die Duplettenprüfung ein Duplikat feststellt, dann ist dem System die DocId der bereits abgelegten Datei bekannt. // Falls es sich bei der abgelegten Datei um ein Vorlagendokument (DVORL) und Dateityp PDF handelt, dann soll soll die Duplettenprüfung in diesem Fall übergangen werden! String sqlStatementVorl = """SELECT fd.doku_id FROM files_datentraeger fd LEFT JOIN firmen_spezifisch fs ON fs.doku_id = fd.doku_id WHERE fd.file_hash = '${fileHash}' AND fs.kue_dokuart = '${Const.gDTS_DVORL}' AND fd.datei_erw = 'PDF' """; List sqlResultVorl = d3.sql.executeAndGet(sqlStatementVorl); if(sqlResultVorl != null && sqlResultVorl.size() >= 1) { d3.log.info("insertEntry20 - Abbruch Duplettenprüfung aufgrund Vorlage als Basis"); return 0; } // 23.05.2023 imue - Dokumete an denen die ARC_DOC_ID gefüllt ist, sollen nicht bei der Duplikatsprüfung betrachtet werden // ALT = """SELECT doku_id as foundDocIDs FROM files_datentraeger WHERE file_hash = '${fileHash}' """; String sqlStatement = """SELECT fd.doku_id as foundDocIDs FROM files_datentraeger fd LEFT JOIN firmen_spezifisch fs ON fd.doku_id = fs.doku_id WHERE fd.file_hash = '${fileHash}' AND dok_dat_feld_${Const.gDDF_ARCDOCID} IS NULL"""; List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null) { //d3.log.error("Dublettenprüfung - sqlResult : " + sqlResult); for(GroovyRowResult grr : sqlResult) { foundDocIDs.add(grr.get("foundDocIDs")) } lDocCount = sqlResult.size() if( lDocCount >= 1 ) { if( (docType.getId().equals(Const.gDTS_DWISS) || docType.getId().equals(Const.gDTS_DSCHU) ) && lDocCount == 1 ) { //jleu 22.11.2017 Lasse Duplikat für Wissensdokumente zu und verlinke die beiden Dokumente - aber nur, wenn es nur ein Ursprungsdokument gibt lResult = d3.call.link_documents(foundDocIDs[0], doc.id(), "d3groovy", false, false); if( lResult != 0 ) { d3.log.error("Fehler beim Verlinken Result ${lResult}") } else { Document docTemp = d3.archive.getDocument(foundDocIDs[0]) docTemp.setText(1, "Copied to ${doc.id()}") doc.setText(1, "Original ${foundDocIDs[0]}") try { docTemp.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTemp.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } try { doc.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } else { for(int i = 0; i < lDocCount; i++) { if( !foundDocIDs[i].equals(doc.id())) { Document docTemp = d3.archive.getDocument(foundDocIDs[i]); if( d3.remote.getLanguage().equals("049") ) { if(docTemp != null) { d3.hook.setProperty("additional_info_text", "Das Dokument ist bereits ${lDocCount} Mal im d.3 abgelegt. Eine erneute Ablage ist nicht möglich. Das letzte Mal wurde es unter DokID ${foundDocIDs[i]} durch den Ersteller ${docTemp.getOwner()} gespeichert.") } else { d3.hook.setProperty("additional_info_text", "Das Dokument ist bereits ${lDocCount} Mal im d.3 abgelegt. Eine erneute Ablage ist nicht möglich. Das letzte Mal wurde es unter DokID ${foundDocIDs[i]} gespeichert.") } } else { if(docTemp != null) { d3.hook.setProperty("additional_info_text", "The document already exists ${lDocCount} times in d.3. You are not allowed to import it again. The last Document ID is ${foundDocIDs[i]} from Owner ${docTemp.getOwner()} ).") } else { d3.hook.setProperty("additional_info_text", "The document already exists ${lDocCount} times in d.3. You are not allowed to import it again. The last Document ID is ${foundDocIDs[i]}).") } } d3.log.info( "Das Dokument ist bereits ${lDocCount} Mal im d.3 abgelegt. Eine erneute Ablage ist nicht möglich. Das letzte Mal wurde es unter DokID ${foundDocIDs[i]} gespeichert." ) return -170 } } } } } } } } else if( docType.getId().equals(Const.gDTS_DEQUI) ) { // Kopie eines Dokumentes nach Equipment erlauben unter folgenden Bedingungen: // Gleicher Hashwert innerhalb von Equipment -> keine Ablage // Gleicher Hashwert innerhalb von Equipment und irgendeiner anderen Dokumentart -> Ablage erlauben List foundDocIDs = new ArrayList<>(); String lFileExtension = doc.getFileExtension() if( !lFileExtension.equals("D3L") ) { // Ermittlung des HashValue PhysicalVersion[] pv = doc.getPhysicalVersions(); // Initialer Import if(pv.size() == 1) { String fileHash = pv[0].getFileHash() def sqlStatement = "SELECT fd.doku_id as foundDocIDs " + "FROM files_datentraeger fd " + "LEFT JOIN firmen_spezifisch fs ON fs.doku_id = fd.doku_id " + "WHERE fd.file_hash = '${fileHash}' " + "AND fs.kue_dokuart = '${Const.gDTS_DEQUI}' "; List sqlResult = d3.sql.executeAndGet(sqlStatement); for(GroovyRowResult grr : sqlResult) { foundDocIDs.add(grr.get("foundDocIDs")) } int lDocCount = sqlResult.size() if( lDocCount >= 1 ) { for(int i = 0; i < lDocCount; i++) { if( !foundDocIDs[i].equals(doc.id())) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Das Dokument ist bereits ${lDocCount} Mal im d.3 abgelegt. Eine erneute Ablage ist nicht möglich. Das letzte Mal wurde es unter DokID ${foundDocIDs[i]} gespeichert.") } else { d3.hook.setProperty("additional_info_text", "The document already exists ${lDocCount} times in d.3. You are not allowed to import it again. The last Document ID is ${foundDocIDs[i]}).") } d3.log.info( "Das Dokument ist bereits ${lDocCount} Mal im d.3 abgelegt. Eine erneute Ablage ist nicht möglich. Das letzte Mal wurde es unter DokID ${foundDocIDs[i]} gespeichert." ) return -170 } } } } } } } return 0 } @Entrypoint( entrypoint = "hook_insert_exit_20" ) public int insertExit20(D3Interface d3, Document doc, String fileDestination, Integer importOk, User user, DocumentType docType) { if( docType.getId().equals(Const.gDTS_AHAUP) ) { Functions.setMainfolder(d3, doc) } return 0; } @Entrypoint( entrypoint = "hook_insert_exit_30" ) public int insertExit30 (D3Interface d3, Document doc, String fileDestination, Integer importOk, User user, DocumentType docType) { def lTextMig if(doc != null) { lTextMig = doc.getText(4) } def lSalesgroup def lFileExtension def lCount def lReturn def lSubject def lDokGroup if(doc != null) { lDokGroup = doc.field[Const.gDDF_DOKGROUP] } def lAndClause def lRetCode def lRetVal def pRowCount def lUser = "" if(user != null) { lUser = user.id(); } if ( docType.getId().equals(Const.gDTS_DABTE) ) { Functions.inheritTeamdoc(d3, doc, lUser) } // d3.log.info("Der Besitzer lautet ${lUser} und der Text ${lTextMig} und der Importstatus ${importOk}") if( importOk != 0 ) { if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAktuellVersInternID) ) { // OPG-2024 - Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments // Technikdokumenten (DMDOK) - DDF 88 soll mit der aktuellen Versionsnummer befüllt werden Functions.setInternalVersion( d3, doc.id() ); } //Wenn für Opportunity Dokumente mehrere Opportunity Nummern eingetragen sind, rufe die Funktion zur Erstellung der d3l Datei auf if ( docType.getId().equals(Const.gDTS_DKUKO) || (Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitProjektnummerID) || Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitOpportunityID)) ) { if( lUser == "hostimp" ) { // 01.08.2017 Es können nun Kundenkontaktdokumente auch per Hostimport angeliefert werden. (vorher war in dieser Funktion alles was per Hostimport hereinkam ausgeschlossen!) // Für diese Dokumente sollen zu den zugehörigen Kundenkontakt IDs D3L Dateien erstellt werden. // Da diese D3L Dateien dann ebenfalls per Hostimport hereinkommen benötigen wir eine Prüfung, dass nicht für D3L Dateien weitere D3L Dateien erstellt weden. // Diese Prüfung erfolgt nun über die Dateiextension. lFileExtension = doc.getFileExtension() } if ( docType.getId().equals(Const.gDTS_DKUKO) && (!doc.field[Const.gDDF_KONTAKTNUMMER].equals("") && doc.field[Const.gDDF_KONTAKTNUMMER] != null) && !lFileExtension.equals("d3l") && !lFileExtension.equals("D3L") ) { def lOppCount def lKuKoID = doc.field[Const.gDDF_KONTAKTNUMMER] def lOppNRMain = doc.field[Const.gDDF_OPPNUMMER] def lProjNrMain = doc.field[Const.gDDF_AUFTRNR] def lProzessMain = doc.field[Const.gDDF_PROZESS] def lKdNummerMain = doc.field[Const.gDDF_KNR] List lOppNR = new ArrayList<>(); List lProjNr = new ArrayList<>(); List lProzess = new ArrayList<>(); List lDokIdRef = new ArrayList<>(); List lKdName = new ArrayList<>(); List lKdNummer = new ArrayList<>(); def sqlStatement = "SELECT doku_id as lDokIdRef, dok_dat_feld_${Const.gDDF_OPPNUMMER} as lOppNR, " + "dok_dat_feld_${Const.gDDF_AUFTRNR} as lProjNr, dok_dat_feld_${Const.gDDF_PROZESS} as lProzess, " + "dok_dat_feld_${Const.gDDF_KNAME} as lKdName, dok_dat_feld_${Const.gDDF_KNR} as lKdNummer " + "FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${lKuKoID}' " + "AND kue_dokuart = '${Const.gDTS_AKONT}' "; List sqlResult = d3.sql.executeAndGet(sqlStatement) if( sqlResult != null && sqlResult.size() > 0) { lOppCount = sqlResult.size(); for(GroovyRowResult grr : sqlResult) { lOppNR.add(grr.get("lOppNR")) lProjNr.add(grr.get("lProjNr")) lProzess.add(grr.get("lProzess")) lDokIdRef.add(grr.get("lDokIdRef")) lKdName.add(grr.get("lKdName")) lKdNummer.add(grr.get("lKdNummer")) } } // Es ist nur notwendig das Kundenkontaktdokument zu clonen, falls es mehr als eine passende Akte hierzu gibt if ( lOppCount > 1 ) { for (int i = 0; i < lOppCount; i++) { if ( !lOppNRMain.equals(lOppNR.get(i)) && lProzess.get(i).equals("0201") ) { lReturn = Functions.createLinkFiles(d3, doc.id(), lOppNR.get(i), lProjNr.get(i), lProzess.get(i), lDokIdRef.get(i), lKdName.get(i), lKdNummer.get(i), "", "") } else if ( !lProjNrMain.equals(lProjNr.get(i)) && lProzess.get(i).equals("0202") ) { lReturn = Functions.createLinkFiles(d3, doc.id(), lOppNR.get(i), lProjNr.get(i), lProzess.get(i), lDokIdRef.get(i), lKdName.get(i), lKdNummer.get(i), "", "") } else if ( !lKdNummerMain.equals(lKdNummer.get(i)) && lProzess.get(i).equals("0200") ) { lReturn = Functions.createLinkFiles(d3, doc.id(), lOppNR.get(i), lProjNr.get(i), lProzess.get(i), lDokIdRef.get(i), lKdName.get(i), lKdNummer.get(i), "", "") } } } //jleu - 09.11.2016 - Wenn einer neuer Besuchsbericht importiert wird, soll eine Gruppe darüber informiert werden if ( docType.getId().equals(Const.gDTS_DKUKO) && doc.field[Const.gDDF_DOKGROUP].equals(Const.gDOKUGRP) ) { lSubject = "Kundenbericht von ${lUser} mit Titel ${doc.field[Const.gDDF_ERDATE]} I ${doc.field[Const.gDDF_DOKTITLE]}" boolean lExpandGroups = true // JPL -> 1 boolean lIgnoreCheckout = true // JPL -> 1 def lSender = "d3_mailser" def lFileExtHold = "" lFileExtHold = doc.getFileExtension() if ( !lFileExtHold.equals("D3L") ) { //Sende einen Postkorbeintrag an die entsprechende Gruppe lRetVal = d3.call.hold_file_send(Const.gINFOGRP, lSubject, doc.id(), null, null, lExpandGroups, lIgnoreCheckout, null, null, lSender, 0, false, false, null, 0, false); d3.log.info("SendHoldFile Returnwert - ${lRetVal} - ${lUser} Titel ${doc.field[Const.gDDF_ERDATE]} I ${doc.field[Const.gDDF_DOKTITLE]}"); } else { d3.log.info("Kein Postkorbeintrag - d3l Datei Importiert"); } } } else if( !lFileExtension.equals("d3l") && !lFileExtension.equals("D3L") ) { for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if ( doc.field[Const.gDDF_OPPNRM][i] != null && !docType.getId().equals(Const.gDTS_DMAUF) && !docType.getId().equals(Const.gDTS_DMDOK) && !docType.getId().equals(Const.gDTS_DMSPE) ) { def lOppNR = doc.field[Const.gDDF_OPPNRM][i] lReturn = Functions.createLinkFiles(d3, doc.id(), lOppNR, "", "", "", "", "", "", ""); } else if ( (!doc.field[Const.gDDF_WEITAUFTRAGSNR][i].equals("") && doc.field[Const.gDDF_WEITAUFTRAGSNR][i] != null) && !docType.getId().equals(Const.gDTS_DMEOP) && !docType.getId().equals(Const.gDTS_DOPPD) && !docType.getId().equals(Const.gDTS_DVERD) ) { def lOppNR = "" def lProjNr = doc.field[Const.gDDF_WEITAUFTRAGSNR][i] lReturn = Functions.createLinkFiles(d3, doc.id(), lOppNR, lProjNr, docType.getId(), "", "", "", "", ""); } } } } //Wenn mehrere Beleg oder SR-ID Nummern eingetragen sind, rufe die Funktion zur Erstellung der d3l Datei auf (#Service) if ( (Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereBelegNrID) || Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereSRIDID)) && !doc.getFileExtension().equals("d3l") && !doc.getFileExtension().equals("D3L") ) { for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereBelegNrID) ) { def lBelegNr = doc.field[Const.gDDF_WEITEREBELEGNR][i] if(lBelegNr != null) { Functions.createLinkFilesService( d3, doc, lBelegNr, null ); } } else if( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereSRIDID) ) { def lSrId = doc.field[Const.gDDF_WEITERESRID][i] if(lSrId != null) { Functions.createLinkFilesService( d3, doc, null, lSrId ); } } } } // imue 26.08.2020: Ergänzung für Equipment if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereEquipmentID) ) { for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { String currentEquipment = doc.field[Const.gDDF_WEITEREEQUIPMENT][i]; if(currentEquipment != null) { Functions.createLinkFilesEquipment(d3, doc, currentEquipment); } } } // imue 06.05.2022: Ergänzung für Einkauf if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gWeitereEinkaufBelegNrID) ) { for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { String lBelegNr = doc.field[Const.gDDF_WEITEREBELEGNR][i]; if(lBelegNr != null) { Functions.createLinkFilesPurchase(d3, doc, lBelegNr); } } } if( lTextMig.equals("Migration") ) { // Das Attribut "Akte" wird im Maschinenprojekt bis auf die Ausnahme ECR automatisch anhand der Dokumentgruppe und der Dokumentart (Anwendungsfall) ermittelt // 25.07.2016/dkle: Anpassung auf die neuen Dokumentgruppen von ECR //Schlüsselumstellung "Medien" -> DG074 Functions.setAttributSubject(d3, doc, docType, user.id()); } else { d3.log.info("Start proc insertExit30 - docId = ${doc.id()}, pFileDest = ${doc.getFileExtension()}, pImportOk = ${importOk}, lUser = ${lUser}, pDocTypeShort = ${docType.getId()}") //jleu 18.01.2017 Schulungsdokumentation if (docType.getId().equals(Const.gDTS_DSCHU)) { //Die Funktion erstellt eine sucheschulungattr.html Datei //die auf den d.3one Server der jeweiligen Umgebung nach c:\inetpub\wwwroot kopiert werden muss //Die Datei sucheschulungattr.html stellt eine Suche über Werte aus der Dokumtart Schulungsdokumentation bereit. Functions.createSearchHTML(d3, doc) } //Ende Schulungsdokumentation if (docType.getId().equals(Const.gDTS_DWISS)) { // call CreateSearchHTML(pDocTypeShort) Functions.sendMailRecom(d3, doc, lUser) } // imue 15.04.2019 - OPG-2133 - beim Import muss die Hauptangebot_Nr immer leer sein if( docType.getId().equals(Const.gDTS_AUNTE) && (doc.field[Const.gDDF_HAUPTOPPANNR] != null && !doc.field[Const.gDDF_HAUPTOPPANNR].equals("")) ) { doc.field[Const.gDDF_HAUPTOPPANNR] = ""; try { doc.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } if( docType.getId().equals(Const.gDTS_AUNTE) && ( doc.field[Const.gDDF_HAUPTOPPANNR] == null || doc.field[Const.gDDF_HAUPTOPPANNR].equals("") ) ) { lReturn = Functions.createOfferFolder(d3, doc, docType.getId()); } //jleu 08.03.2017 Erstelle Unterakten Marketingprojekt if( docType.getId().equals(Const.gDTS_AMARK)) { Functions.createMarketResearchFolder(d3, doc, doc.field[Const.gDDF_MARKETINGPROJEKT]) } // -------------------------------------------------------------- // ######## Anpassung zum Prototyp für Maschinenprojekte V2 ######## // dkle 06.12.2016: Bei Anlage der Akte Kundenkontakt mit einer // Kundenkontakt_ID die bereits besteht sollen alle vorhandenen Dokumente // per d3l in die neue Akte verlinkt werden // -------------------------------------------------------------- if( docType.getId().equals(Const.gDTS_AKONT) ) { Functions.createD3lForDKUKO(d3, doc, doc.field[Const.gDDF_KONTAKTNUMMER] ) } // -------------------------------------------------------------- // // ######## Anpassung zum Prototyp für Maschinenprojekte ######## // Bei Anlage der Akte Ergebnis Opportunity wird automatisch die Kopie der // Ergebnisdokumente ausgelöst // -------------------------------------------------------------- if( docType.getId().equals(Const.gDTS_AMEOP) && (doc.field[Const.gDDF_BASEOPP] != null && !doc.field[Const.gDDF_BASEOPP].equals("")) ) { def lBaseOpp = doc.field[Const.gDDF_BASEOPP]; def lOrderNo = doc.field[Const.gDDF_AUFTRNR]; //... und verknüpfe die Ergebnisdokumente in die Maschinenprojektakte lReturn = Functions.copyResultDocs(d3, doc, lBaseOpp, lOrderNo ) } // Das Attribut "Akte" wird im Maschinenprojekt bis auf die Ausnahme ECR automatisch anhand der Dokumentgruppe und der Dokumentart (Anwendungsfall) ermittelt Functions.setAttributSubject(d3, doc, docType, user.id()); // 11.05.2020 - kann eigentlich im InsertExit nicht auftreten, daher erstmal auskommentiert // Maschinenprojekt Wenn der Status der Unterakte ECR auf "Genehmigung" steht soll eine Dublette alle Ergebnisdokumente in die Dokumentart DMSPE kopiert werden. //if( docType.getId().equals(Const.gDTS_AMECR) && doc.field[Const.gDDF_ECRSTATUS].equals("E0003") ) { // def lActID = doc.field[Const.gDDF_AKTIVITAETSID] // def lOrderID = doc.field[Const.gDDF_AUFTRNR] // Functions.copyApprovedECR(d3, lActID, lOrderID, ""); //} // Eine neue Unterakte ECR wird zu einer bestehenden Aktivitäts-ID angelegt. In dem Falle sollen alle Dokumente der "Originalen" Akte per D3L in die neue Akte verknüpft werden if( docType.getId().equals(Const.gDTS_AMECR) && !doc.getText(4).equals("Original") ) { Functions.createLinkFilesOrder(d3, doc, docType.getId()); } //Splitte für alle Dokument- und Aktenarten zur Opportunity das Erstelldatum wenn nicht leer und schreibe die Werte in Jahr und Monat // dkle, 02.02.2016 Dies gilt für alle Dokumentarten, sowie die Opportunityakte. Andernfalls wird im Insert Entry das Jahr/Monat anhand des aktuellen Datums ermittelt if ( doc.field[Const.gDDF_ERDATE] != null && Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gEreignisDateID) == true ) { SimpleDateFormat dateFormatYear = new SimpleDateFormat("yyyy"); def lJahr = dateFormatYear.format(doc.field[Const.gDDF_ERDATE]); SimpleDateFormat dateFormatMonth = new SimpleDateFormat("MM"); def lMonat = dateFormatMonth.format(doc.field[Const.gDDF_ERDATE]); try { doc.field[Const.gDDF_JAHR] = lJahr; doc.field[Const.gDDF_MONAT] = lMonat; doc.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } // 31.07.2017 Überprüfung, ob das notwendig ist, oder ob d.search dieses Dokument nicht am Ende des imports ohnehin erhält d3.call.document_send_to_dsearch( doc.id(), "", 0, "", false, "Fr", 0, "d3groovy") } if (docType.getId().equals(Const.gDTS_ABAUP)) { Functions.createConstDocFolder(d3, doc, doc.field[Const.gDDF_BAUPROJEKT]) } // phoer 20160823: Wenn beim Insert der Maschinenprojektdokumente das Zuordnung Kundenkontakt gefüllt ist... if( doc.field[Const.gDDF_MAPPCUSTACTION] != null && ( docType.getId().equals(Const.gDTS_DKOMM)|| docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) ) ) { //...rufe die Funktion zum Kopieren des Dokuments auf, damit es in die Kundenkontaktakte importiert wird Functions.copyCustAction(d3, doc, doc.field[Const.gDDF_MAPPCUSTACTION]); } if( docType.getId().equals(Const.gDTS_DMECR) && ( lUser.equals("hostimp") ) ) { // Überprüfe, wenn es eine D3L Datei ist, ob diese schon existiert // Falls ja, Bereinigung des Hostimport-Verzeichnisses // 31.07.2017 Überprüfung, wie es dazu kommt, dass // - Diese Funktion überhaupt existiert (ggf. schon beim Schreiben der D3L Prüfen, ob sie erstellt werden muss // - Sie im Exit und nciht im Entry ist if( doc.getText(4).equals("ToCopy") ) { doc.setText(4, ""); try { doc.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } Functions.copyApprovedECR( d3, "", "", doc.id() ) } List lECRDokID def lFileName def sqlStatement = "SELECT f.doku_id as lECRDokID " + "FROM firmen_spezifisch as f, phys_datei as p " + "WHERE f.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' " + "AND f.dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${doc.field[Const.gDDF_AKTIVITAETSID]}' " + "AND p.datei_erw = 'D3L' " + "AND ( p.text like '%${doc.getText(4)}%' OR p.text like '${doc.getText(4)}%' OR p.text like '%${doc.getText(4)}') " + "AND f.kue_dokuart = '${Const.gDTS_DMECR}' " + "AND p.doku_id = f.doku_id " + "AND p.doku_id <> '${doc.id()}' " List sqlResult = d3.sql.executeAndGet(sqlStatement) pRowCount = sqlResult.size() if( sqlResult != null ) { for(GroovyRowResult grr : sqlResult) { lECRDokID.add(grr.get("lECRDokID")) } } if( pRowCount > 0 ) { // Lösche die Datei aus dem Hostimport-Verzeichnis d3.call.document_delete("HOSTIMP Es handelt sich um ein Duplikat", true, true, doc.id(), "d3groovy", false); } } } // Aufruf der Funktion manage_d3l_Supp_Custo, wenn weitere Kunden_Nr oder weitere Lieferanten_Nr bei Kundendokumenten oder Lieferantendokumenten hinzugefügt oder entfernt werden if( docType.getId().equals(Const.gDTS_DKUMA) || docType.getId().equals(Const.gDTS_DLIMA) ) { // gDDF_WEITLIEFNR - gDDF_WEITKDNR def lFileExt lFileExt = doc.getFileExtension() if( !lFileExt.equals("D3L") ) { // d3.log.error( "Dokumentart: " + docType.getId() + " DokuID: " + doc.id() ) // Variablen setzen je nach Dokumentart // Welches DDF ist zu befüllen? // Welche Ziel-Dokumentart wird benötigt und muss abgefragt werden? def lDDFToFill def lScenario def lBlock if( docType.getId().equals(Const.gDTS_DKUMA) ) { lDDFToFill = Const.gDDF_WEITKDNR lScenario = "CustomerNumber" } else if( docType.getId().equals(Const.gDTS_DLIMA) ) { lDDFToFill = Const.gDDF_WEITLIEFNR lScenario = "SupplierNumber" } for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if(doc.field[lDDFToFill][i] != null && !doc.field[lDDFToFill][i].equals("")) { lBlock = "CREATE/UNBLOCK" Functions.createD3lForSuppCusto(d3, lBlock, doc.field[lDDFToFill][i], lScenario, doc.id()); } } } } d3.log.info("End proc insertExit30 - pDocId = ${doc.id()}, pFileDest = ${doc.getFileExtension()}, pImportOk = ${importOk}, pUser = ${lUser}, pDocTypeShort = ${docType.getId()}") } return 0; } // end of insertExit30 /* * Verknüpfen von Dokumenten bzw. Akten * beinhaltet: * + hook_link_entry_30 (aktiv) * + hook_link_exit_10 (aktiv) */ @Entrypoint( entrypoint = "hook_link_entry_30" ) public int linkEntry30( D3Interface d3, Document docFather, Document docChild ){ d3.log.info("Start proc linkEntry30 - doku_id_ref_ueber = ${docFather.id()}, doku_id_ref_unter = ${docChild.id()}") def child_doc_type_short = docChild.getType().getId() def parent_doc_type_short = docFather.getType().getId() //def lUser = d3.remote.getUserName() -> 26.06.2020 führte zu fehlerhaften LIN002 Jobs und wurde daher auf getOwner() geändert def lUser = docChild.getOwner() def lLinkAllowed def lRetCode def lLinkAllowed2 def lIdentifier def lIdentifierF def lFather def lChild def lOppNo def lAuftrNo def lText4Unter def lReturn def pRowCount def lCount def lRetVal d3.log.info("linkEntry30 - lUser = ${lUser}"); lText4Unter = docChild.getText(4) // OPG-2054 - imue 15.10.2019 if( ( parent_doc_type_short.equals(Const.gDTS_ALIMA) && !child_doc_type_short.equals(Const.gDTS_DLIMA) ) || ( parent_doc_type_short.equals(Const.gDTS_ALONT) && !child_doc_type_short.equals(Const.gDTS_DLONT) ) || ( parent_doc_type_short.equals(Const.gDTS_ALIKO) && !child_doc_type_short.equals(Const.gDTS_DLIKO) ) ) { // Ablage ist mit einer anderen Konstellation nicht erlaubt - Abbruch ohne Usermeldung return 9500; } if ( child_doc_type_short.equals(Const.gDTS_DWISS) || child_doc_type_short.equals(Const.gDTS_DSCHU) || child_doc_type_short.equals(Const.gDTS_DREGE) || child_doc_type_short.equals(Const.gDTS_DAREG) || child_doc_type_short.equals(Const.gDTS_ABAUN) || child_doc_type_short.equals(Const.gDTS_DBAUD) || child_doc_type_short.equals(Const.gDTS_AMARK) || child_doc_type_short.equals(Const.gDTS_AUNMA) || child_doc_type_short.equals(Const.gDTS_DMARK) || child_doc_type_short.equals(Const.gDTS_AGLAK) || child_doc_type_short.equals(Const.gDTS_AVEVO) || child_doc_type_short.equals(Const.gDTS_DVEDO) || child_doc_type_short.equals(Const.gDTS_DABTE) || child_doc_type_short.equals(Const.gDTS_AVODA) || child_doc_type_short.equals(Const.gDTS_AREME) || child_doc_type_short.equals(Const.gDTS_AHAUP) || child_doc_type_short.equals(Const.gDTS_ATEIL) || child_doc_type_short.equals(Const.gDTS_DOSSI) || child_doc_type_short.equals(Const.gDTS_AITSM) || child_doc_type_short.equals(Const.gDTS_DITSM)) { //Überspringe die Verknüpfung } else { //lUser == "d3_server" || phoer 20170803: Auskommentiert, da sonst innerhalb der Aktenstruktur manuell verknüpft werden kann def user = d3.archive.getUser( lUser ); if ( lUser != null && ( user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) || lText4Unter.equals("SAP-Systemklon") || lUser.equals("hostimp") ) ) { //Überspringe die Verknüpfung } else if ( child_doc_type_short.equals(Const.gDTS_DPRST) ) { // Ausnahme Projektorganisationsdokumente wegen Verwendung in beiden Anwendungsfällen // 31.07.2017 teilweise werden Attribute doppelt geholt - prüfen! lOppNo = docChild.field[Const.gDDF_OPPNUMMER] lAuftrNo = docChild.field[Const.gDDF_AUFTRNR] if ( !lOppNo.equals("") && lOppNo != null && ( parent_doc_type_short.equals(Const.gDTS_APROR) || parent_doc_type_short.substring(0,1).equals("D") ) ) { //lasse die Verknüpfung zu } else if ( !lAuftrNo.equals("") && lAuftrNo != null && ( parent_doc_type_short.equals(Const.gDTS_AMUPO) || parent_doc_type_short.substring(0,1).equals("D") ) ) { //lasse die Verknüpfung zu } else if ( parent_doc_type_short.substring(0,1).equals("A") ) { //Prüfung ob die gewünschte Verlinkung erlaubt ist def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_DTSVATER} as lFather, dok_dat_feld_${Const.gDDF_DTSKIND} as lChild " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_AABWL}' " + "AND dok_dat_feld_${Const.gDDF_DTSVATER} = '${parent_doc_type_short}' " GroovyRowResult grr = d3.sql.firstRow(sqlStatement); if(grr != null && grr.size() > 0) { lFather = grr.get("lFather") lChild = grr.get("lChild") } if ( lFather.equals(parent_doc_type_short) && lChild.equals("A") ) { //Verknüpfung darf erfolgen } else { //Für diesen Returnwert kann kein Additional Info Text vergeben werden, denn dieser wird dem Benutzer nicht angezeigt! Die msglib.usr muss weiterhin gepflegt werden d3.log.error("LinkEntry30 - return -155") return -155 } } } else { lIdentifier = child_doc_type_short.substring(0,1) lIdentifierF = parent_doc_type_short.substring(0,1) if ( lIdentifier.equals("A") || lIdentifier.equals("a") ) { //Prüfung ob die gewünschte Verlinkung erlaubt ist def sqlStatement = "SELECT * " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_AABWL}' " + "AND dok_dat_feld_${Const.gDDF_DTSVATER} = '${parent_doc_type_short}' " + "AND dok_dat_feld_${Const.gDDF_DTSKIND} = '${lIdentifier}' " List sqlResult = d3.sql.executeAndGet(sqlStatement); lLinkAllowed = sqlResult.size() if ( lLinkAllowed == 1 ) { //Für diesen Returnwert kann kein Additional Info Text vergeben werden, denn dieser wird dem Benutzer nicht angezeigt! Die msglib.usr muss weiterhin gepflegt werden // Hier wird der Standard-Fehlercode überschrieben! 75! d3.log.error("LinkEntry30 - return 9425") return 9425 } else { //Prüfung ob die gewünschte Verlinkung erlaubt ist def sqlStatementSec = "SELECT * " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_AABWL}' " + "AND dok_dat_feld_${Const.gDDF_DTSVATER} = '${parent_doc_type_short}' " + "AND dok_dat_feld_${Const.gDDF_DTSKIND} = '${child_doc_type_short}'" List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec); lLinkAllowed2 = sqlResultSec.size() if ( lLinkAllowed2 == 0 ) { //Für diesen Returnwert kann kein Additional Info Text vergeben werden, denn dieser wird dem Benutzer nicht angezeigt! Die msglib.usr muss weiterhin gepflegt werden d3.log.error("LinkEntry30 - return -150") return -150 } else { //Akten dürfen verknüpft werden } } } else if ( lIdentifier.equals("D") && lIdentifierF.equals("D") ) { //Verknüpfung darf erfolgen } else if ( ( lIdentifier.equals("D") || lIdentifier.equals("d") ) && (lIdentifierF.equals("A") || lIdentifierF.equals("a") ) ) { //Prüfung ob die gewünschte Verlinkung erlaubt ist def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_DTSVATER} as lFather, dok_dat_feld_${Const.gDDF_DTSKIND} as lChild " + "FROM firmen_spezifisch " + "WHERE kue_dokuart = '${Const.gDTS_AABWL}' " + "AND dok_dat_feld_${Const.gDDF_DTSVATER} = '${parent_doc_type_short}' " GroovyRowResult grr = d3.sql.firstRow(sqlStatement); if(grr != null && grr.size() > 0) { lFather = grr.get("lFather") lChild = grr.get("lChild") } if ( lFather.equals(parent_doc_type_short) && lChild.equals("A") ) { //Verknüpfung darf erfolgen } else { //Für diesen Returnwert kann kein Additional Info Text vergeben werden, denn dieser wird dem Benutzer nicht angezeigt! Die msglib.usr muss weiterhin gepflegt werden d3.log.error("LinkEntry30 - return -155") return -155 } } } } // Wenn das Dokument bis hierher gekommen ist darf die Verknüpfung generell stattfinden. // Weitere Prüfung 03 ECR Dokumente -> Unterakte ECR ist diese das Original (anhand Aktivitäts-ID), // Ja = Es passiert nichts // Nein = Es muss an die Original gelinkt werden. if( child_doc_type_short.equals(Const.gDTS_DMECR) && parent_doc_type_short.equals(Const.gDTS_AMECR) ) { def lText1 def lText2 def lText3 def lText4 def lTextAll def lText4Link def lChildActivity def lFatherActivity def lProjNumberTmp def lFileExt def lFatherOriginalDocID lChildActivity = docChild.field[Const.gDDF_AKTIVITAETSID] lFatherActivity = docFather.field[Const.gDDF_AKTIVITAETSID] lText1 = docFather.getText(1) lText2 = docFather.getText(2) lText3 = docFather.getText(3) lText4 = docFather.getText(4) lFileExt = docChild.getFileExtension() if( lText1.equals("Original") || lText2.equals("Original") || lText3.equals("Original") || lText4.equals("Original") ) { lTextAll = "Original" } if( lFileExt.equals("d3l") || lFileExt.equals("D3L") ) { // Wird manuell verlinkt nichts zu tun // d3.log.error( "lFileExt: ${lFileExt} Wird manuell verlinkt nichts zu tun" ) // lText2 = docFather.getText(4) // lRetCode = d3.call.link_documents( lFatherOriginalDocID[1], docChild.id(), "d3groovy", false, false) // if( lRetCode != 0 ) { // d3.log.error( "Fehler bei der Verknüpfung des Dokumentes mit der Originalakte" ) // } } else if( lChildActivity.equals(lFatherActivity) && lTextAll.equals("Original") ) { // Verknüpfung darf erfolgen // erstelle d3l Dateien in allen zugehörigen Aktivitäts-IDs // Suche nach allen Unterakten ECR mit dieser Aktivitäts-ID // 31.07.2017 Frage: Kann es zu Timing Problemen kommen??? Aktenplan läuft schon an während das DOK schon in diesem Einsprungspunkt ist. def sqlStatement = "SELECT fs.doku_id as lFatherD3LDocID " + "FROM firmen_spezifisch fs, phys_datei pd " + "WHERE fs.doku_id = pd.doku_id " + "AND fs.kue_dokuart = '${Const.gDTS_AMECR}' " + "AND fs.dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${lChildActivity}' " List sqlResult = d3.sql.executeAndGet(sqlStatement); pRowCount = sqlResult.size() for( GroovyRowResult grr : sqlResult ) { try { Document docTemp2 = d3.archive.getDocument(grr.get("lFatherD3LDocID"), "d3groovy") lText4Link = docTemp2.getText(4) if( !lText4Link.equals("Original") && !docTemp2.id().equals(docFather.id() ) ) { Functions.createD3lForECR(d3, docChild.id(), docTemp2.id()); } } catch(Exception e) { d3.log.error("Exception in linkentry30 - " + e.getMessage()); } } } else if( ( lChildActivity.equals(lFatherActivity) && !lTextAll.equals("Original") && !lChildActivity.substring(0,4).equals("Neue") && !lChildActivity.equals("0000000000") ) || !lChildActivity.equals(lFatherActivity) ) { // Suche das Original // erstelle den passenden Link def sqlStatement = "SELECT fs.doku_id as lFatherOriginalDocID " + "FROM firmen_spezifisch fs, phys_datei pd " + "WHERE fs.doku_id = pd.doku_id " + "AND fs.kue_dokuart = '${Const.gDTS_AMECR}' " + "AND fs.dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${lChildActivity}' " + "AND ( pd.text like '%Original%' OR pd.text like 'Original%' OR pd.text like '%Original') " List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null && sqlResult.size() > 0) { pRowCount = sqlResult.size() lFatherOriginalDocID = sqlResult.getAt(0).get("lFatherOriginalDocID") } if( pRowCount != 1 ) { d3.log.error( "Es konnte keine korrekte Verknüpfung erstellt werden" ) d3.log.error("LinkEntry30 - return -185") return -185 } else { // verlinken mit der passenden Akte // 31.07.2017 unschön, kann zu Problemen führen, einmal prüfen, obs Probleme gibt if( !docFather.id().equals(lFatherOriginalDocID) ) { Document docTemp = d3.archive.getDocument(lFatherOriginalDocID) lProjNumberTmp = docTemp.field[Const.gDDF_AUFTRNR] if ( lProjNumberTmp != null ) { docChild.field[Const.gDDF_AUFTRNR] = lProjNumberTmp try { docChild.updateAttributes("d3groovy", false) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docChild.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) d3.log.error("Fehler bei der Zuordnung zur Originalakte eines ECR/Change Order Dokuments. Dokument ID: ${docChild.id()} ") } } } } d3.log.error( "Verknüpfung NICHT Originalakte mit Originaldatei verhindern" ) d3.log.error("LinkEntry30 - return -155") return -155 } } //jleu 20.02.2017 Prüfen, ob Baukten gleich sind, sonst nicht erlauben if( ( child_doc_type_short.equals(Const.gDTS_DBAUD) && ( parent_doc_type_short.equals(Const.gDTS_ABAUN) || parent_doc_type_short.equals(Const.gDTS_ABAUK) ) ) || ( child_doc_type_short.equals(Const.gDTS_ABAUN) && parent_doc_type_short.equals(Const.gDTS_ABAUK) ) ) { def BauakteUeber def BauakteUnter def i = 0 def j = 1 def ResString = "" def CountRes BauakteUeber = docFather.field[Const.gDDF_BAUAKTE] BauakteUnter = docChild.field[Const.gDDF_BAUAKTE] if( !BauakteUeber.equals(BauakteUnter) ) { d3.log.error("LinkEntry30 - return -155") return -155 } // Umsetzung in Groovy von d3set_get_filter? - Siehe Ticket D003769593 - WORKAROUND: if ( parent_doc_type_short.equals(Const.gDTS_ABAUK) && child_doc_type_short.equals(Const.gDTS_DBAUD) ) { def sqlStatement = "SELECT fsmv.value_char as value " + "FROM firm_spez_mult_val fsmv " + "LEFT JOIN firmen_spezifisch fs ON fsmv.doku_id = fs.doku_id " + "WHERE kue_dokuart = '\$SET\$' " + "AND fs.doku_id = '${SystemSpecificConst.gResBauakteID}'" List sqlResult = d3.sql.executeAndGet(sqlStatement); if( sqlResult.size() > 1 ) { for(GroovyRowResult grr : sqlResult) { ResString = ResString + grr.get("value") } } else if( sqlResult.size() == 1 ) { ResString = sqlResult.getAt(0).get("value") } String[] splittedString = ResString.split(";") for ( String s : splittedString ) { if( BauakteUnter.equals(s) ) { d3.log.error("LinkEntry30 - return -155") return -155 } } } } d3.log.info("End proc linkEntry30 - doku_id_ref_ueber = ${docFather.id()}, doku_id_ref_unter = ${docChild.id()}") // 31.07.2017 Generell bessere Kommentare und Erklärungen in die Funktion einbringen return 0 } @Entrypoint( entrypoint = "hook_link_exit_10" ) public int linkExit10(D3Interface d3, Document docFather, Document docChild, Integer errorCode) { /* * Ausführungsbeschreibung: * Wenn es sich um einen Projektlieferanten handelt, dessen Projekt- oder Opportunity-Nummer sich ändert, * dann hole alle Kinder und gebe Ihnen das neue Erkennungsattribut, damit der Aktenplan für die Kinder erneut ausgeführt wird (Verknüpfung) */ d3.log.info( "linkExit10 ( ${docFather.id()}, ${docChild.id()}, ${errorCode} )" ) def userName = "" if(d3.remote.getUserName() != null || !d3.remote.getUserName().equals("") ) { userName = d3.remote.getUserName() } //d3.log.error( "linkExit10 - Aufruf mit ${userName}" ) if( errorCode == 0 ) { if( (docChild.getType().getId().equals(Const.gDTS_ALIKO)) && (userName != null && !userName.equals("d3_async") && (!userName.equals(""))) ) { // Erkennungsattribut des Vaters holen - entweder Projektnummer oder OpportunityNummer def fatherProjectNo = docFather.field[Const.gDDF_AUFTRNR] def fatherOpporNo = docFather.field[Const.gDDF_OPPNUMMER] String[] childrenList = d3.call.link_get_children(docChild.id(), "d3groovy") d3.log.error( "linkExit10 ( ${docFather.id()} hat ${childrenList.size()} Kinder )" ) if( childrenList.size() > 0 ) { for( String dokuId : childrenList ) { // Workaround: Erkenenungsattribut des Kindes ändern, anstatt Aktenplan nochmals auslösen (JPL Lösung) // d3.log.error("linkExit10 - fatherProjectNo = " + fatherProjectNo) // d3.log.error("linkExit10 - fatherOpporNo = " + fatherOpporNo) Document docTemp = d3.archive.getDocument(dokuId) if(fatherProjectNo != null && !fatherProjectNo.equals("")) { docTemp.field[Const.gDDF_AUFTRNR] = fatherProjectNo } else if(fatherOpporNo != null && !fatherOpporNo.equals("")) { docTemp.field[Const.gDDF_OPPNUMMER] = fatherOpporNo } try { docTemp.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTemp.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } } // imue 15.09.2020: Prüfung das der Kundenname bei Prozess Kunde übernommen wird if( docChild.getType().getId().equals(Const.gDTS_APROZ) && (userName == null || (userName != null && userName.equals("d3_async"))) ) { String lKundenNameFather = docFather.field[Const.gDDF_KNAME]; String lKundenNameChild = docChild.field[Const.gDDF_KNAME]; if(lKundenNameChild == null) { d3.log.info("Kundenname wird gesetzt = " + lKundenNameFather) docChild.field[Const.gDDF_KNAME] = lKundenNameFather; try { docChild.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docChild.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } return 0 } /* * Aktualisierung der Eigenschaftswerte * beinhaltet: * + hook_upd_attrib_entry_20 (aktiv) * + hook_upd_attrib_entry_10 (nicht in Nutzung) * + hook_upd_attrib_exit_20 (aktiv) */ @Entrypoint( entrypoint = "hook_upd_attrib_entry_20" ) public int updateAttribEntry20(D3Interface d3, Document doc, User user, DocumentType docType, DocumentType docTypeNew) { d3.log.debug("Start updateAttribEntry20"); def lCnt def pRowCount def lReturn def lCount def lRetCode def lLength def lReturn2 def lDokGroup def lSubject def lAndClause def userName = "" if(user != null) { userName = user.id(); } // Validierung der Administrativen Akten if(docType.getId().equals(Const.gDTS_AAFOL) || docType.getId().equals(Const.gDTS_AZTXT)) { int resultValidate = Functions.validateAdminFolder(d3, doc, "UPDATE") if(resultValidate == 1) { return -170 } } // Values for old_dok_dat_field Document docTemp = d3.archive.getDocument(doc.id()) //Validieren der Prozessart Functions.validateProcess(d3, doc) d3.log.info( "updateAttribEntry20(${doc.id()}, ${userName}, ${docType.getId()}, ${docTypeNew.getId()} )" ) //jleu 01.08.2018 Vertragsdokumente if( docType.getId().equals(Const.gDTS_EVDOK) || docType.getId().equals(Const.gDTS_EVUNT) ) { def lRetVal = Functions.checkContractNumber(d3, doc) if (lRetVal == 10) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT019049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT019001) } return -200 } } //jleu 21.05.2021 ITSM Dokumente if( docType.getId().equals(Const.gDTS_DITSM) ) { def RetVal = Functions.checkITSMNumber(d3, doc) if (RetVal == 10) { // Meldung an den Benutzer, dass eine unbekannte ITSM ID verwendet wird if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT025049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT025001) } return -170 } } if( docType.getId().equals(Const.gDTS_DLOEH) ) { Functions.sixty2single(d3, doc) } //jleu 25.04.2018 Hauptvorgaenge if( docType.getId().equals(Const.gDTS_AHAUP) ) { Functions.entryFunctionMainfolder(d3, doc, user, 0) } //jleu 18.10.2017 Prüfen, ob Vorgang bereits existiert if( docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_AREME) ) { String caseold = docTemp.field[Const.gDDF_CASE]; String casenew = doc.field[Const.gDDF_CASE]; if ( !doc.field[Const.gDDF_CASE].equals(docTemp.field[Const.gDDF_CASE]) ) { def sqlStatement = "SELECT * FROM firmen_spezifisch as lVorgang where kue_dokuart = '${docType.getId()}' and dok_dat_feld_${Const.gDDF_CASE} = '${doc.field[Const.gDDF_CASE]}' " List sqlResult = d3.sql.executeAndGet(sqlStatement) lCnt = sqlResult.size() if( lCnt != 0 ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Vorgang existiert bereits") } else { d3.hook.setProperty("additional_info_text", "Case name already exists") } return -171 } } } // Ende Prüfung Vorgang def InvalidData def lECRStatus def lChildCount if( !docType.getId().equals(Const.gDTS_SAPDO) ) { d3.log.info("Start proc updateAttribEntry20 - pDocId = ${doc.id()}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}") def h_projnr def lProjNr def lBuchKr def lBuchKr68 lReturn = 0 // Split Attribut Funktion bei Technikdokumenten im Import if( docType.getId().equals(Const.gDTS_DMDOK) && (!doc.field[Const.gDDF_FUNKTION].equals("") && doc.field[Const.gDDF_FUNKTION] != null) && ( !doc.field[Const.gDDF_FUNKTION].equals(docTemp.field[Const.gDDF_FUNKTION] || !doc.field[Const.gDDF_NPN].equals(docTemp.field[Const.gDDF_NPN]) ) ) ) { lReturn = Functions.splitFunction( d3, doc, docType.getId() ) if( lReturn.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte waehlen Sie eine gültige Funktion aus.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Please choose a valid function.") lReturn = 0 } d3.log.error( "Bitte waehlen Sie eine gültige Funktion aus." ) return -170 } else if( lReturn.equals("FEHLERODATA") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else if( lReturn.equals("FEHLERFUNKTION") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else { lReturn = 0 } } // Split Attribut Modul bei Technikdokumenten im Import if( docType.getId().equals(Const.gDTS_DMDOK) && (!doc.field[Const.gDDF_MODUL].equals("") && doc.field[Const.gDDF_MODUL] != null) && (!doc.field[Const.gDDF_MODUL].equals(docTemp.field[Const.gDDF_MODUL]) || !doc.field[Const.gDDF_FUNKTION].equals(docTemp.field[Const.gDDF_FUNKTION]) ) ) { lReturn = Functions.splitModule( d3, doc, docType.getId() ) if( lReturn.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte waehlen Sie ein gültige Modulnummer aus.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Please choose a valid module number.") lReturn = 0 } d3.log.error( "Bitte waehlen Sie eine gültige Modulnummer aus." ) return -170 } else if( lReturn.equals("FEHLERODATA") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else if( lReturn.equals("FEHLERFUNKTION") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else { lReturn = 0 } } //jleu - Wird benötigt für Wertemenge "d3uservalues" if( docType.getId().equals(Const.gDTS_DMARK) || docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_DVEDO) || docType.getId().equals(Const.gDTS_AREME) || docType.getId().equals(Const.gDTS_AMARK) || docType.getId().equals(Const.gDTS_AHAUP) || docType.getId().equals(Const.gDTS_DSCHU) ) { Functions.splitUser(d3, doc); } //Splitten des zusammengesetzten Strings Projektnr, Projektname nach Projektnummer für das Feld Projektnummer if ( docType.getId().equals(Const.gDTS_AMEIS) || docType.getId().equals(Const.gDTS_DPROO) || docType.getId().equals(Const.gDTS_APROJ) ) { if(doc.field[Const.gDDF_PROJNR] != null) { h_projnr = doc.field[Const.gDDF_PROJNR].substring(0,14) doc.field[Const.gDDF_PROJNR] = h_projnr } if( docType.getId().equals(Const.gDTS_APROJ) ) { Functions.setNextProjnr( d3, doc, Const.gDDF_PROJNR, 3, "UPDATE" ) } } // 26.04.2021: Ergänzung des Splits im UpdateEntry // 25.11.2022: imue Ergänzung auch für Dokumentartwechsel if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gLieferantNrID) || Functions.checkIfRepoIDExistsInDocType(d3, docTypeNew, SystemSpecificConst.gLieferantNrID)) { def returnSplitLieferant if(!docType.getId().equals(docTypeNew.getId())) { returnSplitLieferant = Functions.splitLieferant(d3, doc, docTypeNew, user, "update", null); } else { returnSplitLieferant = Functions.splitLieferant(d3, doc, docType, user, "update", null); } if(returnSplitLieferant == -170) { return -170 } } // Split für Buchungskreis nicht mehr notwendig, da wir diese Wertemenge bereits auf Groovy / Schlüssel-Übersetzung // umgestellt haben -> imue 07.08.2019 if( ( !doc.field[Const.gDDF_LNR].equals(docTemp.field[Const.gDDF_LNR]) || !doc.field[Const.gDDF_LNAME].equals(docTemp.field[Const.gDDF_LNAME]) || !doc.field[Const.gDDF_KONTAKTBESCH].equals(docTemp.field[Const.gDDF_KONTAKTBESCH]) || !doc.field[Const.gDDF_LIEFAKTKAT].equals(docTemp.field[Const.gDDF_LIEFAKTKAT]) || !doc.field[Const.gDDF_KONTAKTDATE].equals(docTemp.field[Const.gDDF_KONTAKTDATE]) ) && docType.getId().equals(Const.gDTS_DLONT) && !userName.equals("d3_async") ) { lReturn = Functions.splitLieferantenkontaktbeschreibung(d3, doc, docType); if(lReturn == -170) { return -170; } } // Wenn der nur der Lieferantenname geändert wurde, aber nicht die Lieferantennummer, dann muss die Lieferantennummer geleert werden // da ansonsten aufgrund der führenden Lieferantennummer, der Lieferantename wieder geändert wird (OPG-2055) // - nicht im ValidateUpdateEntry möglich, da dort der alte Eigenschafts-Wert nicht verfügbar ist if( docType.getId().equals(Const.gDTS_ALIKO) && docTemp.field[Const.gDDF_LNR].equals(doc.field[Const.gDDF_LNR]) && !docTemp.field[Const.gDDF_LNAME].equals(doc.field[Const.gDDF_LNAME]) ) { def lLFName = doc.field[Const.gDDF_LNAME] // wenn der Benutzer einen Lieferantennamen manuell eingibt, dann besteht kein |, der returnValue ist null if( lLFName != null ) { lReturn = lLFName.indexOf("|") if( lReturn == -1 ) { doc.field[Const.gDDF_LNR] = "" } } } if( ( !doc.field[Const.gDDF_KNR].equals(docTemp.field[Const.gDDF_KNR]) || !doc.field[Const.gDDF_KNAME].equals(docTemp.field[Const.gDDF_KNAME]) ) && ( docType.getId().equals(Const.gDTS_DKUMA) ) ) { int returnValidateKunden = Functions.validateKunden(d3, doc, docType, user, "update") if(returnValidateKunden == -170) { return -170 } } //Maschinenprojekt: Wenn weder eine Auftrags- noch eine Opportunity-Nr. eingetragen wird, verhindere die Ablage if( docType.getId().equals(Const.gDTS_AKOMM) || docType.getId().equals(Const.gDTS_AKONT) || docType.getId().equals(Const.gDTS_AKUKO) || docType.getId().equals(Const.gDTS_ALIEK) || docType.getId().equals(Const.gDTS_APROR) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DMEOP) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DVERD) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_DMAUF) ) { lReturn = Functions.validateOppProjNr( d3, doc) if( lReturn.equals("WITHOUTPROJOPP") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT012049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT012001) } d3.log.error( "Sie versuchen ein Dokument zu importieren, ohne entweder eine Projekt- oder eine Opportunitynummer eingetragen zu haben. Bitte korrigieren Sie Ihre Eingabe." ) return -170 } else if(lReturn.equals("PROJOPP")) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT013049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT013001) } d3.log.error( "Sie versuchen ein Dokument zu importieren, und haben sowohl eine Projekt- als auch eine Opportunitynummer eingetragen. Bitte korrigieren Sie Ihre Eingabe." ) return -170 } } //Anpassung Jahr und Monat, wenn das Ereignisdatum geändert wurde // dkle 01.02.2016: Erweiterung, nur für Dokumente, nicht für Akten, außer Opportunityakte if( !doc.field[Const.gDDF_ERDATE].equals(docTemp.field[Const.gDDF_ERDATE]) && ( docType.getId().equals(Const.gDTS_AOPPU) || docType.getId().equals(Const.gDTS_DOPPD) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DLONT) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_AMPRA) || docType.getId().equals(Const.gDTS_APREN) || docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASERE) || docType.getId().equals(Const.gDTS_ASEBE) || docType.getId().equals(Const.gDTS_DVERD) ) ) { def lJahr = doc.field[Const.gDDF_ERDATE].toString().substring(0,4) def lMonat = doc.field[Const.gDDF_ERDATE].toString().substring(5,7) doc.field[Const.gDDF_JAHR] = lJahr doc.field[Const.gDDF_MONAT] = lMonat } // Wenn Angebotsversion geschlossen, darf nicht eine neue Angebotsversion erstellt werden (Ja mit Dokumenten, Ja ohne Dokumente) // 06.03.2023 imue: Anpassungen aufgrund Änderungen Quicktag.dxp if( docType.getId().equals(Const.gDTS_AREGI) && doc.field[Const.gDDF_ANNEU] != null && !doc.field[Const.gDDF_ANNEU].equals(docTemp.field[Const.gDDF_ANNEU]) && ( doc.field[Const.gDDF_ANNEU].toString().startsWith("Ja, mit Dokumenten") || doc.field[Const.gDDF_ANNEU].toString().startsWith("Ja, ohne Dokumente") ) ) { def lANState = doc.field[Const.gDDF_ANSTATUS] if( lANState != null && lANState.toString().startsWith("geschlossen") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Die Angebotsnummer, die Sie erstellen moechten existiert bereits. Bitte waehlen Sie für die Neuanlage die hoechste Angebotsnummer.") } else { d3.hook.setProperty("additional_info_text", "The offer number you want to create already exists. Please choose the latest offer number for to create a new folder.") } d3.log.error( "Die Angebotsnummer, die Sie erstellen moechten existiert bereits. Bitte waehlen Sie für die Neuanlage die hoechste Angebotsnummer." ) return -170 } } if( ( docTypeNew.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMDOK) || docTypeNew.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DPRST) || docTypeNew.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DLIKO) ) && !doc.field[Const.gDDF_NPN].equals(docTemp.field[Const.gDDF_NPN]) ) { InvalidData = 0 InvalidData = Functions.validateNetzPSP(d3, doc) if( InvalidData != 0 ) { // Der additional_info_text wird in der Funktion "validateNetzPSP" gesetzt return -170 } } // ECR-Dokumente und Ergebnisdokument dürfen nicht in genehmigte ECRs importiert werden. if ( docType.getId().equals(Const.gDTS_DMECR) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && !userName.equals("d3_async") && (doc.field[Const.gDDF_ARCDOCID].equals("") || doc.field[Const.gDDF_ARCDOCID] == null) ) { int resultValidateErgebnisdokumente = Functions.validateErgebnisdokumenteECR(d3, doc, user) if( resultValidateErgebnisdokumente == -170) { return -170 } } // Hier wurde in JPL die Mustermaterialnummer (jedoch Einfachfeld) gesplittet. // Da es dieses nicht mehr gibt und das Mehrfachfeld im unterem Verlauf gesplittet wird, // kann es hier in Groovy entfernt werden. 12.08.2019 int returnvalueMM = Functions.validateMustermaterialNr(d3, doc, docTemp, docType, "Update") if(returnvalueMM == -170) { return -170; } if( docType.getId().equals(Const.gDTS_DMEOP) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DOPPD) ) { // d3.log.error( "Multi Field" ) for (int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( (!doc.field[Const.gDDF_MUSTERMATNR69][i].equals("") && doc.field[Const.gDDF_MUSTERMATNR69][i] != null) && !doc.field[Const.gDDF_MUSTERMATNR69][i].equals(docTemp.field[Const.gDDF_MUSTERMATNR69][i]) ) { // d3.log.error( "pDocTypeShort: ${docType.getId()} Mustermaterial Mehrfachfeld 60: ${:(doc.field[Const.gDDF_MUSTERMATNR69][i]})") String[] splittedString = doc.field[Const.gDDF_MUSTERMATNR69][i].split(" \\| ") lReturn = splittedString.size() if( lReturn == 2 ) { def convertedString = splittedString[0].trim() doc.field[Const.gDDF_MUSTERMATNR69][i] = convertedString // d3.log.info( "Eingabe: dok_dat_feld[{$Const.gDDF_MUSTERMATNR}]: ${doc.field[Const.gDDF_MUSTERMATNR]})\"" ) } lReturn = Functions.validateSAPMaterialNo( d3, doc, doc.field[Const.gDDF_MUSTERMATNR69][i] ) if( lReturn.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT004049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT004001) } d3.log.error( "Bitte waehlen Sie eine gültige Mustermaterialnummer aus." ) return -170 } } } } //Vererbung der Angebotsnummer auf die Dokumente einer Angebotsversion if ( docType.getId().equals(Const.gDTS_AREGI) ) { // dkle: 2017-11-13 Da die Verknüpfung vor dem Exit Hook gelöst wird müssen die Children früher ermittelt werden. // Ziel ist die Vererbung von Attributen String[] linkedChildren = d3.call.link_get_children(doc.id(), "d3groovy" ) // Initialisierung des Arrays in den Const gAREGIChild = new ArrayList<>() // d3.log.error( "Es wurden ${lReturn} Children gefunden" ) if ( linkedChildren.size() > 0 ) { for( int i=0; i < linkedChildren.size(); i++) { def linkedChildrenTemp = linkedChildren.getAt(i) gAREGIChild.add(linkedChildrenTemp) } } } // Das Attribut "Akte" wird im Maschinenprojekt bis auf die Ausnahme ECR automatisch anhand der Dokumentgruppe und der Dokumentart (Anwendungsfall) ermittelt // 25.07.2016/dkle: Anpassung auf die neuen Dokumentgruppen von ECR // 25.11.2022 imue: Ausführung muss auch bei Dokumentartänderung funktionieren if( ( docType.getId().equals(Const.gDTS_DMAUF) || docTypeNew.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMDOK) || docTypeNew.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docTypeNew.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docTypeNew.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMECR) || docTypeNew.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_DLIMA) || docTypeNew.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) || docTypeNew.getId().equals(Const.gDTS_DKUMA)) && ( !doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_ECRChangeOrder) && !doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && (doc.field[Const.gDDF_SUBJECT].equals("") || doc.field[Const.gDDF_SUBJECT] == null) ) ) { lDokGroup = doc.field[Const.gDDF_DOKGROUP] def lProcess = doc.field[Const.gDDF_PROZESS] if ( docType.getId().equals(Const.gDTS_DPRST) && !lProcess.equals("")) { lAndClause = "and dok_dat_feld_${Const.gDDF_PROZESS} = '${lProcess}' " } else { lAndClause = "" } // 31.07.2017 Hinweis: Hier kann nur ein Wert zurückkommen, da es eine fachlich gepflegte administrative Akte ist. // 25.11.2022 imue: Bei Dokumentartänderung muss die neue Doumentart zur Ermittlung genommen werden def sqlStatement if(!docType.getId().equals(docTypeNew.getId())) { sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_SUBJECT} as lSubject " + "FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_REGISTER} = '${lDokGroup}' " + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${docTypeNew.getId()}' " + "AND kue_dokuart = '${Const.gDTS_AAFOL}' ${lAndClause} " } else { sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_SUBJECT} as lSubject " + "FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_REGISTER} = '${lDokGroup}' " + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${docType.getId()}' " + "AND kue_dokuart = '${Const.gDTS_AAFOL}' ${lAndClause} " } def sqlResult = d3.sql.executeAndGet(sqlStatement) if(sqlResult.size() > 0) { lSubject = sqlResult.getAt(0).get("lSubject") } // Der Wert "Projektorganisation" darf nicht gesetzt werden, im Code wird bei dieser Bedingung das Feld immer geleert if(lSubject.equals("Projektorganisation")) { } else { doc.field[Const.gDDF_SUBJECT] = lSubject } } //Maschinenprojekt Prototyp 4: Wenn beim Import die Dokumentgruppe Medien gewählt wurde, aber das Feld Akte leer ist, gib einen Fehler aus if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) && doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && ( doc.field[Const.gDDF_SUBJECT] == null || doc.field[Const.gDDF_SUBJECT].equals("") ) ) { // dkle, 02.02.2016 additional infotext eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe") } else { d3.hook.setProperty("additional_info_text", "You try to update an document as Medien without choosing a folder. Please correct your input.") } d3.log.error( "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe" ) return -170 } else if ( docType.getId().equals(Const.gDTS_DPRST) && doc.field[Const.gDDF_SUBJECT].equals(Const.gAK_Projektorganisation) ) { doc.field[Const.gDDF_SUBJECT] = "" } //Splitte für alle Dokument- und Aktenarten zur Opportunity das Erstelldatum wenn nicht leer und schreibe die Werte in Jahr und Monat // dkle, 02.02.2016 Dies gilt für alle Dokumentarten, sowie die Opportunityakte. Andernfalls wird im Insert Entry das Jahr/Monat anhand des aktuellen Datums ermittelt if( (!doc.field[Const.gDDF_ERDATE].equals("") && doc.field[Const.gDDF_ERDATE] != null) && ( docType.getId().equals(Const.gDTS_AOPPU) || docType.getId().equals(Const.gDTS_DOPPD) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DLONT) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DVERD) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_AMPRA) || docType.getId().equals(Const.gDTS_APREN) || docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_ASERE) || docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) || docType.getId().equals(Const.gDTS_SAPDO) ) ) { def lJahr = doc.field[Const.gDDF_ERDATE].toString().substring(0,4) def lMonat = doc.field[Const.gDDF_ERDATE].toString().substring(5,7) doc.field[Const.gDDF_JAHR] = lJahr doc.field[Const.gDDF_MONAT] = lMonat } // Angebotsdokumente: Angebot_Nr in den Zusatztitel einfügen, wenn die Angebot_Nr nicht "Neue" oder "9999" ist if( docType.getId().equals(Const.gDTS_DOPPD) ) { Functions.setAdditionalTitle(d3, doc); } //Prüfung des ausgewählten Lieferanten bei der Ablage if( !userName.equals("d3_async") && !userName.equals("hostimp") && ( docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_ALONT) || docType.getId().equals(Const.gDTS_DLIMA) ) ) { lReturn = Functions.validateLiefName( d3, doc, "Update") if( lReturn.equals("OK") ) { // Es handelt sich um einen validen Wert } else if ( lReturn.equals("Fehler") ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT016049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT016001) } d3.log.error( "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." ) return -170 } // Validierung der Lieferantennummer (nur bei gDTS_ALIKO) - OPG-2105 - updateAttribEntry20 lReturn = Functions.validateLiefNum( d3, doc, "Update" ) if( lReturn.equals("OK") ) { // Es handelt sich um einen validen Wert } else if ( lReturn.equals("Fehler") ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT016049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT016001) } d3.log.error( "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." ) return -170 } } // Wenn es sich um ein Ergebnisdokument handelt und ein Angebotsdokument ist, muss die übergeordnete Angebotsversion "in Arbeit" sein. if( docType.getId().equals(Const.gDTS_DOPPD) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && doc.field[Const.gDDF_ARCDOCID] == null ) { lReturn = Functions.validateErgebnisdokumenteAngebot(d3, doc, user); if(lReturn == -170) { return -170; } } if( docType.getId().equals(Const.gDTS_APROJ) ) { for( int hCount60=1; hCount60 <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); hCount60++) { // d3.log.error("Ich bin in Runde ${hCount60} mit Benutzer ${doc.field[Const.gDDF_PROJBER][hCount60]} ") if( !doc.field[Const.gDDF_PROJBER][hCount60].equals(docTemp.field[Const.gDDF_PROJBER][hCount60]) && (doc.field[Const.gDDF_PROJBER][hCount60] != null) ) { for(int lExist=1; lExist <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); lExist++) { if ( doc.field[Const.gDDF_PROJBER][hCount60].equals(docTemp.field[Const.gDDF_PROJBER][lExist]) ) { // d3.log.error("Der neue Benutzer ${doc.field[Const.gDDF_PROJBER][hCount60]} und der alte ${docTemp.field[Const.gDDF_PROJBER][lExist]}") if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT018049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT018001) } d3.log.error( "Der Benutzer ist bereits als Projektbeteiligter in diesem Organisationsprojekt hinterlegt." ) return -170 } } } } } } // Ende von !SAP_DO try { // IMUE 05.03.2019 - Ergänzung für Massenänderungen ("Einzeländerung" befindet sich im ValidateUpdateEntry10) def lApiIdTemp = d3.remote.getVersion()[0..2]; if(lApiIdTemp.equals('231')) { d3.log.info(" ## Start Massenänderung - updateAttribEntry20 - ${docType.getId()}") // Splitten des zusammengesetzten String Opportunity-Nummern (Mehrfachfeld Opportunitydokumente) und Submission nach Opportunitynummer def returnOpp = Functions.splitOpportunityMehrf(d3, doc, docType); } } catch(Exception e) { d3.log.info("updateAttribEntry20 - lApiIdTemp konnte nicht ermittelt weden") } //Splitten der zusammengesetzten Strings Projektnummer und Submission nach Projektnummer def returnProj = Functions.splitProjektnummer(d3, doc, docType); // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung Functions.splitServSrId(d3, doc, docType); int resultCheckSrId = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereSRIDID); if(resultCheckSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "SR_ID in Zeile ${resultCheckSrId} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "SR_ID in line ${resultCheckSrId} exists multiple") } return -170; } int resultValidateSrId = Functions.validateSrId(d3, doc); if(resultValidateSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere SR_ID in Zeile ${resultValidateSrId} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further SR_ID in line ${resultValidateSrId} ") } return -170; } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) ) { Functions.splitServBelegnummer(d3, doc, docType); int resultCheckBelegNr = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } int resultValidateBelegNr = Functions.validateBelegNr(d3, doc); if(resultValidateBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere Belegnummer in Zeile ${resultValidateBelegNr} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further actitivy no in line ${resultValidateBelegNr} ") } return -170 } if( doc.field[Const.gDDF_BELEGTYP] == null ) { String belegNrTemp = doc.field[Const.gDDF_BELEGNUMMER]; String sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as belegTyp FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${belegNrTemp}' " + "AND kue_dokuart = '${Const.gDTS_ASEBE}' "; List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null && sqlResult.size() > 0) { String lBelegTyp = sqlResult.getAt(0).get("belegTyp"); if( lBelegTyp != null && !lBelegTyp.equals("") && docType.getId().equals(Const.gDTS_DSEBE) ) { doc.field[Const.gDDF_BELEGTYP] = lBelegTyp; } } } } // imue: Validierung doppelter Einträge für weitere Belegnummer Einkauf if( docType.getId().equals(Const.gDTS_DEINK) ) { int resultCheckBelegNr = Functions.checkPurchaseNr(d3, doc, SystemSpecificConst.gWeitereEinkaufBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } } // imue: Validierung der Belegart für den Service if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegNrID) && Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegArtID)) { Functions.validateBelegart(d3, doc); } // imue: Validierung der Belegart für den Einkauf if(Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEinkaufsBelegNrID)) { Functions.validateBelegart(d3, doc); } // imue 26.08.2020 - Ergänzung für Equipment if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "UPDATE"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, true); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment Zeile ${resultValidateEquipment} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further equipment in line ${resultValidateEquipment} ") } return -170; } } if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "UPDATE"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, false); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipment") } return -170; } } // imue 12.12.2022 if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentsID) == true ) { Functions.splitEquipments(d3, doc, docType); int resultValidateEquipment = Functions.validateEquipments(d3, doc, user); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipments prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipments") } return -170; } } // Splitten der weiteren Kundenummer und weiteren Lieferantennummer if( docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) { Functions.validateWeitKundLiefNo(d3, doc, docType); } // 17.01.2023 - Neue Validierung der Materialnummer if(doc.getType().getId().equals(Const.gDTS_DMATE) && doc.field[Const.gDDF_MATERIALNUMMER] != null) { String returnValueMatNo = Functions.validateMaterialNum(d3, doc); if(returnValueMatNo != null && returnValueMatNo.equals("ERROR")) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte geben Sie eine Material_Nr ein, zu der bereits eine Materialakte existiert."); } else { d3.hook.setProperty("additional_info_text", "Please enter a material no. for which a mertial file already exists."); } return -170; } } return 0 } @Entrypoint( entrypoint = "hook_upd_attrib_exit_20" ) public int updAttribExit20(D3Interface d3, Document doc, Integer errorCode, User user, DocumentType docType, DocumentType docTypeOld, Document gOldDoc) { //proc updateAttribExit20(pDocId, pError, pUser, pDocTypeShort, pDocTypeShortOld) def lCnt = 0 def lRetCode def lRetcode2 def lReturn def lRetVal def lRowCount def userName = "" if(user != null) { userName = user.id(); } d3.log.info("updAttribExit20 Ausführung für Document ${doc.id()} mit User - " + userName); // siehe globale Variable (alte Dokumenteigenschaften ansonsten im Exit nicht zur Verfügung) Document docTemp = gOldDoc; if( docType.getId().equals(Const.gDTS_AHAUP) ) { for(int i=1; i<=Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( !doc.field[Const.gDDF_TEILVOBEZGEN][i].equals(gOldDoc.field[Const.gDDF_TEILVOBEZGEN][i]) ) { def sqlStatement = "SELECT doku_id FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ATEIL}' AND dok_dat_feld_${Const.gDDF_TEILVONR} = '${doc.field[Const.gDDF_TEILVONRM][i]}'"; List sqlResult = d3.sql.executeAndGet(sqlStatement); if( sqlResult != null && sqlResult.size() == 1 ) { Document docChild = d3.archive.getDocument(sqlResult.getAt(0).get("doku_id")); docChild.field[Const.gDDF_TEILVOBEZ] = doc.field[Const.gDDF_TEILVOBEZGEN][i] try { docChild.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docChild.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } Functions.setMainfolder(d3, doc); } if( !docType.getId().equals(Const.gDTS_SAPDO) ) { d3.log.info("Start proc updateAttribExit20 - pDocId = ${doc.id()}, pError = ${errorCode}, pUser = ${userName}, pDocTypeShort = ${docType.getId()} " ) //imue 09.08.2021 Dossier if( docType.getId().equals(Const.gDTS_DOSSI) ) { Functions.splitDossierValue(d3, doc, docType, "UPDATEEXIT") } //jleu 18.01.2017 Schulungsdokumentation if( docType.getId().equals(Const.gDTS_DSCHU) ) { //Die Funktion erstellt eine sucheschulungattr.html Datei //die auf den d.3one Server der jeweiligen Umgebung nach c:\inetpub\wwwroot kopiert werden muss //Die Datei sucheschulungattr.html stellt eine Suche über Werte aus der Dokumtart Schulungsdokumentation bereit. Functions.createSearchHTML( d3, doc) } //Ende Schulungsdokumentation //Aufruf der Funktion für die Anlage der Unterakten für Arbeitspakete und Meilensteine // 31.07.2017 Weshalb werden Attribute in einem Exit Hook aktualisiert? if( docType.getId().equals(Const.gDTS_APROJ) ) { def projNr = doc.field[Const.gDDF_PROJNR]; def oldProjNr = gOldDoc.field[Const.gDDF_PROJNR]; if( !doc.field[Const.gDDF_PROJNR].equals(gOldDoc.field[Const.gDDF_PROJNR]) ) { if(doc.field[Const.gDDF_PROJNR] != null) { def lProjNr = doc.field[Const.gDDF_PROJNR].substring(0,11) doc.field[Const.gDDF_PROJEKTKLAMMER] = lProjNr try { doc.updateAttributes(userName, true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } lRetCode = d3.call.document_send_to_dsearch( doc.id(), "", 0, "", false, "Fr", 0, "d3groovy") Functions.inheritOrgProjAttributes( d3, doc, gOldDoc, user, oldProjNr ) } } else { Functions.inheritOrgProjAttributes( d3, doc, gOldDoc, user, projNr ) } } //jleu - Aufruf der Aktualisierung von Teamsitzungsakten if( docType.getId().equals(Const.gDTS_AREME) ) { if( !doc.field[Const.gDDF_CASE].equals(gOldDoc.field[Const.gDDF_CASE]) ) { // erst alle Akten aktualisieren def sqlStatement = "SELECT doku_id FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AVODA}' AND dok_dat_feld_${Const.gDDF_CASE} = '${gOldDoc.field[Const.gDDF_CASE]}'"; List sqlResult = d3.sql.executeAndGet(sqlStatement); if( sqlResult != null ) { for( GroovyRowResult grr: sqlResult ) { Document docTempUpdate = d3.archive.getDocument(grr.get("doku_id")) docTempUpdate.field[Const.gDDF_CASE] = doc.field[Const.gDDF_CASE] try { docTempUpdate.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTempUpdate.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } // danach die Dokumente aktualisieren def sqlStatementDoc = "SELECT doku_id FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DABTE}' AND dok_dat_feld_${Const.gDDF_CASE} = '${gOldDoc.field[Const.gDDF_CASE]}'"; List sqlResultDoc = d3.sql.executeAndGet(sqlStatementDoc); if( sqlResultDoc != null ) { for( GroovyRowResult grr: sqlResultDoc ) { Document docTempUpdate = d3.archive.getDocument(grr.get("doku_id")) docTempUpdate.field[Const.gDDF_CASE] = doc.field[Const.gDDF_CASE] try { docTempUpdate.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTempUpdate.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } } //jleu - 18.10.2017 Aufruf der Aktualisierung von vertraulichen Vorgangsakten if( docType.getId().equals(Const.gDTS_AVEVO) ) { if( !doc.field[Const.gDDF_CASE].equals(gOldDoc.field[Const.gDDF_CASE]) ) { def sqlStatement = "SELECT doku_id as DokuId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DVEDO}' AND dok_dat_feld_${Const.gDDF_CASE} = '${gOldDoc.field[Const.gDDF_CASE]}'"; List sqlResult = d3.sql.executeAndGet(sqlStatement); if( sqlResult != null ) { for( GroovyRowResult grr: sqlResult ) { Document docTempUpdate = d3.archive.getDocument(grr.get("DokuId")) docTempUpdate.field[Const.gDDF_CASE] = doc.field[Const.gDDF_CASE] try { docTempUpdate.updateAttributes("d3groovy", true) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTempUpdate.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } } //Aufruf der Aktualisierung zum Projektstatus durch Arbeitspaketphase if( docType.getId().equals(Const.gDTS_AMEIS) ) { def msap = doc.field[Const.gDDF_MSAPS]; def msapold = gOldDoc.field[Const.gDDF_MSAPS]; if( !doc.field[Const.gDDF_MSAPS].equals(gOldDoc.field[Const.gDDF_MSAPS]) ) { def sqlStatement = "SELECT doku_id as DokuId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DPROO}' AND dok_dat_feld_${Const.gDDF_MSAPS} = '${gOldDoc.field[Const.gDDF_MSAPS]}'"; List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null) { for( GroovyRowResult grr : sqlResult ) { Document docTempUpdate = d3.archive.getDocument(grr.get("DokuId")) docTempUpdate.field[Const.gDDF_MSAPS] = doc.field[Const.gDDF_MSAPS] try { docTempUpdate.updateAttributes("d3groovy", false) } catch( Exception e ) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docTempUpdate.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } } //Änderung der Attribute Submission und Hauptopportunity für alle Akten und Dokumente wenn die Werte auf der Opportunityakte geändert werden if( docType.getId().equals(Const.gDTS_AOPPU) ) { Functions.inheritOppAttr( d3, doc, gOldDoc, user ) } //Anpassung der Ergebnisdokumente, wenn ein neues Angebot erstellt werden soll // 06.03.2023 imue: Anpassungen aufgrund Änderungen Quicktag.dxp if( docType.getId().equals(Const.gDTS_AREGI) && (doc.field[Const.gDDF_ANNEU] != null && (doc.field[Const.gDDF_ANNEU].toString().startsWith("Ja, mit Dokumenten") || doc.field[Const.gDDF_ANNEU].toString().startsWith("Ja, ohne Dokumente"))) ) { def lAnAlt = doc.field[Const.gDDF_OPPANNr] def lAnNeu = doc.field[Const.gDDF_ANNEU] //Erstelle eine neue Angebotsakte und kopiere die angebotsrelevanten Dokumente lRetcode2 = Functions.createNewOffer( d3, doc) //Rufe diese Funktion auf, wenn auch Dokumente kopiert werden sollen if( lAnNeu != null && lAnNeu.toString().startsWith("Ja, mit Dokumenten") ) { lRetCode = Functions.copyOfferDocuments( d3, doc, lRetcode2) // Mache aus Ergebnisdokumenten keine Ergebnisdokumente wenn ein neues Angebot erstellt werden soll // Achtung: Wenn folgende Funktion ausgeführt wird (Update des Dokumentes) wird der Aktenplan ausgeführt // daher ist zwingend erforderlich: Angebotsdokumente -> Angebotsversion "Nur Verknüpfungen die durch diese Regel erstellt wurden löschen", // da ansonsten die komplette Verbindung der untereinander verknüpften Angebotsdokumente verloren geht! lRetCode = Functions.updResultDoc(d3, doc) } } //Vererbung der Angebotsnummer auf die Dokumente einer Angebotsversion if( docType.getId().equals(Const.gDTS_AREGI) ) { // Prüfung ob sich die Opportunity-Nummer überhaupt geändert hat if(doc.field[Const.gDDF_OPPANNr] != null && gOldDoc != null && gOldDoc.field[Const.gDDF_OPPANNr] != null && !doc.field[Const.gDDF_OPPANNr].equals(gOldDoc.field[Const.gDDF_OPPANNr])) { Functions.inheritOfferNo(d3, doc, gOldDoc, gAREGIChild, user) // nach Verwendung muss das Array wieder geleert werden while(gAREGIChild.size() > 0) { gAREGIChild.remove(0); } } } //Wenn eine weitere Opportunity Nummer in das Mehrfachfeld eingetragen wird, schaue ob es diese Link Datei gibt //ansonsten lege eine neue an if( docType.getId().equals(Const.gDTS_DOPPD) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DVERD) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_DEQUI) || docType.getId().equals(Const.gDTS_DEINK)) { Functions.checkForLinkFiles(d3, doc, docType, docTemp); } //Änderung des Attributs Angebotsname für alle Akten und Dokumente wenn die Werte auf dem Angebotsvorgange geändert werden if( docType.getId().equals(Const.gDTS_AUNTE) && ( docTemp != null && !doc.field[Const.gDDF_ANNAME].equals(docTemp.field[Const.gDDF_ANNAME]) ) ) { Functions.inheritANNameNew( d3, doc, user ) } /* 04.11.2019 Funktion wird bereits durch inheritOppAttr abgedeckt else if( docType.getId().equals(Const.gDTS_AUNTE) && ( !doc.field[Const.gDDF_HAUPTOPP].equals(docTemp.field[Const.gDDF_HAUPTOPP]) || !doc.field[Const.gDDF_SALESGROUP].equals(docTemp.field[Const.gDDF_SALESGROUP]) || !doc.field[Const.gDDF_STATUS].equals(docTemp.field[Const.gDDF_STATUS]) || !doc.field[Const.gDDF_SUBMISSION].equals(docTemp.field[Const.gDDF_SUBMISSION]) || !doc.field[Const.gDDF_PROZESS].equals(docTemp.field[Const.gDDF_PROZESS]) || !doc.field[Const.gDDF_KNR].equals(docTemp.field[Const.gDDF_KNR]) || \ !doc.field[Const.gDDF_KNAME].equals(docTemp.field[Const.gDDF_KNAME]) || !doc.field[Const.gDDF_BUCHKREIS].equals(docTemp.field[Const.gDDF_BUCHKREIS]) || \ !doc.field[Const.gDDF_OPPNUMMER].equals(docTemp.field[Const.gDDF_OPPNUMMER]) ) ) { // Anpassung 24.10.2017 Vererbung der Attribute des Angebotsvorgangs auf die Angebotsversionen und Angebotsdokumente // Vorbereitung: hier muss weiteres vererbt werden! // get children für AUNTE -> Ergebnis 1-n AREGI // DokuIds und Dokumentart speichern // get children für AREGI -> Ergebnis 1-n DOPPD // DokuIds und Dokumentart speichern // Vererbungsarray durchlaufen, neue Informationen vererben def lChildCount1 def lChildArrCount2 String[] lChildArray1 String[] lChildArray2 // get children für AUNTE -> Ergebnis 1-n AREGI lChildArray1 = d3.archive.link_get_children( doc.id(), "d3groovy") lChildCount1 = lChildArray1.size() // get children für AREGI -> Ergebnis 1-n DOPPD lChildArrCount2 = 1 for(int lChildCount2=0; lChildCount2 < lChildCount1; lChildCount2++) { lChildArray2 = d3.archive.link_get_children( lChildArray1[lChildCount2], "d3groovy") lChildArrCount2 = lChildArray2.size() } // Kontrolle nach dem Durchlauf for(int lCount=0; lCount < lChildArrCount2; lCount++) { // d3.log.error( "Start inheritOPPValues lChildArray1[${lCount}]: ${lChildArray1[lCount]}" ) Functions.inheritOPPValues( d3, lChildArray1[lCount], doc.id() ) } for(int lCount=0; lCount < lChildArrCount2; lCount++) { // d3.log.error( "Start inheritOPPValues lChildArray2[${lCount}]: ${lChildArray2[lCount]}" ) Functions.inheritOPPValues( d3, lChildArray2[lCount], doc.id() ) } } */ //Änderung der Attribute Kundenname und Kundennummer bei Änderung auf der Opportunityakte if( docType.getId().equals(Const.gDTS_AOPPU) && ( docTemp != null && !doc.field[Const.gDDF_KNR].equals(docTemp.field[Const.gDDF_KNR]) ) ) { Functions.inheritKInfoNew(d3, doc, user) } // -------------------------------------------------------------- // ######## Anpassung zum Prototyp für Maschinenprojekte ######## // -------------------------------------------------------------- if( docType.getId().equals(Const.gDTS_AMPRA) && docTemp != null && !doc.field[Const.gDDF_BASEOPP].equals(docTemp.field[Const.gDDF_BASEOPP]) && (!doc.field[Const.gDDF_BASEOPP].equals("") && doc.field[Const.gDDF_BASEOPP] != null) ) { def lBaseOpp = doc.field[Const.gDDF_BASEOPP] def lOrderNo = doc.field[Const.gDDF_AUFTRNR] //... und verknüpfe die Ergebnisdokumente in die Maschinenprojektakte Functions.copyResultDocs( d3, doc, lBaseOpp, lOrderNo ) } //Anpassung phoer 05.10.2016: 26.07.2016/dkle: Maschinenprojekt Wenn der Status der Unterakte ECR auf "Genehmigung" steht soll eine Dublette alle Ergebnisdokumente in die Dokumentart DMSPE kopiert werden. if( docType.getId().equals(Const.gDTS_AMECR) && docTemp != null && !doc.field[Const.gDDF_ECRSTATUS].equals(docTemp.field[Const.gDDF_ECRSTATUS]) && doc.field[Const.gDDF_ECRSTATUS].equals("E0003") && !userName.equals("d3_async") ) { def lActID = doc.field[Const.gDDF_AKTIVITAETSID] def lOrderID = doc.field[Const.gDDF_AUFTRNR] Functions.copyApprovedECR( d3, lActID, lOrderID, "" ) } if(docTemp != null) { if( !doc.field[Const.gDDF_AKTIVITAETSID].equals(docTemp.field[Const.gDDF_AKTIVITAETSID]) && docType.getId().equals(Const.gDTS_AMECR) ) { List lChildID = new ArrayList<>(); def lChildCount def lActID def sqlStatement = "SELECT pd.doku_id as lChildID " + "FROM phys_datei as pd, firmen_spezifisch as fs " + "WHERE fs.doku_id = pd.doku_id " + "AND fs.kue_dokuart = '${Const.gDTS_DMECR}' " + "AND fs.dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${docTemp.field[Const.gDDF_AKTIVITAETSID]}' " + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' " List sqlResult = d3.getSql().executeAndGet(sqlStatement) lChildCount = sqlResult.size() for(GroovyRowResult grr : sqlResult) { lChildID.add(grr.get("lChildID")) } if( lChildCount > 0 ) { lActID = doc.field[Const.gDDF_AKTIVITAETSID] for(int lCount=0; lCount < lChildCount; lCount++) { try { Document docChild = d3.archive.getDocument(lChildID.get(lCount), "d3groovy") docChild.field[Const.gDDF_AKTIVITAETSID] = lActID docChild.updateAttributes("d3groovy", true) } catch(Exception e) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docChild.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) d3.log.error("Fehler bei der Aktualisierung des ECR/Change Order Dokuments bei Änderung der Unterakte ECR/Change Order. Dokument ID: :(lChildID[lCount])") } // d3.log.error( "Aktivitäts-ID vererben, Kind Nummer ${lCount} bearbeitet ${doc.field[Const.gDDF_AKTIVITAETSID]})" ) } } } } if(docTemp != null) { // dkle, 01.02.2016 Bei Aktualisierung der Opportunityakten und wenn sich der Status ändert soll der Aktenplan für alle children ausgeführt werden. // entfernt, in Funktion inheritOppAttr aufgenommen // phoer 20160823: Wenn beim Update der Maschinenprojektdokumente das Zuordnung Kundenkontakt geändert wurde... if( ( docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) ) && !doc.field[Const.gDDF_MAPPCUSTACTION].equals(docTemp.field[Const.gDDF_MAPPCUSTACTION]) && (!doc.field[Const.gDDF_MAPPCUSTACTION].equals("") && doc.field[Const.gDDF_MAPPCUSTACTION] != null) ) { //...rufe die Funktion zum Kopieren des Dokuments auf, damit es in die Kundenkontaktakte importiert wird String subMappCustAction = ""; if(doc.field[Const.gDDF_MAPPCUSTACTION] != null && doc.field[Const.gDDF_MAPPCUSTACTION].toString().size() >= 7) { subMappCustAction = doc.field[Const.gDDF_MAPPCUSTACTION].substring(0,7); } if( !subMappCustAction.equals("bereits") ) { Functions.copyCustAction( d3, doc, doc.field[Const.gDDF_MAPPCUSTACTION] ); } } } //Änderung der Attribute, wenn die Maschinenprojektakte sich in SAP geändert hat if( docType.getId().equals(Const.gDTS_AMPRA) || docType.getId().equals(Const.gDTS_APREN) ) { // 20.07.202 Optimierung: Es muss nur in die Funktion eingestiegen werden, wenn sich relevante Eigenschaften geändert haben if( Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNAME) == true || Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNR) == true || Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_STATUS) == true || Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SUBMISSION) == true || Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SALESGROUP) == true || Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS68) == true ) { Functions.inheritMProjAttributes( d3, doc, gOldDoc, user ); } } if( docType.getId().equals(Const.gDTS_AKONT) ) { Functions.inheritAkontAttributes(d3, doc, gOldDoc, user); } if( docType.getId().equals(Const.gDTS_ALIKO) ) { // Zur Aktualisierung der Dokumente -> Akte markieren für die Verarbeitung im Skript CheckMassDataChanged! try { String ddfValueChanged = null; // Lieferantennummer boolean liefNrChanged = Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_LNR); if(liefNrChanged == true) { if(ddfValueChanged == null) { ddfValueChanged = String.valueOf(Const.gDDF_LNR); } else { ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_LNR); } } // Lieferantenname boolean liefNameChanged = Functions.checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_LNAME); if(liefNameChanged == true) { if(ddfValueChanged == null) { ddfValueChanged = String.valueOf(Const.gDDF_LNAME); } else { ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_LNAME); } } if(ddfValueChanged != null) { // Ermittlung der bisherigen Einträge String sqlStatementMdc = "SELECT doc_id FROM mass_data_change WHERE doc_id = '${doc.id()}' " List sqlResultMdc = d3.sql.executeAndGet(sqlStatementMdc); int indexCounter = sqlResultMdc.size(); if(indexCounter == 0) { String sqlStatementMdcInsert = "INSERT INTO mass_data_change (doc_id, field_name, field_index, field_value) VALUES ('${doc.id()}', 'MDC-ALIKO', 1, '${ddfValueChanged}') "; int returnValue = d3.sql.execute(sqlStatementMdcInsert); } else if(indexCounter >= 1) { indexCounter = indexCounter + 1; String sqlStatementMdcInsert = "INSERT INTO mass_data_change (doc_id, field_name, field_index, field_value) VALUES ('${doc.id()}', 'MDC-ALIKO', ${indexCounter}, '${ddfValueChanged}') "; int returnValue = d3.sql.execute(sqlStatementMdcInsert); } } } catch(Exception e) { d3.log.error("Error Functions inheritAkontAttributes - Akte ${doc.id()} konnte nicht in die Tabelle mass_data_change ergänzt werden: " + e); } } // Vererbung der Erkennungsattribute if( docType.getId().equals(Const.gDTS_ALONT) && (!doc.field[Const.gDDF_LNR].equals(gOldDoc.field[Const.gDDF_LNR]) || !doc.field[Const.gDDF_LIEFAKTKAT].equals(gOldDoc.field[Const.gDDF_LIEFAKTKAT]) || !doc.field[Const.gDDF_KONTAKTDATE] != gOldDoc.field[Const.gDDF_KONTAKTDATE] || !doc.field[Const.gDDF_KONTAKTBESCH].equals(gOldDoc.field[Const.gDDF_KONTAKTBESCH]) ) ) { def returninheritLiefAttrib = Functions.inheritLiefAttrib(d3, doc, docType, userName, gOldDoc); } if( docType.getId().equals(Const.gDTS_AKUND) && docTemp != null && !doc.field[Const.gDDF_KNAME].equals(docTemp.field[Const.gDDF_KNAME]) ) { if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { d3.log.info("Functions updUpdateExit20 AKUND Verarbeitung JPL Asynchron"); try { d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); d3.call.d3async_job_set_attribute("hook_function", "gyInheritKundenname", 0); d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); d3.call.d3async_job_set_attribute("custom_job_par[2]", String.valueOf(Const.gDDF_KNR), 0); d3.call.d3async_job_set_attribute("custom_job_par[3]", docTemp.field[Const.gDDF_KNR], 0); d3.call.d3async_job_close(); } catch(Exception e) { String noticeHoldfile = "UPD-Job konnte nicht erstellt werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) d3.log.error("UPD-Job konnte nicht erstellt werden = " + e); } } else { d3.log.info("Functions updUpdateExit20 AKUND Verarbeitung Asynchron"); def sqlStatement = "SELECT doku_id as dokuId FROM firmen_spezifisch WHERE dok_dat_feld_${Const.gDDF_KNR} = '${docTemp.field[Const.gDDF_KNR]}'" List sqlResult = d3.getSql().executeAndGet(sqlStatement) Map attribUpdate = new HashMap<>(); attribUpdate.put(Const.gDDF_KNAME, doc.field[Const.gDDF_KNAME]); List docIds = new ArrayList<>(); for(GroovyRowResult grr : sqlResult) { docIds.add(grr.get("dokuId")); } Functions.createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "UpdateExitAKUND"); } } // phoer, 20180306: Sperren von Dokumenten im Werkauftrag wenn der ECR von zunächst "Genehmigung" auf "Abgelehnt" gestzt wird if( docType.getId().equals(Const.gDTS_DMECR) && docTemp.field[Const.gDDF_ECRSTATUS].equals("E0003") && doc.field[Const.gDDF_ECRSTATUS].equals("E0009") && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") ) { def lProjNo = doc.field[Const.gDDF_AUFTRNR] List lTargetDocID = new ArrayList<>(); def lRetBlock def sqlStatement = "SELECT fs.doku_id as lTargetDocID " + "FROM firmen_spezifisch fs, phys_datei pd " + "WHERE fs.doku_id = pd.doku_id " + "AND fs.kue_dokuart = '${Const.gDTS_DMSPE}' " + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNo}' " + "AND pd.text like '%${doc.id()}%' " List sqlResult = d3.getSql().executeAndGet(sqlStatement) for(GroovyRowResult grr : sqlResult) { lTargetDocID.add(grr.get("lTargetDocID")) } lRowCount = sqlResult.size() if( lRowCount == 0 ) { d3.log.error("Das kopierte Ergebnisdokument für das Dokument ${doc.id()} konnte nicht gefunden werden!") } else { for(String docuId : lTargetDocID) { Document docTempTarget = d3.archive.getDocument(docuId) // 0 = gesperrt (Groovy 'g') | 1 = freigegeben (Groovy 'f') def lBlockInfo = docTempTarget.getReleaseVersionStatus() // TODO Hinweis: 24.06.2019 - wenn Dokument freigegeben, nochmal freigeben? if ( lBlockInfo.equals("f") ) { lReturn = docTempTarget.block(true, "d3groovy") if (lReturn != 0) { d3.log.error("Das Dokument ${docTempTarget.id()} konnte nicht auf Freigabe / Gesperrt gesetzt werden! Errorcode = ${lReturn}") } } } } } // jleu 18.01.2017 Umbenennen von Bauprojekten if( docType.getId().equals(Const.gDTS_ABAUP) && ( docTemp != null && !doc.field[Const.gDDF_BAUPROJEKT].equals(docTemp.field[Const.gDDF_BAUPROJEKT] ) ) ) { def sqlStatement1 = "SELECT doku_id as dokuID FROM firmen_spezifisch WHERE ( kue_dokuart = '${Const.gDTS_ABAUN}' OR kue_dokuart = '${Const.gDTS_ABAUK}' OR kue_dokuart = '${Const.gDTS_DBAUD}' ) AND dok_dat_feld_${Const.gDDF_BAUPROJEKT} = '${docTemp.field[Const.gDDF_BAUPROJEKT]}' " List sqlResult1 = d3.getSql().executeAndGet(sqlStatement1) if( sqlResult1 != null ) { for(GroovyRowResult grr : sqlResult1) { Document docSearch = d3.archive.getDocument(grr.get("dokuID")) docSearch.field[Const.gDDF_BAUPROJEKT] = doc.field[Const.gDDF_BAUPROJEKT] try{ docSearch.updateAttributes("d3groovy", true) } catch(Exception e) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docSearch.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } //jleu 15.03.2017 Wissensdokumente //jleu 10.02.2022 Anpassung wg. fehlerhafter Caption if( docType.getId().equals(Const.gDTS_DWISS) ) { List lValueArr = new ArrayList<>(); def lThemen = "" def tmp if( user.getIsSysUser() == false && !user.getRealName().equals("Master") && !user.getRealName().equals("d3groovy") ) { // E-Mail Versand Functions.sendMailRecom(d3, doc, user.id()) } def sqlStatement = "SELECT value_char as lValueArr FROM firm_spez_mult_val WHERE doku_id = '${doc.id()}' and field_no = '${Const.gDDF_THEMA}' " List sqlResult = d3.getSql().executeAndGet(sqlStatement) if(sqlResult != null && sqlResult.size() > 0) { for(GroovyRowResult grr : sqlResult) { lValueArr.add(grr.get("lValueArr")) } for(int i = 0; i < sqlResult.size(); i++) { tmp = lValueArr[i] if( tmp != null && !tmp.equals("")) { if ( i == 0) { lThemen = tmp } else { lThemen = lThemen + " I " + tmp } } } } if(lThemen.toString().length() > 250) { lThemen = lThemen.substring(0, 248); } doc.field[Const.gDDF_THEMEN] = lThemen try { doc.updateAttributes("d3groovy", true) } catch(Exception e) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } //Umbennen von Marktforschungsprojekten if( docType.getId().equals(Const.gDTS_AMARK) ) { if(docTemp.field[Const.gDDF_MARKETINGPROJEKT] != null) { def sqlStatement1 = "SELECT doku_id as dokuID FROM firmen_spezifisch WHERE " + "( kue_dokuart = '${Const.gDTS_AMARK}' OR kue_dokuart = '${Const.gDTS_AUNMA}' OR kue_dokuart = '${Const.gDTS_DMARK}' ) " + " AND dok_dat_feld_${Const.gDDF_MARKETINGPROJEKT} = '${docTemp.field[Const.gDDF_MARKETINGPROJEKT]}' "; List sqlResult1 = d3.getSql().executeAndGet(sqlStatement1) if(sqlResult1 != null) { for(GroovyRowResult grr : sqlResult1) { Document docSearch = d3.archive.getDocument(grr.get("dokuID")) docSearch.field[Const.gDDF_MARKETINGPROJEKT] = doc.field[Const.gDDF_MARKETINGPROJEKT] try { docSearch.updateAttributes("d3groovy", true) } catch(Exception e) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docSearch.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } } } } // Aufruf der Funktion manage_d3l_Supp_Custo, wenn weitere Kunden_Nr oder weitere Lieferanten_Nr bei Kundendokumenten oder Lieferantendokumenten hinzugefügt oder entfernt werden if( docType.getId().equals(Const.gDTS_DKUMA) || docType.getId().equals(Const.gDTS_DLIMA) ) { // gDDF_WEITLIEFNR - gDDF_WEITKDNR def lFileExt = doc.getFileExtension().toUpperCase() if( !lFileExt.equals("D3L") ) { // d3.log.error( "Dokumentart: " + docType.getId() + " DokuID: " + doc.id() ) // Variablen setzen je nach Dokumentart // Welches DDF ist zu befüllen? // Welche Ziel-Dokumentart wird benötigt und muss abgefragt werden? def lDDFToFill def lScenario def lBlock if( docType.getId().equals(Const.gDTS_DKUMA) ) { lDDFToFill = Const.gDDF_WEITKDNR lScenario = "CustomerNumber" } else if( docType.getId().equals(Const.gDTS_DLIMA) ) { lDDFToFill = Const.gDDF_WEITLIEFNR lScenario = "SupplierNumber" } for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( doc.field[lDDFToFill][i] != null || !doc.field[lDDFToFill][i].equals(docTemp.field[lDDFToFill][i]) ) { if( docTemp.field[lDDFToFill][i] != null && doc.field[lDDFToFill][i] != null && !doc.field[lDDFToFill][i].equals(docTemp.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: BLOCK " + lOldNumber[i] ) lBlock = "BLOCK" Functions.createD3lForSuppCusto( d3, lBlock, docTemp.field[lDDFToFill][i], lScenario, doc.id() ) // d3.log.error( "Start manage_d3l_Supp_Custo with: CREATE/UNBLOCK " + lNewNumber[i] ) lBlock = "CREATE/UNBLOCK" Functions.createD3lForSuppCusto( d3, lBlock, doc.field[lDDFToFill][i], lScenario, doc.id() ) } else if( docTemp.field[lDDFToFill][i] != null && doc.field[lDDFToFill][i] == null && !doc.field[lDDFToFill][i].equals(docTemp.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: BLOCK " + lOldNumber[i] ) lBlock = "BLOCK" Functions.createD3lForSuppCusto( d3, lBlock, docTemp.field[lDDFToFill][i], lScenario, doc.id() ) } else if( doc.field[lDDFToFill][i] != null && !doc.field[lDDFToFill][i].equals(docTemp.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: CREATE/UNBLOCK " + lNewNumber[i] ) lBlock = "CREATE/UNBLOCK" Functions.createD3lForSuppCusto( d3, lBlock, doc.field[lDDFToFill][i], lScenario, doc.id() ) } } } } } // 02.2020 - Änderung der Attribute, wenn die Service-Akte sich in SAP geändert hat // 08.2020 - Ergänzung um Equipment if( docType.getId().equals(Const.gDTS_ASEBE) || docType.getId().equals(Const.gDTS_ASERE) || docType.getId().equals(Const.gDTS_AEQUI) ) { Functions.inheritServiceAttributes( d3, doc, docTemp, docType, user ) } } if ( docTemp != null && docTemp.getType().getId().equals(Const.gDTS_SAPDO) ) { def lJahr = doc.field[Const.gDDF_ERDATE].toString() lJahr = lJahr.substring(0,4) def lMonat = doc.field[Const.gDDF_ERDATE].toString() lMonat = lMonat.substring(5,7) try { def abteilungTemp = "${userName}: Systemuser"; doc.field[Const.gDFF_ABTEILUNG] = abteilungTemp.toString(); doc.field[Const.gDDF_JAHR] = lJahr doc.field[Const.gDDF_MONAT] = lMonat try { doc.updateAttributes("d3groovy", true) } catch(Exception e) { String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, doc.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) } } catch(Exception e) { d3.log.error("UpdAttribExit20 " + e.getMessage()); } } gOldDoc = null; // globales Dokument leeren (Sicherheitsfaktor) d3.log.info("End proc updateAttribExit20 - pDocId = ${doc.id()}, pError = ${errorCode}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}") return 0 } /* * Dokumentsuche * + hook_search_entry_05 (nicht in Nutzung) * + hook_search_entry_10 (aktiv) * + hook_search_entry_20 (nicht in Nutzung) * + hook_search_exit_30 (nicht mehr in Nutzung) */ @Entrypoint( entrypoint = "hook_search_entry_10" ) public int searchEntry10(D3Interface d3, User user, DocumentType docType, Document searchContext) { def userName = "" if(user != null) { userName = user.id(); } // im SearchEntry10 gibt es das Dokument Objekt nur als searchContext, daher folgender Workaround: // Document doc = d3.archive.getDocument(searchContext.id()) Document doc = searchContext; d3.log.info("Start proc searchEntry10 - pUser = ${userName}, pDocTypeShort = ${docType.getId()}") def lLength def lReturn def lRetCode def lReturn2 def h_projnr def lBuchKr def lBuchKr68 def lLFName def lLFNr def lKDNr def lKDName def lHauptProj //Validieren der Prozessart if( doc.getType() != null) { Functions.validateProcess(d3, doc) } //jleu 12.09.2018 Dossier if( docType != null && (docType.getId().equals(Const.gDTS_DOSSI) || docType.getId().equals(Const.gDTS_AHAUP) || docType.getId().equals(Const.gDTS_ATEIL) ) ) { Functions.splitDossierValue(d3, doc, docType, "SEARCHENTRY"); } if( docType != null && docType.getId().equals(Const.gDTS_DUMMY) && doc.field[Const.gDDF_HAUPTVONR] != null) { String[] splittedString = doc.field[Const.gDDF_HAUPTVONR].split("\\|"); if( splittedString != null && splittedString.size() == 2) { doc.field[Const.gDDF_HAUPTVONR] = splittedString[1]; } } // Splitten des zusammengesetzten Strings ECR Aktivitäts_ID und ECR Beschreibung boolean repoIdActivityExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gECRCONRID); if( repoIdActivityExists == true && doc.field[Const.gDDF_AKTIVITAETSID] != null ) { Functions.splitActivity(d3, doc); } /* 02.2020 - da wir nun mit Groovy-Übersetzungen arbeiten, sollte dies überflüssig sein * // Ermittlung in welchen Dokumentarten die Eigenschaften Buchungskreis, Buchungskreise verwendet werden def sqlStatementBuch = "SELECT DISTINCT kue_dokuart as dokuart " + "FROM fispe_titel_dokuart " + "WHERE repository_id = '${SystemSpecificConst.gBuchungskreisID}' " + "OR repository_id = '${SystemSpecificConst.gBuchungskreiseID}' " List sqlResultBuch = d3.sql.executeAndGet(sqlStatementBuch); List listDokuArtenBuchngskreis = new ArrayList<>() for(GroovyRowResult grr : sqlResultBuch) { listDokuArtenBuchngskreis.add(grr.get("dokuart")) } //Splitten des zusammengesetzten Strings Buchungskreis, Buchungskreise if( listDokuArtenBuchngskreis.contains(docType.getId()) && ( doc.field[Const.gDDF_BUCHKREIS] != null || doc.field[Const.gDDF_BUCHKREIS68][1] != null )) { String[] splittedStringEinf = doc.field[Const.gDDF_BUCHKREIS].split(" \\| ") lReturn = splittedStringEinf.size() if ( lReturn >= 1 ) { doc.field[Const.gDDF_BUCHKREIS] = splittedStringEinf[0].trim() // d3.log.info( "Suchparameter: dok_dat_feld[gDDF_BUCHKREIS]: ${doc.field[Const.gDDF_BUCHKREIS]}" ) } if(doc.field[Const.gDDF_BUCHKREIS68][1] != null) { String[] splittedStringMehrf = doc.field[Const.gDDF_BUCHKREIS68][1].split(" \\| ") lReturn = splittedStringMehrf.size() if( lReturn > 1 ) { doc.field[Const.gDDF_BUCHKREIS68][1] = splittedStringMehrf[0].replaceAll(" ", "") // d3.log.info( "Suchparameter: dok_dat_feld_:(gDDF_BUCHKREIS68)[1]: ${doc.field[Const.gDDF_BUCHKREIS68][1]}" ) } } } */ // JLEU 07.05.2020: sobald die Organisationseinheiten von Buchungskreisen zu Funktionen umgestellt wurden (Steuerung über Akten) kann dieser Teil weg! boolean repoIdOrganEinheitExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gOrganEinheitID); // Split des zusammengesetzten Feldes Organisationseinheit if ( repoIdOrganEinheitExists == true && doc.field[Const.gDDF_ORGEINHEIT] != null ) { doc.field[Const.gDDF_ORGEINHEIT] = Functions.splitBuKrs(doc.field[Const.gDDF_ORGEINHEIT]); } boolean repoIdFunktionExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gFunktionID); if( repoIdFunktionExists == true && doc.field[Const.gDDF_FUNKTION] != null ) { lReturn = Functions.splitFunction( d3, doc, docType.getId()); } boolean repoIdModuleExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gModuleID); if( repoIdModuleExists == true && doc.field[Const.gDDF_MODUL] != null ) { // Split Attribut Modul bei Technikdokumenten im Import lReturn = Functions.splitModule(d3, doc, docType.getId()); } //Splitten des Lieferantennamens und der Lieferantennummer für die Suche boolean repoIdLieferantExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gLieferantNrID); if( repoIdLieferantExists == true && ( doc.field[Const.gDDF_LNAME] != null || doc.field[Const.gDDF_LNR] != null ) ) { Functions.splitLieferantSearch(d3, doc, docType); } // Ermittlung in welchen Dokumentarten die Eigenschaften Kundennamens, Kundennummer verwendet werden boolean repoIdKundeExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gKundennrID); if( repoIdKundeExists == true ) { Functions.splitKunde(d3, doc, docType); } // Ermittlung in welchen Dokumentarten die Eigenschaften Endkundenname und Endkundennummer verwendet werden boolean repoIdEndKundeExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gEndkundennrID); if( repoIdEndKundeExists == true ) { Functions.splitEndKunde(d3, doc, docType); } // Split Zuordnung Kundenkontakt // if( ( pDocTypeShort == gDTS_DLIKO || pDocTypeShort == gDTS_DMSPE || pDocTypeShort == gDTS_DKOMM || \ // pDocTypeShort == gDTS_DMAP1 || pDocTypeShort == gDTS_DMAUF || pDocTypeShort == gDTS_DMDOK || \ // pDocTypeShort == gDTS_DMECR || pDocTypeShort == gDTS_DOPP1 || pDocTypeShort == gDTS_DPRST || \ // pDocTypeShort == gDTS_DUMMY ) && \ // dok_dat_feld[gDDF_MAPPCUSTACTION] != "" ) // { // // Nur der Vollständigkeit halber, wird nicht gesplittet // } // Ermittlung in welchen Dokumentarten die Eigenschaften Hauptopportunitynummer und Opportunitynummer verwendet werden boolean repoIdOppExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gOpportunityNrID); boolean repoIdHauptOppSubExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gHauptOpportunityID); if(repoIdOppExists == true || repoIdHauptOppSubExists == true) { Functions.splitOpportunitySubmission(d3, doc, docType); } /* 02.2020 - In der suche steht weitere Opportunitynummer nicht zur Verfügung * // Ermittlung in welchen Dokumentarten die Eigenschaft Opportunity-Nummern (Mehrfachfeld) verwendet wird def sqlStatementOppMehrf = "SELECT DISTINCT kue_dokuart as dokuart " + "FROM fispe_titel_dokuart " + "WHERE repository_id = '${SystemSpecificConst.gWeitOpportunityID}' " List sqlResultOppMehrf = d3.sql.executeAndGet(sqlStatementOppMehrf); List listDokuArtenOppMehrf = new ArrayList<>() for(GroovyRowResult grr : sqlResultOppMehrf) { listDokuArtenOppMehrf.add(grr.get("dokuart")) } //Splitten des zusammengesetzten String Opportunity-Nummern (Mehrfachfeld Opportunitydokumente) und Submission nach Opportunitynummer if( ( listDokuArtenOppMehrf.contains(docType.getId()) ) && doc.field[Const.gDDF_OPPNRM][1] != null ) { String[] splittedString = doc.field[Const.gDDF_OPPNRM][1].split(" \\| ") lRetCode = splittedString.size() if( splittedString[0] != null ) { doc.field[Const.gDDF_OPPNRM][1] = splittedString[0] } } */ // Ermittlung in welchen Dokumentarten die Eigenschaft Projektnummer boolean repoIdProjektNrExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gProjektNrID); if(repoIdProjektNrExists == true) { Functions.splitProjektnummer(d3, doc, docType); } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung boolean repoIdSrIdExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gSRIDID); if(repoIdSrIdExists == true) { Functions.splitServSrId(d3, doc, docType); int resultValidateSrId = Functions.validateSrId(d3, doc); if(resultValidateSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere SR_ID in Zeile ${resultValidateSrId} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further SR_ID in line ${resultValidateSrId} ") } return -170; } } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung boolean repoIdServBelegExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegNrID); if(repoIdServBelegExists == true) { Functions.splitServBelegnummer(d3, doc, docType); int resultValidateBelegNr = Functions.validateBelegNr(d3, doc); if(resultValidateBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere Belegnummer in Zeile ${resultValidateBelegNr} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further actitivy no in line ${resultValidateBelegNr} ") } return -170 } } // imue 26.08.2020 - Ergänzung für Equipment if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "SEARCH"); } if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "SEARCH"); } // imue 12.12.2022 if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentsID) == true ) { Functions.splitEquipments(d3, doc, docType); } /* 02.2020 - Weitere Projektnummer ist in der Suche nicht verfügbar * if( ( docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DMAP1) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DOPP1) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DUMMY) ) && doc.field[Const.gDDF_WEITAUFTRAGSNR][1] != null ) { String[] splittedString = doc.field[Const.gDDF_WEITAUFTRAGSNR][1].split("\\|") lReturn = splittedString.size() if( lReturn > 1 ) { def convertedString = splittedString[0].replaceAll(" ", "") doc.field[Const.gDDF_WEITAUFTRAGSNR][1] = convertedString } } */ //Splitten des zusammengesetzten Strings Projektnr, Projektname nach Projektnummer für das Feld Projektnummer (Organisation) boolean repoIdOrgProjNrExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gProjOrgNrID); if( repoIdOrgProjNrExists == true && doc.field[Const.gDDF_PROJNR] != null ) { Functions.splitProjekt(d3, doc, docType, user, "SEARCH"); } //Org. Hauptprojekt // if(( pDocTypeShort == gDTS_AMEIS || pDocTypeShort == gDTS_APROJ || pDocTypeShort == gDTS_DPROO || pDocTypeShort == gDTS_DUMMY ) && ( dok_dat_feld[gDDF_PROJVERKN] != "" ) ) { // Der Wert im Feld Org.Hauptprojekt wird ungesplittet abgelegt, daher kein Split notwendig // } /* 02.2020 - PSP Element gibt es in der Suche nicht * // Splitten des zusammengesetzten Strings PSP Element if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_AMPRO) ) && doc.field[Const.gDDF_PSPELEMENT] != null ) { String[] splittedString = doc.field[Const.gDDF_PSPELEMENT].split(" \\| ") lReturn = splittedString.size() if( lReturn > 1 ) { doc.field[Const.gDDF_PSPELEMENT] = splittedString[0] doc.field[Const.gDDF_NPN] = splittedString[1].trim() d3.log.info( "Suchparameter: dok_dat_feld[:gDDF_PSPELEMENT]: ${doc.field[Const.gDDF_PSPELEMENT]})\"" ) d3.log.info( "Suchparameter: dok_dat_feld[:gDDF_NPN]: ${doc.field[Const.gDDF_NPN]})\"" ) } } */ // Splitten des zusammengesetzten Strings Netzplan boolean repoIdNetzplanExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gNetzplanNrId); if( repoIdNetzplanExists == true && doc.field[Const.gDDF_NPN] != null ) { String[] splittedString = doc.field[Const.gDDF_NPN].split(" \\| "); if(splittedString != null) { lReturn = splittedString.size() if( lReturn > 1 ) { doc.field[Const.gDDF_NPN] = splittedString[0]; } } } // imue 18.10.2019 - Splitten des zusammengesetzten Strings Maschinentyp boolean repoIdMaTypExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gMaschinentypID); if( repoIdMaTypExists == true && doc.field[Const.gDDF_MASCHINENTYP] != null ) { String[] splittedString = doc.field[Const.gDDF_MASCHINENTYP].split(" \\| ") if(splittedString != null) { lReturn = splittedString.size() if( lReturn > 1 ) { doc.field[Const.gDDF_MASCHINENTYP] = splittedString[2].trim(); } } } // 09.05.2017 Split Kundenkontakt-ID boolean repoIdKundenKontaktIdExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gKundenkontaktIDID); if( repoIdKundenKontaktIdExists == true && doc.field[Const.gDDF_KONTAKTNUMMER] != null ) { int returnValue = Functions.validateKuKoID(d3, doc, user, "SEARCH"); /* JE NACH RÜCKMELDUNG FACHBEREICH; KANN DIES WEG String[] splittedString = doc.field[Const.gDDF_KONTAKTNUMMER].split("\\|") if(splittedString != null) { lReturn = splittedString.size() if( lReturn == 5 ) { doc.field[Const.gDDF_KONTAKTNUMMER] = splittedString[2].trim() doc.field[Const.gDDF_KDAKTNAME] = splittedString[4] } } */ } boolean repoIdMusterMaterialMehrfachIdExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gMusterMaterialMehrfID); if( repoIdMusterMaterialMehrfachIdExists == true && doc.field[Const.gDDF_MUSTERMATNR69][1] != null ) { String[] splittedString = doc.field[Const.gDDF_MUSTERMATNR69][1].split(" \\| ") if(splittedString != null) { lReturn = splittedString.size() if( lReturn == 2 ) { doc.field[Const.gDDF_MUSTERMATNR69][1] = splittedString[0].trim() } } } // jleu, 24.01.2018 Splitten der Eigenschaft d.3Benutzer if( docType != null && ( docType.getId().equals(Const.gDTS_DMARK) || docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_DVEDO) || docType.getId().equals(Const.gDTS_AREME) || docType.getId().equals(Const.gDTS_AMARK) ) ) { def ld3user String test = doc.field[Const.gDDF_D3USER67][1]; if( doc.field[Const.gDDF_D3USER67][1] != null ) { ld3user = doc.field[Const.gDDF_D3USER67][1]; if(ld3user != null) { String[] splittedString = ld3user.split("\\="); if(splittedString != null) { doc.field[Const.gDDF_D3USER67][1] = splittedString[0]; } } } } // Split der Kontakt_Beschreibung DLONT Lieferantenaktivitätsdokumente Lieferantenmanagement boolean repoIdKDKontaktBeschIdExists = Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gKontaktBeschreibungID); if( repoIdKDKontaktBeschIdExists == true ) { Functions.splitLieferantenkontaktbeschreibung(d3, doc, docType); } // Vorbelegung des Attribut Prozess bei Maschinenprojektdokumente und Opportunitydokumente (OPG-2169) if( docType != null && ( docType.getId().equals(Const.gDTS_DMAP1) || docType.getId().equals(Const.gDTS_DOPP1) || docType.getId().equals(Const.gDTS_ENTMAP) ) ) { if( docType.getId().equals(Const.gDTS_DMAP1) ) { doc.field[Const.gDDF_PROZESS] = '0202' } else if( docType.getId().equals(Const.gDTS_DOPP1) ) { doc.field[Const.gDDF_PROZESS] = '0201' } else if( docType.getId().equals(Const.gDTS_ENTMAP) ) { doc.field[Const.gDDF_PROZESS] = '0204' } } d3.log.info("Ende proc searchEntry10 - pUser = ${userName}, pDocTypeShort = ${docType.getId()}") return 0; } /* * Validieren von Eigenschaftswerten * + hook_validate_import_entry_10 (aktiv) * + hook_validate_search_entry_10 (nicht in Nutzung) * + hook_validate_update_entry_10 (aktiv) */ @Entrypoint( entrypoint = "hook_validate_update_entry_10" ) public int validateUpdateEntry10(D3Interface d3, User user, DocumentType docType, Document doc, String nextcall) { def userName = "" if(user != null) { userName = user.id(); } d3.log.info( "validateUpdateEntry10( ${userName}, ${docType.getId()}, ${doc.id()} )" ) def lReturn def lReturn2 def lAndClause = "" def lRetCode //jleu 16.05.2018 Dossier if ( docType.getId().equals(Const.gDTS_DOSSI) ){ Functions.splitDossierValue(d3, doc, docType, "UPDATEENTRY") } def returnWeit = Functions.validateWeitKundLiefNo(d3, doc, docType); // Documenteigenschaften vor Update // 25.11.2022 imue: Korrektur Document docBeforeUpdate = null; try { docBeforeUpdate = d3.archive.getDocument(doc.id().toString()); } catch(Exception e) { d3.log.info("validateUpdateEntry10 - docBeforeUpdate konnte nicht geladen werden"); } // Splitten des zusammengesetzten Strings Lieferantenname, Lieferantennummer nach Lieferantennumer für das Feld Lieferantennummer und Lieferantenname (führend immer die Lieferantennummer) if ( ( docType.getId().equals(Const.gDTS_DMEOP) || docType.getId().equals(Const.gDTS_ALIEF) || docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DLONT) || docType.getId().equals(Const.gDTS_ALIMA) || docType.getId().equals(Const.gDTS_ALIAK) || docType.getId().equals(Const.gDTS_ALONT) || docType.getId().equals(Const.gDTS_DLIKO) ) && ( docBeforeUpdate != null && (!docBeforeUpdate.field[Const.gDDF_LNR].equals(doc.field[Const.gDDF_LNR]) || !docBeforeUpdate.field[Const.gDDF_LNAME].equals(doc.field[Const.gDDF_LNAME]) ) ) ) { def returnSplitLieferant = Functions.splitLieferant(d3, doc, docType, user, "update" , docBeforeUpdate); if(returnSplitLieferant == -170) { return -170 } } /* // wird bereits im UpdateEntry20 erledigt // Split der Kundenkontakt_Beschreibung DLONT Lieferantenkontaktdokumente_neu Lieferantenmanagement if ( docType.getId().equals(Const.gDTS_DLONT) ) { if( doc.field[Const.gDDF_KDAKTBESCH] != null && !doc.field[Const.gDDF_KDAKTBESCH].equals("") ) { lReturn = doc.field[Const.gDDF_KDAKTBESCH].indexOf("|") String[] splittedString if( lReturn > 0 ) { splittedString = doc.field[Const.gDDF_KDAKTBESCH].split("\\|") lReturn = splittedString.size() } if( lReturn == 3 ) { // Anpassung imue 17.04.2019 def sqlStatement = "SELECT value_char_allowed as allowedValue " + "FROM doc_field_val_lang " + "WHERE predef_value_id = '${SystemSpecificConst.gPredValueIDKatLief}' AND value_char_transl = '{splittedString[1]}' " GroovyRowResult grr = d3.sql.firstRow(sqlStatement); def lKontKategorie if(grr != null) { lKontKategorie = grr.get("allowedValue"); } doc.field[Const.gDDF_KONTAKTDATE] = splittedString[0] doc.field[Const.gDDF_KDAKTKAT] = lKontKategorie doc.field[Const.gDDF_KDAKTBESCH] = splittedString[2] } } } */ //Maschinenprojekt Prototyp 4: Wenn beim Import die Dokumentgruppe Medien gewählt wurde, aber das Feld Akte leer ist, gib einen Fehler aus if ( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) && doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && ( doc.field[Const.gDDF_SUBJECT] == null || doc.field[Const.gDDF_SUBJECT].equals("")) ) { // dkle, 02.02.2016 additional infotext eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe") } else { d3.hook.setProperty("additional_info_text", "You try to update an document as Medien without choosing a folder. Please correct your input.") } d3.log.error( "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe" ) return -170 } else if ( docType.getId().equals(Const.gDTS_DPRST) && doc.field[Const.gDDF_SUBJECT].equals(Const.gAK_Projektorganisation) ) { doc.field[Const.gDDF_SUBJECT] = "" } def InvalidData = 0 if( docType.getId().equals(Const.gDTS_DMECR) && (!doc.field[Const.gDDF_AUFTRNR].equals("") && doc.field[Const.gDDF_AUFTRNR] != null) ) { // d3.log.error( doc.field[Const.gDDF_AKTIVITAETSID] ) // d3.log.error( doc.field[Const.gDDF_BESCHREIBUNG] ) InvalidData = Functions.validateActivity( d3, doc, "Update") } else if( docType.getId().equals(Const.gDTS_DMECR) && ( (doc.field[Const.gDDF_AKTIVITAETSID] != null && !doc.field[Const.gDDF_AKTIVITAETSID].equals("")) || (doc.field[Const.gDDF_BESCHREIBUNG] != null && !doc.field[Const.gDDF_BESCHREIBUNG].equals("")) ) && (doc.field[Const.gDDF_AUFTRNR].equals("") || doc.field[Const.gDDF_AUFTRNR] == null) ) { InvalidData = 2 } if( InvalidData == 1 ) { // Meldung an den Benutzer, dass die Projektnummer gefüllt werden muss if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT002049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT002001) } d3.log.error( Const.gADITXT002049 ) return -170 } else if( InvalidData == 2 ) { // Meldung an den Benutzer, dass die Projektnummer gefüllt werden muss if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT001049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT001001) } d3.log.error( Const.gADITXT001049 ) return -170 } //Splitten des zusammengesetzten String Opportunitynummer und Submission nach Opportunitynummer def returnOpp = Functions.splitOpportunitySubmission(d3, doc, docType); //Splitten der zusammengesetzten Strings Projektnummer und Submission nach Projektnummer def returnProj = Functions.splitProjektnummer(d3, doc, docType); /* wird bereits im UpdateEntry10 ausgeführt, daher hier nicht notwendig // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_ASERE) ) { String[] splittedString = doc.field[Const.gDDF_SRID].split(" \\| "); //Wenn SR-ID ermittelt wurde, dann SR-ID in Attributfeld schreiben if( splittedString[0] != null ) { doc.field[Const.gDDF_SRID] = splittedString[0].trim(); } } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) ) { String[] splittedString = doc.field[Const.gDDF_BELEGNUMMER].split(" \\| "); //Wenn SR-ID ermittelt wurde, dann Servicebelegnummer in Attributfeld schreiben if( splittedString[0] != null) { doc.field[Const.gDDF_BELEGNUMMER] = splittedString[0].trim(); if( splittedString[2] != null) { doc.field[Const.gDDF_BELEGTYP] = splittedString[2].trim(); } } } */ //Splitten des zusammengesetzten String Opportunity-Nummern (Mehrfachfeld Opportunitydokumente) und Submission nach Opportunitynummer // 21.03.2018 dkle: Wegen Groovy Hook Validierung in den validateUpdateEntry10 umgezogen def returnOppMehr = Functions.splitOpportunityMehrf(d3, doc, docType); // Splitten der Kundenaktivitäts-ID beim Update // 21.03.2018 dkle: Wegen Groovy Hook Validierung in den validateUpdateEntry10 umgezogen if ( docType.getId().equals(Const.gDTS_DKUKO) && docBeforeUpdate != null && !doc.field[Const.gDDF_KONTAKTNUMMER].equals(docBeforeUpdate.field[Const.gDDF_KONTAKTNUMMER] ) ) { lReturn = Functions.validateKuKoID( d3, doc, user, "Update" ) if( lReturn == -170 ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT014049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT014001) } d3.log.error( "Bitte geben Sie eine gueltige Kundenkontakt-ID ein." ) return -170 } } d3.log.info("ENDE validateUpdateEntry10 -- pUser ${userName}, pDocTypeShort {docType.getId()} ") return 0; } @Entrypoint( entrypoint = "hook_validate_import_entry_10" ) public int validateImportEntry10(D3Interface d3, User user, DocumentType docType, Document doc, String nextcall) { //jleu 01.08.2018 Vertragsdokumente if( docType.getId().equals(Const.gDTS_EVDOK) || docType.getId().equals(Const.gDTS_EVUNT) ) { def lRetVal = Functions.checkContractNumber(d3, doc) if( lRetVal == 10 ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT019049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT019001) } return -200 } } return 0; //jleu 21.05.2021 ITSM Dokumente if( docType.getId().equals(Const.gDTS_DITSM) ) { def RetVal = Functions.checkITSMNumber(d3, doc) if (RetVal == 10) { // Meldung an den Benutzer, dass eine unbekannte ITSM ID verwendet wird if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT025049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT025001) } return -170 } } } /* * Einspielen einer neuen Version * + hook_new_version_entry_10 (aktiv) * + hook_new_version_entry_20 (aktiv) * + hook_new_version_entry_30 (nicht in Nutzung) * + hook_new_version_exit_10 (nicht in Nutzung) * + hook_new_version_exit_20 (nicht in Nutzung) * + hook_new_version_exit_30 (aktiv) */ @Entrypoint( entrypoint = "hook_new_version_entry_10" ) public int newVersionEntry10(D3Interface d3, Document doc, String fileSource, String fileDestination, User user, DocumentType docType) { // proc NewVersionEntry10(pDocId, pFileSource, pFileDest, pUser, pDocTypeShort) def userName = "" if(user != null) { userName = user.id(); } Document oldDoc = null; if(doc.id() == null) { //Ermittlung der Doku-Id über ZeichNr def sqlStatement = "SELECT doku_id as pDocId FROM phys_datei WHERE zeich_nr = '${doc.getNumber()}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if( sqlResult != null && sqlResult.size()> 0) { def pDocId = sqlResult.getAt(0).get("pDocId") oldDoc = d3.archive.getDocument(pDocId); } } else { oldDoc = d3.archive.getDocument(doc.id()); } d3.log.info("Start proc NewVersionEntry10 - pDocId = ${doc.id()}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}, pFileSource = ${fileSource}, pFileDest = ${fileDestination}") def lTextMig def InvalidData def lECRStatus def lChildCount def h_projnr def lProjNr def lBuchKr def lBuchKr68 def lRetCode def pRowCount def lLength def lReturn2 def lReturn def lSubject def lAndClause def lCount def datei_erw if ( doc.getFileExtension() != null ) { datei_erw = doc.getFileExtension().toLowerCase() } def pDocId //Validieren der Prozessart Functions.validateProcess(d3, doc) // imue 25.02.2019 - Aktualisierung durch MSG verhindern (Import über Dokumentklasse gelöst) - OPG-2106 if( datei_erw.equals('msg') && doc.id() == null ) { //Ermittlung der Doku-Id über ZeichNr def sqlStatement = "SELECT doku_id as pDocId FROM phys_datei WHERE dokuart = '${docType.getId()}' AND zeich_nr = '${doc.getNumber()}' " def sqlResult = d3.sql.executeAndGet(sqlStatement) if(sqlResult != null) { pDocId = sqlResult.getAt(0).get("pDocId") } // Meldung an den Benutzer, dass ein MSG File nicht genutzt werden darf if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT024049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT024001) } d3.log.error( Const.gADITXT024049 ) lReturn = d3.call.document_transfer("Freigabe", null, null, true, 0, "d3groovy", pDocId) return -170 } if( docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) { Functions.validateWeitKundLiefNo(d3, doc, docType); } //jleu 16.05.2018 Dossier if( docType.getId().equals(Const.gDTS_DOSSI) ) { Functions.splitDossierValue(d3, doc, docType, "NEWVERSIONENTRY") } //jleu 29.03.2017 Marktforschungsdokumente if( docType.getId().equals(Const.gDTS_DMARK) || docType.getId().equals(Const.gDTS_AVEVO) || docType.getId().equals(Const.gDTS_DVEDO) || docType.getId().equals(Const.gDTS_AREME) || docType.getId().equals(Const.gDTS_AMARK) || docType.getId().equals(Const.gDTS_DSCHU) ) { Functions.splitUser(d3, doc); } if( docType.getId().equals(Const.gDTS_DLOEH) ) { Functions.sixty2single(d3, doc) } //Splitten des zusammengesetzten Strings Buchungskreis, Buchungskreistext nach Buchungskreis def returnBuch = Functions.splitBuchungskreis(d3, doc, docType); //Splitten des zusammengesetzten Strings Projektnr, Projektname nach Projektnummer für das Feld Projektnummer if( docType.getId().equals(Const.gDTS_DPROO) ) { h_projnr = doc.field[Const.gDDF_PROJNR].substring(0,14) doc.field[Const.gDDF_PROJNR] = h_projnr } //Splitten des zusammengesetzten String Opportunitynummer und Submission nach Opportunitynummer def returnOpp = Functions.splitOpportunitySubmission(d3, doc, docType); //Splitten der zusammengesetzten Strings Projektnummer und Submission nach Projektnummer def returnProj = Functions.splitProjektnummer(d3, doc, docType); //Splitten des zusammengesetzten String Opportunity-Nummern (Mehrfachfeld Opportunitydokumente) und Submission nach Opportunitynummer def returnOppMehr = Functions.splitOpportunityMehrf(d3, doc, docType); if( (doc.field[Const.gDDF_LNR] != null && oldDoc.field[Const.gDDF_LNR] != null) || (doc.field[Const.gDDF_LNAME] != null && oldDoc.field[Const.gDDF_LNAME] != null) ) { if( ( !doc.field[Const.gDDF_LNR].equals(oldDoc.field[Const.gDDF_LNR]) || !doc.field[Const.gDDF_LNAME].equals(oldDoc.field[Const.gDDF_LNAME]) ) && ( docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DLONT) || docType.getId().equals(Const.gDTS_DLIMA) ) ) { def returnSplitLieferant = Functions.splitLieferant(d3, doc, docType, user, "update", oldDoc); if(returnSplitLieferant == -170) { return -170 } } } if( (doc.field[Const.gDDF_KNR] != null && oldDoc.field[Const.gDDF_KNR] != null) || (doc.field[Const.gDDF_KNAME] != null && oldDoc.field[Const.gDDF_KNAME] != null) ) { if( ( !doc.field[Const.gDDF_KNR].equals(oldDoc.field[Const.gDDF_KNR]) || !doc.field[Const.gDDF_KNAME].equals(oldDoc.field[Const.gDDF_KNAME]) ) && ( docType.getId().equals(Const.gDTS_DKUMA) ) ) { int returnValidateKunden = Functions.validateKunden(d3, doc, docType, user, "update") if(returnValidateKunden == -170) { return -170 } } } if( docType.getId().equals(Const.gDTS_DKUKO) && doc.field[Const.gDDF_KONTAKTNUMMER] != null && !doc.field[Const.gDDF_KONTAKTNUMMER].equals("") && !doc.field[Const.gDDF_KONTAKTNUMMER].equals(oldDoc.field[Const.gDDF_KONTAKTNUMMER]) ) { // 09.05.2017 Anpassung, da sich der Aufbau geändert hat // Aufbau: |||| lReturn = Functions.validateKuKoID( d3, doc, user, "NewVersion" ) if( lReturn == -170 ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT014049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT014001) } d3.log.error( "Bitte geben Sie eine gueltige Kundenkontakt-ID ein." ) return -170 } } //Maschinenprojekt: Wenn weder eine Auftrags- noch eine Opportunity-Nr. eingetragen wird, verhindere die Ablage lReturn = Functions.validateOppProjNr( d3, doc ) if( lReturn.equals("WITHOUTPROJOPP") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT012049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT012001) } return -170 } else if( lReturn.equals("PROJOPP") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT013049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT013001) } return -170 } // 30.08.2016 dkle: Aktivitäts-ID und Beschreibung ECR Dokumente und Unterakte ECR if( docType.getId().equals(Const.gDTS_DMECR) && doc.field[Const.gDDF_AUFTRNR] != null ) { int resultValidateActivity = Functions.validateActivity(d3, doc, "Update") if(resultValidateActivity == 1) { return -170 } } // ECR-Dokumente und Ergebnisdokument dürfen nicht in genehmigte ECRs importiert werden. if( docType.getId().equals(Const.gDTS_DMECR) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && doc.field[Const.gDDF_ARCDOCID] == null ) { int resultvalidateErgebnisdokumente = Functions.validateErgebnisdokumenteECR(d3, doc, user); if(resultvalidateErgebnisdokumente == -170) { return -170 } } int returnvalueMM = Functions.validateMustermaterialNr(d3, doc, oldDoc, docType, "NewVersion") if(returnvalueMM == -170) { return -170; } if( docType.getId().equals(Const.gDTS_DMDOK) && doc.field[Const.gDDF_FUNKTION] != null && !doc.field[Const.gDDF_FUNKTION].equals("") && ( !doc.field[Const.gDDF_FUNKTION].equals(oldDoc.field[Const.gDDF_FUNKTION] || !doc.field[Const.gDDF_NPN].equals(oldDoc.field[Const.gDDF_NPN]) ) ) ) { lReturn = 0 // Split Attribut Funktion bei Technikdokumenten im Import lReturn = Functions.splitFunction ( d3, doc, docType.getId() ) if( lReturn.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte waehlen Sie eine gültige Funktion aus.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Please choose a valid function.") lReturn = 0 } d3.log.error( "Bitte waehlen Sie eine gültige Funktion aus." ) return -170 } else if( lReturn.equals("FEHLERODATA") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else if( lReturn.equals("FEHLERFUNKTION") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else { lReturn = 0 } } if( docType.getId().equals(Const.gDTS_DMDOK) && doc.field[Const.gDDF_MODUL] != null && !doc.field[Const.gDDF_MODUL].equals("") && (!doc.field[Const.gDDF_MODUL].equals(oldDoc.field[Const.gDDF_MODUL]) || !doc.field[Const.gDDF_FUNKTION].equals(oldDoc.field[Const.gDDF_FUNKTION])) ) { // Split Attribut Modul bei Technikdokumenten im Import lReturn = Functions.splitModule( d3, doc, docType.getId() ) if( lReturn.equals("FEHLER") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte waehlen Sie ein gültige Modulnummer aus.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Please choose a valid module number.") lReturn = 0 } d3.log.error( "Bitte waehlen Sie eine gültige Modulnummer aus." ) return -170 } else if( lReturn.equals("FEHLERODATA") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else if( lReturn.equals("FEHLERFUNKTION") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Problem Funktionsaufruf: Bitte wenden Sie sich an Ihren Administrator.") lReturn = 0 } else { d3.hook.setProperty("additional_info_text", "Error on Call Function: Please contact your administrator.") lReturn = 0 } d3.log.error( "Problem Funktionsaufruf stringSplitFunction: Bitte wenden Sie sich an Ihren Administrator." ) return -170 } else { lReturn = 0 } } // Das Attribut "Akte" wird im Maschinenprojekt bis auf die Ausnahme ECR automatisch anhand der Dokumentgruppe und der Dokumentart (Anwendungsfall) ermittelt // 25.07.2016/dkle: Anpassung auf die neuen Dokumentgruppen von ECR if( ( docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) && ( !doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_ECRChangeOrder) && !doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && (doc.field[Const.gDDF_SUBJECT].equals("") || doc.field[Const.gDDF_SUBJECT] == null) ) ) { def lDokGroup = doc.field[Const.gDDF_DOKGROUP] def lProcess = doc.field[Const.gDDF_PROZESS] if ( docType.getId().equals(Const.gDTS_DPRST) && !lProcess.equals("")) { lAndClause = "and dok_dat_feld_${Const.gDDF_PROZESS} = '${lProcess}' " } else { lAndClause = "" } // 31.07.2017 Hinweis: Hier kann nur ein Wert zurückkommen, da es eine fachlich gepflegte administrative Akte ist. def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_SUBJECT} as lSubject " + "FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_REGISTER} = '${lDokGroup}' " + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${docType.getId()}' " + "AND kue_dokuart = '${Const.gDTS_AAFOL}' ${lAndClause} " def sqlResult = d3.sql.executeAndGet(sqlStatement) if(sqlResult != null && sqlResult.size() > 0) { lSubject = sqlResult.getAt(0).get("lSubject") } if(lSubject.equals("Projektorganisation")) { // Der Wert "Projektorganisation" darf nicht gesetzt werden, im Code wird bei dieser Bedingung das Feld immer geleert } else { doc.field[Const.gDDF_SUBJECT] = lSubject } } //Maschinenprojekt Prototyp 4: Wenn beim Import die Dokumentgruppe Medien gewählt wurde, aber das Feld Akte leer ist, gib einen Fehler aus if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIMA) || docType.getId().equals(Const.gDTS_DKUMA) ) && doc.field[Const.gDDF_DOKGROUP].equals(Const.gDG_Medien) && ( doc.field[Const.gDDF_SUBJECT] == null || doc.field[Const.gDDF_SUBJECT].equals("") ) ) { // dkle, 02.02.2016 additional infotext eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe") } else { d3.hook.setProperty("additional_info_text", "You try to update an document as Medien without choosing a folder. Please correct your input.") } d3.log.error( "Sie versuchen ein Dokument mit der Dokumentgruppe Medien zu aktualisieren, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe" ) return -170 } else if ( docType.getId().equals(Const.gDTS_DPRST) && doc.field[Const.gDDF_SUBJECT].equals(Const.gAK_Projektorganisation) ) { doc.field[Const.gDDF_SUBJECT] = "" } // Prüfung des ausgewählten Lieferanten bei der Ablage if( !userName.equals("d3_async") && !userName.equals("hostimp") && ( docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_ALONT) || docType.getId().equals(Const.gDTS_DLIMA) ) ) { lReturn = Functions.validateLiefName( d3, doc, "NewVersion" ) if( lReturn.equals("OK") ) { // Es handelt sich um einen validen Wert } else if( lReturn.equals("Fehler") ) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT016049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT016001) } d3.log.error( "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." ) return -170 } // Validierung der Lieferantennummer (nur bei gDTS_ALIKO) - OPG-2105 - NewVersionEntry10 lReturn = Functions.validateLiefNum( d3, doc, "Update") if( lReturn.equals("OK") ) { // Es handelt sich um einen validen Wert } else if( lReturn.equals("Fehler") ) { // dkle, 02.02.2016 additional info Text eingefügt if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT016049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT016001) } d3.log.error( "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." ) return -170 } // Überprüfung doppelter Einträge von Lieferanten if( docType.getId().equals(Const.gDTS_ALIKO) ) { lReturn = Functions.checkDuplikateLieferant( d3, "NewVersion", userName, doc.id() ) if( lReturn.equals("OK") ) { // Do nothing } else { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", Const.gADITXT017049) } else { d3.hook.setProperty("additional_info_text", Const.gADITXT017001) } d3.log.error( "Dieser Lieferant existiert bereits in dieser Opportunity, bzw. in diesem Projekt. Bitte nutzen Sie die existierende Akte." ) return -170 } } } if( ( !doc.field[Const.gDDF_LNR].equals(oldDoc.field[Const.gDDF_LNR]) || !doc.field[Const.gDDF_LNAME].equals(oldDoc.field[Const.gDDF_LNAME]) || !doc.field[Const.gDDF_KONTAKTBESCH].equals(oldDoc.field[Const.gDDF_KONTAKTBESCH]) || !doc.field[Const.gDDF_LIEFAKTKAT].equals(oldDoc.field[Const.gDDF_LIEFAKTKAT]) || !doc.field[Const.gDDF_KONTAKTDATE].equals(oldDoc.field[Const.gDDF_KONTAKTDATE]) ) && docType.getId().equals(Const.gDTS_DLONT) ) { lReturn = Functions.splitLieferantenkontaktbeschreibung(d3, doc, docType); if(lReturn == -170) { return -170; } } // Wenn es sich um ein Ergebnisdokument handelt und ein Angebotsdokument ist, muss die übergeordnete Angebotsversion "in Arbeit" sein. if( docType.getId().equals(Const.gDTS_DOPPD) && doc.field[Const.gDDF_ERGEBNISDOK].equals("Ja") && ( doc.field[Const.gDDF_ARCDOCID] == null || !doc.field[Const.gDDF_ARCDOCID].equals("") ) ) { lReturn = Functions.validateErgebnisdokumenteAngebot(d3, doc, user); if(lReturn == -170) { return -170; } } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung Functions.splitServSrId(d3, doc, docType); int resultCheckSrId = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereSRIDID); if(resultCheckSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "SR_ID in Zeile ${resultCheckSrId} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "SR_ID in line ${resultCheckSrId} exists multiple") } return -170; } int resultValidateSrId = Functions.validateSrId(d3, doc); if(resultValidateSrId != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere SR_ID in Zeile ${resultValidateSrId} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further SR_ID in line ${resultValidateSrId} ") } return -170; } // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung if( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) ) { Functions.splitServBelegnummer(d3, doc, docType); int resultValidateBelegNr = Functions.validateBelegNr(d3, doc); int resultCheckBelegNr = Functions.checkServiceNr(d3, doc, SystemSpecificConst.gWeitereBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } if(resultValidateBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte weitere Belegnummer in Zeile ${resultValidateBelegNr} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further actitivy no in line ${resultValidateBelegNr} ") } return -170 } if( doc.field[Const.gDDF_BELEGTYP] == null ) { String belegNrTemp = doc.field[Const.gDDF_BELEGNUMMER]; String sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as belegTyp FROM firmen_spezifisch " + "WHERE dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${belegNrTemp}' " + "AND kue_dokuart = '${Const.gDTS_ASEBE}' "; List sqlResult = d3.sql.executeAndGet(sqlStatement); if(sqlResult != null && sqlResult.size() > 0) { String lBelegTyp = sqlResult.getAt(0).get("belegTyp"); if( lBelegTyp != null && !lBelegTyp.equals("") && docType.getId().equals(Const.gDTS_DSEBE) ) { doc.field[Const.gDDF_BELEGTYP] = lBelegTyp; } } } } // imue: Validierung doppelter Einträge für weitere Belegnummer Einkauf if( docType.getId().equals(Const.gDTS_DEINK) ) { int resultCheckBelegNr = Functions.checkPurchaseNr(d3, doc, SystemSpecificConst.gWeitereEinkaufBelegNrID); if(resultCheckBelegNr != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Belegnummer in Zeile ${resultCheckBelegNr} ist doppelt eingetragen") } else { d3.hook.setProperty("additional_info_text", "Further actitivy in line ${resultCheckBelegNr} exists multiple") } return -170; } } // imue: Validierung der Belegart für den Service if(Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegNrID) && Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gBelegArtID)) { Functions.validateBelegart(d3, doc); } // imue: Validierung der Belegart für den Einkauf if(Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEinkaufsBelegNrID)) { Functions.validateBelegart(d3, doc); } // imue 26.08.2020 - Ergänzung für Equipment if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "NEWVERSION"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, true); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment Zeile ${resultValidateEquipment} prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check further equipment in line ${resultValidateEquipment} ") } return -170; } } if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentID) == true ) { Functions.splitEquipment(d3, doc, docType, "NEWVERSION"); int resultValidateEquipment = Functions.validateEquipment(d3, doc, user, false); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipment prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipment") } return -170; } } // imue 12.12.2022 if( Functions.checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentsID) == true ) { Functions.splitEquipments(d3, doc, docType); int resultValidateEquipment = Functions.validateEquipments(d3, doc, user); if(resultValidateEquipment != 0) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte Equipments prüfen") } else { d3.hook.setProperty("additional_info_text", "Please check equipments") } return -170; } } // 17.01.2023 - Neue Validierung der Materialnummer if(doc.getType().getId().equals(Const.gDTS_DMATE) && doc.field[Const.gDDF_MATERIALNUMMER] != null) { String returnValueMatNo = Functions.validateMaterialNum(d3, doc); if(returnValueMatNo != null && returnValueMatNo.equals("ERROR")) { if( d3.remote.getLanguage().equals("049") ) { d3.hook.setProperty("additional_info_text", "Bitte geben Sie eine Material_Nr ein, zu der bereits eine Materialakte existiert."); } else { d3.hook.setProperty("additional_info_text", "Please enter a material no. for which a mertial file already exists."); } return -170; } } d3.log.info("End proc NewVersionEntry10 - pDocId = ${doc.id()}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}, pFileSource = ${fileSource}, pFileDest = ${fileDestination}") return 0 } @Entrypoint( entrypoint = "hook_new_version_entry_20" ) public int newVersionEntry20(D3Interface d3, Document doc, String fileSource, String fileDestination, User user, DocumentType docType) { def InvalidData if( ( docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DLIKO) ) && doc.field[Const.gDDF_AUFTRNR] != null && !doc.field[Const.gDDF_AUFTRNR].equals("") ) { InvalidData = 0 InvalidData = Functions.validateNetzPSP(d3, doc) if( InvalidData != 0 ) { // Der additional_info_text wird in der Funktion "validateNetzPSP" gesetzt return -170 } } // Angebotsdokumente: Angebot_Nr in den Zusatztitel einfügen, wenn die Angebot_Nr nicht "Neue" oder "9999" ist if( docType.getId().equals(Const.gDTS_DOPPD) ) { Functions.setAdditionalTitle(d3, doc); } return 0; } @Entrypoint( entrypoint = "hook_new_version_exit_30" ) public int newVersionExit30(D3Interface d3, Document doc, Integer importOk, Integer errorCode, User user, DocumentType docType, Document gOldDoc) { //proc newVersionExit30(pDocId, pImportOk, pErrorNrApi, pUser, pDocTypeShort) def userName = "" if(user != null) { userName = user.id(); } d3.log.info("Start proc newVersionExit30 - pDocId = ${doc.id()}, pImportOk = ${importOk}, pErrorNrApi = ${errorCode}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}") def lReturn def lRetCode // ersetzt die Funktion drs_render() - nicht mehr benötigt 20210805 jleu //Functions.renderDocument(d3, doc); // 27.01.2020 imue - Funktion nicht notwendig, da die Vererbung auf die Dokuemnte bereits auf Basis der Akte über den Hook gemacht wird (siehe inheritOrgProjAttributes) // if( docType.getId().equals(Const.gDTS_DPROO) ) { // lRetCode = Functions.inheritDocAccess( d3, doc, "newVersion") // } //imue 09.08.2021 Dossier if( docType.getId().equals(Const.gDTS_DOSSI) ) { Functions.splitDossierValue(d3, doc, docType, "NEWVERSIONEXIT") } // 1: Einspielung der neuen Version erfolgreich / 0: Einspielung der neuen Version mit Fehler abgebrochen if( importOk == 1 ) { if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAktuellVersInternID) ) { // https://jira.d-velop.de/browse/OPG-2024 Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments // Technikdokumenten (DMDOK) - DDF 88 soll mit der aktuellen Versionsnummer befüllt werden Functions.setInternalVersion( d3, doc.id() ); } } // phoer 20160823: Wenn beim Import einer neuen Version der Maschinenprojektdokumente das Zuordnung Kundenkontakt geändert wurde... if( docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DMECR) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) ) { def lMapCusAct = doc.field[Const.gDDF_MAPPCUSTACTION] // d3.log.error("NewVersion DDF ${doc.field[Const.gDDF_MAPPCUSTACTION]}") if ( lMapCusAct != null && !lMapCusAct.substring(0,7).equals("bereits") ) { //...rufe die Funktion zum Kopieren des Dokuments auf, damit es in die Kundenkontaktakte importiert wird Functions.copyCustAction(d3, doc, lMapCusAct) } } //Wenn eine weitere Opportunity Nummer in das Mehrfachfeld eingetragen wird, schaue ob es diese Link Datei gibt //ansonsten lege eine neue an if ( docType.getId().equals(Const.gDTS_DOPPD) || docType.getId().equals(Const.gDTS_DLIKO) || docType.getId().equals(Const.gDTS_DKUKO) || docType.getId().equals(Const.gDTS_DKOMM) || docType.getId().equals(Const.gDTS_DMDOK) || docType.getId().equals(Const.gDTS_DMAUF) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DVERD) || docType.getId().equals(Const.gDTS_DPRST) || docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_DEQUI) || docType.getId().equals(Const.gDTS_DEINK)) { Functions.checkForLinkFiles(d3, doc, docType, gOldDoc); } // Aufruf der Funktion manage_d3l_Supp_Custo, wenn weitere Kunden_Nr oder weitere Lieferanten_Nr bei Kundendokumenten oder Lieferantendokumenten hinzugefügt oder entfernt werden if( docType.getId().equals(Const.gDTS_DKUMA) || docType.getId().equals(Const.gDTS_DLIMA) ) { // gDDF_WEITLIEFNR - gDDF_WEITKDNR def lFileExt = doc.getFileExtension().toUpperCase() if( !lFileExt.equals("D3L") ) { // d3.log.error( "Dokumentart: " + docType.getId() + " DokuID: " + doc.id() ) // Variablen setzen je nach Dokumentart // Welches DDF ist zu befüllen? // Welche Ziel-Dokumentart wird benötigt und muss abgefragt werden? def lDDFToFill def lScenario def lBlock if( docType.getId().equals(Const.gDTS_DKUMA) ) { lDDFToFill = Const.gDDF_WEITKDNR lScenario = "CustomerNumber" } else if( docType.getId().equals(Const.gDTS_DLIMA) ) { lDDFToFill = Const.gDDF_WEITLIEFNR lScenario = "SupplierNumber" } for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { if( doc.field[lDDFToFill][i] != null || !doc.field[lDDFToFill][i].equals(gOldDoc.field[lDDFToFill][i]) ) { if( gOldDoc.field[lDDFToFill][i] != null && doc.field[lDDFToFill][i] != null && !doc.field[lDDFToFill][i].equals(gOldDoc.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: BLOCK " + lOldNumber[i] ) lBlock = "BLOCK" Functions.createD3lForSuppCusto( d3, lBlock, gOldDoc.field[lDDFToFill][i], lScenario, doc.id() ) // d3.log.error( "Start manage_d3l_Supp_Custo with: CREATE/UNBLOCK " + lNewNumber[i] ) lBlock = "CREATE/UNBLOCK" Functions.createD3lForSuppCusto( d3, lBlock, doc.field[lDDFToFill][i], lScenario, doc.id() ) } else if( gOldDoc.field[lDDFToFill][i] != null && doc.field[lDDFToFill][i] == null && !doc.field[lDDFToFill][i].equals(gOldDoc.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: BLOCK " + lOldNumber[i] ) lBlock = "BLOCK" Functions.createD3lForSuppCusto( d3, lBlock, gOldDoc.field[lDDFToFill][i], lScenario, doc.id() ) } else if( doc.field[lDDFToFill][i] != null && !doc.field[lDDFToFill][i].equals(gOldDoc.field[lDDFToFill][i]) ) { // d3.log.error( "Start manage_d3l_Supp_Custo with: CREATE/UNBLOCK " + lNewNumber[i] ) lBlock = "CREATE/UNBLOCK" Functions.createD3lForSuppCusto( d3, lBlock, doc.field[lDDFToFill][i], lScenario, doc.id() ) } } } } } /// globales Dokumetn Object null setzen gOldDoc = null; d3.log.info("Ende proc newVersionExit30 - pDocId = ${doc.id()}, pImportOk = ${importOk}, pErrorNrApi = ${errorCode}, pUser = ${userName}, pDocTypeShort = ${docType.getId()}") return 0; } /* * Dokumente freigeben * + hook_release_entry_10 (nicht in Nutzung) * + hook_release_exit_10 (aktiv) */ @Entrypoint( entrypoint = "hook_release_exit_10" ) public int releaseExit10(D3Interface d3, Document doc, User user, Integer errorCode, DocumentType docType, String unblock) { def userName = "" if(user != null) { userName = user.id(); } def lReturn d3.log.info( "releaseExit10 Start ( ${doc.id()}, ${userName}, ${errorCode}, ${doc.getType().getId()}, ${unblock} )" ) /* * Ausführungsbeschreibung: * Wenn unblock gleich "1" (= das Dokument wird entsperrt), sollen auch alle zugehörigen D3L Dateien entsperrt werden */ if(unblock.equals("1")) { def sqlStatement = "SELECT f.doku_id as dokuId " + "FROM firmen_spezifisch as f, phys_datei as p " + "WHERE f.kue_dokuart = '${doc.getType().getId()}' " + "AND ( p.text LIKE '%${doc.id()}%' OR p.text LIKE '%${doc.id()}' OR p.text LIKE '${doc.id()}%' ) " + "AND ( p.datei_erw = 'D3L' OR p.datei_erw = 'd3l' ) " + "AND f.doku_id = p.doku_id " List sqlResult = d3.sql.executeAndGet(sqlStatement); d3.log.info( "releaseExit10 - Es wurden ${sqlResult.size()} Kinder gefunden." ) // Kenndaten des Kindes holen if(sqlResult.size() > 0) { for (GroovyRowResult grr : sqlResult) { //d3.log.error( "releaseExit10 - Überprüfung d3l DokuId: ${grr.get("dokuId")} " ) Document docTemp = d3.archive.getDocument(grr.get("dokuId")) if( (docTemp.getText(3).equals(doc.id())) || docTemp.getText(4).equals(doc.id()) ) { // getReleaseVersionStatus() -> g = gesperrt, f = freigegeben if( (docTemp.getStatus().toString().equals("DOC_STAT_RELEASE")) && (docTemp.getReleaseVersionStatus().equals("g")) ) { // aktuell Bug enthalten - warte auf Lösung https://jira.d-velop.de/browse/DSR-8616 // def lReturnNew = docTemp.block(false, "d3groovy") // Workaround: lReturn = d3.call.document_block(false, "d3groovy", docTemp.id()) d3.log.info("releaseExit10 - Dokument ${grr.get("dokuId")} nicht mehr geblockt") if (lReturn != 0) { d3.log.error("Das Dokument ${docTemp.id()} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") } else { d3.log.error( "Das Dokument kann nicht entsperrt werden. Status: ${docTemp.getStatus().toString()} Kennzeichen: ${docTemp.getReleaseVersionStatus()} g=gesperrt/f=freigegeben" ) } } else { d3.log.error( "Das Dokument kann nicht entsperrt werden, Vater DokumentID nicht im Bemerkungsfeld gefunden. Bemerkung 3: ${docTemp.getText(3)} Bemerkung 4: ${docTemp.getText(4)}" ) } } } } } else { d3.log.info( "releaseExit10 - Die SQL Abfrage zur Ermittlung der Vaterdokumente ergab keine Treffer." ) } /* * Ausführungsbeschreibung: * Wenn eine Freigabeversion erzeugt wird, muss die interne Version hochgeezählt werden */ if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAktuellVersInternID) ) { // https://jira.d-velop.de/browse/OPG-2024 Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments Functions.setInternalVersion( d3, doc.id() ) } d3.log.info( "releaseExit10 Stop ( ${doc.id()}, ${userName}, ${errorCode}, ${doc.getType().getId()}, ${unblock} )" ) return 0 } /* * Sperren eines Dokumentes * + hook_block_entry_10 (nicht in Nutzung) * + hook_block_exit_10 (aktiv) */ @Entrypoint( entrypoint = "hook_block_entry_10" ) public int blockEntry10( D3Interface d3, Document doc, User user ) { def userName = "" if(user != null) { userName = user.id() } // d3.log.error( "blockExit10 - Start blockExit10( ${doc.id()}, ${userName} )" ) def lReturn /* * Ausführungsbeschreibung: * Sperrung zugehöriger d3l Dateien, wenn das Originaldokument gesperrt wird und sich die d3l Datei im Status "Freigabe" befindet und bisher ungesperrt ist */ def sqlStatement = "SELECT f.doku_id as dokuId " + "FROM firmen_spezifisch as f, phys_datei as p " + "WHERE f.kue_dokuart = '${doc.getType().getId()}' " + "AND ( p.text LIKE '%${doc.id()}%' OR p.text LIKE '%${doc.id()}' OR p.text LIKE '${doc.id()}%' ) " + "AND ( p.datei_erw = 'D3L' OR p.datei_erw = 'd3l' ) " + "AND f.doku_id = p.doku_id " List sqlResult = d3.sql.executeAndGet(sqlStatement); d3.log.info( "blockExit10 - Es wurden ${sqlResult.size()} Kinder gefunden." ) // Kenndaten des Kindes holen if(sqlResult.size() > 0) { for (GroovyRowResult grr : sqlResult) { //d3.log.info( "blockExit10 - Überprüfung d3l DokuId: ${grr.get("dokuId")} " ) Document docTemp = d3.archive.getDocument(grr.get("dokuId")) if( (docTemp.getText(3).equals(doc.id())) || docTemp.getText(4).equals(doc.id()) ) { if( (docTemp.getStatus().toString().equals("DOC_STAT_RELEASE")) && (docTemp.getReleaseVersionStatus().equals("f")) ) { // aktuell Bug enthalten - warte auf Lösung https://jira.d-velop.de/browse/DSR-8616 def lReturnNew = docTemp.block(true, "d3groovy") // Workaround: // lReturn = d3.call.document_block(true, "d3groovy", docTemp.id()) d3.log.info("blockExit10 - Dokument ${grr.get("dokuId")} geblockt") if (lReturn !=0) { d3.log.error("blockExit10 - Das Dokument ${docTemp.id()} konnte nicht auf Freigabe / Gesperrt gesetzt werden! Errorcode = ${lReturn}") } } else { d3.log.error( "blockExit10 - Das Dokument kann nicht gesperrt werden. Status: ${docTemp.getStatus().toString()} Kennzeichen: ${docTemp.getReleaseVersionStatus()} g=gesperrt/f=freigegeben" ) } } else { d3.log.error( "blockExit10 - Das Dokument kann nicht gesperrt werden, Vater DokumentID nicht im Bemerkungsfeld gefunden. Bemerkung 3: ${docTemp.getText(3)} Bemerkung 4: ${docTemp.getText(4)}" ) } } } else { d3.log.info( "blockExit10 - Die SQL Abfrage zur Ermittlung der Vaterdokumente ergab keine Treffer." ) } return 0 } /* * Löschen eines Dokumentes * + hook_delete_entry_10 (nicht in Nutzung) * + hook_delete_exit_10 (aktiv) */ @Entrypoint( entrypoint = "hook_delete_exit_10" ) public int deleteExit10(D3Interface d3, Document doc, User user, Integer errorCode, DocumentType docType) { def userName = "" if(user != null) { userName = user.id() } d3.log.info( "hookDeleteExit10 - START ( " + doc.id() + ", " + userName + ", " + errorCode + ", " + docType.getId() + ")" ) /* * Ausführungsbeschreibung: * Löschen aller D3l Dateien, wenn das Hauptdokument gelöscht wird und keine Version mehr vorhanden ist */ if( (errorCode == 0) && (!userName.equals("")) ) { def lReturn // Anmerkung durch Frau Luk: D3l-Datien werden auch gelöscht, wenn eine Bearbeitungversion gelöscht wird - 07.05.2019 imue def sqlStatementBea = "SELECT * " + "FROM phys_datei as p " + "WHERE p.doku_id = '${doc.id()}' " List sqlResultBea = d3.sql.executeAndGet(sqlStatementBea); d3.log.info( "hookDeleteExit10 - Es wurden ${sqlResultBea.size()} Versionen für Dokument ${doc.id()} gefunden" ) if(sqlResultBea.size() == 0) { // SELECT auf text[3] und text[4] // Finde alle zugehörigen d3l Dateien def sqlStatement = "SELECT f.doku_id as dokuId " + "FROM firmen_spezifisch as f, phys_datei as p " + "WHERE ( p.text LIKE '%${doc.id()}%' OR p.text LIKE '%${doc.id()}' OR p.text LIKE '${doc.id()}%' ) " + "AND ( p.datei_erw = 'D3L' OR p.datei_erw = 'd3l' ) " + "AND f.doku_id = p.doku_id " List sqlResult = d3.sql.executeAndGet(sqlStatement); for (GroovyRowResult grr : sqlResult) { d3.log.info( "hookDeleteExit10 - Löschung D3L: " + grr.get("dokuId") ) lReturn = d3.call.document_delete("Löschung Verweisdatei, aufgrund Löschung des Originals", true, true, grr.get("dokuId"), "d3groovy", false ) if( lReturn == 0 ) { // Do nothing! d3.log.info( "hookDeleteExit10 - D3L Datei " + grr.get("dokuId") + " erfolgreich gelöscht" ) } else { d3.log.error( "hookDeleteExit10 - D3L Datei konnte nicht gelöscht werden " + grr.get("dokuId") + " Fehler: " + lReturn + "" ) } } } else { d3.log.info( "hookDeleteExit10 - Es existieren noch weitere Versionen für Dokument ${doc.id()}, sodass die zugehörigen D3L Dateien nicht gelöscht werden!" ) } /* * Ausführungsbeschreibung: * Wenn eine Bearbeitungsversion gelöscht wird, muss die interne Version runtergezählt werden */ if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAktuellVersInternID) ) { // https://jira.d-velop.de/browse/OPG-2024 Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments // Technikdokumenten (DMDOK) - DDF 88 soll mit der aktuellen Versionsnummer befüllt werden // Prüfung ob docId überhaupt noch exisitert def sqlStatementVers = "SELECT f.doku_id as d3lExistence " + "FROM firmen_spezifisch as f " + " WHERE f.doku_id = '${doc.id()}' " List sqlResultVers = d3.getSql().executeAndGet(sqlStatementVers) def d3lExistenceCount = sqlResultVers.size() // https://jira.d-velop.de/browse/OPG-2024 Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments // Technikdokumenten (DMDOK) - DDF 88 soll mit der aktuellen Versionsnummer befüllt werden if(d3lExistenceCount > 0) { d3.log.info( "hookDeleteExit10 - setInternalVersion: " + doc.id() ) Functions.setInternalVersion( d3, doc.id() ) } } } d3.log.info( "hookDeleteExit10 - ENDE deleteExit10( " + doc.id() + ", " + errorCode + ", " + docType.getId() + ")" ) return 0 } /* * Statustranser * + hook_transfer_entry_30 (nicht in Nutzung) * + hook_transfer_exit_30 (aktiv) */ @Entrypoint( entrypoint = "hook_transfer_exit_30" ) public int transferExit30(D3Interface d3, User user, Document doc, Integer fileId, String sourceStatus, String destStatus, UserOrUserGroup destEditor, Integer errorCode) { DocumentType docType = doc.getType() def userName = "" if(user != null) { userName = user.id(); } d3.log.info("hookTransferExit30 - START " + userName + ", " + doc.id() + ")") if ( Functions.checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gAktuellVersInternID) ) { // https://jira.d-velop.de/browse/OPG-2024 Erstellung Hook zur Füllung des Attributs "interne Version" mit der Versionsinformation des d.3 Dokuments // Technikdokumenten (DMDOK) - DDF 88 soll mit der aktuellen Versionsnummer befüllt werden // jleu 02.04.2019 auskommentiert, da sonst ein Versionieren über d.3one nicht möglich ist // Functions.setInternalVersion( d3, doc.id() ) } d3.log.info("hookTransferExit30 - ENDE " + userName + ", " + doc.id() + ")") return 0 } }