diff --git a/Optima/_Groovy/Const.groovy b/Optima/_Groovy/Const.groovy new file mode 100644 index 0000000..cedd7ea --- /dev/null +++ b/Optima/_Groovy/Const.groovy @@ -0,0 +1,456 @@ +// -------------------------------------------------------------------------------------------------------- +// Const.groovy +// -------------------------------------------------------------------------------------------------------- +// +// Groovy Definitionsdatei für alle benötigten Dokument- und Aktenarten, +// sowie DokDatfelder und RepositoryIDs +// +// -------------------------------------------------------------------------------------------------------- + + +public class Const { + + // Dokumentarten + // --- Teilprojektübergreifend --- + static final String gDTS_DKUKO = "DKUKO"; //Kundenkontaktdokumente + static final String gDTS_DLIKO = "DLIKO"; //Lieferantenkontaktdokument + static final String gDTS_DKOMM = "DKOMM"; //Email Kommunikation + static final String gDTS_DPRST = "DPRST"; //Projektsteuerungsdokumente (01 Projektorganisationsdokumente) + static final String gDTS_SAPDO = "SAPDO"; //SAP-Dokumente für die Migr + static final String gDTS_DVORL = "DVORL"; //90 Vorlagen + static final String gDTS_DUMMY = "Dummy"; //globale Suche + static final String gDTS_DALTD = "DALTD" //Altdokumente + // --- Organisationsprojekt --- + static final String gDTS_DPROO = "dproo"; //Organisationsprojektdokume + // --- Opportunity --- + static final String gDTS_DOPPD = "DOPPD"; //Angebotsdokumente + static final String gDTS_DVERD = "DVERD"; //Vertragrelevante Dokumente + // --- Bauakte --- + static final String gDTS_DBAUD = "DBAUD"; //Baudokumente + static final String gDTS_DABAU = "DABAU"; //abhängige Baudokumente + static final String gDTS_DBAAU = "DBAAU"; //Baudokumente Ausführung + static final String gDTS_DBAAS = "DBAAS"; //Baudokumente Ausschreibung + static final String gDTS_DBABE = "DBABE"; //Baudokumente Besprechungen + static final String gDTS_DBAGE = "DBAGE"; //Baudokumente Genehmigung + // --- Schulungsdokumente --- + static final String gDTS_DSCHU = "DSCHU"; //Schulungsdokumente + static final String gDTS_DREGE = "DREGE"; //Regelberichte + // --- Regelberichte --- + static final String gDTS_DAREG = "DAREG"; //Anhänge zu Regelberichten + // --- Marktforschungsdokumente --- + static final String gDTS_DMARK = "DMARK"; //Marktbeobachtungsdokumente + static final String gDTS_AMARK = "AMARK" //01.02.02 Marktforschungsprojekte + // --- Maschinenprojekt --- + static final String gDTS_DVERT = "DVERT"; // Vertragsdokumente + static final String gDTS_DMDOK = "DMDOK"; //Technikdokumente + static final String gDTS_DMAUF = "DMAUF"; //Vertriebsdokumente + static final String gDTS_DMSPE = "DMSPE"; //Spezifikationsdokumente + static final String gDTS_DMECR = "DMECR"; //ECR-Dokumente + static final String gDTS_DMEOP = "DMEOP"; //Ergebnisdokumente Opportunity (in Maschinenprojekt) + // --- Wissensmanagement --- + static final String gDTS_DWISS = "DWISS"; //Wissensdokumente + static final String gDTS_AWISS = "AWISS"; //Wissensarchiv + // --- Hauptvorgaenge + static final String gDTS_DOSSI = "DOSSI"; //Dossier + static final String gDTS_ATEIL = "ATEIL"; //Teilvorgangsakte + static final String gDTS_AHAUP = "AHAUP"; //Hauptvorgangsakte + + // --- Lieferantenmanagement + static final String gDTS_DLIMA = "DLIMA" //Lieferantendokumente + static final String gDTS_DLONT = "DLONT" //Lieferantenkontakt_Neu (Lieferantenmanagement) + + // --- Kundenmanagement + static final String gDTS_DKUMA = "DKUMA" //Kundendokumente (Kundenmanagement) + static final String gDTS_DERZD = "DERZD" //Erzeugnisdokumente + + // --- Einkauf + static final String gDTS_DEINK = "DEINK" //Einkausbelegdokument + + // --- Material + static final String gDTS_DMATE = "DMATE" //Materialdokumente + + + // Aktenarten + // --- Teilprojektübergreifend --- + static final String gDTS_APROA = "aproa"; //Prozess + static final String gDTS_APROZ = "aproz"; //Prozessart + static final String gDTS_APROG = "aprog"; //Prozessgruppe + static final String gDTS_AAFOL = "aafol"; //administrative folder + static final String gDTS_AZTXT = "AZTXT"; //administrative translation + static final String gDTS_AADOM = "AADOM"; //administrative domains + static final String gDTS_ALIEF = "ALIEF"; //Lieferantenakte + static final String gDTS_AKONT = "AKONT"; //Kundenkontakt + static final String gDTS_AKUND = "AKUND"; //Kundenakte + static final String gDTS_AKUKO = "AKUKO"; //Kundenaktivität + static final String gDTS_ALIEK = "ALIEK"; //Projektbeschaffung + static final String gDTS_ALIKO = "ALIKO"; //Lieferantenkontakt oder Projektlieferant + static final String gDTS_AKONA = "AKONA"; //Kontaktakte OP + static final String gDTS_APROR = "APROR"; //Projektorganisation + static final String gDTS_AABWL = "AABWL"; //Ablage Whitelist + static final String gDTS_AUNMA = "AUNMA"; //Unterakte Marktforschungsprojekte + static final String gDTS_AGLAK = "AGLAK"; // GL-Akte + static final String gDTS_DLOEH = "DLOEH"; //Notizdokumente + // --- Organisationsprojekte --- + static final String gDTS_AMEIS = "ameis"; //Meilensteine / Arbeitspakete + static final String gDTS_APROJ = "aproj"; //Organisationprojekte + // --- Opportunity --- + static final String gDTS_AREGI = "AREGI"; //Angebotsversion + static final String gDTS_AUNTE = "AUNTE"; //Angebotsvorgang + static final String gDTS_AOPPU = "AOPPU"; //Opportunityakte + static final String gDTS_AANGE = "AANGE"; //Angebot + static final String gDTS_AANGU = "AANGU"; //Angebotsübergreifend/vor Angebot + static final String gDTS_AKOMM = "AKOMM"; //Kommunikation + static final String gDTS_AVERT = "AVERT"; //Verträge/Vereinbarungen + static final String gDTS_AERGE = "AERGE"; //Vertragsergebnis + static final String gDTS_ASOPP = "ASOPP"; //Suche Opportunitydokumente + // --- Bauprojekt --- + static final String gDTS_ABAUG = "ABAUG"; //Bauaktengruppe + static final String gDTS_ABAUK = "ABAUK"; //Bauakte + static final String gDTS_ABAUN = "ABAUN"; //Bauakte untergeordnet + static final String gDTS_ABAUP = "ABAUP"; //Bauprojekte + static final String gDTS_ABAUA = "ABAUA"; //Bauplanänderung Akte + static final String gDTS_ABESP = "ABESP"; //Bauakte_Besprechungen + static final String gDTS_AGENB = "AGENB"; //Genehmigung_Bauprojekt + static final String gDTS_AAUSB = "AAUSB"; //Ausschreibung_Bauprojekt + // --- Maschinenprojekt --- + static final String gDTS_AMPRA = "AMPRA"; //Maschinenprojektakte + static final String gDTS_AMAUF = "AMAUF"; //Vertrieb + static final String gDTS_AMPRO = "AMPRO"; //Unterakte Technik + static final String gDTS_AMUEB = "AMUEB"; //Maschinenübergreifend + static final String gDTS_AMAKT = "AMAKT"; //Technik + static final String gDTS_AMNAC = "AMNAC"; //Unterakte Vertrieb + static final String gDTS_AMSPE = "AMSPE"; //Spezifikation + static final String gDTS_AMUPO = "AMUPO"; //Unterakte Projektorganisation + static final String gDTS_AMCRA = "AMCRA"; //ECR-Akte + static final String gDTS_AMECR = "AMECR"; //Unterakte ECR + static final String gDTS_AMUSP = "AMUSP"; //Unterakte Spezifikation + static final String gDTS_AMEOP = "AMEOP"; //Akte Ergebnis Opportunity (in Maschinenprojekt) + static final String gDTS_ASMAS = "ASMAS"; //Maschinenprojektdokumente + static final String gDTS_DERZ1 = "DERZ1"; // Maschinendokumente (vorher neutrale Maschinendokumente) + static final String gDTS_DSOFT = "DSOFT"; // Alle Software-Dokumente + static final String gDTS_AERZ1 = "AERZ1"; // Maschine + static final String gDTS_DMAP1 = "DMAP1"; // Alle Maschinenprojekt Dokumente + static final String gDTS_DOPP1 = "DOPP1"; // Alle Opportunity Dokumente + static final String gDTS_ENTMAP = "DPEN1"; // Entwicklungsprojektdokumente - Sammler für Primärentwicklung + // --- Primärentwicklung + static final String gDTS_APREN = "APREN"; //02.04 Entwicklungsprojektakte + // --- Abteilungsdokumente --- + static final String gDTS_AREME = "AREME"; //01.03.02 Abteilungsakte + static final String gDTS_AVODA = "AVODA"; //Vorgangsdatum Akte + static final String gDTS_DABTE = "DABTE"; //Abteilungsdokumente + // --- Sonstige --- + static final String gDTS_DVEME = "DVEME"; //Vertriebsmedien + static final String gDTS_AVEVO = "AVEVO"; //Vertrauliche Vorgangsakte + static final String gDTS_DVEDO = "DVEDO"; //Vertrauliche Dokumente + static final String gDTS_EVDOK = "EVDOK"; //Vertragsdokument + static final String gDTS_EVUNT = "EVUNT"; //Vertragsunterlage + static final String gDTS_EVERT = "EVERT"; //Einzelvertrag + static final String gDTS_RVERT = "RVERT"; //Rahmenvertrag + static final String gDTS_MNDNT = "MNDNT"; //Organisationseinheit dbs CaseMngr Contract + static final String gDTS_DMATO = "DMATO"; // Marketingtooldokumente + static final String gDTS_PRTNR = "PRTNR"; //Partnerakte + // --- Lieferantenmanagement + static final String gDTS_ALIMA = "ALIMA"; //Lieferantenmanagement + static final String gDTS_ALIAK = "ALIAK"; //Lieferantenaktivität (Lieferantenmanagement) + static final String gDTS_ALONT = "ALONT"; //Lieferantenkontakt_neu (Lieferantenmanagement) + static final String gDTS_AKUMA = "AKUMA"; //Kundenmanagement + static final String gDTS_AEINK = "AEINK"; //Prozess (Lieferant) + // --- Service + static final String gDTS_DSERE = "DSERE"; //Service Request Dokumente + static final String gDTS_ASERE = "ASERE"; //Service Request Akte + static final String gDTS_DSEBE = "DSEBE"; //Service Beleg Dokumente + static final String gDTS_ASEBE = "ASEBE"; //Service Beleg Akte + static final String gDTS_DSEFA = "DSEFA"; // Service Faktura Dokumente + static final String gDTS_DSELI = "DSELI"; // Service Lieferung Dokumente + static final String gDTS_DSER1 = "DSER1"; // Dokumentsammler für Servicedokumente + // --- ITSM + static final String gDTS_AITSM = "AITSM"; //ITSM Akte + static final String gDTS_DITSM = "DITSM"; //ITSM Dokumente + // --- Equipment + static final String gDTS_DEQUI = "DEQUI"; //Equipment Dokumente + static final String gDTS_AEQUI = "AEQUI"; //Equipment Akte + // --- Einkauf + static final String gDTS_AEIBE = "AEIBE"; //Einkaufsbeleg + // --- Material + static final String gDTS_AMATE = "AMATE" //Materialakten + + // -------------------------------------------------------------------------------------------------------- + // DocField IDs + // -------------------------------------------------------------------------------------------------------- + + static final int gDDF_PROJNR = 1; //Projekt-Nr. + static final int gDDF_STATUS = 1; //Status + static final int gDDF_PARTNERID = 1; //PartnerID + static final int gDDF_CONTRACTNO = 1; //Vertragsnummer intern + static final int gDDF_PROJTITLE = 2; //Projekt-Titel + static final int gDDF_OPPANNr = 2; //Angebot_Nr + static final int gDDF_PSPELEMENT = 2; //PSP-Element + static final int gDDF_ZIELDTS = 2; //Zieldokumentart + static final int gDDF_PARTNERNAME = 2; //Partnername + static final int gDDF_PROZESS = 3; //Prozess + static final int gDDF_CONTRACTNAME = 3; //Vertragsbezeichnung + static final int gDDF_PROZESSGROUP = 4; //Prozessgruppe + static final int gDDF_MASCHINENTYP = 4; //Maschinentyp (Achtung: Es gibt Maschinentyp und Maschinen_Typ) + static final int gDDF_PROZESSART = 5; //Prozessart + static final int gDDF_IHL = 5; //IH-Leistungsart (Service | GROOVY) + static final int gDDF_PROJLEITER = 6; //Projektleiter + static final int gDDF_ABTSENDER = 6; //Abteilung (Sender) + static final int gDDF_PROJVABT = 7; //Projektverantw. Abteilung + static final int gDDF_SENDER = 7; //Absender + static final int gDDF_PROJSTATUS = 8; //Projektstatus + static final int gDDF_PROJKLAMMER = 8; //Projektklammer + static final int gDDF_BELEGTYP = 8; //Belegtyp/-art ( Service | GROOVY ) + static final int gDDF_BASEOPP = 9; //zugrundeliegende Opportunity + static final int gDDF_PROJEKTPHASE = 9; //Projektphase + static final int gDDF_EQUIPMENT = 9; //Equipment + static final int gDDF_LNR = 10; //Lieferant_Nr + static final int gDDF_EVENT = 10; //Vorgang + static final int gDDF_CASE = 10; //Vorgang + static final int gDDF_LNAME = 11; //Lieferant_Name + static final int gDDF_VORGANGSSTATUS = 11; //Vorgangsstatus + static final int gDDF_NPN = 12; //Netzplan_Nr + static final int gDDF_UNTERBAUAKTE = 12; //untergeordnete Bauakte + static final int gDDF_GLAKTYP = 12; //GL-Akten Typ + static final int gDDF_NPVN = 13; //Netzplanvorgangsnummer + static final int gDDF_BAUAKTENGRUPPE = 13; //Bauaktengruppe + static final int gDDF_MUSTERMATNR = 13; //Mustermaterial Nr. + static final int gDDF_VOROWNER = 13; //Vorgangsbesitzer + static final int gDDF_CASEOWNER = 13; //Vorgangsbesitzer + static final int gDDF_LNAME2 = 13; //Lieferant_Name2 + static final int gDDF_ENDKUNDENNR = 13; //Endkunden_Nr + static final int gDDF_ENDKUNDENAM = 14; //Endkunden_Name + static final int gDDF_GREMIUN = 14; //Gremium + static final int gDDF_RESPSALESMAN = 14; //zust. Verkäufer + static final int gDDF_LLAND = 14; //Lieferant_Land + static final int gDDF_KONTAKTNUMMER = 15; //Kundenkontakt_ID + static final int gDDF_AKTIVITAETSID = 15; //ECR Aktivitäts_ID + static final int gDDF_ORGEINHEIT = 15; //Organisationseinheit dbs CaseMngr Contract + static final int gDDF_ITSMID = 15; //ITSM ID + static final int gDDF_ORDNUNG = 16; //Ordnung + static final int gDDF_AKTENGRP = 16; //Aktengruppe (Equipment) + static final int gDDF_APPHASE = 16; //Arbeitspaketphase + static final int gDDF_ADITTITLE = 16; //Zusatztitel + static final int gDDF_ORGPROJVERT = 16; //Org.Projekt_Vertretung + static final int gDDF_DOKTITLE = 17; //Dokumenttitel + static final int gDDF_DOKGRP = 18; //Dokumentkategorie + static final int gDDF_AKTENANLAGE = 18; //Nur Aktenanlage + static final int gDDF_REIHENFOLGE = 18; //Reihenfolge + static final int gDDF_LORT = 18; //Lieferant_Ort + static final int gDDF_MSAPS = 19; //Meilenstein/Arbeitspaket + static final int gDDF_AUFTRNR = 19; //Projekt_Nr + static final int gDDF_ANZZUGRIFFE = 19; //Anzahl Zugriffe + static final int gDDF_PROJVERKN = 20; //Projektverknüpfung + static final int gDDF_ANGELEGTVON = 20; //Angelegt von + static final int gDDF_FRAGESTELLUNG = 20; //Fragestellung + static final int gDDF_MATERIALNUMMER = 20; //Material_Nr + static final int gDDF_MODUL = 20; //Modul (Erzeugnisstruktur) + static final int gDDF_MODULM = 20; //M-Modul (Maschinendokumente) + static final int gDDF_NEUEFRAGE = 21; //Neue Fragestellung + static final int gDDF_DOKGROUP = 21; //Dokumentgruppe + static final int gDDF_KNR = 22; //Kunden_Nr + static final int gDDF_THEMEN = 22; //Themen (Caption für Wissensdokumente) + static final int gDDF_KNAME = 23; //Kunden_Name + static final int gDDF_ABBAUAKTE = 23; //abhängige Bauakte + static final int gDDF_KDAKTNAME = 24; //Kundenkontakt_Beschreibung + static final int gDDF_BESCHREIBUNG = 24; //ECR Beschreibung + static final int gDDF_BAUAKTE = 24; //Bauakte + static final int gDDF_SRID = 25; //Service-Request ID ( Service | GROOVY ) + static final int gDDF_BAUPLANAENDERUNG = 25; //Bauprojekt Unteraktentitel + static final int gDDF_KDANPRT = 25; //Kunden_Ansprechpartner + static final int gDDF_ORGENTRY = 25; //Originaleintrag + static final int gDDF_DOMAIN = 25; //Domäne + static final int gDDF_REGISTER = 26; //Register + static final int gDDF_REFERENZOBJ = 26; //Referenzobjekt (wird über SAP gefüllt) + static final int gDDF_CLASS = 27; //Klasse + static final int gDDF_DTSKIND = 27; //Dokumentart des Kindes bei Verknüpfungs-Whitelist + static final int gDDF_ZUGRIFF = 27; //Zugriff + static final int gDDF_REFERENZNR = 27; //ReferenzNr (wird über SAP gefüllt) + static final int gDDF_BUCHKREIS = 28; //Buchungskreis + static final int gDDF_HAUPTPROJEKT = 29; //Hauptprojekt // TODO in den D3 Eigenschaften ist Feld 29 die Projektklammer!! + static final int gDDF_PROJEKTKLAMMER = 29; + static final int gDDF_HAUPTOPPANNR = 29; //Hauptangebot_Nr + static final int gDDF_FUNKTION = 29; //Funktion (Erzeugnisstruktur) + static final int gDDF_MARKETINGPROJEKT = 30; //Marktforschungsprojekt + static final int gDDF_ANLAGE = 30; //Anlage + static final int gDDF_KATEGORIE = 30; //Kategorie + static final int gDDF_BAUPROJEKT = 30; //Bauprojekt + static final int gDDF_SORTIERUNG = 30; //Sortierreiehenfolge + static final int gDDF_HAUPTVONR = 30; //Hauptvorgangsnummer + static final int gDDF_OPPNUMMER = 31; //Opportunity_Nr + static final int gDDF_GESPARTNR = 31; //Geschäftspartnernummer + static final int gDDF_HAUPTVOBEZ = 31; //Hauptvorgangsbezeichnung + static final int gDDF_BELEGNUMMER = 31; //Belegenummer ( Service | GROOVY ) + static final int gDDF_KOMMRICHTUNG = 32; //Kommunikationsrichtung + static final int gDDF_TEILVONR = 32; //Teilvorgangsnummer + static final int gDDF_TEILVOBEZ = 33; //Teilvorgangsbezeichnung + static final int gDDF_JAHR = 33; //Jahr + static final int gDDF_MONAT = 34; //Monat + static final int gDDF_STRUKTURINFO = 34; //Strukturinformationen + static final int gDDF_VKPHASE = 35; //CRM-Verkaufsphase + static final int gDDF_HAUPTOPP = 36; //Hauptopportunity + static final int gDDF_SUBMISSION = 37; //Submission + static final int gDFF_SCHLUESSEL = 38; //Schlüsselwert + static final int gDDF_SRKATEGORIE = 38; //Service Request Kategorie ( Service | GROOVY ) + static final int gDFF_ABTEILUNG = 39; //Abteilung (aus Org. Mgmt.) + static final int gDDF_ANNAME = 40; //Angebot_Name + static final int gDDF_SAPBESCHREIBUNG = 40; //SAP Beschreibung ITSM / Equipment + static final int gDDF_SVBESCHREIBUNG = 40; //Beschreibung ( Service | GROOVY ) + static final int gDDF_ANNEU = 41; //neue Angebotsversion + static final int gDDF_ANFORDERER = 41; //Anforderer + static final int gDDF_MAPPCUSTACTION = 41; //Zuordnung Kundenkontakt + static final int gDDF_KDAKTLAND = 42; // Kunde Land + static final int gDDF_ANSTATUS = 43; //Angebotsstatus + static final int gDDF_ECRSTATUS = 43; //ECR Status + static final int gDDF_KDAKTORT = 43; // Kunde Ort + static final int gDDF_ERGEBNISDOK = 44; //Ergebnisdokumente + static final int gDDF_ANWENDUNGSFALL = 45; //Anwendungsfall + static final int gDDF_DTSVATER = 45; //Dokumentart des Vaters bei Verknüpfungs-Whitelist + static final int gDDF_KDAKTKAT = 45; //Kundenkontakt_Kategorie + static final int gDDF_LIEFAKTKAT = 45; //Lieferantenkontakt_Kategorie + static final int gDDF_KONTAKTBESCH = 46; //Kontakt_Beschreibung + static final int gDDF_KDAKTBESCH = 46; //Kundenkontakt_Beschreibung + static final int gDDF_KURZTEXT = 46; //Kurztext ( Service | GROOVY ) + static final int gDDF_SALESGROUP = 47; //Verkäufergruppe + static final int gDDF_SUBJECT = 48; //Betreff + static final int gDDF_AKTE = 48; //Akte (Equipment) + static final int gDDF_BELEGART = 48; //Betreff + static final int gDDF_ARCDOCID = 49; //ARC Doc ID + static final int gDDF_BESPRTITEL = 49; //Besprechungstitel + static final int gDDF_ERDATE = 50; //Ereignisdatum + static final int gDDF_KONTAKTDATE = 52; //Kundenkontakt_Termin + static final int gDDF_DOKDATE = 54; //Dokumentdatum + static final int gDDF_EQUIPMENTS = 60; //Equipments (Service) - 12.12.2022 + static final int gDDF_PROJBER = 60; //Projektbeteiligte + static final int gDDF_ERGDOCFUER = 60; //Ergebnisdokument für + static final int gDDF_VORGANG = 60; //Beteiligter Vorgang + static final int gDDF_TEILVONRM = 60; //Teilvorgangsnummern + static final int gDDF_GESPARTNR60 = 60; //Geschäftspartnernummer + static final int gDDF_SCHLAGWORT = 61; //Schlagwort + static final int gDDF_MSAPM = 61; //Meilenstein/Arbeitspaket Mehrfach + static final int gDDF_TEILVOBEZGEN = 61; //Teilvorgangsbezeichnungen + static final int gDDF_PROJEKTE = 62; //Projekte Mehrfach + static final int gDDF_OPPNRM = 62; //weitere Opportunity_Nr + static final int gDDF_STRUKTURINFOS = 62; //Strukturinformationen + static final int gDDF_WEITKDNR = 62; //weitere Kunden_Nr + static final int gDDF_MASCHINENTYPEN = 62; //Maschinen-Typen (Maschinendokumente) + static final int gDDF_WEITEREBELEGNR = 62; //Weitere Belegnummer (Service) + static final int gDDF_PROJLEITERM = 63; //Projektleiter Mehrfach + static final int gDDF_EMPFEHLUNG = 63; //Empfehlung + static final int gDDF_GESPART = 63; //Geschäftspartner + static final int gDDF_ABTEMPM = 63; //Abteilung (Empfänger) Mehrfach + static final int gDDF_HAUPTFUNKTION = 63; //Hauptfunktion (Regelberichte) + //static final int gDDF_D3USER = 63; //d.3 User + static final int gDDF_D3USER63 = 63; //d.3 User -> ehemals "gDDF_D3USER" + static final int gDDF_EMPFAENGERM = 65; //Empfänger + static final int gDDF_FUNKTIONM = 64; //M-Funktion (Maschinendokumente) + static final int gDDF_WEITERESRID = 64; //Weitere SR-ID (Service) + static final int gDDF_WEITEREEQUIPMENT = 64; + static final int gDDF_PROJVABTM = 65; //Projektverantwortliche Abteilung Mehrfach + static final int gDDF_THEMA = 66; //Thema Wissensdokumente + static final int gDDF_PROJEKTTITELM = 66; //Projekttitel Mehrfach + static final int gDDF_WEITAUFTRAGSNR = 66; //weitere Projekt_Nr + static final int gDDF_WEITLIEFNR = 66; //weitere Lieferanten_Nr + static final int gDDF_HAUPTPROJEKTM = 67; //Hauptprojekt Mehrfach + //static final int gDDF_d3USER = 67; //d.3 Anmeldename + static final int gDDF_D3USER67 = 67; //d.3 Anmeldename -> ehemals "gDDF_d3USER" + static final int gDDF_ISOCODE = 67; //ISO Sprachcode (ISO3) + static final int gDDF_REGIONALORG = 67; //Regionalorganisation + static final int gDDF_EMAILKONTAKT = 68; //Emailkontakt Mehrfach + static final int gDDF_BUCHKREIS68 = 68; //Buchungskreis Mehrfach Intercompany + static final int gDDF_ORGEINHEITEN = 69; //Orgeinheiten aus OrgMngmtn + static final int gDDF_UEBERSETZUNG = 69; //Übersetzung + static final int gDDF_MUSTERMATNR69 = 69; //Mustermaterial Nr. Mehrfach (Feld 69) + static final int gDDF_DOCINFONR = 80; //Dokumenteninfosatz Nr. + static final int gDDF_VERSIONINTERN = 88; //d.3 Version (intern) + + // DDF für Vertriebsdokumente + static final int gDDF_DIVISION = 61; + static final int gDDF_MACHINESYSTEM = 62; + static final int gDDF_MACHINE = 63; + static final int gDDF_FUNCTIONS = 64; + static final int gDDF_MODULES = 60; + static final int gDDF_PACKAGE = 65; + + + // Werte für Baudokumente + static final String gAUSFUEHRUNG = "8 Ausführung"; + static final String gBESPRECHUNG = "Besprechungen"; + static final String gGENEHMIGUNG = "4 Genehmigungen"; + static final String gAUSSCHREIBUNG = "6 Ausschreibung"; + + // Werte für Wiedervorlage Kundenberichte + static final String gDOKUGRP = "DG052"; //Wert aus den administrativen Akte für Dokumentgruppe (#Kundenberichte) + static final String gINFOGRP = "INFO_Kundenberichte"; //Gruppe empfängt Postkorbeintrag bei neuen Besuchsberichten + + // Allgemeine Variablen (z.B. Schlüsselumstellung) + static final String gDG_Kommunikation = "DG134" + static final String gDG_Medien = "DG074" + static final String gDG_ECRChangeOrder = "DG025" + + static final String gAK_Kommunikation = "AK010" + static final String gAK_Kundenaktivität = "AK011" + static final String gAK_Lieferantenaktivität = "AK014" + static final String gAK_Projektorganisation = "AK017" + static final String gAK_Spezifikation = "AK021" + static final String gAK_ErgebnisOpportuntiy = "AK004" + static final String gAK_Werkauftrag = "AK028" + + + static final int RETURNCODE_OK = 0; + + static final String gTECHNICAL_GROUP = "d3_grp_hoo" // Gruppenkürzel + + + // Zentralisierung Additional Info Text + static final String gADITXT001049 = "Bitte geben Sie eine Projektnummer ein, erst dann koennen Sie ECR/CO_Nr und Beschreibung auswaehlen." + static final String gADITXT001001 = "Please provide a Project number, after that you can choose a ECR/CO no. and Description." + static final String gADITXT002049 = "Bitte waehlen Sie eine ECR/CO_Nr und Beschreibung passend zur Projektnummer." + static final String gADITXT002001 = "Please choose an ECR/CO no. and Description which fits to the Project number." + static final String gADITXT003049 = "Sie versuchen ein Ergebnisdokument in einen genehmigten ECR/Change Order zu importieren. Bitte korrigieren Sie Ihre Eingabe." + static final String gADITXT003001 = "You try to import a document to an accepted ECR/Change Order. Please correct your input." + static final String gADITXT004049 = "Bitte waehlen Sie eine gültige Mustermaterialnummer aus." + static final String gADITXT004001 = "Please choose a valid sample material number." + static final String gADITXT005049 = "Bitte waehlen Sie eine gültige Funktion aus." + static final String gADITXT005001 = "Please choose a valid function." + static final String gADITXT006049 = "Bitte waehlen Sie ein gültige Modulnummer aus." + static final String gADITXT006001 = "Please choose a valid module number." + static final String gADITXT007049 = "Sie versuchen ein Maschinenprojektdokument einer Opportunity zuzuordnen. Bitte korrigieren Sie Ihre Eingabe." + static final String gADITXT007001 = "You try to add a project document to an opportunity. Please correct your input." + static final String gADITXT008049 = "Sie versuchen ein Opportunitydokument einem Maschinenprojekt zuzuordnen. Bitte korrigieren Sie Ihre Eingabe." + static final String gADITXT008001 = "You try to add an opportunity document to an project. Please correct your input." + static final String gADITXT009049 = "Eine der Angebotsakten in die Sie importieren moechten ist versendet, oder bereits angenommen. Es koennen keine weiteren Ergebnisdokumente abgelegt werden. Erstellen Sie ein neues Angebot, oder importieren Sie ein Basisdokument ohne Ergebnischarakter." + static final String gADITXT009001 = "One offer folder you chose for your import has been sent or is already accepted. It is not allowed to import further more result documents. Please create a new offer folder or import a document without result character." + static final String gADITXT010049 = "Bitte wählen Sie entweder den Lieferantennamen oder die Lieferantennummer aus der Liste aus, oder geben Sie es manuell ein." + static final String gADITXT010001 = "Please choose either a Customer No. or a Customer Name from the Dropdown Box or provide them manually." + static final String gADITXT011049 = "Bitte geben Sie mindestens den Lieferantennamen ein oder wählen Sie ihn aus der Drop Down Liste." + static final String gADITXT011001 = "Please provide a Customer Name or chose from the Dropdown Box." + static final String gADITXT012049 = "Sie versuchen ein Dokument zu importieren, ohne entweder eine Projekt- oder eine Opportunitynummer eingetragen zu haben. Bitte korrigieren Sie Ihre Eingabe." + static final String gADITXT012001 = "You try to import a document without attaching it to an order or an opportunity. Please correct your input." + static final String gADITXT013049 = "Sie versuchen ein Dokument zu importieren. Dabei haben Sie sowohl eine Projekt- als auch eine Opportunitynummer (ggf. unter weitere) eingetragen. Bitte korrigieren Sie Ihre Eingabe." + static final String gADITXT013001 = "You try to import a document by attaching an order as well as an opportunity, maybe concerning the fields for further numbers. Please correct your input." + static final String gADITXT014049 = "Bitte geben Sie eine gueltige Kombination aus Kundenkontakt-ID und entweder Kundennummer, Projektnummer oder Opportunitynummer ein." + static final String gADITXT014001 = "Please provide a valid combination of Customer Contact ID and Customer Number, Project Number or Opportunitynumber." + static final String gADITXT015049 = "Sie versuchen ein Dokument mit der Dokumentgruppe Medien abzulegen, ohne eine Akte ausgewaehlt zu haben. Bitte korrigieren Sie Ihre Eingabe" + static final String gADITXT015001 = "You try to import an document as Medien without choosing a folder. Please correct your input." + static final String gADITXT016049 = "Bitte geben Sie einen gültigen, eindeutigen Lieferanten an oder wählen Sie den Lieferanten aus der Auswahlliste." + static final String gADITXT016001 = "Please choose a valid, unambiguous Supplier or choose from the supplier number drop down." + static final String gADITXT017049 = "Dieser Lieferant existiert bereits in dieser Opportunity, bzw. in diesem Projekt. Bitte nutzen Sie die existierende Akte." + static final String gADITXT017001 = "This Supplier already exists for this Opportunity or Project. Please use the existing Supplier." + static final String gADITXT018049 = "Der Benutzer ist bereits als Projektbeteiligter in diesem Organisationsprojekt hinterlegt." + static final String gADITXT018001 = "The User has already been assigned as project participant in this organizational project." + static final String gADITXT019049 = "Sie haben eine ungültige Vertragsnummer eingegeben." + static final String gADITXT019001 = "You have entered a non existent contract number." + static final String gADITXT020049 = "Bitte geben Sie einen gültigen Kunden an." + static final String gADITXT020001 = "Please choose a valid Customer" + static final String gADITXT021049 = "Bitte geben Sie eine gültige Kombination aus Lieferant_Nr, Kontakt_Beschreibung, Kategorie und Termin ein oder wählen Sie eine Kontakt_Beschreibung aus der Auswahlliste." + static final String gADITXT021001 = "Please provide a valid combination of supplier_nr, contact description, categorie and date or choose from the contact description drop down." + static final String gADITXT022049 = "Bitte wählen Sie die weitere Kunden_Nr aus der Auswahlliste aus oder geben Sie eine existierende weitere Kunden_Nr ein." + static final String gADITXT022001 = "Please choose either a Further customer no. from the Dropdown Box or provide a correct Further customer no. manually." + static final String gADITXT023049 = "Bitte wählen Sie die weitere Lieferant_Nr aus der Auswahlliste aus oder geben Sie eine existierende weitere Lieferant_Nr ein." + static final String gADITXT023001 = "Please choose either a Further supplier no. from the Dropdown Box or provide a correct Further supplier no. manually." + static final String gADITXT024049 = "Der Import einer MSG-Datei ist nicht erlaubt." + static final String gADITXT024001 = "Importing a MSG file is not allowed." + static final String gADITXT025049 = "Unbekannte ITSM ID" + static final String gADITXT025001 = "Unknown ITSM ID" + +} \ No newline at end of file diff --git a/Optima/_Groovy/Functions.classpath b/Optima/_Groovy/Functions.classpath new file mode 100644 index 0000000..df30ebe --- /dev/null +++ b/Optima/_Groovy/Functions.classpath @@ -0,0 +1,3 @@ +D:\d3\d3server.prg\ext_groovy\Jar-Files\json-20180813.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\commons-io-2.5.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\commons-lang-2.6.jar \ No newline at end of file diff --git a/Optima/_Groovy/Functions.groovy b/Optima/_Groovy/Functions.groovy new file mode 100644 index 0000000..3d13be7 --- /dev/null +++ b/Optima/_Groovy/Functions.groovy @@ -0,0 +1,9322 @@ +import java.lang.invoke.ConstantCallSite + +// -------------------------------------------------------------------------------------------------------- +// Functions.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 com.dvelop.d3.server.core.D3Interface.StorageManagerInterface + +import groovy.sql.GroovyRowResult +import com.dvelop.d3.server.exceptions.SQLException +import com.dvelop.d3.server.exceptions.D3Exception + +import java.util.Calendar.* +import java.util.concurrent.atomic.DoubleAdder +import java.util.regex.Pattern.First +import java.awt.Component.BaselineResizeBehavior +import java.text.SimpleDateFormat +import java.time.chrono.AbstractChronology +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.channels.FileChannel +import java.sql.Timestamp +import org.apache.commons.lang.StringEscapeUtils +import java.nio.file.StandardCopyOption +import java.nio.file.Files + +// zusätzliche Imports für oData Zugriff 21.01.2019 +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.cert.X509Certificate; +import org.json.JSONArray; +import org.json.JSONObject; +import org.apache.commons.io.IOUtils; + + + +public class Functions { + + // hinzugefügt von calb/d.velop zur Verwendung in checkIfRepoIDExistsInDocType() + public static Map RepoInDocTypeList = new HashMap<>(); + + /** + * Ergänzt Eigenschaften in einer JPL Datei, wenn diese in der Dokumentart existiert + * @author Hilfsfunktion + * @return keine Rückgabe - im Hintergrund wird die JPL Datei erweitert + */ + public static void appendJplIfAttribExists( D3Interface d3, Document doc, DocumentType docType, File lPathJPL, int repoId, int dbPos, String value ) { + d3.log.info("Start Functions appendJplIfAttribExists"); + + boolean attribExists = checkIfRepoIDExistsInDocType(d3, docType, repoId); + if(attribExists == true) { + try { + lPathJPL.append( "dok_dat_feld[${dbPos}] = \"" + value + "\"" + System.lineSeparator()); + } catch(Exception e) { + d3.log.error("appendJplIfAttribExists can't append to file = " + lPathJPL); + } + } + } + + /** + * Prüfung ob es den Lieferanten (Akte - Projektlieferant) bereits gibt + * @author + * @see NewVersionEntry + * @return "OK"= nicht vorhanden; "FEHLER"=bereits vorhanden + */ + public static String checkDuplikateLieferant( D3Interface d3, Document doc, def pEntry, def pUser, def pDocId ) { + d3.log.info("Start Functions checkDuplikateLieferant"); + + def lRecordCount + def lAndClause = "" + + if( doc.field[Const.gDDF_AUFTRNR] != null && !doc.field[Const.gDDF_AUFTRNR].equals("") ) { + lAndClause = "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' " + } else if( doc.field[Const.gDDF_OPPNUMMER] != null && !doc.field[Const.gDDF_OPPNUMMER].equals("") ) { + lAndClause = "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' " + } + + if( doc.field[Const.gDDF_LNR] == null ) { + lAndClause = lAndClause + " AND (dok_dat_feld_${Const.gDDF_LNR} IS NULL OR dok_dat_feld_${Const.gDDF_LNR} = '') " + } else { + lAndClause = lAndClause + " AND dok_dat_feld_${Const.gDDF_LNR} = '${doc.field[Const.gDDF_LNR]}' " + } + + if( pDocId != null && ( pEntry.equals("update") || pEntry.equals("newversion") ) ) { + lAndClause = lAndClause + " AND doku_id <> '${pDocId}' " + } + + def sqlStatement = "SELECT * " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIKO}' " + + "AND dok_dat_feld_${Const.gDDF_LNAME} = '${doc.field[Const.gDDF_LNAME]}' " + lAndClause + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if( sqlResult != null && sqlResult.size() > 0 && pEntry.equals("insert") ) { + d3.log.error( "Es gibt bereits einen Eintrag. Ablage wird nicht erlaubt." ) + return "Fehler" + } else if( sqlResult != null && sqlResult.size() > 0 && ( pEntry.equals("update") || pEntry.equals("newversion") ) ) { + d3.log.error( "Es gibt bereits einen Eintrag. Ablage wird nicht erlaubt." ) + return "Fehler" + } else { + // d3.log.error( "Ablage erlaubt, kein Duplikat gefunden." ) + return "OK" + } + + } + + /** + * Prüfung der Gültigkeit der Vertragsnummer + * @author Unterstützende Prozesse + * @see ValidateInsertEntry, InsertEntry + * @return 0=gültig; 10=ungültig + */ + public static int checkContractNumber(D3Interface d3, Document doc) { + d3.log.info("Start Functions checkContractNumber"); + + String[] splittedString = doc.field[Const.gDDF_CONTRACTNO].split("\\|") + if(splittedString != null && splittedString.size() > 0) { + doc.field[Const.gDDF_CONTRACTNO] = splittedString[0].trim(); + } + + def sqlStatement = "SELECT * FROM firmen_spezifisch where dok_dat_feld_${Const.gDDF_CONTRACTNO} = '${doc.field[Const.gDDF_CONTRACTNO]}' and kue_dokuart in ('${Const.gDTS_EVERT}','${Const.gDTS_RVERT}') " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if( sqlResult == null || sqlResult.size() == 0 ) { + return 10 + } else { + return 0 + } + + } + + /** + * Organisation D3L-Dateien + * @author + * @see UpdateAttributExit, NewVersionExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt, gesperrt oder entsperrt + */ + public static int checkForLinkFiles(D3Interface d3, Document doc, DocumentType docType, Document docTemp) { + d3.log.info("Start Functions checkForLinkFiles"); + + def lReturn + def lCopyCount + List lCopyDokID + def lBlockInfo + def lOppNo + def lOppNoOld + def lProjNo + def lProjNoOld + def lFileExt = doc.getFileExtension() + + if( lFileExt != null && !lFileExt.equals("d3l") && !lFileExt.equals("D3L") ) { + + // Beispiel: Wenn aus einer anderen Dokumentart ein Kundenkontaktdokument wird, müssen nachträglich die D3L Dateien erzeugt werden + if( docType.getId().equals(Const.gDTS_DKUKO) && ( !docTemp.getType().getId().equals(Const.gDTS_DKUKO) || !docTemp.field[Const.gDDF_KONTAKTNUMMER].equals(doc.field[Const.gDDF_KONTAKTNUMMER]) ) ) { + + List lOppNR = new ArrayList<>(); + def lOppCount + def lKuKoID = doc.field[Const.gDDF_KONTAKTNUMMER]; + def lOppNRMain = doc.field[Const.gDDF_OPPNUMMER]; + def lProjNrMain = doc.field[Const.gDDF_AUFTRNR]; + def lKdNummerMain = doc.field[Const.gDDF_KNR]; + 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); + for(GroovyRowResult grr : sqlResult) { + lDokIdRef.add(grr.get("lDokIdRef")); + lOppNR.add(grr.get("lOppNR")); + lProjNr.add(grr.get("lProjNr")); + lProzess.add(grr.get("lProzess")); + lKdName.add(grr.get("lKdName")); + lKdNummer.add(grr.get("lKdNummer")); + } + + lOppCount = sqlResult.size(); + + // 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") ) { + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatementOppNummer = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNR.get(i)}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResultOppNummer = d3.getSql().executeAndGet(sqlStatementOppNummer) + lCopyCount = sqlResultOppNummer.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultOppNummer) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Opportunityakte ${lOppNR.get(i)}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + 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") ) { + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatementProjNummer = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNr.get(i)}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResultProjNummer = d3.getSql().executeAndGet(sqlStatementProjNummer) + lCopyCount = sqlResultProjNummer.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultProjNummer) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Maschinenprojektakte ${lProjNr.get(i)}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + lBlockInfo = docCopy.getReleaseVersionStatus() + + d3.log.info("lProjNrMain - " + lBlockInfo); + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + d3.log.info("lProjNrMain - " + lReturn); + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + 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") ) { + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatementKdNummer = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_KNR} = '${lKdNummer.get(i)}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResultKdNummer = d3.getSql().executeAndGet(sqlStatementKdNummer) + lCopyCount = sqlResultKdNummer.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultKdNummer) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Kundenmanagamentakte ${lKdNummer.get(i)}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFiles(d3, doc.id(), lOppNR.get(i), lProjNr.get(i), lProzess.get(i), lDokIdRef.get(i), lKdName.get(i), lKdNummer.get(i), "", "") + } + } + } + } + + // wenn sich die Kundenkontakt-ID geändert hat und es gibt bereits D3L Dateien, müssen diese auf "Freigabe gesperrt" gesetzt werden + if( !doc.field[Const.gDDF_KONTAKTNUMMER].equals(docTemp.field[Const.gDDF_KONTAKTNUMMER]) ) { + + List lFoundDocID = new ArrayList<>(); + def lRowCountSec + def lReturnSec + + def sqlStatementSec = "SELECT fs.doku_id as lFoundDocID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND pd.text like '%${doc.id()}%' " + + "AND ( pd.datei_erw = 'D3L' " + + "OR pd.datei_erw = 'd3l' ) " + + "AND fs.dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${docTemp.field[Const.gDDF_KONTAKTNUMMER]}' " + + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec); + lRowCountSec = sqlResultSec.size() + for(GroovyRowResult grr : sqlResultSec) { + lFoundDocID.add(grr.get("lFoundDocID")) + } + + for(int lRound = 0; lRound < lRowCountSec; lRound++) { + lReturn = d3.call.document_block (true, "d3groovy", lFoundDocID.get(lRound)); + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lFoundDocID.get(lRound)} konnte nicht gesperrt werden! Errorcode ${lReturn}") + } + } + } + + } + + for( int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + + // 13.07.2020: Durch Ergänzungen für den Service muss hier explizit geprüft werden, ob es die Eigenschaft in der Dokumentart gibt + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitOpportunityID) ) { + if( !doc.field[Const.gDDF_OPPNRM][i].equals(docTemp.field[Const.gDDF_OPPNRM][i]) && (!doc.field[Const.gDDF_OPPNRM][i].equals("") && 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) ) { + + lOppNo = doc.field[Const.gDDF_OPPNRM][i] + lOppNoOld = docTemp.field[Const.gDDF_OPPNRM][i] + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + if( lOppNoOld != null && !lOppNoOld.equals("") ) { + + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der alten Opportunityakte ${lOppNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + // JPL -> api_function("attribute_get_single", "doc_status_info", "", lCopyDokID[lCount], "d3groovy") + // 0 = gesperrt (Groovy 'g') | 1 = freigegeben (Groovy 'f') + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + + } + else + { + // es existiert keine d3l Datei, also nichts zu tun + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Opportunityakte ${lOppNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFiles( d3, doc.id(), lOppNo, "", "", "", "", "", "", "") + } + + } else if( !doc.field[Const.gDDF_OPPNRM][i].equals(docTemp.field[Const.gDDF_OPPNRM][i]) && (doc.field[Const.gDDF_OPPNRM][i].equals("") || 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) ) { + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + lOppNo = doc.field[Const.gDDF_OPPNRM][i] + lOppNoOld = docTemp.field[Const.gDDF_OPPNRM][i] + + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if ( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Opportunityakte ${lOppNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + lBlockInfo = docCopy.getReleaseVersionStatus() // 0 = gesperrt ('g') | 1 = freigegeben ('f') + + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if (lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitProjektnummerID) ) { + if ( !doc.field[Const.gDDF_WEITAUFTRAGSNR][i].equals(docTemp.field[Const.gDDF_WEITAUFTRAGSNR][i]) && (!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) ) { + lProjNo = doc.field[Const.gDDF_WEITAUFTRAGSNR][i] + + lProjNoOld = docTemp.field[Const.gDDF_WEITAUFTRAGSNR][i] + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + + if( !lProjNoOld.equals("") ) { + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Projektakte ${lProjNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true ,"d3groovy") // 0 = entsperren 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Projektakte ${lProjNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + // 0 = gesperrt | 1 = freigegeben + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFiles(d3, doc.id(), lOppNo, lProjNo, "", "", "", "", "", "") + } + + } else if ( !doc.field[Const.gDDF_WEITAUFTRAGSNR][i].equals(docTemp.field[Const.gDDF_WEITAUFTRAGSNR][i]) && (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) ) { + + // d3l sperren + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + lProjNo = doc.field[Const.gDDF_WEITAUFTRAGSNR][i] + + lProjNoOld = docTemp.field[Const.gDDF_WEITAUFTRAGSNR][i] + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Maschinenprojektakte ${lProjNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + + // 13.07.2020: Ergänzung für den Service weitere BelegNr und weitere SrID + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereBelegNrID) ) { + + if ( !doc.field[Const.gDDF_WEITEREBELEGNR][i].equals(docTemp.field[Const.gDDF_WEITEREBELEGNR][i]) && (!doc.field[Const.gDDF_WEITEREBELEGNR][i].equals("") && doc.field[Const.gDDF_WEITEREBELEGNR][i] != null) ) { + + def lBelegNo = doc.field[Const.gDDF_WEITEREBELEGNR][i] + def lBelegNoOld = docTemp.field[Const.gDDF_WEITEREBELEGNR][i] + + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + + if( lBelegNoOld != null && !lBelegNoOld.equals("") ) { + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy"); + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + lReturn = docCopy.block(true ,"d3groovy") // 0 = entsperren 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + // 0 = gesperrt | 1 = freigegeben + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFilesService(d3, doc, lBelegNo, null); + } + + } else if ( !doc.field[Const.gDDF_WEITEREBELEGNR][i].equals(docTemp.field[Const.gDDF_WEITEREBELEGNR][i]) && (doc.field[Const.gDDF_WEITEREBELEGNR][i].equals("") || doc.field[Const.gDDF_WEITEREBELEGNR][i] == null) ) { + + // d3l sperren + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + def lBelegNo = doc.field[Const.gDDF_WEITEREBELEGNR][i] + def lBelegNoOld = docTemp.field[Const.gDDF_WEITEREBELEGNR][i] + + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + boolean belegNoExistsInOtherDocField = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITEREBELEGNR, 0, lBelegNoOld); + if(belegNoExistsInOtherDocField == false) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + + } else if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereSRIDID) ) { + + if ( !doc.field[Const.gDDF_WEITERESRID][i].equals(docTemp.field[Const.gDDF_WEITERESRID][i]) && (!doc.field[Const.gDDF_WEITERESRID][i].equals("") && doc.field[Const.gDDF_WEITERESRID][i] != null) ) { + + def lSrIdNo = doc.field[Const.gDDF_WEITERESRID][i] + def lSrIdOld = docTemp.field[Const.gDDF_WEITERESRID][i] + + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + + if( lSrIdOld != null && !lSrIdOld.equals("") ) { + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_SRID} = '${lSrIdOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lSrIdOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true ,"d3groovy") // 0 = entsperren 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_SRID} = '${lSrIdNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lSrIdNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + // 0 = gesperrt | 1 = freigegeben + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFilesService(d3, doc, null, lSrIdNo); + } + + } else if ( !doc.field[Const.gDDF_WEITERESRID][i].equals(docTemp.field[Const.gDDF_WEITERESRID][i]) && (doc.field[Const.gDDF_WEITERESRID][i].equals("") || doc.field[Const.gDDF_WEITERESRID][i] == null) ) { + + // d3l sperren + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + def lSrIdNo = doc.field[Const.gDDF_WEITERESRID][i] + def lSrIdOld = docTemp.field[Const.gDDF_WEITERESRID][i] + + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_SRID} = '${lSrIdOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + boolean srIdExistsInOtherDocField = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITERESRID, 0, lSrIdOld); + if(srIdExistsInOtherDocField == false) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lSrIdOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + } + + // imue 26.08.20.20: Ergänzung für Equipment + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) ) { + + if ( ( doc.field[Const.gDDF_WEITEREEQUIPMENT][i] != null && !doc.field[Const.gDDF_WEITEREEQUIPMENT][i].equals("") ) && !doc.field[Const.gDDF_WEITEREEQUIPMENT][i].equals(docTemp.field[Const.gDDF_WEITEREEQUIPMENT][i]) ) { + + def lEquipmentNo = doc.field[Const.gDDF_WEITEREEQUIPMENT][i] + def lEquipmentNoOld = docTemp.field[Const.gDDF_WEITEREEQUIPMENT][i] + + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + + if( lEquipmentNoOld != null && !lEquipmentNoOld.equals("") ) { + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${lEquipmentNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lEquipmentNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy"); + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + lReturn = docCopy.block(true ,"d3groovy") // 0 = entsperren 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${lEquipmentNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lEquipmentNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + // 0 = gesperrt | 1 = freigegeben + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFilesEquipment(d3, doc, lEquipmentNo); + } + + } else if ( ( doc.field[Const.gDDF_WEITEREEQUIPMENT][i] == null || doc.field[Const.gDDF_WEITEREEQUIPMENT][i].equals("") ) && !doc.field[Const.gDDF_WEITEREEQUIPMENT][i].equals(docTemp.field[Const.gDDF_WEITEREEQUIPMENT][i]) ) { + + // d3l sperren + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + def lEquipmentNo = doc.field[Const.gDDF_WEITEREEQUIPMENT][i] + def lEquipmentNoOld = docTemp.field[Const.gDDF_WEITEREEQUIPMENT][i] + + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${lEquipmentNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + boolean equipmentNoExistsInOtherDocField = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITEREBELEGNR, 0, lEquipmentNoOld); + if(equipmentNoExistsInOtherDocField == false) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lEquipmentNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + } + + // 05.05.2022: Ergänzung für den Einkauf weitere BelegNr + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEinkaufBelegNrID) ) { + + if ( !doc.field[Const.gDDF_WEITEREBELEGNR][i].equals(docTemp.field[Const.gDDF_WEITEREBELEGNR][i]) && (!doc.field[Const.gDDF_WEITEREBELEGNR][i].equals("") && doc.field[Const.gDDF_WEITEREBELEGNR][i] != null) ) { + + def lBelegNo = doc.field[Const.gDDF_WEITEREBELEGNR][i] + def lBelegNoOld = docTemp.field[Const.gDDF_WEITEREBELEGNR][i] + + // Alte Nummer überprüfen und d3l ggf. sperren + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + + if( lBelegNoOld != null && !lBelegNoOld.equals("") ) { + // Alte Nummer überprüfen und d3l ggf. sperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '{doc.id()}%' OR pd.text like '%{doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy"); + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + lReturn = docCopy.block(true ,"d3groovy") // 0 = entsperren 1 = sperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + + // Neue Nummer überprüfen und ggf. d3l erstellen, falls vorhanden d3l entsperren + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNo}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNo}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + // 0 = gesperrt | 1 = freigegeben + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("g") ) { + lReturn = docCopy.block(false, "d3groovy") // 0 = entsperren + if(lReturn != 0) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } + } else { + createLinkFilesPurchase(d3, doc, lBelegNo); + } + + } else if ( !doc.field[Const.gDDF_WEITEREBELEGNR][i].equals(docTemp.field[Const.gDDF_WEITEREBELEGNR][i]) && (doc.field[Const.gDDF_WEITEREBELEGNR][i].equals("") || doc.field[Const.gDDF_WEITEREBELEGNR][i] == null) ) { + + // d3l sperren + // Sperrung der d3l Datei, wenn die Opportunity Nummer entfernt wird + def lBelegNo = doc.field[Const.gDDF_WEITEREBELEGNR][i] + def lBelegNoOld = docTemp.field[Const.gDDF_WEITEREBELEGNR][i] + + def sqlStatement = "SELECT fs.doku_id as lCopyDokID " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNoOld}' " + + "AND ( pd.text like '%${doc.id()}%' OR pd.text like '${doc.id()}%' OR pd.text like '%${doc.id()}' ) " + + "AND ( pd.datei_erw = 'D3L' OR pd.datei_erw = 'd3l' ) " + + "AND fs.kue_dokuart = '${docType.getId()}' " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lCopyCount = sqlResult.size() + lCopyDokID = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + lCopyDokID.add(grr.get("lCopyDokID")) + } + + if( lCopyCount != 0 ) { + boolean belegNoExistsInOtherDocField = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITEREBELEGNR, 0, lBelegNoOld); + if(belegNoExistsInOtherDocField == false) { + d3.log.info("Die Kopie des Dokuments ${doc.id()} existiert bereits in der Akte ${lBelegNoOld}!") + for(int lCount=0; lCount < lCopyCount; lCount++) { + Document docCopy = d3.archive.getDocument(lCopyDokID.get(lCount), "d3groovy") + + lBlockInfo = docCopy.getReleaseVersionStatus() + if( lBlockInfo.equals("f") ) { + + lReturn = docCopy.block(true, "d3groovy") // 1 = sperren + if( lReturn != 0 ) { + d3.log.error("Das Dokument ${lCopyDokID.get(lCount)} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + } + } + } + } + } + } + return 0; + } + + /** + * Überprüfung ob der Wert null ist + * @author allgemeine Hilfsfunktion + * @return wenn null, dann Rückgabe von "", ansonsten Originalwert + */ + public static String checkIfNullValue(String docValue) { + if(docValue == null || docValue.equals("null") || docValue.equals("")) { + return ""; + } else { + return docValue; + } + } + + /** + * Überprüfung ob der Wert null ist oder spezielle Zeichen enthält, notwendig für JPL Dateien + * @author allgemeine Hilfsfunktion + * @return wenn null, dann Rückgabe von "", ansonsten Originalwert mit maskierten Sonderzeichen + */ + public static String checkValueForJpl(String docValue) { + if(docValue == null || docValue.equals("null") || docValue.equals("")) { + return ""; + } else { + String docValueMasked = checkSpecialCharsInString(docValue); + if(docValueMasked != null && !docValueMasked.equals(docValue)) { + return docValueMasked; + } else { + return docValue; + } + } + } + + /** + * Überprüfung ob die Eigenschaft (Repository-ID) in der Dokumentart vorhanden ist + * @author allgemeine Hilfsfunktion + * @return true=vorhanden; false=nicht vorhanden + */ + public static boolean checkIfRepoIDExistsInDocType(D3Interface d3, DocumentType docType, int repoID) { + + // Ermittlung in welchen Dokumentarten die Eigenschaft Opportunitynummer, Hauptopportunity, Submission vorkommt + // Globale Liste als Cache hinzugefügt + if(docType != null) { + + // Prüfen, ob die Kombination bereits in der Liste enthalten ist: + def ergebnis = RepoInDocTypeList.get( docType.id() + Integer.toString(repoID) ); + + //d3.log.error( "checkIfRepoIDExistsInDocType => ${ergebnis} "); + + if ( ergebnis == null ) + { + def sqlStatement = "SELECT DISTINCT kue_dokuart as dokuArt " + + "FROM fispe_titel_dokuart " + + "WHERE repository_id = '${Integer.toString(repoID)}' " + + "AND kue_dokuart = '${docType.id()}'"; + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if ( sqlResult != null && sqlResult.size() > 0 ) + { + //d3.log.error( "hinzugefügt: " + docType.id() + " / ${Integer.toString(repoID)} / true " ); + RepoInDocTypeList.put( docType.id() + Integer.toString(repoID), true ); + return true; + } + else + { + //d3.log.error( "hinzugefügt: " + docType.id() + " / ${Integer.toString(repoID)} / false " ); + RepoInDocTypeList.put( docType.id() + Integer.toString(repoID), false ); + return false; + } + } + else + { + //d3.log.error( "gefunden: ${docType.id()} / ${Integer.toString(repoID)} / ${ergebnis} " ); + return ergebnis; + } + } + return false; + } + + /** + * Überprüfung ob ein Eigenschaftswert im 60er Feld eingetragen wurde + * @author allgemeine Hilfsfunktion + * @return true=vorhanden; false=nicht vorhanden + */ + public static boolean checkIfContentExistsInDoc(D3Interface d3, Document doc, int ddfToCheck, int posToSkip, String valueToCheck) { + d3.log.info("Start Functions checkIfContentExistsInDoc"); + + for(int i=1; i<=Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(i != posToSkip) { + if(doc.field[ddfToCheck][i] != null) { + String currentValue = doc.field[ddfToCheck][i]; + if(currentValue.equals(valueToCheck)) { + return true; + } + } + } + } + return false; + } + + /** + * Überprüfung ob sich ein Eigenschaftsfeld geändert hat + * @author allgemeine Hilfsfunktion + * @return true=geändert; false=nicht geändert + */ + public static boolean checkIfValueChanged(D3Interface d3, Document doc, Document gOldDoc, int ddfToCheck) { + d3.log.info("Start Functions checkIfValueChanged"); + if(gOldDoc != null) { + if(ddfToCheck >= 60 && ddfToCheck <=69) { + // Mehrfachfeld + for(int i=1; i<=Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[ddfToCheck][i] == null && gOldDoc.field[ddfToCheck][i] != null) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } else if(doc.field[ddfToCheck][i] != null && gOldDoc.field[ddfToCheck][i] == null) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } else if(doc.field[ddfToCheck][i] != null && gOldDoc.field[ddfToCheck][i] != null) { + if(doc.field[ddfToCheck][i] != gOldDoc.field[ddfToCheck][i] ) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } + } + } + } else { + // Einfachfeld + if(doc.field[ddfToCheck] == null && gOldDoc.field[ddfToCheck] != null) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } else if(doc.field[ddfToCheck] != null && gOldDoc.field[ddfToCheck] == null) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } else if(doc.field[ddfToCheck] != null && gOldDoc.field[ddfToCheck] != null) { + if(doc.field[ddfToCheck] != gOldDoc.field[ddfToCheck]) { + d3.log.info("End Functions checkIfValueChanged = true"); + return true; + } + } + } + } + d3.log.info("End Functions checkIfValueChanged = false"); + return false; + } + + /** + * Prüft ob ein Wert nicht doppelt eingetragen wurde im Service (Weitere BelegNr oder Weitere SrId) + * @author Service + * @see UpdateAttributeEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int checkServiceNr(D3Interface d3, Document doc, int repoId) { + d3.log.info("Start Functions checkServiceNr"); + + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), repoId) ){ + if( repoId == SystemSpecificConst.gWeitereBelegNrID ) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + def lBelegNr = doc.field[Const.gDDF_WEITEREBELEGNR][i]; + if(lBelegNr != null) { + boolean valueIsNotSingle = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITEREBELEGNR, i, lBelegNr); + if(valueIsNotSingle == true) { + return i; + } + } + } + } else if( repoId == SystemSpecificConst.gWeitereSRIDID ) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + def lSrId = doc.field[Const.gDDF_WEITERESRID][i]; + if(lSrId != null) { + boolean valueIsNotSingle = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITERESRID, i, lSrId); + if(valueIsNotSingle == true) { + return i; + } + } + } + } + } + return 0; + } + + /** + * Prüft ob ein Wert nicht doppelt eingetragen wurde im Einkauf (Weitere BelegNrd) + * @author Einkauf + * @see UpdateAttributeEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int checkPurchaseNr(D3Interface d3, Document doc, int repoId) { + d3.log.info("Start Functions checkPurchaseNr"); + + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), repoId) ){ + if( repoId == SystemSpecificConst.gWeitereEinkaufBelegNrID ) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + def lBelegNr = doc.field[Const.gDDF_WEITEREBELEGNR][i]; + if(lBelegNr != null) { + boolean valueIsNotSingle = checkIfContentExistsInDoc(d3, doc, Const.gDDF_WEITEREBELEGNR, i, lBelegNr); + if(valueIsNotSingle == true) { + return i; + } + } + } + } + } + return 0; + } + + /** + * Überprüfung ob sich ein Sonderzeichen im String befindet (notwendig für JPL Dateien und dem Hostimport) + * Folgende Zeichen sind nicht möglich: ":", """ ,da sie von JPL mit Funktionen vorbelegt sind + * @author allgemeine Hilfsfunktion + * @return String mit maskierten Sonderzeichen + */ + public static String checkSpecialCharsInString(String stringToCheck) { + final List metaCharacters = new ArrayList<>(); + metaCharacters.add("\\"); + metaCharacters.add("'"); + for(String currentCharacter : metaCharacters) { + if(stringToCheck.contains(currentCharacter)) { + stringToCheck = stringToCheck.replace(currentCharacter,"\\"+currentCharacter); + } + } + return stringToCheck; + } + + /** + * Wenn Sender in der Administrativen Domänen Akte zu finden ist, dann Kommuniaktionsrichtung "innerhalb Optima", wenn NICHT dann "eingehend". + * Danach folgt die Prüfung des Empfänger, wenn dieser sich NICHT in der Administrativen Domänen Akte befindet, ändert sich die Kommuniaktionsrichtung auf "ausgend". + * Je nach Kommunikationsrichtung wird infolgedessen die "Abteilung Sender" gefüllt aus den Benutzerinformationen. + * Voraussetzung: Der Absender steht mit seiner E-Mail-Adresse ebenfalls initial in der Kommunikationsrichtung drin. + * @author Übergreifende Prozesse + * @see InsertEntry + * @return keine Rückgabe, im Hintergrund wird die "Kommunikationsrichtigung" und der "Abteilung Sender" gefüllt + */ + public static int checkMailProperties(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions checkMailProperties"); + + def lRetCode + + // 23.06.2015 - tbur - Splitten des Attributs Kommunikationsrichtung. + // Aus SMOL kommt hier die E-Mailadresse des Absenders. Wenn diese die Domain OPTIMA-GROUP.COM enthält, dann + // handelt es sich um eine ausgehende Mail. In diesem Fall wird der Wert in "ausgehend" geändert. + // Ansonsten wird es in "eingehend" geändert. + if( ( doc.field[Const.gDDF_KOMMRICHTUNG] != null && !doc.field[Const.gDDF_KOMMRICHTUNG].equals("eingehend") + && !doc.field[Const.gDDF_KOMMRICHTUNG].equals("ausgehend") && !doc.field[Const.gDDF_KOMMRICHTUNG].equals("intern (innerhalb OPTIMA Group)") ) + && checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gKommunikationsrichtID)) { + + def domain + def sender + def receiver + def cnt_contact + def cnt_receiver + def startIndexDomainSender + List domainsSender = new ArrayList<>() + def startIndexDomainEmpf + List domainsEmpf = new ArrayList<>() + // 31.07.2017 sm_n_num_occurs("dok_dat_feld_:gDDF_EMAILKONTAKT") statt CUR_60_FIELDS + // 23.07.2019 imue anscheinend nicht mehr in Verwendung -> cnt_contact = sm_n_num_occurs("dok_dat_feld_:gDDF_EMAILKONTAKT") + sender = doc.field[Const.gDDF_KOMMRICHTUNG] + if( sender != null ) { + String convertedString = sender.toLowerCase() + domain = convertedString + } + if(domain != null) { + // 23.07.2019 imue - Ergänzung um weitere Domänen siehe OPG-2159 + startIndexDomainSender = domain.indexOf("@") + domain = domain.substring(startIndexDomainSender + 1) + def sqlStatementDom = "SELECT dok_dat_feld_${Const.gDDF_DOMAIN} as domainsSender " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_DOMAIN} = '${domain}' " + + "AND kue_dokuart = '${Const.gDTS_AADOM}' " + List sqlResultDom = d3.sql.executeAndGet(sqlStatementDom); + if(sqlResultDom != null) { + lRetCode = sqlResultDom.size() + for(GroovyRowResult grr : sqlResultDom) { + domainsSender.add(grr.get("domainsSender")) + } + } + } + domain = lRetCode + if( domain > 0 ) { + doc.field[Const.gDDF_KOMMRICHTUNG] = "intern (innerhalb OPTIMA Group)" + for( int a=1; a < Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); a++) { + String convertedString = doc.field[Const.gDDF_EMPFAENGERM][a]; + if(convertedString != null) { + convertedString = convertedString.toLowerCase(); + receiver = convertedString + d3.log.info(" Empfänger :a = " + receiver) + if(receiver != null) { + // 23.07.2019 imue - Ergänzung um weitere Domänen siehe OPG-2159 + startIndexDomainEmpf = receiver.indexOf("@") + receiver = receiver.substring(startIndexDomainEmpf + 1) + def sqlStatementDomEmpf = "SELECT dok_dat_feld_${Const.gDDF_DOMAIN} as domainsEmpf " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_DOMAIN} = '${receiver}' " + + "AND kue_dokuart = '${Const.gDTS_AADOM}' " + List sqlResultDomEmpf = d3.sql.executeAndGet(sqlStatementDomEmpf); + if(sqlResultDomEmpf != null) { + lRetCode = sqlResultDomEmpf.size() + for(GroovyRowResult grr : sqlResultDomEmpf) { + domainsEmpf.add(grr.get("domainsEmpf")) + } + d3.log.info(" Anzahl OPTIMA in Empfänger ${a} = ${lRetCode}" ) + if(lRetCode == 0) { + doc.field[Const.gDDF_KOMMRICHTUNG] = "ausgehend" + d3.log.info(" Kommunikationsrichtung in ausgehend geändert" ) + } + } + } + } + } + // Wenn der EMpfängerkreis auch nur OPTIMA enthält, dann ist die Richtung INTERN + } else { + doc.field[Const.gDDF_KOMMRICHTUNG] = "eingehend" + // Bei eingehenden Mails muss der Absender in das Feld E-Mail Kontakt geschrieben werden + } + // d3.log.info(" Richtung = " + doc.field[Const.gDDF_KOMMRICHTUNG]) + } + + // 17.12.2015 - tbur - Füllen der Attribute Abteilung Sender und Abteilung Empfänger. + // Mit den Sender- bzw- Empfängeremailadressen soll die Abteilung aus dem Benutzerstamm + // ermittelt werden. + if( ( doc.field[Const.gDDF_KOMMRICHTUNG] != null ) && checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gKommunikationsrichtID) ) { + def sender + def abteilung + def chk_receiver = 0 + def chk_sender = 0 + def cnt_receiver + def receiver + if( doc.field[Const.gDDF_KOMMRICHTUNG].equals("intern (innerhalb OPTIMA Group)") ) { + chk_receiver = 1 + chk_sender = 1 + d3.log.info(" intern = Sender und Empfänger werden bearbeitet.") + } else if( doc.field[Const.gDDF_KOMMRICHTUNG].equals("ausgehend") ) { + chk_receiver = 0 + chk_sender = 1 + d3.log.info(" ausgehend = Nur Sender wird bearbeitet.") + } else if( doc.field[Const.gDDF_KOMMRICHTUNG].equals("eingehend") ) { + chk_receiver = 1 + chk_sender = 0 + d3.log.info(" eingehend = nichts wird bearbeitet.") + } else { + chk_receiver = 0 + chk_sender = 0 + d3.log.info(" FEHLER KommRichtung = " + doc.field[Const.gDDF_KOMMRICHTUNG]) + } + // Prüfen des Senders + if( chk_sender == 1 ) { + sender = doc.field[Const.gDDF_SENDER] + if( sender != null ) { + String convertedString = sender.toUpperCase() + sender = convertedString + } + d3.log.info(" Sender = " + sender) + if( sender != null && !docType.getId().equals(Const.gDTS_DPROO) ) { + def sqlStatementAbt = "SELECT abteilung as abteilung FROM benutzer WHERE upper(email) = '${sender}' " + List sqlResultAbt = d3.sql.executeAndGet(sqlStatementAbt); + if(sqlResultAbt != null && sqlResultAbt.size() > 0) { + abteilung = sqlResultAbt.getAt(0).get("abteilung") + if( abteilung != null && !abteilung.equals("") ) { + d3.log.info(" Abteilung = " + abteilung) + doc.field[Const.gDDF_ABTSENDER] = abteilung + } else { + d3.log.info(" Keine Abteilung gefunden") + doc.field[Const.gDDF_ABTSENDER] = "Keine Abteilung gefunden" + } + } + } + } + // Prüfen der Empfänger + if( chk_receiver == 1 ) { + for( int a=1; a <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); a++ ) { + receiver = doc.field[Const.gDDF_EMPFAENGERM][a] + if( receiver != null ) { + String convertedString = doc.field[Const.gDDF_EMPFAENGERM][a].toUpperCase() + receiver = convertedString + d3.log.info(" Empfänger ${a} = " + receiver) + def sqlStatementAbt = "SELECT abteilung as abteilung FROM benutzer WHERE upper(email) = '${receiver}' " + List sqlResultAbt = d3.sql.executeAndGet(sqlStatementAbt); + if( sqlResultAbt != null && sqlResultAbt.size() > 0 ) { + abteilung = sqlResultAbt.getAt(0).get("abteilung") + doc.field[Const.gDDF_ABTEMPM][a] = abteilung + d3.log.info(" dok_dat_feld_" + Const.gDDF_ABTEMPM + "[${a}] = " + abteilung ) + } + } else { + d3.log.info(" Keine Abteilung gefunden") + doc.field[Const.gDDF_ABTEMPM][a] = "Keine Abteilung gefunden" + } + } + } + } + return 0; + } + + /** + * Erstellung der Aktenstruktur für die Baudokumente + * @author Unterstützende Prozesse + * @see InsertExit + * @return keine Rückgabe; im Hintergrund werden Akten erstellt + */ + public static void createConstDocFolder(D3Interface d3, Document doc, def lBauprojekt) { + d3.log.info("Start Functions createConstDocFolder"); + + def lReturnvalue //Fehlercode + + //Setzen der Attributwerte für die Baugruppe-Akten + Document newDoc = d3.archive.newDocument() + newDoc.status = Document.DocStatus.DOC_STAT_RELEASE + newDoc.field[Const.gDDF_BAUPROJEKT] = lBauprojekt + newDoc.field[Const.gDDF_PROZESS] = "PZ003" + newDoc.type = Const.gDTS_ABAUK + + //Definition der Bauakten + String[] lBauakten = [ + "01 Besprechungen", + "02 Controlling", + "03 Zeitplan", + "04 Gebäudepläne", + "05 Vorplanungen", + "06 Genehmigungen", + "07 Ausführungen", + "08 Ausschreibungen I Beschaffungen", + "09 Abnahmen", + "10 Reparaturen I Reklamationen", + "11 Keine Ahnung wo das hin muss" + ] + def lAnz = lBauakten.size() + + for(int j=0; j < lAnz; j++) { + newDoc.field[Const.gDDF_BAUAKTE] = lBauakten[j] + lReturnvalue = d3.call.folder_create(newDoc) + if (lReturnvalue != 0) { + d3.log.error("### Fehler Anlage Bauakte - folder_create (createConstDocFolder) ${lReturnvalue}") + } + } + } + + /** + * Organisation D3L-Dateien "Kundenkontaktdokumente" + * @author Maschinenprojekt + * @see InsertExit + * @return keine Rückgabe; im Hintergrund werden D3L-Dateien erstellt + */ + public static void createD3lForDKUKO(D3Interface d3, Document doc, def ln15 ) { + d3.log.info("Start Functions createD3lForDKUKO"); + + // Suche alle Kundenkontaktdokument "DKUKO" mit der gleichen Kundenkontakt-ID DDF15 deren Fileextension != d3l + d3.log.info("createD3lForDKUKO gestartet für " + doc.id()); + + def lDKUKOCount + def lReturn + def ln60Count + def ln63Count + def ln65Count + def ln68Count + def lDocCount + def lCount + def lDateTime + def l60sCount + def ln4 + + def sqlStatement = "SELECT p.doku_id as lDKUKODocID " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${ln15}' " + + "AND p.datei_erw <> 'D3L' " + + "AND p.dokuart = '${Const.gDTS_DKUKO}' " + + "AND p.doku_id = f.doku_id "; + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size() > 0) { + lDKUKOCount = sqlResult.size() + + d3.log.info("createD3lForDKUKO - doc ${doc.id()} / Kontaktnummer ${ln15} / DKUKO Anzahl ${sqlResult.size()}"); + + for(int i=0; i < lDKUKOCount; i++) { + + def sqlStatement1 = "SELECT dok_dat_feld_${Const.gDDF_ABTSENDER} as ln6, " + + "dok_dat_feld_${Const.gDDF_SENDER} as ln7, " + + "dok_dat_feld_${Const.gDDF_PROJKLAMMER} as ln8, " + + "dok_dat_feld_${Const.gDDF_RESPSALESMAN} as ln14, " + + "dok_dat_feld_${Const.gDDF_DOKTITLE} as ln17, " + + "dok_dat_feld_${Const.gDDF_DOKGROUP} as ln21, " + + "dok_dat_feld_${Const.gDDF_KDAKTNAME} as ln24, " + + "dok_dat_feld_${Const.gDDF_KOMMRICHTUNG} as ln32, " + + "dok_dat_feld_${Const.gDDF_JAHR} as ln33, " + + "dok_dat_feld_${Const.gDDF_MONAT} as ln34, " + + "dok_dat_feld_${Const.gDDF_VKPHASE} as ln35, " + + "dok_dat_feld_${Const.gDDF_ERGEBNISDOK} as ln44, " + + "dok_dat_feld_${Const.gDDF_KDAKTKAT} as ln45, " + + "dok_dat_feld_${Const.gDDF_ARCDOCID} as ln49, " + + "dok_dat_feld_${Const.gDDF_ERDATE} as ln50, " + + "dok_dat_feld_${Const.gDDF_KONTAKTDATE} as ln52, " + + "dok_dat_feld_${Const.gDDF_DOCINFONR} as ln80 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${sqlResult.getAt(i).get("lDKUKODocID")}'"; + + List sqlResult1 = d3.sql.executeAndGet(sqlStatement1); + if(sqlResult1 != null && sqlResult1.size() > 0) { + + def ln6 = sqlResult1.getAt(0).get("ln6") + def ln7 = sqlResult1.getAt(0).get("ln7") + def ln8 = sqlResult1.getAt(0).get("ln8") + def ln14 = sqlResult1.getAt(0).get("ln14") + def ln17 = sqlResult1.getAt(0).get("ln17") + def ln21 = sqlResult1.getAt(0).get("ln21") + def ln24 = sqlResult1.getAt(0).get("ln24") + def ln32 = sqlResult1.getAt(0).get("ln32") + def ln33 = sqlResult1.getAt(0).get("ln33") + def ln34 = sqlResult1.getAt(0).get("ln34") + def ln35 = sqlResult1.getAt(0).get("ln35") + def ln44 = sqlResult1.getAt(0).get("ln44") + def ln45 = sqlResult1.getAt(0).get("ln45") + def ln49 = sqlResult1.getAt(0).get("ln49") + def ln50 = sqlResult1.getAt(0).get("ln50") + def ln52 = sqlResult1.getAt(0).get("ln52") + def ln80 = sqlResult1.getAt(0).get("ln80") + + def sqlStatement2 = "SELECT dok_dat_feld_${Const.gDDF_STATUS} as ln1, " + + "dok_dat_feld_${Const.gDDF_PROZESS} as ln5, " + + "dok_dat_feld_${Const.gDDF_AUFTRNR} as ln19, " + + "dok_dat_feld_${Const.gDDF_KNR} as ln22, " + + "dok_dat_feld_${Const.gDDF_KNAME} as ln23, " + + "dok_dat_feld_${Const.gDDF_BUCHKREIS} as ln28, " + + "dok_dat_feld_${Const.gDDF_OPPNUMMER} as ln31, " + + "dok_dat_feld_${Const.gDDF_HAUPTOPP} as ln36, " + + "dok_dat_feld_${Const.gDDF_SUBMISSION} as ln37, " + + "dok_dat_feld_${Const.gDFF_ABTEILUNG} as ln39, " + + "dok_dat_feld_${Const.gDDF_SALESGROUP} as ln47 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${doc.id()}' "; + + List sqlResult2 = d3.sql.executeAndGet(sqlStatement2); + if(sqlResult2 != null && sqlResult2.size() > 0) { + + def ln1 = sqlResult2.getAt(0).get("ln1") + def ln5 = sqlResult2.getAt(0).get("ln5") + def ln19 = sqlResult2.getAt(0).get("ln19") + def ln22 = sqlResult2.getAt(0).get("ln22") + def ln23 = sqlResult2.getAt(0).get("ln23") + def ln28 = sqlResult2.getAt(0).get("ln28") + def ln31 = sqlResult2.getAt(0).get("ln31") + def ln36 = sqlResult2.getAt(0).get("ln36") + def ln37 = sqlResult2.getAt(0).get("ln37") + def ln39 = sqlResult2.getAt(0).get("ln39") + def ln47 = sqlResult2.getAt(0).get("ln47") + + List ln60 = new ArrayList<>(); + def sqlStatement3 = "SELECT value_char as ln60 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${sqlResult.getAt(i).get("lDKUKODocID")}' " + + "AND field_no = '${Const.gDDF_ERGDOCFUER}'" + List sqlResult3 = d3.sql.executeAndGet(sqlStatement3); + if(sqlResult3 != null && sqlResult3.size() > 0) { + for(GroovyRowResult grr : sqlResult3) { + ln60.add(grr.get("ln60")); + } + } + + List ln63 = new ArrayList<>(); + def sqlStatement4 = "SELECT value_char as ln63 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${sqlResult.getAt(i).get("lDKUKODocID")}' " + + "AND field_no = '${Const.gDDF_ABTEMPM}' " + List sqlResult4 = d3.sql.executeAndGet(sqlStatement4); + if(sqlResult4 != null && sqlResult4.size() > 0) { + for(GroovyRowResult grr : sqlResult4) { + ln63.add(grr.get("ln63")) + } + } + + List ln65 = new ArrayList<>(); + def sqlStatement5 = "SELECT value_char as ln65 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${sqlResult.getAt(i).get("lDKUKODocID")}' " + + "AND field_no = '${Const.gDDF_EMPFAENGERM}'" + List sqlResult5 = d3.sql.executeAndGet(sqlStatement5); + if(sqlResult5 != null && sqlResult5.size() > 0) { + for(GroovyRowResult grr : sqlResult5) { + ln65.add(grr.get("ln65")) + } + } + + List ln68 = new ArrayList<>(); + def sqlStatement6 = "SELECT value_char as ln68 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${doc.id()}' " + + "AND field_no = '${Const.gDDF_BUCHKREIS68}' " + List sqlResult6 = d3.sql.executeAndGet(sqlStatement6); + if(sqlResult6 != null && sqlResult6.size() > 0) { + for(GroovyRowResult grr : sqlResult6) { + ln68.add(grr.get("ln68")) + } + } + + Date dateLog = new Date(); + SimpleDateFormat sdfLog = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String dateString = sdfLog.format(dateLog); + + File lPathD3L = new File("F:\\d3\\Hostimport\\CopyDKUKO\\" + sqlResult.getAt(i).get("lDKUKODocID") + "_" + dateString + "_" + ln15 + ".D3L"); + File lPathJPL = new File("F:\\d3\\Hostimport\\CopyDKUKO\\"+ sqlResult.getAt(i).get("lDKUKODocID") + "_" + dateString + "_" + ln15 + ".jpl"); + + lPathJPL.write("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${Const.gDTS_DKUKO}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_STATUS}] = \"" + checkValueForJpl(ln1) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"" + checkValueForJpl(ln5) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ABTSENDER}] = \"" + checkValueForJpl(ln6) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_SENDER}] = \"" + checkValueForJpl(ln7) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROJKLAMMER}] = \"" + checkValueForJpl(ln8) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_RESPSALESMAN}] = \"" + checkValueForJpl(ln14) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"" + checkValueForJpl(ln17) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"" + checkValueForJpl(doc.field[Const.gDDF_AUFTRNR]) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"" + checkValueForJpl(ln21) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNR}] = \"" + checkValueForJpl(ln22) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNAME}] = \"" + checkValueForJpl(ln23) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KDAKTNAME}] = \"" + checkValueForJpl(ln24) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_BUCHKREIS}] = \"" + checkValueForJpl(ln28) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"" + checkValueForJpl(doc.field[Const.gDDF_OPPNUMMER]) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KOMMRICHTUNG}] = \"" + checkValueForJpl(ln32) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_JAHR}] = \"" + checkValueForJpl(ln33) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_MONAT}] = \"" + checkValueForJpl(ln34) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_VKPHASE}] = \"" + checkValueForJpl(ln35) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_HAUPTOPP}] = \"" + checkValueForJpl(ln36) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_SUBMISSION}] = \"" + checkValueForJpl(ln37) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDFF_ABTEILUNG}] = \"" + checkValueForJpl(ln39) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERGEBNISDOK}] = \"" + checkValueForJpl(ln44) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KDAKTKAT}] = \"" + checkValueForJpl(ln45) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_SALESGROUP}] = \"" + checkValueForJpl(ln47) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ARCDOCID}] = \"" + checkValueForJpl(ln49) + "\"" + System.lineSeparator()) + if(ln50 != null && !ln50.equals("")) { + Date date50 = new Date(ln50.getTime()); + SimpleDateFormat sdf50 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + String formatDateTime50 = sdf50.format(date50); + formatDateTime50 = formatDateTime50.replace(":", "\\:") + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"" + formatDateTime50 + "\"" + System.lineSeparator()) + } + if(ln52 != null && !ln52.equals("")) { + Date date52 = new Date(ln52.getTime()); + SimpleDateFormat sdf52 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + String formatDateTime52 = sdf52.format(date52); + formatDateTime52 = formatDateTime52.replace(":", "\\:") + lPathJPL.append("dok_dat_feld[${Const.gDDF_KONTAKTDATE}] = \"" + formatDateTime52 + "\"" + System.lineSeparator()) + } + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOCINFONR}] = \"" + checkValueForJpl(ln80.toString()) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KONTAKTNUMMER}] = \"" + checkValueForJpl(ln15.toString()) + "\"" + System.lineSeparator()) + lPathJPL.append("text[4] = \"" + sqlResult.getAt(i).get("lDKUKODocID") + "\"" + System.lineSeparator()) + + for(int j=1; j <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); j++) { + if(ln60 != null && ln60.size() > 0) { + if( !doc.field[Const.gDDF_ABTEMPM][j].equals("") && doc.field[Const.gDDF_ABTEMPM][j] != null) { + lPathJPL.append("dok_dat_feld_${Const.gDDF_ERGDOCFUER}[${j}] = \"" + checkValueForJpl(ln60.get(j)) + "\"" + System.lineSeparator()) + } + } + if(ln63 != null && ln63.size() > 0) { + if( !doc.field[Const.gDDF_ABTEMPM][j].equals("") && doc.field[Const.gDDF_ABTEMPM][j] != null ) { + lPathJPL.append("dok_dat_feld_${Const.gDDF_ABTEMPM}[${j}] = \"" + checkValueForJpl(ln63[j]) + "\"" + System.lineSeparator()) + } + } + if(ln68 != null && ln68.size() > 0) { + if( !doc.field[Const.gDDF_BUCHKREIS68][j].equals("") && doc.field[Const.gDDF_BUCHKREIS68][j] != null ) { + lPathJPL.append("dok_dat_feld_${Const.gDDF_BUCHKREIS68}[${j}] = \"" + checkValueForJpl(ln68[j]) + "\"" + System.lineSeparator()) + } + } + if(ln65 != null && ln65.size() > 0) { + if( !doc.field[Const.gDDF_EMPFAENGERM][j].equals("") && doc.field[Const.gDDF_EMPFAENGERM] != null ) { + lPathJPL.append("dok_dat_feld_${Const.gDDF_EMPFAENGERM}[${j}] = \"" + checkValueForJpl(ln65[j]) + "\"" + System.lineSeparator()) + } + } + } + + lPathD3L.write("idlist" + System.lineSeparator()); + lPathD3L.append("${sqlResult.getAt(i).get("lDKUKODocID")}" + System.lineSeparator()); + } + } + } + } + } + + /** + * Organisation D3L Dateien für ECR + * @author + * @see LinkEntry + * @return keine Rückgabe; im Hintergrund werden D3L-Dateien erstellt + */ + public static void createD3lForECR( D3Interface d3, def docIdChild, def docIdFather ) { + d3.log.info("Start Functions createD3lForECR"); + + //Erstelle d3l Dateien zu einem Dokument, wenn weitere Aufträge eingegeben werden + + // Wir kommen aus dem Link Entry + // Übergeben wird + // - pDocId = Die Dokument ID des auslösenden Kindes !Originaldokument! -> docIdchild + // - pDocIdFather = Hier ist der neue Vater enthalten, die Akte in die die D3L kopiert werden soll -> docIdFather + + def lReturn + def lWeitAuftragsnrCount + List lErgDoc60 = new ArrayList<>(); + List lWeitAuftragsnr = new ArrayList<>(); + def lD3LStop + def lDateTime + + Document docTemp = d3.archive.getDocument(docIdChild, "d3groovy"); + + def sqlStatement1 = + "SELECT dok_dat_feld_${Const.gDDF_BESCHREIBUNG} as In24, dok_dat_feld_${Const.gDDF_ERGEBNISDOK} as ln44 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${docIdChild}' " + List sqlResult1 = d3.sql.executeAndGet(sqlStatement1); + def In24 = sqlResult1.getAt(0).get("In24") + def ln44 = sqlResult1.getAt(0).get("ln44") + + // Projektnummer des Vaters ermitteln, für korrekten Durchlauf Aktenplan + def sqlStatement2 = + "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} as In19 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${docIdFather}' " + List sqlResult2 = d3.sql.executeAndGet(sqlStatement2); + def In19 = sqlResult2.getAt(0).get("In19") + + // DBMS ALIAS In24, In28, In80, In21, In18, In17, In43, In33, In23, In22, In34, In8, In5, In2, In1, In37, In15, In50 + def sqlStatement3 = + "SELECT dok_dat_feld_${Const.gDDF_BESCHREIBUNG} as In24, " + + "dok_dat_feld_${Const.gDDF_BUCHKREIS} as In28, " + + "dok_dat_feld_${Const.gDDF_DOCINFONR} as In80, " + + "dok_dat_feld_${Const.gDDF_DOKGROUP} as In21, " + + "dok_dat_feld_${Const.gDDF_DOKGRP} as In18, " + + "dok_dat_feld_${Const.gDDF_DOKTITLE} as In17, " + + "dok_dat_feld_${Const.gDDF_ECRSTATUS} as In43, " + + "dok_dat_feld_${Const.gDDF_JAHR} as In33, " + + "dok_dat_feld_${Const.gDDF_KNAME} as In23, " + + "dok_dat_feld_${Const.gDDF_KNR} as In22, " + + "dok_dat_feld_${Const.gDDF_MONAT} as In34, " + + "dok_dat_feld_${Const.gDDF_PROJKLAMMER} as In8, " + + "dok_dat_feld_${Const.gDDF_PROZESS} as In5, " + + "dok_dat_feld_${Const.gDDF_PSPELEMENT} as In2, " + + "dok_dat_feld_${Const.gDDF_STATUS} as In1, " + + "dok_dat_feld_${Const.gDDF_SUBMISSION} as In37, " + + "dok_dat_feld_${Const.gDDF_AKTIVITAETSID} as In15, " + + "dok_dat_feld_${Const.gDDF_ERDATE} as In50 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${docIdChild}' " + + List sqlResult3 = d3.sql.executeAndGet(sqlStatement3); + In24 = sqlResult3.getAt(0).get("In24") + def In28 = sqlResult3.getAt(0).get("In28") + def In80 = sqlResult3.getAt(0).get("In80") + def In21 = sqlResult3.getAt(0).get("In21") + def In18 = sqlResult3.getAt(0).get("In18") + def In17 = sqlResult3.getAt(0).get("In17") + def In43 = sqlResult3.getAt(0).get("In43") + def In33 = sqlResult3.getAt(0).get("In33") + def In23 = sqlResult3.getAt(0).get("In23") + def In22 = sqlResult3.getAt(0).get("In22") + def In34 = sqlResult3.getAt(0).get("In34") + def In8 = sqlResult3.getAt(0).get("In8") + def In5 = sqlResult3.getAt(0).get("In5") + def In2 = sqlResult3.getAt(0).get("In2") + def In1 = sqlResult3.getAt(0).get("In1") + def In37 = sqlResult3.getAt(0).get("In37") + def In15 = sqlResult3.getAt(0).get("In15") + def In50 = sqlResult3.getAt(0).get("In50") + + + // Eine eindeutige Erkennung eines bereits kopierten Kindes ist + // - Die Projektnummer (DDF 19 gDDF_AUFTRNR) + // - die Aktivitäts-ID (gDDF_AKTIVITAETSID DDF 15) und + // - Im Bemerkungsfeld 4 die Dokument ID des Kindes + def sqlStatement4 = + "SELECT pd.text as lBemerkung " + + "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} = '${In15}' " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${In19}' " + List sqlResult4 = d3.sql.executeAndGet(sqlStatement4) + + if(sqlResult4 != null && sqlResult4.size() > 0) { + lD3LStop = 0 + // Wenn im Bemerkungsfeld die Dokument ID des Original-Kind-Dokuments enthalten ist dann erfolgt keine Kopie + for( GroovyRowResult grr : sqlResult4 ) { + + if( grr.get("lBemerkung") != null && !grr.get("lBemerkung").equals("") ) { + lReturn = grr.get("lBemerkung").indexOf(docIdChild); + + if( lReturn > 0 ) { + d3.log.error( "Dieses Dokument ${docIdChild} wurde bereits verlinkt. Verlinkung wird nicht durchgeführt." ) + lD3LStop = 1 + } else { + // d3.log.error( "Nicht gefunden! Es darf gelinkt werden." ) + // Alles OK, das cloning wird gestartet. + } + } + } + } + + if( lD3LStop != 1 ) { + if( In21.equals("") ) { + In21 = "ECR" + } + + def sqlStatement5 = + "SELECT value_char as lErgDoc60 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${docIdChild}' " + + "AND field_no = '${Const.gDDF_ERGDOCFUER}' " + List sqlResult5 = d3.sql.executeAndGet(sqlStatement5) + for(GroovyRowResult grr : sqlResult5) { + lErgDoc60.add( grr.get("lErgDoc60") ) + } + + def sqlStatement6 = + "SELECT value_char as lWeitAuftragsnr66 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${docIdChild}' " + + "AND field_no = '${Const.gDDF_WEITAUFTRAGSNR}' " + List sqlResult6 = d3.sql.executeAndGet(sqlStatement6) + for(GroovyRowResult grr : sqlResult6) { + lWeitAuftragsnr.add( grr.get("lWeitAuftragsnr66") ) + } + lWeitAuftragsnrCount = lWeitAuftragsnr.size() + + // Tag zweistellig, Monat zweistellig, Jahr viertstellig, Minute zweistellig, Sekunde zweistellig Milisekunde dreistellig, + def date = new Date() + def sdf = new SimpleDateFormat("ddMMyyyy") + lDateTime = sdf.format(date) + + File fileD3L = new File( "F:\\d3\\Hostimport\\LinkFiles\\CopyECR" + "_" + In19 + "_" + docIdChild + "_30_" + lDateTime + "_" + docTemp.field[Const.gDDF_AKTIVITAETSID] + ".d3l" ) + File fileJPL = new File( "F:\\d3\\Hostimport\\LinkFiles\\CopyECR" + "_" + In19 + "_" + docIdChild + "_30_" + lDateTime + "_" + docTemp.field[Const.gDDF_AKTIVITAETSID] + ".jpl" ) + + fileD3L.write( "idlist" + System.lineSeparator()) + fileD3L.append( "${docIdChild}" ) + + fileJPL.write( "logi_verzeichnis = 'Fr' " + System.lineSeparator()) + fileJPL.append( "dokuart = '${Const.gDTS_DMECR}'" + System.lineSeparator()) + if(In24 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_BESCHREIBUNG}] = \"" + In24 + "\"" + System.lineSeparator()) + } + if(ln44 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_ERGEBNISDOK}] = \"" + ln44 + "\"" + System.lineSeparator()) + } + if(In28 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_BUCHKREIS}] = \"" + In28 + "\"" + System.lineSeparator()) + } + if(In80 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_DOCINFONR}] = \"" + In80 + "\"" + System.lineSeparator()) + } + if(In21 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"" + In21 + "\"" + System.lineSeparator()) + } + if(In18 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_DOKGRP}] = \"" + In18 + "\"" + System.lineSeparator()) + } + if(In17 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"" + In17 + "\"" + System.lineSeparator()) + } + if(In43 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_ECRSTATUS}] = \"" + In43 + "\"" + System.lineSeparator()) + } + if(In33 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_JAHR}] = \"" + In33 + "\"" + System.lineSeparator()) + } + if(In23 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_KNAME}] = \"" + In23 + "\"" + System.lineSeparator()) + } + if(In22 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_KNR}] = \"" + In22 + "\"" + System.lineSeparator()) + } + if(In34 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_MONAT}] = \"" + In34 + "\"" + System.lineSeparator()) + } + if(In8 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_PROJKLAMMER}] = \"" + In8 + "\"" + System.lineSeparator()) + } + if(In19 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"" + In19 + "\"" + System.lineSeparator() ) + } + if(In5 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_PROZESS}] = \"" + In5 + "\"" + System.lineSeparator()) + } + if(In2 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_PSPELEMENT}] = \"" + In2 + "\"" +System.lineSeparator()) + } + if(In1 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_STATUS}] = \"" + In1 + "\"" + System.lineSeparator()) + } + if(In37 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_SUBMISSION}] = \"" + In37 + "\"" + System.lineSeparator()) + } + if(docTemp.field[Const.gDDF_SUBJECT] != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_SUBJECT}] = \"" + docTemp.field[Const.gDDF_SUBJECT] + "\"" + System.lineSeparator()) + } + if(In15 != null) { + fileJPL.append( "dok_dat_feld[${Const.gDDF_AKTIVITAETSID}] = \"" + In15 + "\"" + System.lineSeparator()) + } + + // Der Hostimport erwartet ein bestimmtes Format, daher muss der Timestamp angepasst werden + Date date50 = new Date(In50.getTime()); + SimpleDateFormat sdf50 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + String formatDateTime50 = sdf50.format(date50); + formatDateTime50 = formatDateTime50.replace(":", "\\:") + + fileJPL.append( "dok_dat_feld[${Const.gDDF_ERDATE}] = \"" + formatDateTime50 + "\"" + System.lineSeparator()) + fileJPL.append( "text[4] = \"" + docIdChild + "\"" + System.lineSeparator()) + + for( int i = 1; i <= lErgDoc60.size(); i++ ) { + fileJPL.append( "dok_dat_feld_:gDDF_ERGDOCFUER[:lCount] = \"" + lErgDoc60[i] + "\"" + System.lineSeparator()) + } + + for( int i = 1; i <= lWeitAuftragsnrCount; i++ ) { + fileJPL.append( "dok_dat_feld_${Const.gDDF_WEITAUFTRAGSNR[i]} = \"" + lWeitAuftragsnr[i] + "\"" + System.lineSeparator()) + } + + } + + } + + /** + * Organisation D3L Dateien für "Kundendokumente" und "Lieferantendokumente" + * @author Maschinenprojekt + * @see InsertExit, UpdateAttributExit, NewVersionExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt, gesperrt oder entsperrt + */ + public static void createD3lForSuppCusto( D3Interface d3, def lBlock, def lNumberToConnect, def lScenario, def lOriginDocId ) { + d3.log.info("Start Functions createD3lForSuppCusto"); + + def lChildOrigID + def lSQL + def lChildCount + def lChildBlockStatus + def lReturn + def lSQLRDID + + Document doc = d3.archive.getDocument(lOriginDocId) + + d3.log.info( "manage_d3l_Supp_Custo( ${lBlock}, ${lNumberToConnect}, ${lScenario}, ${lOriginDocId} )" ) + // Neuer Eintrag weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Erstellung der D3L + // Erneuter Eintrag weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Freigabe der D3L + // Löschen eines Eintrags weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Sperrung der D3L + + if( lScenario.equals("CustomerNumber") ) { + lSQL = "AND fs.kue_dokuart = '${Const.gDTS_DKUMA}' AND fs.dok_dat_feld_${Const.gDDF_KNR} = '${lNumberToConnect}' " + } else if( lScenario.equals("SupplierNumber") ) { + lSQL = "AND fs.kue_dokuart = '${Const.gDTS_DLIMA}' AND fs.dok_dat_feld_${Const.gDDF_LNR} = '${lNumberToConnect}' " + } + + def sqlStatement = "SELECT pd.doku_id as lChildOrigID, pd.frei_o_gesperrt as lChildBlockStatus " + + "FROM phys_datei as pd, firmen_spezifisch as fs " + + "WHERE fs.doku_id = pd.doku_id " + lSQL + + "AND pd.datei_erw = 'D3L' " + + "AND ( pd.text LIKE '%${lOriginDocId}%' OR pd.text LIKE '%${lOriginDocId}' OR pd.text LIKE '${lOriginDocId}%' ) " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + lChildCount = sqlResult.size() + if( lChildCount > 0 ) { + lChildOrigID = sqlResult.getAt(0).get("lChildOrigID") + lChildBlockStatus = sqlResult.getAt(0).get("lChildBlockStatus") + } + + if( lBlock.equals("CREATE/UNBLOCK") ) { + // Neuer Eintrag weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Erstellung der D3L + // Erneuter Eintrag weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Freigabe der D3L + + // Gibt es bereits eine D3L? + if( lChildCount == 1 ) { + + // UNBLOCK + if( !lChildBlockStatus.equals("f") ) { + lReturn = d3.call.document_block(false, "d3groovy", lChildOrigID) + if (lReturn != 0) { + d3.log.error("Das Dokument ${lChildOrigID} konnte nicht Entsperrt werden! Errorcode = ${lReturn}") + } + } + } else { + // d3.log.error( "Hier werden D3L erstellt für lNumberToConnect " + lNumberToConnect ) + // CREATE + // Alle Daten des Original-Dokuments holen + // Holen aller Daten aus dem Child-Dokument + + def In1, In4, In5, In6, In7, In17, In21, In32, In33, In34, In39, In48, In49, In50, In80 + def ln63Count, ln65Count, ln62Count, ln66Count + List In63 = new ArrayList<>(); + List In65 = new ArrayList<>(); + // Kundendokumente + def In22, In23, In28 + List In62 = new ArrayList<>(); + // Lieferantendokumente + def In10, In11 + List In66 = new ArrayList<>(); + + def sqlFurtherFields + def lNameToConnect + if( lScenario.equals("CustomerNumber") ) { + + def sqlStatementFirst = "SELECT dok_dat_feld_${Const.gDDF_STATUS} as In1, " + + "dok_dat_feld_${Const.gDDF_PROZESS} as In5, " + + "dok_dat_feld_${Const.gDDF_ABTSENDER} as In6, " + + "dok_dat_feld_${Const.gDDF_SENDER} as In7, " + + "dok_dat_feld_${Const.gDDF_DOKTITLE} as In17, " + + "dok_dat_feld_${Const.gDDF_DOKGROUP} as In21, " + + "dok_dat_feld_${Const.gDDF_KOMMRICHTUNG} as In32, " + + "dok_dat_feld_${Const.gDDF_JAHR} as In33, " + + "dok_dat_feld_${Const.gDDF_MONAT} as In34, " + + "dok_dat_feld_${Const.gDFF_ABTEILUNG} as In39, " + + "dok_dat_feld_${Const.gDDF_SUBJECT} as In48, " + + "dok_dat_feld_${Const.gDDF_ARCDOCID} as In49, " + + "dok_dat_feld_${Const.gDDF_ERDATE} as In50, " + + "dok_dat_feld_${Const.gDDF_DOCINFONR} as In80, " + + "dok_dat_feld_${Const.gDDF_KNR} as In22, " + + "dok_dat_feld_${Const.gDDF_KNAME} as In23, " + + "dok_dat_feld_${Const.gDDF_BUCHKREIS} as In28 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${lOriginDocId}' " + + GroovyRowResult grrFirst = d3.sql.firstRow(sqlStatementFirst); + In1 = grrFirst.get("In1") + In5 = grrFirst.get("In5") + In6 = grrFirst.get("In6") + In7 = grrFirst.get("In7") + In17 = grrFirst.get("In17") + In21 = grrFirst.get("In21") + In32 = grrFirst.get("In32") + In33 = grrFirst.get("In33") + In34 = grrFirst.get("In34") + In39 = grrFirst.get("In39") + In48 = grrFirst.get("In48") + In49 = grrFirst.get("In49") + In50 = grrFirst.get("In50") + In80 = grrFirst.get("In80") + In22 = grrFirst.get("In22") + In23 = grrFirst.get("In23") + In28 = grrFirst.get("In28") + + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_KNAME} as lNameToConnect " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${lNumberToConnect}' " + + GroovyRowResult grrSec = d3.sql.firstRow(sqlStatementSec); + lNameToConnect = grrSec.get("lNameToConnect") + + } else if( lScenario.equals("SupplierNumber") ) { + + def sqlStatementFirst = "SELECT dok_dat_feld_${Const.gDDF_STATUS} as In1, " + + "dok_dat_feld_${Const.gDDF_PROZESS} as In5, " + + "dok_dat_feld_${Const.gDDF_ABTSENDER} as In6, " + + "dok_dat_feld_${Const.gDDF_SENDER} as In7, " + + "dok_dat_feld_${Const.gDDF_DOKTITLE} as In17, " + + "dok_dat_feld_${Const.gDDF_DOKGROUP} as In21, " + + "dok_dat_feld_${Const.gDDF_KOMMRICHTUNG} as In32, " + + "dok_dat_feld_${Const.gDDF_JAHR} as In33, " + + "dok_dat_feld_${Const.gDDF_MONAT} as In34, " + + "dok_dat_feld_${Const.gDFF_ABTEILUNG} as In39, " + + "dok_dat_feld_${Const.gDDF_SUBJECT} as In48, " + + "dok_dat_feld_${Const.gDDF_ARCDOCID} as In49, " + + "dok_dat_feld_${Const.gDDF_ERDATE} as In50, " + + "dok_dat_feld_${Const.gDDF_DOCINFONR} as In80, " + + "dok_dat_feld_${Const.gDDF_LNR} as In10, " + + "dok_dat_feld_${Const.gDDF_LNAME} as In11 " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${lOriginDocId}' " + + GroovyRowResult grrFirst = d3.sql.firstRow(sqlStatementFirst); + In1 = grrFirst.get("In1") + In5 = grrFirst.get("In5") + In6 = grrFirst.get("In6") + In7 = grrFirst.get("In7") + In17 = grrFirst.get("In17") + In21 = grrFirst.get("In21") + In32 = grrFirst.get("In32") + In33 = grrFirst.get("In33") + In34 = grrFirst.get("In34") + In39 = grrFirst.get("In39") + In48 = grrFirst.get("In48") + In49 = grrFirst.get("In49") + In50 = grrFirst.get("In50") + In80 = grrFirst.get("In80") + In10 = grrFirst.get("In10") + In11 = grrFirst.get("In11") + + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_LNAME} as lNameToConnect " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND dok_dat_feld_${Const.gDDF_LNR} = '${lNumberToConnect}' " + + GroovyRowResult grrSec = d3.sql.firstRow(sqlStatementSec); + lNameToConnect = grrSec.get("lNameToConnect") + } + + def sqlStatement63 = "SELECT value_char as In63 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lOriginDocId}' " + + "AND field_no = '${Const.gDDF_ABTEMPM}' " + List sqlResult63 = d3.sql.executeAndGet(sqlStatement63); + ln63Count = sqlResult63.size() + for(GroovyRowResult grr : sqlResult63) { + In63.add(grr.get("In63")) + } + + def sqlStatement65 = "SELECT value_char as In65 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lOriginDocId}' " + + "AND field_no = '${Const.gDDF_EMPFAENGERM}' " + List sqlResult65 = d3.sql.executeAndGet(sqlStatement65); + ln65Count = sqlResult65.size() + for(GroovyRowResult grr : sqlResult65) { + In65.add(grr.get("In65")) + } + + if( lScenario.equals("CustomerNumber") ) { + def sqlStatement62 = "SELECT value_char as In62 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lOriginDocId}' " + + "AND field_no = '${Const.gDDF_WEITKDNR}' " + List sqlResult62 = d3.sql.executeAndGet(sqlStatement62); + ln62Count = sqlResult62.size() + for(GroovyRowResult grr : sqlResult62) { + In62.add(grr.get("In62")) + } + } else if( lScenario.equals("SupplierNumber") ) { + def sqlStatement66 = "SELECT value_char as In66 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lOriginDocId}' " + + "AND field_no = '${Const.gDDF_WEITLIEFNR}' " + List sqlResult66 = d3.sql.executeAndGet(sqlStatement66); + ln66Count = sqlResult66.size() + for(GroovyRowResult grr : sqlResult66) { + In66.add(grr.get("In66")) + } + } + + def date = new Date() + def sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") + def lKey = sdf.format(date).toString() + + // 04.10.2019 imue -> Aufgrund von Fehlersituationen mit dem Dateinamen den Dokumenttitel bei der Bennenung entfernt + File lPathD3L = new File("F:\\d3\\Hostimport\\LinkFiles\\CopyCustSupp" + "_" + lOriginDocId + "_" + lKey + ".d3l") + File lPathJPL = new File("F:\\d3\\Hostimport\\LinkFiles\\CopyCustSupp" + "_" + lOriginDocId + "_" + lKey + ".jpl") + + lPathJPL.append("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + if( lScenario.equals("CustomerNumber") ) { + lPathJPL.append("dokuart = \"${Const.gDTS_DKUMA}\"" + System.lineSeparator()) + } else if( lScenario.equals("SupplierNumber") ) { + lPathJPL.append("dokuart = \"${Const.gDTS_DLIMA}\"" + System.lineSeparator()) + } + + lPathJPL.append( "dok_dat_feld[${Const.gDDF_STATUS}] = \"" + checkValueForJpl(In1) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_PROZESS}] = \"" + checkValueForJpl(In5) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_ABTSENDER}] = \"" + checkValueForJpl(In6) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_SENDER}] = \"" + checkValueForJpl(In7) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"" + In17 + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"" + In21 + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_KOMMRICHTUNG}] = \"" + checkValueForJpl(In32) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_JAHR}] = \"" + checkValueForJpl(In33) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_MONAT}] = \"" + checkValueForJpl(In34) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDFF_ABTEILUNG}] = \"" + checkValueForJpl(In39) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_SUBJECT}] = \"" + checkValueForJpl(In48) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_ARCDOCID}] = \"" + checkValueForJpl(In49) + "\"" + System.lineSeparator()) + + // Der Hostimport erwartet ein bestimmtes Format, daher muss der Timestamp angepasst werden + Date date50 = new Date(In50.getTime()); + SimpleDateFormat sdf50 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + String formatDateTime50 = sdf50.format(date50); + formatDateTime50 = formatDateTime50.replace(":", "\\:") + lPathJPL.append( "dok_dat_feld[${Const.gDDF_ERDATE}] = \"" + formatDateTime50 + "\"" + System.lineSeparator()) + + if( lScenario.equals("CustomerNumber") ) { + lPathJPL.append( "dok_dat_feld[${Const.gDDF_KNR}] = \"" + lNumberToConnect + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_KNAME}] = \"" + lNameToConnect + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_BUCHKREIS}] = \"" + checkValueForJpl(In28) + "\"" + System.lineSeparator()) + } else if( lScenario.equals("SupplierNumber") ) { + lPathJPL.append( "dok_dat_feld[${Const.gDDF_LNR}] = \"" + lNumberToConnect + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_LNAME}] = \"" + lNameToConnect + "\"" + System.lineSeparator()) + } + + lPathJPL.append( "text[4] = \"" + lOriginDocId + "\"" + System.lineSeparator()) + + for( String sIn62 : In62) { + int lCounter = 1 + if( sIn62 != null ){ + /* in Groovy nicht notwendig + lReturn = api_function( "string_mask_special_char", In62[:lCount] ) + if( lReturn > 0 ) + { + In62[:lCount] = api_converted_string + } + */ + lPathJPL.append( "dok_dat_feld_${Const.gDDF_WEITKDNR}[${lCounter}] = \"" + sIn62 + "\"" + System.lineSeparator()) + lCounter = lCounter + 1; + } + } + + for( String sIn63 : In63) { + int lCounter = 1 + if( sIn63 != null ) { + /* in Groovy nicht notwendig? + lReturn = api_function( "string_mask_special_char", In63[:lCount] ) + if( lReturn > 0 ) + { + In63[:lCount] = api_converted_string + } + */ + lPathJPL.append( "dok_dat_feld_${Const.gDDF_ABTEMPM}[${lCounter}] = \"" + sIn63 + "\"" + System.lineSeparator()) + lCounter = lCounter + 1; + } + } + + for( String sIn66 : In66) { + int lCounter = 1 + if( sIn66 != null ) { + /* in Groovy nicht notwendig? + lReturn = api_function( "string_mask_special_char", In66[:lCount] ) + if( lReturn > 0 ) + { + In66[:lCount] = api_converted_string + } + */ + lPathJPL.append( "dok_dat_feld_${Const.gDDF_WEITLIEFNR}[${lCounter}] = \"" + sIn66 + "\"" + System.lineSeparator()) + lCounter = lCounter + 1; + } + } + + for( String sIn65 : In65) { + int lCounter = 1 + if( sIn65 != null) { + /* in Groovy nicht notwendig? + lReturn = api_function( "string_mask_special_char", In65[:lCount] ) + if( lReturn > 0 ) + { + In65[:lCount] = api_converted_string + } + */ + lPathJPL.append( "dok_dat_feld_${Const.gDDF_EMPFAENGERM}[${lCounter}] = \"" + sIn65 + "\"" + System.lineSeparator()) + lCounter = lCounter + 1; + } + } + + lPathD3L.append( "idlist" + System.lineSeparator()) + lPathD3L.append( "${lOriginDocId}" ) + + } + + } else if( lBlock.equals("BLOCK") && lChildCount >= 1 && lChildBlockStatus.equals("f") ) { + // Löschen eines Eintrags weitere Lieferant_Nr bzw. weitere Kunden_Nr -> Sperrung der D3L + // Gibt es bereits eine D3L? - doku_id abfragen + // BLOCK + lReturn = d3.call.document_block(true, "d3groovy", lChildOrigID) + if (lReturn != 0) { + d3.log.error("Das Dokument ${lChildOrigID} konnte nicht Gesperrt werden! Errorcode = ${lReturn}") + } + } + } + + /** + * Erstelle für alle Opportunity Nummern im 60er Feld eine D3L-Datei für den Hostimport + * @author Opportunity + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt + */ + public static void createLinkFiles( D3Interface d3, def doku_id_ref, def lOppNR, def lProjNr, def lProzessart, def lDokIdFather, def lKdName, def lKdNummer, def lEntryPoint, def lKukoID ) { + d3.log.info("Start Functions createLinkFiles"); + + Document doc = d3.archive.getDocument(doku_id_ref, "d3groovy") + def doc_type_short = doc.getType().getId() + + def date = new Date() + def sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") + def lKey = sdf.format(date).toString() + + // Prüfung der Dokumenteigenschaften auf Null-Values + def lDokGroup = checkIfNullValue(doc.field[Const.gDDF_DOKGROUP]); + def lDocTitle = checkIfNullValue(doc.field[Const.gDDF_DOKTITLE]); + def lERDate = doc.field[Const.gDDF_ERDATE]; + def lUnit = checkIfNullValue(doc.field[Const.gDFF_ABTEILUNG]); + def lResDoc = checkIfNullValue(doc.field[Const.gDDF_ERGEBNISDOK]); + def lSuppName = checkIfNullValue(doc.field[Const.gDDF_LNAME]); + def lSuppNo = checkIfNullValue(doc.field[Const.gDDF_LNR]); + def lProcType = checkIfNullValue(doc.field[Const.gDDF_PROZESS]); + def lOrigOpNo = checkIfNullValue(doc.field[Const.gDDF_OPPNUMMER]); + def lOrigProjNo = checkIfNullValue(doc.field[Const.gDDF_AUFTRNR]); + def lActivityID = checkIfNullValue(doc.field[Const.gDDF_KONTAKTNUMMER]); + def lSubject = checkIfNullValue(doc.field[Const.gDDF_SUBJECT]); + lOppNR = checkIfNullValue(lOppNR); + lProjNr = checkIfNullValue(lProjNr); + + def lCustName + def lCustNo + def lMainOpp + def lSubmission + def lANName + def lANNo + def lState + + File lPathJPL = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doku_id_ref + "_" + lKey + "_" + lOppNR + "_" + lProjNr + "_" + doc_type_short + ".jpl" ) + + if( lOppNR != null && !lOppNR.equals("") ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME}, '') as lCustName, ISNULL(dok_dat_feld_${Const.gDDF_KNR}, '') as lCustNo, ISNULL(dok_dat_feld_${Const.gDDF_HAUPTOPP}, '') as lMainOpp, ISNULL(dok_dat_feld_${Const.gDDF_SUBMISSION}, '') as lSubmission, ISNULL(dok_dat_feld_${Const.gDDF_STATUS}, '') as lState " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNR}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lCustName = sqlResult.getAt(0).get("lCustName") + lCustNo = sqlResult.getAt(0).get("lCustNo") + lMainOpp = sqlResult.getAt(0).get("lMainOpp") + lSubmission = sqlResult.getAt(0).get("lSubmission") + lState = sqlResult.getAt(0).get("lState") + } + + } else if( lProjNr != null && !lProjNr.equals("") ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME}, '') as lCustName, ISNULL(dok_dat_feld_${Const.gDDF_KNR}, '') as lCustNo, ISNULL(dok_dat_feld_${Const.gDDF_SUBMISSION}, '') as lSubmission, ISNULL(dok_dat_feld_${Const.gDDF_STATUS}, '') as lState " + + "FROM firmen_spezifisch " + + "WHERE ( kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNr}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lCustName = sqlResult.getAt(0).get("lCustName") + lCustNo = sqlResult.getAt(0).get("lCustNo") + lSubmission = sqlResult.getAt(0).get("lSubmission") + lState = sqlResult.getAt(0).get("lState") + } + } + + if( doc_type_short.equals(Const.gDTS_DKUKO) ) { + if( lProcType.equals("0201") && lOppNR == null && lOppNR.equals("") ) { + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_OPPNUMMER} as lOppNR " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND doku_id = '${lDokIdFather}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lOppNR = sqlResult.getAt(0).get("lOppNR") + } + } else if( lProcType.equals("0202") && lProjNr == null && lProjNr.equals("") ) { + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} as lProjNr " + + "FROM firmen_spezifisch " + + "WHERE ( kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND doku_id = '${lDokIdFather}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lProjNr = sqlResult.getAt(0).get("lProjNr") + } + } else if ( lProcType.equals("0200") ) { + lCustName = lKdName + lCustNo = lKdNummer + } + } + + try { + + // Anpassung 05.03.2018/dkle: Nur Erkennungsattribute befüllen, den Rest per Aktenplan ergänzen lassen + // Allgemein Attribute + lPathJPL.append("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${doc_type_short}\"" + System.lineSeparator()) + lPathJPL.append("text[3] = \"${doku_id_ref}\"" + System.lineSeparator()) + + lPathJPL.append("dok_dat_feld[${Const.gDFF_ABTEILUNG}] = \"${checkValueForJpl(lUnit)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"${checkValueForJpl(lDocTitle)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"${lERDate}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERGEBNISDOK}] = \"${checkValueForJpl(lResDoc)}\"" +System.lineSeparator()) + + if ( doc_type_short.equals(Const.gDTS_DKOMM) ) { + // Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"${checkValueForJpl(lProcType)}\"" + System.lineSeparator()) // Prozessart + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNR}] = \"${checkValueForJpl(lCustNo)}\"" + System.lineSeparator()) // Kunden_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"${checkValueForJpl(lProjNr)}\"" + System.lineSeparator()) // Projekt_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + + // weitere Attribute + lPathJPL.append("dok_dat_feld_${Const.gDDF_OPPNRM}[1] = \"${checkValueForJpl(lOrigOpNo)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DLIKO ) ) { + // Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_LNAME}] = \"${checkValueForJpl(lSuppName)}\"" + System.lineSeparator()) // Lieferant_Name + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"${checkValueForJpl(lProjNr)}\"" + System.lineSeparator()) // Projekt_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + + //Pflichtfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_LNR}] = \"${checkValueForJpl(lSuppNo)}\"" + System.lineSeparator()) + //Ergänzungsfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld_${Const.gDDF_OPPNRM}[1] = \"${checkValueForJpl(lOrigOpNo)}\"" + System.lineSeparator()) + //call api_function("file_add_line", lPathJPL, "dok_dat_feld[:gDDF_PROZESSGROUP] = :+lProcGroup", "APPEND") + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"${checkValueForJpl(lProcType)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNAME}] = \"${checkValueForJpl(lCustName)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNR}] = \"${checkValueForJpl(lCustNo)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_HAUPTOPP}] = \"${checkValueForJpl(lMainOpp)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_SUBMISSION}] = \"${checkValueForJpl(lSubmission)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DMAUF) || doc_type_short.equals(Const.gDTS_DMDOK) || doc_type_short.equals(Const.gDTS_DMSPE) ) { + // Erkennungsattribute + // Akte (oder Betreff/Subject) wird anhand der Dokumentgruppe automatisch ermittelt, daher muss sie gefüllt sein + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"${checkValueForJpl(lProjNr)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DOPPD) ) { + // Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_ANNAME}] = 'angebotsübergreifend/vor Angebot'" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPANNr}] = '99999'" + System.lineSeparator()) // Angebot_Nr + + // Zusatzattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld_${Const.gDDF_OPPNRM}[1] = \"${checkValueForJpl(lOrigOpNo)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DPRST) ) { + // Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"${checkValueForJpl(lProjNr)}\"" + System.lineSeparator()) // Projekt_Nr + // Wird anhand der Dokumentgruppe automatisch ermittelt: + // lPathJPL.append("dok_dat_feld[${Const.gDDF_SUBJECT}] = """) + + // Zusatzattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_HAUPTOPP}] = \"${checkValueForJpl(lMainOpp)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld_${Const.gDDF_OPPNRM}[1] = \"${checkValueForJpl(lOrigOpNo)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DVERD) ) { + // Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + // Zusatzattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld_${Const.gDDF_OPPNRM}[1] = \"${checkValueForJpl(lOrigOpNo)}\"" + System.lineSeparator()) + + } else if ( doc_type_short.equals(Const.gDTS_DKUKO) ) { + //Erkennungsattribute + lPathJPL.append("dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"${checkValueForJpl(lOppNR)}\"" + System.lineSeparator()) // Opportunity_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"${checkValueForJpl(lProjNr)}\"" + System.lineSeparator()) // Projekt_Nr + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNR}] = \"${checkValueForJpl(lKdNummer)}\"" + System.lineSeparator()) + if(lEntryPoint.equals("newVersion")) { + lPathJPL.append("dok_dat_feld[${Const.gDDF_KONTAKTNUMMER}] = \"${checkValueForJpl(lKukoID)}\"" + System.lineSeparator()); + } else { + lPathJPL.append("dok_dat_feld[${Const.gDDF_KONTAKTNUMMER}] = \"${checkValueForJpl(lActivityID)}\"" + System.lineSeparator()); + } + //Ergänzungsfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + } + + if( lSubject != null && !lSubject.equals("") ) { + lPathJPL.append("dok_dat_feld[${Const.gDDF_SUBJECT}] = \"${checkValueForJpl(lSubject)}\"" + System.lineSeparator()); + } + + File lPathD3L = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doku_id_ref + "_" + lKey + "_" + lOppNR + "_" + lProjNr + "_" + doc_type_short + ".d3l" ) + lPathD3L.append("idlist" + System.lineSeparator()) + lPathD3L.append(doku_id_ref) + + } catch(Exception e) { + d3.log.error("Die D3L Datei für Opportunity Nummer ${lOppNR} oder Maschinenprojektnummer ${lProjNr} mit Bezug auf Dokument ${doku_id_ref} konnte nicht erstellt werden! Errorcode = " + e ) + + } + + } + + /** + * Erstelle für alle Service Nummern im 60er Feld (BelegNr, SR-ID) eine D3L-Datei für den Hostimport + * @author Service + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt + */ + public static void createLinkFilesService( D3Interface d3, Document doc, def lBelegNr, def lSrId ) { + d3.log.info("Start Functions createLinkFilesService"); + + if(doc.getFileExtension() != null && !doc.getFileExtension().equals("d3l") && !doc.getFileExtension().equals("D3L")) { + + d3.log.info("Funktion createLinkFilesService wurde gestartet!") + + def doc_type_short = doc.getType().getId() + + def date = new Date() + def sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") + def lKey = sdf.format(date).toString() + + // Prüfung der Dokumenteigenschaften auf Null-Values + def lDokGroup = checkIfNullValue(doc.field[Const.gDDF_DOKGROUP]); + def lDocTitle = checkIfNullValue(doc.field[Const.gDDF_DOKTITLE]); + def lERDate = doc.field[Const.gDDF_ERDATE]; + def lProcType = checkIfNullValue(doc.field[Const.gDDF_PROZESS]); + lBelegNr = checkIfNullValue(lBelegNr); + lSrId = checkIfNullValue(lSrId); + + def lCustName + def lCustNo + + File lPathJPL = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + lBelegNr + "_" + lSrId + "_" + doc_type_short + ".jpl" ) + + if( lBelegNr != null && !lBelegNr.equals("") ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME}, '') as lCustName, ISNULL(dok_dat_feld_${Const.gDDF_KNR}, '') as lCustNo " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNr}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lCustName = sqlResult.getAt(0).get("lCustName") + lCustNo = sqlResult.getAt(0).get("lCustNo") + } + + } else if( lSrId != null && !lSrId.equals("") ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME}, '') as lCustName, ISNULL(dok_dat_feld_${Const.gDDF_KNR}, '') as lCustNo " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ASERE}' " + + "AND dok_dat_feld_${Const.gDDF_SRID} = '${lSrId}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lCustName = sqlResult.getAt(0).get("lCustName") + lCustNo = sqlResult.getAt(0).get("lCustNo") + } + } + + try { + + // Allgemein Attribute + lPathJPL.append("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${doc_type_short}\"" + System.lineSeparator()) + lPathJPL.append("text[3] = \"${doc.id()}\"" + System.lineSeparator()) + + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"${checkValueForJpl(lDocTitle)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"${lERDate}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"${checkValueForJpl(lProcType)}\"" + System.lineSeparator()) + + if ( doc_type_short.equals(Const.gDTS_DSEBE) ) { + // Pflichtfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_BELEGNUMMER}] = \"${checkValueForJpl(lBelegNr)}\"" + System.lineSeparator()) + + // weitere Attribute + + } else if ( doc_type_short.equals(Const.gDTS_DSERE ) ) { + // Pflichtfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_SRID}] = \"${checkValueForJpl(lSrId)}\"" + System.lineSeparator()) + + // weitere Attribute + } + + File lPathD3L = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + lBelegNr + "_" + lSrId + "_" + doc_type_short + ".d3l" ) + lPathD3L.append("idlist" + System.lineSeparator()) + lPathD3L.append(doc.id()) + + } catch(Exception e) { + d3.log.error("Die D3L Datei für ServiceBeleg Nummer ${lBelegNr} oder ServiceRequest ${lSrId} mit Bezug auf Dokument ${doc.id()} konnte nicht erstellt werden! Errorcode = " + e ) + + } + + } + + } + + /** + * Erstelle für alle Equipment Nummern im 60er Feld eine D3L-Datei für den Hostimport + * TODO - weitere Eigenschaften ergänzen + * @author Equipment + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt + */ + public static void createLinkFilesEquipment( D3Interface d3, Document doc, String equipmentNo ) { + d3.log.info("Start Functions createLinkFilesEquipment"); + + if(doc.getFileExtension() != null && !doc.getFileExtension().equals("d3l") && !doc.getFileExtension().equals("D3L")) { + + def doc_type_short = doc.getType().getId() + + def date = new Date() + def sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") + def lKey = sdf.format(date).toString() + + // Prüfung der Dokumenteigenschaften auf Null-Values + equipmentNo = checkIfNullValue(equipmentNo); + + File lPathJPL = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + equipmentNo + "_" + doc_type_short + ".jpl" ) + + try { + + // Allgemein Attribute + lPathJPL.append("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${doc_type_short}\"" + System.lineSeparator()) + lPathJPL.append("text[3] = \"${doc.id()}\"" + System.lineSeparator()) + + // Pflichtfelder + String lDokGroup = checkIfNullValue(doc.field[Const.gDDF_DOKGROUP]); + String lDocTitle = checkIfNullValue(doc.field[Const.gDDF_DOKTITLE]); + String lProcType = checkIfNullValue(doc.field[Const.gDDF_PROZESS]); + String lFile = checkIfNullValue(doc.field[Const.gDDF_AKTE]); + + def lERDate = doc.field[Const.gDDF_ERDATE]; + lPathJPL.append("dok_dat_feld[${Const.gDDF_EQUIPMENT}] = \"${equipmentNo}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${lDokGroup}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"${lDocTitle}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"${lERDate}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_AKTE}] = \"${lFile}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"${checkValueForJpl(lProcType)}\"" + System.lineSeparator()) + + // weitere Attribute + // lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + + File lPathD3L = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + equipmentNo + "_" + doc_type_short + ".d3l" ) + lPathD3L.append("idlist" + System.lineSeparator()) + lPathD3L.append(doc.id()) + + } catch(Exception e) { + d3.log.error("Die D3L Datei für Equipment ${equipmentNo} mit Bezug auf Dokument ${doc.id()} konnte nicht erstellt werden! Errorcode = " + e ) + + } + + } + + } + + /** + * Erstellung D3l-Dateien für Original ECR-Dokumente + * @author + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt + */ + public static void createLinkFilesOrder(D3Interface d3, Document doc, def docTypeShort) { + d3.log.info("Start Functions createLinkFilesOrder"); + + // aus der neuen Akte die Projektnummer holen + def In19 = doc.field[Const.gDDF_AUFTRNR] + + def lD3LStop + List lOriginalECRDocID = new ArrayList<>() + def lOriginalCount + def lActivity = doc.field[Const.gDDF_AKTIVITAETSID] + + // Suche alle Unterakten ECR mit der gleichen Aktivitäts-ID DDF15, die im Bemerkungsfeld 4 "Original" stehen haben + // Es darf nur eine Akte sein! + // Projektnummer muss von der neuen Unterakte übernommen werden gDDF_AUFTRNR DDF 19 + // gDDF_AUFTRNR + // Suche alle Dokumente in der Original Unterakte ECR + // erstelle D3L Dateien und importiere diese in die neue Unterakte ECR (geht per Projektnummer) + // Die Kenndaten sollen aus der neuen Unterakte ECR kommen + // Falls ein Dokument bereits hineinverlinkt wurde soll es nicht erneut dort hineinkommen. + + // Ermittlung der Originalakte + def sqlStatement1 = "SELECT f.doku_id as lOriginalECRDocID " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AMECR}' " + + "AND ( p.text LIKE '%Original%' OR p.text LIKE '%Original' OR p.text LIKE 'Original%' ) " + + "AND f.doku_id = p.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${lActivity}' "; + List sqlResult1 = d3.sql.executeAndGet(sqlStatement1); + if(sqlResult1 != null && sqlResult1.size() > 0) { + lOriginalCount = sqlResult1.size() + for(GroovyRowResult grr : sqlResult1) { + lOriginalECRDocID.add(grr.get("lOriginalECRDocID")) + } + } + + // Falls keine oder mehrere Akten mit der Aktivitäts-ID und dem Vermerk Original existieren -> Abbruch + if( lOriginalCount != 1 ) { + d3.log.error( "Für Aktivitäts-ID " + doc.field[Const.gDDF_AKTIVITAETSID] + " Keine Originalakte gefunden" ) + } else { + // ansonsten Kopie der Originaldokumente per D3L in die neue Unterakte ECR + def lReturn + def lErgDocCount + def lWeitAuftragsnrCount + List lErgDoc60 = new ArrayList<>() + List lWeitAuftragsnr66 = new ArrayList<>() + List lBemerkung = new ArrayList<>() + def lBemCounter + List lChildOrigID = new ArrayList<>() + def lChildCount + def In4 + + // Alle Kinder der mit Original Markierten Akte holen (Eindeutigkeit über Aktivitätsid) + def sqlStatement2 = "SELECT pd.doku_id as lChildOrigID " + + "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} = '${lActivity}' " + + "AND pd.datei_erw <> 'D3L' "; + List sqlResult2 = d3.sql.executeAndGet(sqlStatement2); + if(sqlResult2 != null && sqlResult2.size() > 0) { + lChildCount = sqlResult2.size() + for(GroovyRowResult grr : sqlResult2) { + lChildOrigID.add(grr.get("lChildOrigID")) + } + } + + // Durchlauf für jedes Child-Dokument mit dem Ziel genau eine D3L Datei in der neuen Akte (pDocId) zu haben + for(int i=0; i sqlResult3 = d3.sql.executeAndGet(sqlStatement3); + if(sqlResult3 != null && sqlResult3.size() > 0) { + + def In24 = sqlResult3.getAt(0).get("In24") + def In28 = sqlResult3.getAt(0).get("In28") + def In80 = sqlResult3.getAt(0).get("In80") + def In21 = sqlResult3.getAt(0).get("In21") + def In18 = sqlResult3.getAt(0).get("In18") + def In17 = sqlResult3.getAt(0).get("In17") + def In43 = sqlResult3.getAt(0).get("In43") + def In33 = sqlResult3.getAt(0).get("In33") + def In23 = sqlResult3.getAt(0).get("In23") + def In22 = sqlResult3.getAt(0).get("In22") + def In34 = sqlResult3.getAt(0).get("In34") + def In8 = sqlResult3.getAt(0).get("In8") + def In5 = sqlResult3.getAt(0).get("In5") + def In2 = sqlResult3.getAt(0).get("In2") + def In1 = sqlResult3.getAt(0).get("In1") + def In37 = sqlResult3.getAt(0).get("In37") + def In15 = sqlResult3.getAt(0).get("In15") + def In50 = sqlResult3.getAt(0).get("In50") + def In44 = sqlResult3.getAt(0).get("In44") + + // Eine eindeutige Erkennung eines bereits kopierten Kindes ist + // - Die Projektnummer (DDF 19 gDDF_AUFTRNR) + // - die Aktivitäts-ID (gDDF_AKTIVITAETSID DDF 15) und + // - Im Bemerkungsfeld 4 die Dokument ID des Kindes + + def sqlStatement4 = "SELECT pd.text as lBemerkung " + + "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} = '${In15}' " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${In19}' "; + List sqlResult4 = d3.sql.executeAndGet(sqlStatement4); + if(sqlResult4 != null && sqlResult4.size() > 0) { + for(GroovyRowResult grr : sqlResult4) { + lBemerkung.add(grr.get("lBemerkung").toString().trim()); + } + } + + // Wenn im Bemerkungsfeld die Dokument ID des Original-Kind-Dokuments enthalten ist dann erfolgt keine Kopie + if(lBemerkung.contains(lChildOrigID.get(i))) { + d3.log.error( "Dieses Dokument ${lChildOrigID.get(i)} wurde bereits verlinkt. Verlinkung wird nicht durchgeführt." ); + lD3LStop = 1; + } else { + // d3.log.error( "Nicht gefunden! Es darf gelinkt werden." ) + // Alles OK, das cloning wird gestartet. + } + + d3.log.info( "Bemerkungen sind durchgelaufen. Ergebnis: ${lD3LStop}" ) + d3.log.info( "Bei 0 wird gecloned, bei 1 nicht" ) + + if( lD3LStop != 1 ) { + if( In21 == null ) { + In21 = "ECR" + } + + def sqlStatement5 = "SELECT value_char as lErgDoc60 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lChildOrigID.get(i)}' " + + "AND field_no = '${Const.gDDF_ERGDOCFUER}' "; + List sqlResult5 = d3.sql.executeAndGet(sqlStatement5); + if(sqlResult5 != null && sqlResult5.size() > 0) { + lErgDocCount = sqlResult5.size() + for(GroovyRowResult grr : sqlResult5) { + lErgDoc60.add(grr.get("lErgDoc60")) + } + } + + def sqlStatement6 = "SELECT value_char as lWeitAuftragsnr66 " + + "FROM firm_spez_mult_val " + + "WHERE doku_id = '${lChildOrigID.get(i)}' " + + "AND field_no = '${Const.gDDF_WEITAUFTRAGSNR}' "; + List sqlResult6 = d3.sql.executeAndGet(sqlStatement6); + if(sqlResult6 != null && sqlResult6.size() > 0) { + lWeitAuftragsnrCount = sqlResult6.size() + for(GroovyRowResult grr : sqlResult6) { + lWeitAuftragsnr66.add(grr.get("lWeitAuftragsnr66")) + } + } + + Date dateLog = new Date(); + SimpleDateFormat sdfLog = new SimpleDateFormat("yyyyMMddHHmmss"); + String dateString = sdfLog.format(dateLog); + + File lPathD3L = new File("F:\\d3\\Hostimport\\LinkFiles\\CopyECR" + "_" + In19 + "_" + lChildOrigID.get(i) + "_" + dateString + "_" + doc.field[Const.gDDF_AKTIVITAETSID] + ".d3l") + File lPathJPL = new File("F:\\d3\\Hostimport\\LinkFiles\\CopyECR" + "_" + In19 + "_" + lChildOrigID.get(i) + "_" + dateString + "_" + doc.field[Const.gDDF_AKTIVITAETSID] + ".jpl") + + lPathJPL.write("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = '${Const.gDTS_DMECR}'" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_BESCHREIBUNG}] = \"" + checkValueForJpl(In24) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERGEBNISDOK}] = \"" + checkValueForJpl(In44) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_BUCHKREIS}] = \"" + checkValueForJpl(In28) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOCINFONR}] = \"" + checkValueForJpl(In80) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"" + checkValueForJpl(In21) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGRP}] = \"" + checkValueForJpl(In18) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"" + checkValueForJpl(In17) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ECRSTATUS}] = \"" + checkValueForJpl(In43) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_JAHR}] = \"" + checkValueForJpl(In33) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNAME}] = \"" + checkValueForJpl(In23) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_KNR}] = \"" + checkValueForJpl(In22) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_MONAT}] = \"" + checkValueForJpl(In34) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROJKLAMMER}] = \"" + checkValueForJpl(In8) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"" + checkValueForJpl(In19) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"" + checkValueForJpl(In5) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PSPELEMENT}] = \"" + checkValueForJpl(In2) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_STATUS}] = \"" + checkValueForJpl(In1) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_SUBMISSION}] = \"" + checkValueForJpl(In37) + "\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_AKTIVITAETSID}] = \"" + checkValueForJpl(In15) + "\"" + System.lineSeparator()) + + // Der Hostimport erwartet ein bestimmtes Format, daher muss der Timestamp angepasst werden + Date date50 = new Date(In50.getTime()); + SimpleDateFormat sdf50 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + String formatDateTime50 = sdf50.format(date50); + formatDateTime50 = formatDateTime50.replace(":", "\\:") + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"" + formatDateTime50 + "\"" + System.lineSeparator()) + + lPathJPL.append("text[4] = \"" + lChildOrigID.get(i) + "\"" + System.lineSeparator()) + + for(int lCount=1; lCount <= lErgDocCount; i++) { + lPathJPL.append("dok_dat_feld_${Const.gDDF_ERGDOCFUER[lCount]} = \"" + lErgDoc60.get(lCount) + "\"" + System.lineSeparator()) + } + + lPathD3L.write("idlist" + System.lineSeparator()) + lPathD3L.append("${lChildOrigID.get(i)}") + + } + } + } + } + } + + /** + * Erstelle für alle Einkauf Nummern im 60er Feld (BelegNr) eine D3L-Datei für den Hostimport + * @author Einkauf + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird eine D3L-Datei erstellt + */ + public static void createLinkFilesPurchase( D3Interface d3, Document doc, def lBelegNr ) { + d3.log.info("Start Functions createLinkFilesPurchase"); + + if(doc.getFileExtension() != null && !doc.getFileExtension().equals("d3l") && !doc.getFileExtension().equals("D3L")) { + + d3.log.info("Funktion createLinkFilesPurchase wurde gestartet!") + + def doc_type_short = doc.getType().getId() + + def date = new Date() + def sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") + def lKey = sdf.format(date).toString() + + // Prüfung der Dokumenteigenschaften auf Null-Values + def lDokGroup = checkIfNullValue(doc.field[Const.gDDF_DOKGROUP]); + def lDocTitle = checkIfNullValue(doc.field[Const.gDDF_DOKTITLE]); + def lERDate = doc.field[Const.gDDF_ERDATE]; + def lProcType = checkIfNullValue(doc.field[Const.gDDF_PROZESS]); + lBelegNr = checkIfNullValue(lBelegNr); + + def lCustName + def lCustNo + + File lPathJPL = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + lBelegNr + "_" + doc_type_short + ".jpl" ) + + if( lBelegNr != null && !lBelegNr.equals("") ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME}, '') as lCustName, ISNULL(dok_dat_feld_${Const.gDDF_KNR}, '') as lCustNo " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AEIBE}' " + + "AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNr}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0 ) { + lCustName = sqlResult.getAt(0).get("lCustName") + lCustNo = sqlResult.getAt(0).get("lCustNo") + } + } + + try { + + // Allgemein Attribute + lPathJPL.append("logi_verzeichnis = \"Fr\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${doc_type_short}\"" + System.lineSeparator()) + lPathJPL.append("text[3] = \"${doc.id()}\"" + System.lineSeparator()) + + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"${checkValueForJpl(lDokGroup)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"${checkValueForJpl(lDocTitle)}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_ERDATE}] = \"${lERDate}\"" + System.lineSeparator()) + lPathJPL.append("dok_dat_feld[${Const.gDDF_PROZESS}] = \"${checkValueForJpl(lProcType)}\"" + System.lineSeparator()) + + // Pflichtfelder + lPathJPL.append("dok_dat_feld[${Const.gDDF_BELEGNUMMER}] = \"${checkValueForJpl(lBelegNr)}\"" + System.lineSeparator()) + + File lPathD3L = new File( "F:\\d3\\Hostimport\\LinkFiles\\" + doc.id() + "_" + lKey + "_" + lBelegNr + "_" + doc_type_short + ".d3l" ) + lPathD3L.append("idlist" + System.lineSeparator()) + lPathD3L.append(doc.id()) + + } catch(Exception e) { + d3.log.error("Die D3L Datei für Beleg Nummer ${lBelegNr} mit Bezug auf Dokument ${doc.id()} konnte nicht erstellt werden! Errorcode = " + e ) + + } + } + + } + + /** + * Erstelle Marktbeobachtungsakten + * @author Unterstützende Prozesse + * @see InsertExit + * @return keine Rückgabe; im Hintergrund werden Akten erstellt + */ + public static void createMarketResearchFolder(D3Interface d3, Document doc, def lMarketingProjekt) { + d3.log.info("Start Functions createMarketResearchFolder"); + + def lReturnvalue //Fehlercode + def lDocIdTmp + + //Definition der Marketingprojekt Phasen + List lProjektphasen = new ArrayList<>(); + lProjektphasen.add("01 Anfrage I Briefing") + lProjektphasen.add("02 Analyse") + lProjektphasen.add("03 Bereitstellung") + + for(int j=0; j < lProjektphasen.size(); j++) { + Document newDoc = d3.archive.newDocument() + newDoc.type = Const.gDTS_AUNMA + newDoc.status = "Freigabe" + if(lMarketingProjekt != null) { + newDoc.field[Const.gDDF_MARKETINGPROJEKT]= lMarketingProjekt + } + if(lProjektphasen != null && lProjektphasen.get(j) != null) { + newDoc.field[Const.gDDF_PROJEKTPHASE] = lProjektphasen.get(j) + } + newDoc.field[Const.gDDF_PROZESS] = "PZ001" //Marktforschungsprojekte + lReturnvalue = d3.call.folder_create(newDoc) + if(lReturnvalue != null && lReturnvalue != 0) { + d3.log.error("### Fehler folder_create Bauakte (createMarketResearchFolder) ${lReturnvalue}") + } + } + } //Ende createMarketResearchFolder + + /** + * Erstelle eine neue Angebotsakte, wenn das Attribut "neues Angebot" auf Ja gesetzt wird + * @author + * @see UpdateAttributExit + * @return Rückgabe neuer Dokument-Id + */ + public static String createNewOffer( D3Interface d3, Document doc ) { + d3.log.info("Start Functions createNewOffer"); + + def lReturn + def lFatherOpp + def lANNrTemp + def lANNrCompare + def lANNrMax + String lTimeStamp + def lANLength + def lANShort + def lANShortLength + + Document docTemp = d3.archive.getDocument( doc.id() ) + + def date = new Date() + // JPL -> lTimeStamp = sm_sdtime("n%4y%0m%d%h%M%0s") -> Beispiel 2017083111415 + def sdf = new SimpleDateFormat("yyyyMMddHHmmss") + lTimeStamp = sdf.format(date).toString() + + //Frage zunächst die Dok-ID des Vaterdokuments ab und setze eine Variable + String[] parents = d3.call.link_get_parents( doc.id(), "d3groovy") + lReturn = parents.size() + + if( lReturn > 0 ) { + lFatherOpp = parents[0] + d3.log.info("Die Vaterakte lautet :lFatherOpp") + } else { + d3.log.error("Der Elementarprozess zu Dokument :doku_id_ref konnte nicht ermittelt werden! Errorcode ${lReturn}") + } + + Document docNew = d3.archive.newDocument(); + + //Übernehme die Attribute des bisherigen Angebots und setze Sie für die Neuanlage + // dkle, 02.02.2016 Die Angebotsversion enthält kein Ereignisdatum mehr, auskommentiert + if( lReturn > 0 ) { + def lKdNr = doc.field[Const.gDDF_KNR] + def lKdName = doc.field[Const.gDDF_KNAME] + def lProz = doc.field[Const.gDDF_PROZESS] + def lOppNR = doc.field[Const.gDDF_OPPNUMMER] + def lHauptOpp = doc.field[Const.gDDF_HAUPTOPP] + def lSubMis = doc.field[Const.gDDF_SUBMISSION] + def lJahr = doc.field[Const.gDDF_JAHR] + def lMonat = doc.field[Const.gDDF_MONAT] + def lBuchungskreis = doc.field[Const.gDDF_BUCHKREIS] + def lAngebot = doc.field[Const.gDDF_ANNAME] + String lANNummer = doc.field[Const.gDDF_OPPANNr] + def lANStatus = doc.field[Const.gDDF_ANSTATUS] + def lANNeu = doc.field[Const.gDDF_ANNEU] + def lOppState = doc.field[Const.gDDF_STATUS] + def lSalesGroup = doc.field[Const.gDDF_SALESGROUP] + def lANNummerAlt = doc.field[Const.gDDF_OPPANNr] + + docNew.type = Const.gDTS_AREGI + docNew.status = Document.DocStatus.DOC_STAT_RELEASE // "Freigabe" + docNew.field[Const.gDDF_KNR] = lKdNr + docNew.field[Const.gDDF_KNAME] = lKdName + docNew.field[Const.gDDF_PROZESS] = lProz + docNew.field[Const.gDDF_OPPNUMMER] = lOppNR + docNew.field[Const.gDDF_HAUPTOPP] = lHauptOpp + docNew.field[Const.gDDF_SUBMISSION] = lSubMis + docNew.field[Const.gDDF_JAHR] = lJahr + docNew.field[Const.gDDF_MONAT] = lMonat + docNew.field[Const.gDDF_BUCHKREIS] = lBuchungskreis + docNew.field[Const.gDDF_ANNAME] = lAngebot + docNew.field[Const.gDDF_ANSTATUS] = "in Arbeit" + docNew.field[Const.gDDF_ANNEU] = "Nein" + docNew.field[Const.gDDF_STATUS] = lOppState + docNew.field[Const.gDDF_SALESGROUP] = lSalesGroup + + //Prüfe, ob die Angebotsnummer eine SAP- oder ein Platzhalterangebotsnummer ist... + lANNrCompare = lANNummer.substring(0,4) + + //... wenn Platzhalter, dann erhöhe die Angebotsnummer um 1 + if( lANNrCompare.equals("Neue") ) { + + String[] splittedString = lANNummer.split(" "); + def anNumber = splittedString[2]; + //Erhöhe die Angebotsnummer um 1 + try { + anNumber = anNumber.trim() + anNumber = Integer.valueOf(anNumber) + anNumber = anNumber + 1 + lANNrTemp = anNumber + } catch(Exception e) { + d3.log.error("createNewOffer # lANShort enthält keinen Integer-Wert") + } + + lANNummer = "Neue Angebotsversion ${lANNrTemp} ${lTimeStamp}" + + docNew.field[Const.gDDF_OPPANNr] = lANNummer + + // 19.11.2015/dkle Kommentar hinter das else kopiert... wenn SAP-Nummer hole die höchste Platzhalternummer und erhöhe diese um 1 + } else { + def sqlStatement = "SELECT max(dok_dat_feld_${Const.gDDF_OPPANNr}) as lANNrMax " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNR}' " + + "AND dok_dat_feld_${Const.gDDF_ANNAME} = '${lAngebot}' " + + "AND dok_dat_feld_${Const.gDDF_OPPANNr} like 'Neue %' " + + "AND kue_dokuart = '${Const.gDTS_AREGI}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + lANNrMax = sqlResult.getAt(0).get("lANNrMax") + + if( lANNrMax != null && !lANNrMax.equals("") ) { + lANLength = lANNrMax.length() + lANShortLength = lANLength - 14 + lANShort = lANNrMax.substring(0, lANShortLength) + def anNumber = lANShort.substring(21, lANShort.length()) + //Erhöhe die Angebotsnummer um 1 + try { + anNumber = anNumber.trim() + anNumber = Integer.valueOf(anNumber) + anNumber = anNumber + 1 + lANNrTemp = anNumber + } catch(Exception e) { + d3.log.error("createNewOffer # lANShort enthält keinen Integer-Wert") + } + + lANNummer = "Neue Angebotsversion ${lANNrTemp} ${lTimeStamp}" + } else { + lANNummer = "Neue Angebotsversion 1 ${lTimeStamp}" + } + + docNew.field[Const.gDDF_OPPANNr] = lANNummer + } + + lReturn = d3.call.folder_create( docNew ) + String newDokuId + + if(lReturn == 0) { + + def sqlStatementNewDocId = "SELECT doku_id as dokuId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AREGI}' AND dok_dat_feld_${Const.gDDF_OPPANNr} = '${lANNummer}'" + List sqlResultNewDocId = d3.sql.executeAndGet(sqlStatementNewDocId) + + newDokuId = sqlResultNewDocId.getAt(0).get("dokuId") + + if( newDokuId != null ) { + docNew = d3.archive.getDocument(newDokuId); + + d3.log.info("Die Angebotsakte ${docNew.id()} wurde erfolgreich angelegt!") + + lReturn = d3.call.link_documents(lFatherOpp, docNew.id(), "d3groovy", false, false) + + if( lReturn == 0 ) { + d3.log.info("Die Aktenverknüpfung zwischen Angebotsakte ${docNew.id()} und Elementarprozessakte ${lFatherOpp} wurde erfolgreich angelegt!") + } else { + d3.log.error("Die Aktenverknüpfung zwischen Angebotsakte ${docNew.id()} und Elementarprozessakte ${lFatherOpp} wurde nicht erfolgreich angelegt! Errorcode :lReturn") + } + + doc.field[Const.gDDF_ANNEU] = "Nein" + doc.field[Const.gDDF_ANSTATUS] = "geschlossen" + try { + doc.updateAttributes("d3groovy") + } 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) + } + + // in JPL waren die Parameter alle geleert, daher immer default verwenden + d3.call.document_send_to_dsearch( doc.id(), "", 0, "", false, "Fr", 0, "d3groovy") + } + } + + def lDocIdAnNeu = newDokuId; + doc.field[Const.gDDF_OPPANNr] = docTemp.field[Const.gDDF_OPPANNr] + + return "${lDocIdAnNeu}" + + } else { + d3.log.error("Der Dokumentkontext für die Anlage einer Angebotsakte konnte nicht geladen werden!") + } + } + + /** + * Wenn initial in der Inquiry Akte Einträge in Angebotsnamen gemacht werden, erstelle neue Elementarprozessakten (02 Angebot) und darunter jeweils neue Angebotsakten + * @author + * @see InsertExit + * @return keine Rückgabe; im Hintergrund werden Akten erstellt + */ + public static void createOfferFolder(D3Interface d3, Document doc, def doc_type_short ) { + d3.log.info("Start Functions createOfferFolder"); + + //Setze Variablen zur Übernahme der Attribute auf die untergeordneten Akten + // dkle, 02.02.2016 Die Opportunityakten enthelten kein Ereignisdatum mehr, auskommentiert + def h_folder_doku_id + def h_folder_exist + def h_folder_name + def tmp_kundeName = doc.field[Const.gDDF_KNAME] + def tmp_KundeNr = doc.field[Const.gDDF_KNR] + def tmp_BuchKr = doc.field[Const.gDDF_BUCHKREIS] + def tmp_prozess = doc.field[Const.gDDF_PROZESS] + def tmp_Angebot = doc.field[Const.gDDF_ANNAME] + def tmp_OppNr = doc.field[Const.gDDF_OPPNUMMER] + def tmp_HauptOpp = doc.field[Const.gDDF_HAUPTOPP] + def tmp_Submiss = doc.field[Const.gDDF_SUBMISSION] + def tmp_Status = doc.field[Const.gDDF_STATUS] + def tmp_SalesGroup = doc.field[Const.gDDF_SALESGROUP] + def tmp_MultVal + List tmp_Angebote = new ArrayList<>(); + List tmp_Intercompany = new ArrayList<>(); + + Date dateOffer = new Date(); + SimpleDateFormat sdfOffer = new SimpleDateFormat("yyyyMMddHHmmss"); + String dateString = sdfOffer.format(dateOffer); + + // imue 22.11.2021: Generierung Zeitstempel um Angebotsvorgang mit Angebotsversion verbinden zu können! + String lOPPANNrMain = "Neues Angebot " + dateString + try { + Document docFolderVorgang = d3.archive.getDocument(doc.id()); + docFolderVorgang.field[Const.gDDF_HAUPTOPPANNR] = lOPPANNrMain; + docFolderVorgang.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); + } + + // imue 15.04.2019 - OPG-2132 - Vererbung "Intercompany" + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + //Setze die neuen Angebotsnamen in ein Array + if( doc.field[Const.gDDF_BUCHKREIS68][i] != null && !doc.field[Const.gDDF_BUCHKREIS68][i].equals("") ) { + tmp_Intercompany.add(doc.field[Const.gDDF_BUCHKREIS68][i]); + } + } + + // Achtung!: 60er Feld beginnt bei 1 aber Array bei 0! + if(tmp_Intercompany != null && tmp_Intercompany.size() > 0) { + for(int j=1; j <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); j++) { + if(j <= tmp_Intercompany.size() ) { + if( tmp_Intercompany.get(j-1) != null && !tmp_Intercompany.get(j-1).equals("") ) { + doc.field[Const.gDDF_BUCHKREIS68][j] = tmp_Intercompany.get(j-1) + } + } + } + } + + //Hole jetzt die Attribute der neuen Akte + String newOfferVers = "Neue Angebotsversion 1 ${dateString}"; + Document newDoc = d3.archive.newDocument(); + newDoc.type = Const.gDTS_AREGI + newDoc.field[Const.gDDF_ANNAME] = tmp_Angebot + newDoc.field[Const.gDDF_OPPNUMMER] = tmp_OppNr + newDoc.field[Const.gDDF_OPPANNr] = newOfferVers; + newDoc.field[Const.gDDF_ANNEU] = "Nein" + newDoc.field[Const.gDDF_ANSTATUS] = "in Arbeit" + newDoc.field[Const.gDDF_STATUS] = tmp_Status + newDoc.status = "Freigabe" + + // 19.11.2015/dkle neue Attribute für die Angebotsversionsakte, vorher durch Aktenplan + newDoc.field[Const.gDDF_KNR] = tmp_KundeNr + newDoc.field[Const.gDDF_SUBMISSION] = tmp_Submiss + newDoc.field[Const.gDDF_HAUPTOPP] = tmp_HauptOpp + newDoc.field[Const.gDDF_BUCHKREIS] = tmp_BuchKr + newDoc.field[Const.gDDF_KNAME] = tmp_kundeName + newDoc.field[Const.gDDF_PROZESS] = tmp_prozess + newDoc.field[Const.gDDF_SALESGROUP] = tmp_SalesGroup + + Document docAfterImport = d3.archive.importDocument(newDoc); + if(docAfterImport != null) { + // wenn Aktenerstellung erfolgreich + h_folder_doku_id = docAfterImport.id(); + d3.log.info("Die Angebotsversion zur Opportunity ${tmp_OppNr} wurde mit der Nummer ${h_folder_doku_id} erfolgreich angelegt!") + + def lOffDocID + def lReturn + def lOPPANNr = newDoc.field[Const.gDDF_OPPANNr] + + docAfterImport.field[Const.gDDF_HAUPTOPPANNR] = lOPPANNrMain + try { + docAfterImport.updateAttributes("d3groovy", true) + } catch(Exception e) { + String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e + int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, h_folder_doku_id, null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false); + } + + d3.call.document_send_to_dsearch( doc.id(), "", 0, "", false, "Fr", 0, "d3groovy"); + + // 19.11.2015/dkle Verlinkung der neuen Angebotsversionsakte (api_doc_id - Child) mit der Angebotsvorgangsakte (doku_id_ref - Father) + d3.call.link_documents(doc.id(), docAfterImport.id(), "d3groovy", false, false); + } else { + d3.log.error("Die Angebotsversion zur Opportunity ${tmp_OppNr} wurde nicht erfolgreich angelegt!"); + } + + } + + /** + * Erstellung einer HTML Datei für Wissens- oder Infothekdokumente, damit eine Suchseite für d3one zur Verfügung steht + * @author Unterstützende Prozesse + * @see InsertExit, UpdateAttributExit + * @return keine Rückgabe; im Hintergrund wird eine HTML Datei erstelllt + */ + public static void createSearchHTML( D3Interface d3, Document doc) { + d3.log.info("Start Functions createSearchHTML"); + + List lValue = new ArrayList<>() + def lDDFNo + def lField + def lOne + def lCnt + def lParseString + def lRetVal + def lCount + def lArraySum + def lArrayDDF + def lArrayField + def lArrayOne + File lOrgFile + File lFile + + if( doc.getType().getId().equals(Const.gDTS_DSCHU) ) { + + //Pfad zur Originaldatei, die als Quelle dient + lOrgFile = new File("E:\\d3\\d3work\\Schulungsdokumentation\\orgfile.html") + + //Pfad zur Datei, bei der Zeilen angefügt werden sollen + String filePath = "\\\\sde01d3t06\\c\$\\inetpub\\wwwroot\\optima\\sucheschulungattr.html" + lFile = new File(filePath) + //File lFile = "E\:\\d3\\d3work\\Schulungsdokumentation\\sucheschulungattr.html" + + + //Arrays mit den DDF und Werten, für die eine Suche erstellt werden soll. Immer auf die Beziehungen untereinander achten + lArrayDDF = "60" + lArrayField = "" + lArrayOne = "%7B%22210%22%3A%5B%22" + + String[] splittedString = lArrayDDF.split(";") + lArraySum = splittedString.size() + + if( lFile.exists() && !lFile.isDirectory() ) { + lRetVal = 1 + } else { + lRetVal = 0 + } + + } + + if( doc.getType().getId().equals(Const.gDTS_DWISS)) { + + //Pfad zur Originaldatei, die als Quelle dient + lOrgFile = new File("E:\\d3\\d3work\\Schulungsdokumentation\\orgfileDWISS.html"); + + //Pfad zur Datei, bei der Zeilen angefügt werden sollen + String filePath = "\\\\sde01d3t06\\c\$\\inetpub\\wwwroot\\optima\\sucheswissenattr.html" + lFile = new File(filePath); + //File lFile = "E\:\\d3\\d3work\\Schulungsdokumentation\\sucheschulungattr.html" + + + //Arrays mit den DDF und Werten, für die eine Suche erstellt werden soll. Immer auf die Beziehungen untereinander achten + lArrayDDF = "48;61;68" + lArrayField = "Trends;Region;Business Unit" + lArrayOne = "%7B%22125%22%3A%5B%22;%7B%22116%22%3A%5B%22;%7B%22125%22%3A%5B%22" + + String[] splittedString = lArrayDDF.split(";") + lArraySum = splittedString.size() + + if( lFile.exists() && !lFile.isDirectory() ) { + lRetVal = 1 + } else { + lRetVal = 0 + } + + } + + //Nur wenn die Zieldatei existiert ausführen + if( lRetVal == 1 ) { + + copyFileUsingStream(lOrgFile, lFile) + + for( int i=0; i < lArraySum; i++ ) { + String[] splittedString1 = lArrayDDF.split(";") + lDDFNo = splittedString1[i].trim() + + String[] splittedString2 = lArrayField.split(";") + lField = splittedString2[i].trim() + + String[] splittedString3 = lArrayOne.split(";") + lOne = splittedString3[i].trim() + + if( Integer.valueOf(lDDFNo) <= 59 || Integer.valueOf(lDDFNo) >= 70 ) { + + def sqlStatement = "SELECT DISTINCT dok_dat_feld_${lDDFNo} as lValue " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${doc.getType().getId()}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + for(GroovyRowResult grr : sqlResult) { + def newValue = grr.get("lValue"); + newValue = StringEscapeUtils.escapeHtml(newValue); + lValue.add(newValue); + } + lCnt = sqlResult.size() + + //HTML Code anfügen + for(int j=0; j < lCnt; j++) { + if( !lValue.get(j).equals("") ) { + def sqlStatementSec = "SELECT * " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${doc.getType().getId()}' " + + "AND dok_dat_feld_${lDDFNo} = '${lValue.get(j)}' " + + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + lCount = sqlResultSec.size() + + lParseString = "" + lFile << lParseString + "\n" + } + + } + } else { + def sqlStatement = "select distinct value_char as lValue " + + "from firm_spez_mult_val " + + "where field_no = '${lDDFNo}' " + + "and doku_id in (select doku_id from firmen_spezifisch where kue_dokuart = '${doc.getType().getId()}') " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + for(GroovyRowResult grr : sqlResult) { + def newValue = grr.get("lValue"); + newValue = StringEscapeUtils.escapeHtml(newValue); + lValue.add(newValue); + } + lCnt = sqlResult.size() + + //HTML Code anfügen + for(int j=0; j < lCnt; j++) { + if( lValue.get(j) != null && !lValue.get(j).equals("") ) { + def sqlStatementSec = "select value_char " + + "from firm_spez_mult_val " + + "where field_no = '${lDDFNo}' " + + "and value_char = '${lValue.get(j)}' " + + "and doku_id in (select doku_id from firmen_spezifisch where kue_dokuart = '${doc.getType().getId()}') " + + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + lCount = sqlResultSec.size() + + lParseString = "" + lFile << lParseString + "\n" + } + } + } + + } + + lFile << "" + "\n" + lFile << "" + "\n" + lFile << "" + "\n" + lFile << "" + "\n" + lFile << "" + "\n" + lFile << "" + "\n" + lFile << "" + "\n" + + } else { + d3.log.error("Datei nicht vorhanden :lFile") + } + + } + + /** + * Erstellung eines UPD Async Jobs zur Aktualisierung von Dokumenten über den d.3 Async (UPD001) + * Voraussetzung: d3config -> ASYNC_JOB_TYPE = CUSTOMJOB + * @author Hilfsfunktion + * @return keine Rückgabe; im Hintergrund werden Async Jobs erstellt + */ + public static void createAsyncJobForUpdates(D3Interface d3, Document docTrigger, List docIdsToUpdate, Map attributesUpdate, String functionName) { + d3.log.info("Start Functions createAsyncJobForUpdates with <${functionName}>"); + + // Wenn keine JPL Lösung gefunden wurde, dann nehme den Asynchronen Standardweg + for(String docId : docIdsToUpdate) { + try { + // Quelle Dokumentation: + // Die Job-Parameterangaben, die in der Spalte Dokumentart auf eine "-200" verweisen, sind die Suchangaben zur Identifikation des Dokumentes im d.3 Repository. + // Die Job-Parameterangaben, die in der Spalte Dokumentart auf eine "200" verweisen, sind die Zielangaben, auf die das ermittelte Dokument upgedatet werden soll. + d3.call.d3async_job_open(docId, "UPD001", "d3groovy"); + // eindeutige Erkennungseigenschaften "o_" + d3.call.d3async_job_set_attribute("doku_id", docId, -200); + // neue Eigenschaften "n_" (neue Werte aus der Vaterakte) + if(attributesUpdate != null && attributesUpdate.size() > 0) { + for(int ddf : attributesUpdate.keySet()) { + if(ddf > 59 && ddf < 70) { + // Mehrfachfeld (60-69) + try { + List attributValues = attributesUpdate.get(ddf); + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + String value = attributValues.get(i-1).toString(); + if(value == null || (value != null && value.equals("null"))) { + value = ""; + } + d3.call.d3async_job_set_attribute("dok_dat_feld_${ddf}[${i}]", value, 200); + } + } catch(Exception e2) { + d3.log.error("Fehler bei Zugriff auf Mehrfachfeld = " + e2); + } + } else { + // Einfachfeld + String value = attributesUpdate.get(ddf).toString(); + if(value == null || (value != null && value.equals("null"))) { + value = ""; + } + d3.call.d3async_job_set_attribute("dok_dat_feld_${ddf}", value, 200); + } + } + } + d3.call.d3async_job_close(); + } catch(Exception e) { + String noticeHoldfile = "UPD-Datei konnte nicht erstellt werden: " + e + int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docId, null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) + d3.log.error("UPD-Datei für Dokument ${docId} konnte nicht erstellt werden = " + e); + } + } + + } + + /** + * Erstellung einer Dublette aller Ergebnisdokumente + * @author + * @see InsertExit, UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Dokumente erstellt + */ + public static void copyApprovedECR( D3Interface d3, def lActID, def lOrderID, def lDirectCopy ) { + d3.log.info("Start Functions copyApprovedECR"); + + def lReturn + List lDocIDResultDoc = new ArrayList<>(); + def lDocIDResultDocCount + + if( lDirectCopy.equals("") ) { + + // phoer 05.10.2016: Suche alle ECR-Dokumente im Auftrag, die eine Aktivitäts-ID und das Ergebnisdokument = Ja haben + def sqlStatement = "SELECT doku_id as lDocIDResultDoc " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_DMECR}' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lOrderID}' " + + "AND dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${lActID}' " + + "AND dok_dat_feld_${Const.gDDF_ERGEBNISDOK} = 'Ja' "; + List sqlResult = d3.getSql().executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size()> 0) { + for(GroovyRowResult grr : sqlResult) { + lDocIDResultDoc.add(grr.get("lDocIDResultDoc")) + } + lDocIDResultDocCount = sqlResult.size() + } + + } else { + lDocIDResultDoc.add(lDirectCopy) + lDocIDResultDocCount = 1 + d3.log.info( "lDocIDResultDoc[0]: ${lDocIDResultDoc.get(0)} - lDocIDResultDocCount: ${lDocIDResultDocCount}" ) + } + + for(int i=0; i < lDocIDResultDocCount; i++) { + + // Eigenschaften des Original Dokumentes holen + Document originalDoc = d3.archive.getDocument(lDocIDResultDoc.get(i), "d3groovy") + + // Ermittlung Filepath im Dokbaum - daher vorher Prüfung notwendig ob Dokument sich auf dem Storage befindet + String filepath + def sqlStatement = "SELECT fd.lokalisation as lokalisation FROM files_datentraeger as fd WHERE fd.doku_id NOT LIKE '\$%' AND doku_id = '${lDocIDResultDoc[i]}'" + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + def originalDocLocalisation = sqlResult.getAt(0).get("lokalisation") + if( originalDocLocalisation == 2 ) { + // Dokument befindet sich auf dem Storage und muss vor Ermittlung "zurückgeholt" werden + // Optima hat kein Storage im Einsatz, daher keine Relevanz + } else { + filepath = d3.call.document_get_file_path( lDocIDResultDoc[i], "Fr", originalDoc.getFileIdCurrentVersion(), "d3groovy", "") + } + + // nur wenn filepath nicht leer ist, kann das Dokument kopiert werden + if(filepath != null && !filepath.equals("")) { + + // Akte (48) -> wird automatisch auf Werkauftrag gesetzt + // Feld Akte -> Dokumenttitel + // Auftragsnummer (19), Bemerkung (9), Buchungskreis (28), Dokumenteninfosatz Nr. (80), Dokumentgruppe (21), Dokumentkategorie (18), Ereignisdatum (50), + // Ergebnisdokument (60), Hauptauftrag (8), Jahr (33), Kunden_Name (23), Kunden_Nr (22), Monat (34), Prozessart (5), Prozessgruppe (4), weitere Auftragsnummern (66) + + // Workaround: Datei temporär lokal verarbeiten aufgrund der FileExtension + File fileTemp = new File(filepath) + def docName = originalDoc.getFilename() + // Sonderzeichen entfernen + docName = docName.replaceAll("[\\\\/:*?\"<>|]", "_"); + def docExt = originalDoc.getFileExtension() + String copiedFileDest = copyDocumentUsingChannel(d3, fileTemp, docName, docExt) + + if(copiedFileDest != null && !copiedFileDest.equals("") ) { + + Path importFile = Paths.get(copiedFileDest); + + // Neues Dokument definieren mit Eigenschaften des Originals + Document newDoc = d3.archive.newDocument(); + newDoc.type = Const.gDTS_DMSPE + newDoc.status = Document.DocStatus.DOC_STAT_RELEASE + newDoc.setText(3, "${lDocIDResultDoc[i]}") + newDoc.setText(4, "ECR cloned") + newDoc.field[Const.gDDF_SUBJECT]= Const.gAK_Werkauftrag + newDoc.field[Const.gDDF_DOKTITLE] = originalDoc.field[Const.gDDF_DOKTITLE] + newDoc.field[Const.gDDF_AUFTRNR] = originalDoc.field[Const.gDDF_AUFTRNR] + String tempInt = originalDoc.field[Const.gDDF_DOCINFONR] + newDoc.field[Const.gDDF_DOCINFONR] = originalDoc.field[Const.gDDF_DOCINFONR] + newDoc.field[Const.gDDF_DOKGROUP] = Const.gDG_ECRChangeOrder + newDoc.field[Const.gDDF_ERDATE] = originalDoc.field[Const.gDDF_ERDATE] + newDoc.field[Const.gDDF_JAHR] = originalDoc.field[Const.gDDF_JAHR] + newDoc.field[Const.gDDF_MONAT] = originalDoc.field[Const.gDDF_MONAT] + + // Mehrfachfeld + for( int j=1; j <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); j++) { + if( originalDoc.field[Const.gDDF_WEITAUFTRAGSNR][j] != null && !originalDoc.field[Const.gDDF_WEITAUFTRAGSNR][j].equals("") ) { + newDoc.field[Const.gDDF_WEITAUFTRAGSNR][j] = originalDoc.field[Const.gDDF_WEITAUFTRAGSNR][j] + } + if( originalDoc.field[Const.gDDF_ERGDOCFUER][j] != null && !originalDoc.field[Const.gDDF_ERGDOCFUER][j].equals("") ) { + newDoc.field[Const.gDDF_ERGDOCFUER][j] = originalDoc.field[Const.gDDF_ERGDOCFUER][j] + } + } + + try { + // neues Dokument importieren + newDoc = d3.archive.importDocument(newDoc, importFile); + d3.log.info( "Das Dokument ${lDocIDResultDoc[i]} konnte erfolgreich gecloned werden!" ) + + // Workaround: temporäre Datei für FileExtension wieder entfernen + boolean documentTempDeleted = deleteClonedDocumentTemp(d3, copiedFileDest) + if(documentTempDeleted == false) { + d3.log.error("Temporäres Dokument ${copiedFileDest} konnte nicht gelöscht werden!") + } + } catch(Exception e) { + d3.log.error("Das Dokument ${lDocIDResultDoc[i]} konnte nicht erfolgreich kopiert werden!") + return + } + } else { + d3.log.error("Das Dokument ${lDocIDResultDoc[i]} konnte nicht erfolgreich kopiert werden!") + } + } else { + d3.log.error("Das Dokument ${lDocIDResultDoc[i]} konnte nicht erfolgreich kopiert werden!") + } + } + } + + /** + * Erstellung einer Dublette für Kundenkontaktdokumente + * @author + * @see InsertExit, UpdateAttributExit, NewVersionExit + * @return keine Rückgabe; im Hintergrund werden Dokumente erstellt + */ + public static void copyCustAction( D3Interface d3, Document doc, def lMapCustAction ) { + d3.log.info("Start Functions copyCustAction"); + + // Lösung durch Workaround, Datei wird temporär Zwischengespeichert -> die Filextension verloren geht durch Import von newDocument + + doc = d3.archive.getDocument(doc.id()); + + def lReturn + def lContactID + def lContactDate + def lContactName + String lMapNew + def lDokNeu + + String[] splittedString = lMapCustAction.split("\\|") + + if ( splittedString.size() > 0 ) { + + lContactID = splittedString[0].trim() + lContactDate = splittedString[1].trim() + lContactName = splittedString[2].trim() + + // Ermittlung Filepath im Dokbaum - daher vorher Prüfung notwendig ob Dokument sich auf dem Storage befindet + def filepath + def sqlStatement = "SELECT fd.lokalisation as lokalisation FROM files_datentraeger as fd WHERE fd.doku_id NOT LIKE '\$%' AND doku_id = '${doc.id()}'" + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + def originalDocLocalisation = sqlResult.getAt(0).get("lokalisation") + if( originalDocLocalisation == 2 ) { + // Dokument befindet sich auf dem Storage und muss vor Ermittlung "zurückgeholt" werden + // bei Optima kein Storage im Einsatz, daher keine Relevanz + } else { + filepath = d3.call.document_get_file_path( doc.id(), "Ar", doc.getFileIdCurrentVersion(), "d3groovy", "") + } + + // nur wenn filepath nicht leer ist, kann das Dokument kopiert werden + if(filepath != null && !filepath.equals("")) { + + // Workaround: Datei temporär lokal verarbeiten aufgrund der FileExtension + File fileTemp = new File(filepath) + def docName = doc.getFilename() + // Sonderzeichen entfernen + docName = docName.replaceAll("[\\\\/:*?\"<>|]", "_"); + def docExt = doc.getFileExtension() + String copiedFileDest = copyDocumentUsingChannel(d3, fileTemp, docName, docExt) + + if(copiedFileDest != null && !copiedFileDest.equals("") ) { + + // Neues Dokument definieren + Path importFile = Paths.get(copiedFileDest); + + // Eigenschaften im neuen Dokument setzen + Document newDoc = d3.archive.newDocument(); + newDoc.type = Const.gDTS_DKUKO + newDoc.status = Document.DocStatus.DOC_STAT_ARCHIVE + newDoc.setText(3, doc.id()) + newDoc.setText(4, "cloned") + newDoc.field[Const.gDDF_KONTAKTNUMMER] = lContactID + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + Date parsedDate = dateFormat.parse(lContactDate.trim()); + newDoc.field[Const.gDDF_KONTAKTDATE] = parsedDate + newDoc.field[Const.gDDF_BESCHREIBUNG] = lContactName + newDoc.field[Const.gDDF_KNR] = doc.field[Const.gDDF_KNR] + newDoc.field[Const.gDDF_DOKGROUP] = doc.field[Const.gDDF_DOKGROUP] + newDoc.field[Const.gDDF_AUFTRNR] = doc.field[Const.gDDF_AUFTRNR] + newDoc.field[Const.gDDF_DOKTITLE] = doc.field[Const.gDDF_DOKTITLE] + newDoc.field[Const.gDDF_ERDATE] = doc.field[Const.gDDF_ERDATE] + + try { + // neues Dokument importieren + newDoc = d3.archive.importDocument(newDoc, importFile); + lDokNeu = newDoc.id() + + // Workaround: temporäre Datei für FileExtension wieder entfernen + boolean documentTempDeleted = deleteClonedDocumentTemp(d3, copiedFileDest) + if(documentTempDeleted == false) { + d3.log.error("Temporäres Dokument ${copiedFileDest} konnte nicht gelöscht werden!") + } + + d3.log.info("Das Dokument ${doc.id()} wurde erfolgreich kopiert. Die neue Doku-ID lautet ${lDokNeu}") + + lMapNew = "bereits zugeordnet " + lMapCustAction + + doc.field[Const.gDDF_MAPPCUSTACTION] = lMapNew + 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) + d3.log.error( "Die Aktualisierung des Attributs Zuordnung Kundenkontakt für das Dokument ${doc.id} konnte nicht vorgenommen werden!") + } + + } catch(Exception e) { + d3.log.error("Das Dokument ${doc.id} konnte nicht erfolgreich kopiert werden!") + return + } + } else { + d3.log.error("Das Dokument ${doc.id} konnte nicht erfolgreich kopiert werden!") + } + } else { + d3.log.error("Das Dokument ${doc.id} konnte nicht erfolgreich kopiert werden!") + } + d3.log.info("#### Funktion CopyCustAction wurde beendet ####") + } + } + + /** + * Kopie der übergebenen Datei (mit Hilfe von Channeln) + * @author allgemeine Hilfsfunktion + * @return Pfad zur erstellten Datei + */ + public static String copyDocumentUsingChannel(D3Interface d3, File source, String fileName, String extension) { + d3.log.info("Start Functions copyDocumentUsingChannel"); + + String newPath = SystemSpecificConst.cloneDocumentTempPath + File dest = new File(newPath + "\\\\" + fileName + "." + extension); + FileChannel sourceChannel = null; + FileChannel destChannel = null; + try { + sourceChannel = new FileInputStream(source).getChannel(); + destChannel = new FileOutputStream(dest).getChannel(); + destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); + } catch(Exception e) { + // d3.log.error("copyFileUsingChannel Function Error: Temp Document could not be executed - " + e.getMessage()); + } finally { + if( sourceChannel != null) { + sourceChannel.close(); + } + if( destChannel != null) { + destChannel.close(); + } + } + return dest.getPath(); + } + + /** + * Kopie der übergebenen Datei (mit Hilfe von Stream) + * @author allgemeine Hilfsfunktion + * @return keine Rückgabe, im Hintergrund wird eine Datei erstellt + */ + public static void copyFileUsingStream(File source, File dest) throws IOException { + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(source); + os = new FileOutputStream(dest); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } catch(Exception e) { + System.out.println("copyFileUsingStream - " + e.getMessage()); + } finally { + if( is != null ) { + is.close(); + } + if( os != null ) { + os.close(); + } + } + } + + /** + * Wenn "neues Angebot" auf "Ja, mit Dokumenten" gesetzt worden ist, kopiere alle Ergebnisdokumente in die neue Angebotsakte + * @author + * @see UpdateAttributExit + * @return keine Rückgabe, im Hintergrund wird ein Dokument kopriert + */ + public static void copyOfferDocuments( D3Interface d3, Document doc, def docIdAnNeu ) { + d3.log.info("Start Functions copyOfferDocuments"); + + def lReturn + def lResultDok + def lAnNrNeu + def lDokNeu + int lDokCount = 0; + def lARCDocID + def lOpportunityNoTMP + def lBlockSign + + d3.log.info("Start copyOfferDocuments: Alte Angebotsversion ${doc.id()} - Neue Angebotsversion ${docIdAnNeu}"); + lOpportunityNoTMP = doc.field[Const.gDDF_OPPANNr] + + //Hole die Doku-ID aller Dokumente aus der Angebotsakte + + // String[] children = d3.call.link_get_children(doc.id(), "d3groovy") -> wenn das Dokument nicht mehr verknüpft war, dann liefert diese Funktion keine Ergebnisse + String sqlStatementChildren = "SELECT doku_id as dokId " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_DOPPD}' " + + "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? " + + "AND dok_dat_feld_${Const.gDDF_OPPANNr} = ? " + + "AND dok_dat_feld_${Const.gDDF_ERGEBNISDOK} = ? "; + List params = [ + doc.field[Const.gDDF_OPPNUMMER], + doc.field[Const.gDDF_OPPANNr], + "Ja" + ]; + List children = d3.sql.executeAndGet(sqlStatementChildren, params); + if(children != null) { + lDokCount = children.size(); + } + + d3.log.info("copyOfferDocuments lDokCount: ${lDokCount}"); + + if( lDokCount > 0 ) { + + //Schaue, ob das Dokument ein Ergebnisdokument ist + //Soll nicht fuer Angebote gelten + for(GroovyRowResult grrChild : children) { + + try { + def sqlStatement = "SELECT fs.dok_dat_feld_${Const.gDDF_ERGEBNISDOK} as lResultDok, fs.dok_dat_feld_${Const.gDDF_ARCDOCID} as lARCDocID, pd.frei_o_gesperrt as lBlockSign " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE fs.doku_id = '${grrChild.get("dokId")}' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + lResultDok = sqlResult.getAt(0).get("lResultDok") + lARCDocID = sqlResult.getAt(0).get("lARCDocID") + lBlockSign = sqlResult.getAt(0).get("lBlockSign") + + //Wenn ja, kopiere das Dokument... + //phoer 20190220: Umgestellt von Prüfung auf Freigabe, denn bei Dokumenten, die nur in Bearbeitung sind, ist lBlockSign = NULL + if( lResultDok.equals("Ja") && lARCDocID == null && ( !lBlockSign.equals('g') || lBlockSign == null ) ) { + + //Hole die neue Angebotsnummer + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_PROJTITLE} as lAnNrNeu " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${docIdAnNeu}' " + + List sqlResultSec = d3.getSql().executeAndGet(sqlStatementSec) + lAnNrNeu = sqlResultSec.getAt(0).get("lAnNrNeu") + + // Eigenschaften des Original Dokumentes laden + Document originalDoc = d3.archive.getDocument(grrChild.get("dokId")); + + // Ermittlung Filepath im Dokbaum + Map statusMap = new HashMap(); + statusMap.put("DOC_STAT_VERIFICATION", "Pr"); + statusMap.put("DOC_STAT_RELEASE", "Fr"); + statusMap.put("DOC_STAT_PROCESSING", "Be"); + statusMap.put("DOC_STAT_ARCHIVE", "Ar"); + + def filepath = d3.call.document_get_file_path( grrChild.get("dokId"), statusMap.get(originalDoc.getStatus().toString()), originalDoc.getFileIdCurrentVersion(), "d3groovy", ""); + + d3.log.info("copyOfferDocuments filepath : ${filepath}"); + + // nur wenn filepath nicht leer ist, kann das Dokument kopiert werden + if(filepath != null && !filepath.equals("")) { + + // Workaround: Datei temporär lokal verarbeiten aufgrund der FileExtension + File fileTemp = new File(filepath) + def docName = originalDoc.getFilename() + // Sonderzeichen entfernen + docName = docName.replaceAll("[\\\\/:*?\"<>|]", "_"); + def docExt = originalDoc.getFileExtension() + String copiedFileDest = copyDocumentUsingChannel(d3, fileTemp, docName, docExt) + + if(copiedFileDest != null && !copiedFileDest.equals("") ) { + + // Neues Dokument definieren + Path importFile = Paths.get(copiedFileDest); + + // Eigenschaften im neuen Dokument setzen + Document newDoc = d3.archive.newDocument(); + newDoc.type = Const.gDTS_DOPPD + + // notwendig bis Server Hotfix 36 + // newDoc.status = Document.DocStatus.DOC_STAT_RELEASE + + newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING + // 30.03.2023 Quicktag.dxp Anpassung bzw. Server Update Annual (Anpassung der Gruppe auf technischen Kürzel notwendig) + //newDoc.editor = "d3_grp_all"; + newDoc.editor = "d3_grp_a"; + newDoc.setText(3, originalDoc.id()) + newDoc.setText(4, "cloned") + + newDoc.field[Const.gDDF_OPPANNr] = lAnNrNeu + newDoc.field[Const.gDDF_ADITTITLE] = "" + + // alle Pflichtfelder und Erkennungsattribute müssen geholt werden inklusive Buchungskreis! + newDoc.field[Const.gDDF_OPPNUMMER] = doc.field[Const.gDDF_OPPNUMMER] + newDoc.field[Const.gDDF_ERDATE] = originalDoc.field[Const.gDDF_ERDATE] + newDoc.field[Const.gDDF_DOKTITLE] = originalDoc.field[Const.gDDF_DOKTITLE] + newDoc.field[Const.gDDF_DOKGROUP] = originalDoc.field[Const.gDDF_DOKGROUP] + newDoc.field[Const.gDDF_ANNAME] = doc.field[Const.gDDF_ANNAME] + newDoc.field[Const.gDDF_BUCHKREIS] = doc.field[Const.gDDF_BUCHKREIS] + // kopiertes Dokument soll den Status Ergebnisdokuemnt ja behalten + newDoc.field[Const.gDDF_ERGEBNISDOK] = "Ja"; + + try { + // neues Dokument importieren + newDoc = d3.archive.importDocument(newDoc, importFile); + lDokNeu = newDoc.id() + + // d3.log.error( "Vor dem Link: :(lOpportunityNoTMP) = :(dok_dat_feld[gDDF_OPPANNr])" ) + //...und verknüpfe es mit dem neuen Dokument + // Dokument zu Dokument Verknüpfung + lReturn = d3.call.link_documents( lDokNeu, grrChild.get("dokId"), "d3groovy", false, false ) + // Akte zu Dokument Verknüpfung -> erfolgt durch Aktenplan: + // lReturn2 = d3.call.link_documents(docIdAnNeu, lDokNeu, "d3groovy", false, false) + + // Workaround: temporäre Datei für FileExtension wieder entfernen + boolean documentTempDeleted = deleteClonedDocumentTemp(d3, copiedFileDest) + if(documentTempDeleted == false) { + d3.log.error("Temporäres Dokument ${copiedFileDest} konnte nicht gelöscht werden!") + } + + // Workaround: Nach dem link_documents hat er in der Variablen dok_dat_feld[gDDF_OPPANNr] die Angebot_Nr der gerade angelegten Akte stehen. + // Das führt in der Folge zu Fehlern, dass Dokumente der gerade geclonten Akte mit der falschen "neuen" Angebotsnummer bestückt werden. + // call api_log_error( "Test wegen Ticket: NACH dem link_dokuments dok_dat_feld[gDDF_OPPANNr]: :(dok_dat_feld[gDDF_OPPANNr])" ) + // dok_dat_feld[gDDF_OPPANNr] = lOpportunityNoTMP + // call api_log_error( "Nach dem dem Link: :(lOpportunityNoTMP) = :(dok_dat_feld[gDDF_OPPANNr])" ) + + if( lReturn == 0) { + d3.log.info("Das Angebotsdokument ${grrChild.get("dokId")} wurde erfolgreich mit dem neuen Dokument verknüpft!") + } else { + d3.log.error("Das Angebotsdokument ${grrChild.get("dokId")} wurde nicht erfolgreich mit mit dem neuen Dokument verknüpft!") + } + + } catch(Exception e) { + d3.log.error("copyOfferDocuments error = " + e.getMessage()) + d3.log.error("Das Dokument " + grrChild.get("dokId") + " konnte nicht erfolgreich kopiert werden!") + } + } else { + d3.log.error("Das Dokument ${doc.id()} konnte nicht erfolgreich kopiert werden!") + } + } else { + d3.log.error("Das Dokument ${doc.id()} konnte nicht erfolgreich kopiert werden!") + } + } + } catch(Exception e2) { + d3.log.error("copyOfferDocuments error = " + e2.getMessage()); + d3.log.error("Das Dokument " + grrChild.get("dokId") + " konnte nicht erfolgreich kopiert werden!") + } + } + } else { + d3.log.error("Die Angebotsrelevanten Dokumente konnten nicht gefunden werden!") + } + } + + /** + * Übernahme aller Ergebnisdokumente aus der Opportunity in Maschinenprojektakte (Übergabe/Aufträge) + * Die Dokumente werden in die Auftragsakte verlinkt (bisherige Funktion) + * Außerdem sollen die Dokumente in die Akte Ergebnis Opportunity festgeschrieben werden + * @author + * @see InsertExit, UpdateAttributExit + * @return keine Rückgabe, im Hintergrund wird ein Dokument kopiert + */ + public static void copyResultDocs(D3Interface d3, Document doc, def lBaseOpp, def lOrderNo) { + d3.log.info("Start Functions copyResultDocs = " + doc.id()); + + //prüfe, ob bereits eine Auftragsakte generiert wurde... + def lOrderDocID + def lOrderCount + def lResultRecordDocID + def lResultCount + def lBaseOfferCount + def retval + def l60Count + def tmp_orderNo + def tmp_CustNo + def tmp_CustName + def tmp_Process + def tmp_BU + def tmp_MainOrd + + def sqlStatementOrderDoc = "SELECT doku_id as lOrderDocID " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AMAUF}' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lOrderNo}' "; + List sqlResultOrderDoc = d3.getSql().executeAndGet(sqlStatementOrderDoc); + if(sqlResultOrderDoc != null && sqlResultOrderDoc.size()> 0) { + lOrderCount = sqlResultOrderDoc.size(); + lOrderDocID = sqlResultOrderDoc.getAt(0).get("lOrderDocID"); + } + + def sqlStatementRecordDoc = "SELECT doku_id as lResultRecordDocID " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AMEOP}' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lOrderNo}' "; + List sqlResultRecordDoc = d3.getSql().executeAndGet(sqlStatementRecordDoc); + if(sqlResultRecordDoc != null && sqlResultRecordDoc.size()> 0) { + lResultCount = sqlResultRecordDoc.size(); + lResultRecordDocID = sqlResultRecordDoc.getAt(0).get("lResultRecordDocID"); + } + + // Wenn die Ergebnis Opportunity Akte noch nicht existiert + if( lResultCount != null && lResultCount == 0 ) { + + //...erstelle die Ergebnis Opportunity Akte (Achtung: Nur für den Prototyp, Akte wird vermutlich durch SAP erstellt) + tmp_orderNo = doc.field[Const.gDDF_AUFTRNR] + tmp_CustNo = doc.field[Const.gDDF_KNR] + tmp_CustName = doc.field[Const.gDDF_KNAME] + tmp_Process = doc.field[Const.gDDF_PROZESS] + tmp_BU = doc.field[Const.gDDF_BUCHKREIS] + tmp_MainOrd = doc.field[Const.gDDF_PROJKLAMMER] + + Document newFolder = d3.Archive.newDocument() + newFolder.type = Const.gDTS_AMEOP + newFolder.status = Document.DocStatus.DOC_STAT_RELEASE + newFolder.field[Const.gDDF_AUFTRNR] = tmp_orderNo + newFolder.field[Const.gDDF_KNR] = tmp_CustNo + newFolder.field[Const.gDDF_KNAME] = tmp_CustName + newFolder.field[Const.gDDF_PROZESS] = tmp_Process + newFolder.field[Const.gDDF_BUCHKREIS] = tmp_BU + newFolder.field[Const.gDDF_PROJKLAMMER] = tmp_MainOrd + newFolder.field[Const.gDDF_SUBJECT] = Const.gAK_ErgebnisOpportuntiy + + retval = d3.call.folder_create(newFolder) //Verknüpfung dieser Akte erfolgt im Standard Aktenplan + if( retval == 0 ) { + lResultCount = 1 + } + } + + if( lResultCount == 1 ) { + + // Kopiere die Ergebnisdokumente in die Akte "Ergebnis Opportunity" + //...suche dir alle Dokumente mit Ergebnis-Charakter aus der zugrundeliegenden Opportuntity... + def sqlStatement = "SELECT f.doku_id as lResOppDocID, f.dok_dat_feld_${Const.gDDF_OPPNUMMER} as lOppNr " + + "FROM firmen_spezifisch as f, dokuart_langtexte as d, phys_datei as pd " + + "WHERE f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lBaseOpp}' " + + "AND f.dok_dat_feld_${Const.gDDF_ERGEBNISDOK} = 'Ja' " + + "AND f.kue_dokuart <> '${Const.gDTS_DMEOP}' " + + "AND d.sprache = '049' " + + "AND d.kue_dokuart = f.kue_dokuart " + + "AND ( pd.frei_o_gesperrt = 'f' " + + "OR pd.frei_o_gesperrt IS NULL ) " + + "AND pd.doku_id = f.doku_id " + + List sqlResult = d3.getSql().executeAndGet(sqlStatement) + + if( sqlResult != null && sqlResult.size() > 0 ) { + for(GroovyRowResult grr : sqlResult) { + + try { + // Eigenschaften des Original Dokumentes laden + Document originalDoc = d3.archive.getDocument(grr.get("lResOppDocID")); + + // Ermittlung Filepath im Dokbaum + Map statusMap = new HashMap(); + statusMap.put("DOC_STAT_VERIFICATION", "Pr"); + statusMap.put("DOC_STAT_RELEASE", "Fr"); + statusMap.put("DOC_STAT_PROCESSING", "Be"); + statusMap.put("DOC_STAT_ARCHIVE", "Ar"); + String filepath = d3.call.document_get_file_path( originalDoc.id(), statusMap.get(originalDoc.getStatus().toString()), originalDoc.getFileIdCurrentVersion(), "d3groovy", ""); + + // nur wenn filepath nicht leer ist, kann das Dokument kopiert werden + if(filepath != null && !filepath.equals("")) { + + // Workaround: Datei temporär lokal verarbeiten aufgrund der FileExtension + def docName = originalDoc.getFilename() + // Sonderzeichen entfernen + docName = docName.replaceAll("[\\\\/:*?\"<>|]", "_"); + def docExt = originalDoc.getFileExtension() + Path sourceFile = Paths.get(filepath); + + Date dateLog = new Date(); + SimpleDateFormat sdfLog = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String dateString = sdfLog.format(dateLog); + + Path targetFile = Paths.get("F:\\d3\\Hostimport\\CopyDMEOP\\" + docName + "_" + dateString + "." + docExt); + try { + Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING); + } catch(Exception e) { + d3.log.error("copyResultDocs error = " + e); + } + File newFile = new File(targetFile.toString()); + + if(newFile.exists()) { + + Document copyDoc = d3.archive.newDocument(); + copyDoc.setType(Const.gDTS_DMEOP); + + // Kopie aller Ergebnisdokumente in die Dokumentart Ergebnisdokumente Opportunity (in Maschinenprojekt) + File lPathJPL = new File("F:\\d3\\Hostimport\\CopyDMEOP\\" + docName + "_" + dateString + "." + "jpl") + lPathJPL.append("logi_verzeichnis = \"Ar\"" + System.lineSeparator()) + lPathJPL.append("dokuart = \"${Const.gDTS_DMEOP}\"" + System.lineSeparator()) + lPathJPL.append("text[3] = \"${originalDoc.id()}\"" + System.lineSeparator()) + lPathJPL.append("text[4] = \"Ergebnisdokument cloned\"" + System.lineSeparator()) + + // Pflichtattribute + lPathJPL.append( "dok_dat_feld[${Const.gDDF_DOKTITLE}] = \"" + checkValueForJpl(originalDoc.field[Const.gDDF_DOKTITLE]) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_AUFTRNR}] = \"" + checkValueForJpl(lOrderNo) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_DOKGROUP}] = \"" + checkValueForJpl(originalDoc.field[Const.gDDF_DOKGROUP]) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_OPPNUMMER}] = \"" + checkValueForJpl(lBaseOpp) + "\"" + System.lineSeparator()) + lPathJPL.append( "dok_dat_feld[${Const.gDDF_ERDATE}] = \"" + originalDoc.field[Const.gDDF_ERDATE] + "\"" + System.lineSeparator()) + //lPathJPL.append( "dok_dat_feld[${Const.gDDF_STATUS}] = \"" + originalDoc.field[Const.gDDF_STATUS] + "\"" + System.lineSeparator()) + + // Zusatzfelder + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gProzessGroupId, Const.gDDF_PROZESSGROUP, checkValueForJpl(originalDoc.field[Const.gDDF_PROZESSGROUP])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gRepIDProzessart, Const.gDDF_PROZESSART, checkValueForJpl(originalDoc.field[Const.gDDF_PROZESSART])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gAbtsenderID, Const.gDDF_ABTSENDER, checkValueForJpl(originalDoc.field[Const.gDDF_ABTSENDER])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gSenderID, Const.gDDF_SENDER, checkValueForJpl(originalDoc.field[Const.gDDF_SENDER])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gLieferantNrID, Const.gDDF_LNR, checkValueForJpl(originalDoc.field[Const.gDDF_LNR])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gLieferantNaID, Const.gDDF_LNAME, checkValueForJpl(originalDoc.field[Const.gDDF_LNAME])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gKundenkontaktIDID, Const.gDDF_KONTAKTNUMMER, checkValueForJpl(originalDoc.field[Const.gDDF_KONTAKTNUMMER])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gAdittitleID, Const.gDDF_ADITTITLE, checkValueForJpl(originalDoc.field[Const.gDDF_ADITTITLE])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gKundennrID, Const.gDDF_KNR, checkValueForJpl(originalDoc.field[Const.gDDF_KNR])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gKundennameID, Const.gDDF_KNAME, checkValueForJpl(originalDoc.field[Const.gDDF_KNAME])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gBuchungskreisID, Const.gDDF_BUCHKREIS, checkValueForJpl(originalDoc.field[Const.gDDF_BUCHKREIS])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gOpportunityNrID, Const.gDDF_OPPNUMMER, checkValueForJpl(originalDoc.field[Const.gDDF_OPPNUMMER])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gKommunikationsrichtID, Const.gDDF_KOMMRICHTUNG, checkValueForJpl(originalDoc.field[Const.gDDF_KOMMRICHTUNG])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gJahrID, Const.gDDF_JAHR, checkValueForJpl(originalDoc.field[Const.gDDF_JAHR])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gMonatID, Const.gDDF_MONAT, checkValueForJpl(originalDoc.field[Const.gDDF_MONAT])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gVerkaufsphaseID, Const.gDDF_VKPHASE, checkValueForJpl(originalDoc.field[Const.gDDF_VKPHASE])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gHauptOpportunityID, Const.gDDF_HAUPTOPP, checkValueForJpl(originalDoc.field[Const.gDDF_HAUPTOPP])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gSubmissionID, Const.gDDF_SUBMISSION, checkValueForJpl(originalDoc.field[Const.gDDF_SUBMISSION])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gAbteilungOrgID, Const.gDFF_ABTEILUNG, checkValueForJpl(originalDoc.field[Const.gDFF_ABTEILUNG])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gAngebotsnameID, Const.gDDF_ANNAME, checkValueForJpl(originalDoc.field[Const.gDDF_ANNAME])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gErgebnisDokID, Const.gDDF_ERGEBNISDOK, checkValueForJpl(originalDoc.field[Const.gDDF_ERGEBNISDOK])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gKundenkontaktKategorieID, Const.gDDF_KDAKTKAT, checkValueForJpl(originalDoc.field[Const.gDDF_KDAKTKAT])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gSalesgroupID, Const.gDDF_SALESGROUP, checkValueForJpl(originalDoc.field[Const.gDDF_SALESGROUP])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gArcdocidID, Const.gDDF_ARCDOCID, checkValueForJpl(originalDoc.field[Const.gDDF_ARCDOCID])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gDokgroupID, Const.gDDF_DOKGRP, checkValueForJpl(originalDoc.field[Const.gDDF_DOKGRP])); + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gOppannrID, Const.gDDF_OPPANNr, checkValueForJpl(originalDoc.field[Const.gDDF_OPPANNr])); + + String originalDocType = originalDoc.getType().id(); + if( originalDocType != null ) { + if( originalDocType.equals(Const.gDTS_DKOMM) ) { + appendJplIfAttribExists(d3, doc, copyDoc.getType(), lPathJPL, SystemSpecificConst.gDokgroupID, Const.gDDF_DOKGROUP, Const.gDG_Kommunikation); + } + } + + // Stichinformation für den hostimport - daher als letztes importieren + File lPathAction = new File("F:\\d3\\Hostimport\\CopyDMEOP\\" + docName + "_" + dateString + "." + "action") + lPathAction.append("import_file_ext = \"" + docExt + "\"" + System.lineSeparator()) + + } else { + d3.log.error("Das Dokument ${doc.id()} konnte nicht erfolgreich kopiert werden!") + } + } else { + d3.log.error("Das Dokument ${doc.id()} konnte nicht erfolgreich kopiert werden!") + } + } catch(Exception e) { + d3.log.error("Error Functions copyResultDocs " + doc.id() + " = " + e); + } + } + } + } + + d3.log.info("copyResultDocs beendet"); + } + + /** + * Hilfemethode um die Anzahl der gefüllten Mehrfachfelder zu ermmitteln + * @author allgemeine Hilfsfunktion + * @return Anzahl gefüllter Mehrfachfelder + */ + public static int countArrayElements(D3Interface d3, Document doc, int field) { + d3.log.info("Start Functions countArrayElements"); + + int counter = 0; + for(int i=1; i<=Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[field][i] != null) { + counter = counter + 1; + } + } + return counter; + } + + /** + * Löscht eine temporäre Datei zum koprieren von Dokumenten + * @author allgemeine Hilfsfunktion + * @return true=erfolgreich gelöscht; false=nicht gelöscht + */ + public static boolean deleteClonedDocumentTemp(D3Interface d3, String fileDestination) { + d3.log.info("Start Functions deleteClonedDocumentTemp"); + + File dest = new File(fileDestination) + try { + dest.delete() + return true + } catch(Exception e) { + return false + } + } + + /** + * Hinzuvalidierung aller notwendigen Werte für Hauptvorgangsakte + * @author Unterstützende Prozesse + * @see InsertEntry, UpdateAttribEntry + */ + public static void entryFunctionMainfolder(D3Interface d3, Document doc, User pUser, int pX) { + d3.log.info("Start Functions entryFunctionMainfolder"); + + def lNum + def lRetVal + + if( doc.field[Const.gDDF_VOROWNER].equals("") || doc.field[Const.gDDF_VOROWNER] == null) { + doc.field[Const.gDDF_VOROWNER] = pUser.id + } + + if( doc.field[Const.gDDF_VORGANGSSTATUS].equals("") || doc.field[Const.gDDF_VORGANGSSTATUS] == null) { + doc.field[Const.gDDF_VORGANGSSTATUS] = "offen" + } + + if( doc.field[Const.gDDF_BUCHKREIS68][1].equals("") || doc.field[Const.gDDF_BUCHKREIS68][1] == null ) { + doc.field[Const.gDDF_BUCHKREIS68][1] = pUser.getOptField(2) + } + + if( (doc.field[Const.gDDF_ORDNUNG].equals("") || doc.field[Const.gDDF_ORDNUNG] == null) || pX == 1 ) { + def sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AHAUP}' and dok_dat_feld_${Const.gDDF_PROZESS} = '${doc.field[Const.gDDF_PROZESS]}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + lNum = sqlResult.size() + lNum = lNum + 1 + String comlNum = fillNullValues(lNum, 5); + doc.field[Const.gDDF_ORDNUNG] = comlNum; + } + + if( !doc.field[Const.gDDF_HAUPTVOBEZ].equals("") && doc.field[Const.gDDF_HAUPTVOBEZ] != null ) { + lRetVal = doc.field[Const.gDDF_HAUPTVOBEZ].indexOf("|") + if (lRetVal > 0) { + lRetVal = doc.field[Const.gDDF_HAUPTVOBEZ].replace("|", "I") + doc.field[Const.gDDF_HAUPTVOBEZ] = lRetVal + } + } + + for(int i=1; i<= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_TEILVOBEZGEN][i] != null) { + lRetVal = doc.field[Const.gDDF_TEILVOBEZGEN][i].indexOf("|") + if (lRetVal > 0) { + lRetVal = doc.field[Const.gDDF_TEILVOBEZGEN][i].replace("|", "I") + doc.field[Const.gDDF_TEILVOBEZGEN][i] = lRetVal + } + } + } + + if(pX == 1) { + //Für den Fall, dass AHAUP unter AHAUP angelegt wird + doc.field[Const.gDDF_VOROWNER] = pUser.id; + doc.field[Const.gDDF_HAUPTVONR] = ""; + for( int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + doc.field[Const.gDDF_TEILVONRM][i] = ""; + } + } + + } + + /** + * Neue ECR: Ermittlung ECR Aktivitäts_ID für diese Projekt_Nr ermitteln + * @author + * @see InsertEntry + * @return keine Rückgabe; im Hintergrund wird das Feld Const.gDDF_AKTIVITAETSID gefüllt + */ + public static void fillActivityId( D3Interface d3, Document doc) { + d3.log.info("Start Functions fillActivityId"); + + def lUECRNrMax + def lUECRNr + + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + Date date = new Date(); + String todayAsString = dateFormat.format(date); + + def sqlStatement = "SELECT max(SUBSTRING(dok_dat_feld_${Const.gDDF_AKTIVITAETSID},11,4)) as lUECRNrMax " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_AKTIVITAETSID} like 'Neuer ECR %' " + + "AND kue_dokuart = '${Const.gDTS_AMECR}' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size() > 0) { + def stringResult = sqlResult.getAt(0).get("lUECRNrMax") + if(stringResult != null) { + lUECRNrMax = Integer.valueOf(stringResult.trim()) + } + } + + if( lUECRNrMax != null ) { + lUECRNrMax = lUECRNrMax + 1 + + // call api_function( "string_fill_leading_char", lUECRNrMax, "0", 4 ) + // TODO Prüfung notwendig, ob die führenden Nullen hinzugefügt werden + lUECRNrMax = String.format ("%04d", lUECRNrMax); + + lUECRNr = "Neuer ECR " + lUECRNrMax + " " + todayAsString; + } else { + lUECRNr = "Neuer ECR 0001 ${todayAsString}" + } + + doc.field[Const.gDDF_AKTIVITAETSID] = lUECRNr.toString(); + } + + /** + * Hilfsmethode um einen Zahlenwert mit führenden Nullen aufzufüllen + * @author allgemeine Hilfsfunktion + * @return String mit führenden Nullen gemäß Definition + */ + public static String fillNullValues(int value, int len) { + String result = String.valueOf(value); + while (result.length() < len) { + result = "0" + result; + } + return result; + } + + + public static void inheritAkontAttributes( D3Interface d3, Document doc, Document gOldDoc, User user ) { + d3.log.info("Start Functions inheritAkontAttributes"); + + // Prüfung der Änderungen an der Akte (ddfValueChanged enhält alle DDF mit ; getrennt) + String ddfValueChanged = null; + boolean updateNeeded = false; + + // Kundenkontakt Kategorie + boolean kdkontaktkChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KDAKTKAT); + if(kdkontaktkChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KDAKTKAT); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KDAKTKAT); + } + } + + // Kundenkontakt + boolean kdkontaktChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KDAKTNAME); + if(kdkontaktChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KDAKTNAME); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KDAKTNAME); + } + } + + // Kundenkontakt Datum + boolean kdkontaktdateChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KONTAKTDATE); + if(kdkontaktdateChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KONTAKTDATE); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KONTAKTDATE); + } + } + + // Kundennummer + boolean knrChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNR); + if(knrChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KNR); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KNR); + } + } + + // Prozess + boolean processChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_PROZESS); + if(processChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_PROZESS); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_PROZESS); + } + } + + // Verkäufergruppe + boolean salesgChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SALESGROUP); + if(salesgChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_SALESGROUP); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_SALESGROUP); + } + } + + // Buchungskreis Einfachfeld + boolean buchungskeChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS); + if(buchungskeChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_BUCHKREIS); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_BUCHKREIS); + } + } + + // Opportunity Nummer + boolean oppChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_OPPNUMMER); + if(oppChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_OPPNUMMER); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_OPPNUMMER); + } + } + + // Auftragsnummer / Projektnummer + boolean auftnrChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_AUFTRNR); + if(auftnrChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_AUFTRNR); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_AUFTRNR); + } + } + + // Kundenkontakt_ID + boolean kdkidChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KONTAKTNUMMER); + if(kdkidChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KONTAKTNUMMER); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KONTAKTNUMMER); + } + } + + // Buchungskreis Mehrfachfeld + boolean buchungskChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS68); + if(buchungskChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_BUCHKREIS68); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_BUCHKREIS68); + } + } + if(ddfValueChanged != null) { + updateNeeded = true; + } + + if(updateNeeded == true) { + // Zur Aktualisierung der Dokumente -> Akte markieren für die Verarbeitung im Skript CheckMassDataChanged! + try { + // 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-AKONT', 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-AKONT', ${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 eines neuen Angebotsnamens auf alle darunterliegenden Dokumente und Akten + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund wird der Angebotsname vererbt + */ + public static void inheritANNameNew( D3Interface d3, Document doc, User user ) { + d3.log.info("Start Functions inheritANNameNew"); + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritANNameNew Verarbeitung JPL Asynchron"); + + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritANNameNew", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", doc.field[Const.gDDF_ANNAME], 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 { + + + List lChild1 = d3.call.link_get_children(doc.id(), "d3groovy"); + //d3.log.info("Functions inheritANNameNew Verarbeitung Asynchron"); + //Map attribUpdate = new HashMap<>(); + //attribUpdate.put(Const.gDDF_ANNAME, doc.field[Const.gDDF_ANNAME]); + //createAsyncJobForUpdates(d3, doc, lChild1, attribUpdate, "inheritANNameNew"); + + + for( int i = 0; i < lChild1.size(); i++) { + // Durchlauf aller Angebotsversionen (synchron notwendig, da es sonst Fehler im Async Job der Kinddokumente gab) + Document docFolder = d3.archive.getDocument(lChild1[i]); + if(docFolder != null) { + docFolder.field[Const.gDDF_ANNAME] = doc.field[Const.gDDF_ANNAME]; + try { + docFolder.updateAttributes(SystemSpecificConst.updatedUser, true); + } catch(Exception e) { + d3.log.error("Functions inheritANNameNew - Akte ${lChild1[i]} konnte nicht aktualisiert werden"); + } + } + } + + for( int i = 0; i < lChild1.size(); i++) { + // Durchlauf für die Angebotsdokumente + List lChild2 = d3.call.link_get_children(lChild1[i], "d3groovy") + if(lChild2 != null && lChild2.size() > 0) { + Map attribUpdate2 = new HashMap<>(); + attribUpdate2.put(Const.gDDF_ANNAME, doc.field[Const.gDDF_ANNAME]); + // Ermittlung der Angebotsnummer, da ansonsten das Update schief läuft + String sqlStatement = "SELECT f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AREGI}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_ANNAME} = '${doc.field[Const.gDDF_ANNAME]}' " + + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' "; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size() == 1) { + String angebotsNrTemp = sqlResult.getAt(0).get("val"); + if(angebotsNrTemp != null && !angebotsNrTemp.equals("")) { + attribUpdate2.put(Const.gDDF_OPPANNr, angebotsNrTemp); + } + } + createAsyncJobForUpdates(d3, doc, lChild2, attribUpdate2, "inheritANNameNew"); + } + } + } + } + + /** + * Veerbung der Eigenschaften für Lieferantenaktivitätsdokumente + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Eigenschaften vererbt + */ + public static int inheritLiefAttrib(D3Interface d3, Document doc, DocumentType docType, String userName, Document docBeforeUpdate) { + d3.log.info("Start Functions inheritLiefAttrib"); + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritLiefAttrib Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritLiefAttrib", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", docBeforeUpdate.field[Const.gDDF_LNR], 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", docBeforeUpdate.field[Const.gDDF_LIEFAKTKAT], 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", docBeforeUpdate.field[Const.gDDF_KONTAKTDATE], 0); + d3.call.d3async_job_set_attribute("custom_job_par[5]", docBeforeUpdate.field[Const.gDDF_KONTAKTBESCH], 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 inheritLiefAttrib Verarbeitung Asynchron"); + def sqlStatement = "SELECT doku_id as dokuId " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_DLONT}' " + + "AND dok_dat_feld_${Const.gDDF_LNR} = '${docBeforeUpdate.field[Const.gDDF_LNR]}' " + + "AND dok_dat_feld_${Const.gDDF_LIEFAKTKAT} = '${docBeforeUpdate.field[Const.gDDF_LIEFAKTKAT]}' " + + "AND dok_dat_feld_${Const.gDDF_KONTAKTDATE} = '${docBeforeUpdate.field[Const.gDDF_KONTAKTDATE]}' " + + "AND dok_dat_feld_${Const.gDDF_KONTAKTBESCH} = '${docBeforeUpdate.field[Const.gDDF_KONTAKTBESCH]}' "; + List result = d3.sql.executeAndGet(sqlStatement); + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_LNR, doc.field[Const.gDDF_LNR]); + attribUpdate.put(Const.gDDF_LIEFAKTKAT, doc.field[Const.gDDF_LIEFAKTKAT]); + attribUpdate.put(Const.gDDF_KONTAKTDATE, doc.field[Const.gDDF_KONTAKTDATE]); + attribUpdate.put(Const.gDDF_KONTAKTBESCH, doc.field[Const.gDDF_KONTAKTBESCH]); + List docIds = new ArrayList<>(); + for( GroovyRowResult grr : result ) { + docIds.add(grr.get("dokuId")); + } + createAsyncJobForUpdates(d3, docBeforeUpdate, docIds, attribUpdate, "inheritLiefAttrib"); + } + + return 0 + } + + /** + * Vererbung von Eigenschaften + * @author Maschinenprojekt + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Eigenschaften vererbt + */ + public static void inheritMProjAttributes( D3Interface d3, Document doc, Document gOldDoc, User user ) { + d3.log.info("Start Functions inheritMProjAttributes - Document ${doc.id}"); + + // Prüfung der Änderungen an der Akte (ddfValueChanged enhält alle DDF mit ; getrennt) + String ddfValueChanged = null; + boolean updateNeeded = false; + boolean knameChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNAME); + if(knameChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KNAME); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KNAME); + } + } + boolean knrChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNR); + if(knrChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KNR); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KNR); + } + } + boolean statusChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_STATUS); + if(statusChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_STATUS); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_STATUS); + } + } + boolean submChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SUBMISSION); + if(submChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_SUBMISSION); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_SUBMISSION); + } + } + boolean salesgChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SALESGROUP); + if(salesgChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_SALESGROUP); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_SALESGROUP); + } + } + boolean buchungskChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS68); + if(buchungskChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_BUCHKREIS68); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_BUCHKREIS68); + } + } + if(ddfValueChanged != null) { + updateNeeded = true; + } + + d3.log.info("Process Functions inheritMProjAttributes - Document ${doc.id} - updateNeeded ${updateNeeded} "); + + if(updateNeeded == true) { + // Vererbung auf die Akten soll synchron erfolgen, auf den Dokumenten ist asynchron erlaubt! + // Für die Aktualisierung der Dokumente gibt es ein seperates Skript! + def sqlStatementFolder = + """SELECT doku_id as dokuId FROM firmen_spezifisch WHERE kue_dokuart IN + ('${Const.gDTS_AKONT}', '${Const.gDTS_ALIKO}', '${Const.gDTS_AKOMM}', '${Const.gDTS_AKUKO}', + '${Const.gDTS_ALIEK}', '${Const.gDTS_APROR}', '${Const.gDTS_AMAUF}', '${Const.gDTS_AMPRO}', '${Const.gDTS_AMAKT}', '${Const.gDTS_AMNAC}', + '${Const.gDTS_AMSPE}', '${Const.gDTS_AMUPO}', '${Const.gDTS_AMCRA}', '${Const.gDTS_AMECR}', '${Const.gDTS_AMUSP}', '${Const.gDTS_AMEOP}') + AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' + ORDER BY kue_dokuart """; + List sqlResultFolder = d3.sql.executeAndGet(sqlStatementFolder); + + if(sqlResultFolder != null) { + + d3.log.info("Functions inheritMProjAttributes Anzahl Unterakten: " + sqlResultFolder.size()); + + for(GroovyRowResult grr : sqlResultFolder) { + String currDocId = grr.get("dokuId"); + if(currDocId != null && !currDocId.equals("")) { + Document docTemp = d3.archive.getDocument(currDocId); + if(docTemp != null) { + if(knameChanged == true) { + docTemp.field[Const.gDDF_KNAME] = doc.field[Const.gDDF_KNAME]; + } + if(knrChanged == true) { + docTemp.field[Const.gDDF_KNR] = doc.field[Const.gDDF_KNR]; + } + if(statusChanged == true) { + docTemp.field[Const.gDDF_STATUS] = doc.field[Const.gDDF_STATUS]; + } + if(submChanged == true) { + docTemp.field[Const.gDDF_SUBMISSION] = doc.field[Const.gDDF_SUBMISSION]; + } + if(salesgChanged == true) { + docTemp.field[Const.gDDF_SALESGROUP] = doc.field[Const.gDDF_SALESGROUP]; + } + if(buchungskChanged == true) { + for(int hCount60=1; hCount60 <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); hCount60++) { + docTemp.field[Const.gDDF_BUCHKREIS68][hCount60] = doc.field[Const.gDDF_BUCHKREIS68][hCount60]; + } + } + d3.log.info("Functions inheritMProjAttributes Doc ${docTemp.id()} Synchron - Update: " + updateNeeded); + if(updateNeeded == true) { + try { + docTemp.updateAttributes(SystemSpecificConst.updatedUser, true); + } catch(Exception e) { + d3.log.error("Error Functions inheritMProjAttributes - Akte ${docTemp.id()} konnte nicht aktualisiert werden: " + e); + } + } + } + } + } + } else { + d3.log.info("Functions inheritMProjAttributes Anzahl Akten: " + sqlResultFolder); + } + + // Zur Aktualisierung der Dokumente -> Akte markieren für die Verarbeitung im JPL Skript check_massdata_changed_AMPRA! + try { + // 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-AMPRA', 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-AMPRA', ${indexCounter}, '${ddfValueChanged}') "; + int returnValue = d3.sql.execute(sqlStatementMdcInsert); + } + } catch(Exception e) { + d3.log.error("Error Functions inheritMProjAttributes - Akte ${doc.id()} konnte nicht in die Tabelle mass_data_change ergänzt werden: " + e); + } + } + + d3.log.info("End Functions inheritMProjAttributes"); + } + + /** + * Vererbung der Angebotsnummer bei Änderung auf die zugehörigen Dokumente + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund wird die Angebotsnummer vererbt + */ + public static void inheritOfferNo( D3Interface d3, Document doc, Document docOld, List gAREGIChild, User user ) { + d3.log.info("Start Functions inheritOfferNo for docId = " + doc.id()); + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritOfferNo Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritOfferNo", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", doc.field[Const.gDDF_ANNAME], 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 inheritOfferNo Verarbeitung Asynchron"); + + def lOffNoNew = doc.field[Const.gDDF_OPPANNr] + def lOffNoNewShort = lOffNoNew.substring(0,4) + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_OPPANNr, lOffNoNew); + if( lOffNoNewShort.equals("Neue") || lOffNoNewShort.equals("9999") ) { + //mache nichts + } else { + attribUpdate.put(Const.gDDF_ADITTITLE, lOffNoNew); + } + createAsyncJobForUpdates(d3, doc, gAREGIChild, attribUpdate, "inheritOfferNo"); + + // 15.10.2021 Ermittlung der Vater-Akte über SQL Abfrage anstatt Link + // 18.11.2021 NEU: Kriterium hat Zeitstempel erhalten (siehe createOfferFolder + Transport NEU_Opportunity) + List parents = new ArrayList<>(); + String oldHauptOpp = docOld.field[Const.gDDF_HAUPTOPPANNR]; + + String sqlStatementFather = "SELECT doku_id FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AUNTE}' AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' AND dok_dat_feld_${Const.gDDF_HAUPTOPPANNR} = '${oldHauptOpp}'"; + List sqlResultFather = d3.sql.executeAndGet(sqlStatementFather); + if(sqlResultFather != null) { + for(GroovyRowResult grrFather : sqlResultFather) { + String fatherDocId = grrFather.get("doku_id"); + if(fatherDocId != null && !fatherDocId.equals("")) { + parents.add(fatherDocId); + } + } + } + + d3.log.info("Functions inheritOfferNo for docId fathers = " + parents); + + //Aktualisiere auch die Hauptangebotsnummer auf der Angebotsvorgangsakte + // Abfrage und Anpassung der "Väter" + //List parents = d3.call.link_get_parents(doc.id(), "d3groovy") + if( parents != null && parents.size() > 0 ) { + //Hole dir die bisherige Hauptangebotsnummer vom Angebotsvorgang.. + Document docTemp2 = d3.archive.getDocument(parents[0]) + def lOffNoOld = docTemp2.field[Const.gDDF_HAUPTOPPANNR] + String[] splittedString = lOffNoNew.split("\\.") + if(splittedString != null && splittedString.size() > 0) { + lOffNoNew = splittedString[0].trim() + //...Schneide die neue Nummer so, das nur die ersten vier Zeichen für eine Verprobung auf "Neue Angebotsversion" verbleiben + lOffNoNewShort = lOffNoNew.substring(0,4) + //... Wenn die Nummer sich nicht geändert hat, oder eine neue Angebotsversion erstellt wurde, ... + if( lOffNoOld.equals(lOffNoNew) || lOffNoNewShort.equals("Neue") ) { + //...mache nichts... + } else { + //...ansonsten setze die Angebotsnummer als Hauptangebotsnummer auf den Angebotsvorgang + Map attribUpdate2 = new HashMap<>(); + attribUpdate2.put(Const.gDDF_HAUPTOPPANNR, lOffNoNew); + createAsyncJobForUpdates(d3, doc, parents, attribUpdate2, "inheritOfferNo"); + } + } + } + } + } + + /** + * Vererbung der Attribute Submission und Hauptopportunity auf alles darunterliegenden Dokumente und Akten + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Eigenschaften vererbt + */ + public static void inheritOppAttr( D3Interface d3, Document doc, Document gOldDoc, User user ) { + d3.log.info("Start Functions inheritOppAttr"); + + // Prüfung der Änderungen an der Akte (ddfValueChanged enhält alle DDF mit ; getrennt) + String ddfValueChanged = null; + boolean updateNeeded = false; + boolean knameChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNAME); + if(knameChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KNAME); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KNAME); + } + } + boolean knrChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_KNR); + if(knrChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_KNR); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_KNR); + } + } + boolean statusChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_STATUS); + if(statusChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_STATUS); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_STATUS); + } + } + boolean submChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SUBMISSION); + if(submChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_SUBMISSION); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_SUBMISSION); + } + } + boolean salesgChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_SALESGROUP); + if(salesgChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_SALESGROUP); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_SALESGROUP); + } + } + boolean buchkChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS); + if(buchkChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_BUCHKREIS); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_BUCHKREIS); + } + } + boolean mainoppChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_HAUPTOPP); + if(mainoppChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_HAUPTOPP); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_HAUPTOPP); + } + } + boolean buchungskChanged = checkIfValueChanged(d3, doc, gOldDoc, Const.gDDF_BUCHKREIS68); + if(buchungskChanged == true) { + if(ddfValueChanged == null) { + ddfValueChanged = String.valueOf(Const.gDDF_BUCHKREIS68); + } else { + ddfValueChanged = ddfValueChanged + ";" + String.valueOf(Const.gDDF_BUCHKREIS68); + } + } + if(ddfValueChanged != null) { + updateNeeded = true; + } + + d3.log.info("Process Functions inheritOppAttr - Document ${doc.id} - updateNeeded ${updateNeeded} "); + + if(updateNeeded == true) { + + String sqlStatement = """SELECT doku_id as dokuId + FROM firmen_spezifisch WHERE kue_dokuart IN ( + '${Const.gDTS_AANGE}', '${Const.gDTS_AANGU}', '${Const.gDTS_AUNTE}', '${Const.gDTS_AREGI}', + '${Const.gDTS_AKOMM}', '${Const.gDTS_AKUKO}', '${Const.gDTS_AKONT}', '${Const.gDTS_ALIEK}', + '${Const.gDTS_ALIKO}', '${Const.gDTS_APROR}', + '${Const.gDTS_AMUPO}', '${Const.gDTS_AVERT}' ) + AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' """; + List sqlResultFolder = d3.sql.executeAndGet(sqlStatement); + + if(sqlResultFolder != null) { + d3.log.info("Functions inheritOppAttr Anzahl Akten: " + sqlResultFolder.size()); + + for(GroovyRowResult grr : sqlResultFolder) { + String currDocId = grr.get("dokuId"); + + if(currDocId != null && !currDocId.equals("")) { + + Document docTemp = d3.archive.getDocument(currDocId); + if(docTemp != null) { + if(knameChanged == true) { + docTemp.field[Const.gDDF_KNAME] = doc.field[Const.gDDF_KNAME]; + } + if(knrChanged == true) { + docTemp.field[Const.gDDF_KNR] = doc.field[Const.gDDF_KNR]; + } + if(statusChanged == true) { + docTemp.field[Const.gDDF_STATUS] = doc.field[Const.gDDF_STATUS]; + } + if(submChanged == true) { + docTemp.field[Const.gDDF_SUBMISSION] = doc.field[Const.gDDF_SUBMISSION]; + } + if(salesgChanged == true) { + docTemp.field[Const.gDDF_SALESGROUP] = doc.field[Const.gDDF_SALESGROUP]; + } + if(buchkChanged == true) { + docTemp.field[Const.gDDF_BUCHKREIS] = doc.field[Const.gDDF_BUCHKREIS]; + } + if(mainoppChanged == true) { + docTemp.field[Const.gDDF_HAUPTOPP] = doc.field[Const.gDDF_HAUPTOPP]; + } + if(buchungskChanged == true) { + for(int hCount60=1; hCount60 <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); hCount60++) { + docTemp.field[Const.gDDF_BUCHKREIS68][hCount60] = doc.field[Const.gDDF_BUCHKREIS68][hCount60]; + } + } + d3.log.info("Functions inheritOppAttributes Doc ${docTemp.id()} Synchron - Update: " + updateNeeded); + if(updateNeeded == true) { + try { + docTemp.updateAttributes(SystemSpecificConst.updatedUser, true); + } catch(Exception e) { + d3.log.error("Error Functions inheritOppAttributes - Akte ${docTemp.id()} konnte nicht aktualisiert werden: " + e); + } + } + } + } + } + } else { + d3.log.info("Functions inheritOppAttributes Anzahl Akten: " + sqlResultFolder); + } + + // Zur Aktualisierung der Dokumente -> Akte markieren für die Verarbeitung im JPL Skript check_massdata_changed_AOPPU! + try { + // 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-AOPPU', 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-AOPPU', ${indexCounter}, '${ddfValueChanged}') "; + int returnValue = d3.sql.execute(sqlStatementMdcInsert); + } + } catch(Exception e) { + d3.log.error("Error Functions inheritMProjAttributes - Akte ${doc.id()} konnte nicht in die Tabelle mass_data_change ergänzt werden: " + e); + } + + } + d3.log.info("inheritOppAttr beendet"); + } + + /* 04.11.2019 Funktion wird bereits durch inheritOppAttr abgedeckt + public static inheritOPPValues( D3Interface d3, def childId, def fatherId ) { + Document docFather = d3.archive.getDocument(fatherId) + Document docChild = d3.archive.getDocument(childId) + def lOpportunity // gDDF_OPPNUMMER + def lHauptopportunity // gDDF_HAUPTOPP gDDF_OPPNUMMER + def lVerkaeufergruppe // gDDF_SALESGROUP + def lStatus // gDDF_STATUS + def lzustVerkaeufer // gDDF_RESPSALESMAN + String[] lIntercompany // gDDF_BUCHKREIS68 + def lSubmission // gDDF_SUBMISSION + def lProzess // gDDF_PROZESSART + def lKundenNr // gDDF_KNR + def lKundenName // gDDF_KNAME + def lBuchungskreis // gDDF_BUCHKREIS + def lReturn + lOpportunity = docFather.field[Const.gDDF_OPPNUMMER] // gDDF_HAUPTOPP + lHauptopportunity = docFather.field[Const.gDDF_HAUPTOPP] // gDDF_HAUPTOPP + lVerkaeufergruppe = docFather.field[Const.gDDF_SALESGROUP] // gDDF_SALESGROUP + lStatus = docFather.field[Const.gDDF_STATUS] // gDDF_STATUS + lzustVerkaeufer = docFather.field[Const.gDDF_RESPSALESMAN] // gDDF_RESPSALESMAN + lSubmission = docFather.field[Const.gDDF_SUBMISSION] // gDDF_SUBMISSION + lProzess = docFather.field[Const.gDDF_PROZESS] // gDDF_PROZESSART + lKundenNr = docFather.field[Const.gDDF_KNR] // gDDF_KNR + lKundenName = docFather.field[Const.gDDF_KNAME] // gDDF_KNAME + lBuchungskreis = docFather.field[Const.gDDF_BUCHKREIS] // gDDF_BUCHKREIS + for(int lCount=1; lCount <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); lCount++) { + lIntercompany[lCount] = docFather.field[Const.gDDF_BUCHKREIS68][lCount] + docChild.field[Const.gDDF_BUCHKREIS68][lCount] = lIntercompany[lCount] + if( !lIntercompany[lCount].equals("") ) { + // d3.log.error( "lIntercompany[${lCount}]: ${lIntercompany[lCount]}" ) + } + } + docChild.field[Const.gDDF_OPPNUMMER] = lOpportunity + docChild.field[Const.gDDF_HAUPTOPP] = lHauptopportunity + docChild.field[Const.gDDF_SALESGROUP] = lVerkaeufergruppe + docChild.field[Const.gDDF_STATUS] = lStatus + docChild.field[Const.gDDF_RESPSALESMAN] = lzustVerkaeufer + docChild.field[Const.gDDF_SUBMISSION] = lSubmission + docChild.field[Const.gDDF_PROZESS] = lProzess + docChild.field[Const.gDDF_KNR] = lKundenNr + docChild.field[Const.gDDF_KNAME] = lKundenName + docChild.field[Const.gDDF_BUCHKREIS] = lBuchungskreis + try { + docChild.updateAttributes("d3groovy", true) + // d3.log.error( "Erfolgreich Dokument ${childId} ") + } 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( "Die Attribute der neuen Opportunity konnten nicht in das Dokument ${childId} geschrieben werden!") + } + // in JPL waren die Parameter alle geleert, daher immer default verwenden + d3.call.document_send_to_dsearch( childId, "", 0, "", false, "Fr", 0, "d3groovy") + } + */ + + /** + * + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Attribute vererbt + */ + public static void inheritOrgProjAttributes( D3Interface d3, Document doc, Document gOldDoc, User user, String projNo ) { + d3.log.info("Start Functions inheritOrgProjAttributes"); + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritOrgProjAttributes Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritOrgProj", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", projNo, 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 inheritOrgProjAttributes Verarbeitung Asynchron"); + def sqlStatement = "SELECT doku_id as DokuId FROM firmen_spezifisch WHERE (kue_dokuart = '${Const.gDTS_AMEIS}' OR kue_dokuart = '${Const.gDTS_DPROO}') AND dok_dat_feld_${Const.gDDF_PROJNR} = '${projNo}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + docIds.add(grr.get("DokuId")); + } + Map attribUpdate = new HashMap<>(); + def lProjNr = doc.field[Const.gDDF_PROJNR].substring(0,11) + attribUpdate.put(Const.gDDF_HAUPTPROJEKT, lProjNr); + attribUpdate.put(Const.gDDF_PROJNR, doc.field[Const.gDDF_PROJNR]); + attribUpdate.put(Const.gDDF_PROJTITLE, doc.field[Const.gDDF_PROJTITLE]); + attribUpdate.put(Const.gDDF_PROJLEITER, doc.field[Const.gDDF_PROJLEITER]); + attribUpdate.put(Const.gDDF_ORGPROJVERT, doc.field[Const.gDDF_ORGPROJVERT]); + attribUpdate.put(Const.gDDF_PROJVERKN, doc.field[Const.gDDF_PROJVERKN]); + attribUpdate.put(Const.gDDF_HAUPTPROJEKT, doc.field[Const.gDDF_HAUPTPROJEKT]); + List listBuchungskreise = new ArrayList<>(); + List listProjber = new ArrayList<>(); + for(int hCount60=1; hCount60 <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); hCount60++) { + listBuchungskreise.add(doc.field[Const.gDDF_BUCHKREIS68][hCount60]); + listProjber.add(doc.field[Const.gDDF_PROJBER][hCount60]); + } + attribUpdate.put(Const.gDDF_BUCHKREIS68, listBuchungskreise); + attribUpdate.put(Const.gDDF_PROJBER, listProjber); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritOrgProjAttributes"); + + } + } + + /** + * Vererbung von Eigenschaften für Teamsitzungsdokumente + * @author unterstützende Prozesse + * @see InsertExit + * @return keine Rückgabe; im Hintergrund werden Attribute vererbt + */ + public static void inheritTeamdoc( D3Interface d3, Document doc, def pUser) { + d3.log.info("Start Functions inheritTeamdoc"); + + def lCnt + def lDocID + def lAccess + def lCase = doc.field[Const.gDDF_EVENT] + + def sqlStatement = "SELECT doku_id as lDocID FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AREME}' AND dok_dat_feld_${Const.gDDF_EVENT} = '${lCase}'" + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + lCnt = sqlResult.size() + + if (lCnt == 1) { + lDocID = sqlResult.getAt(0).get("lDocID") + Document docTemp = d3.archive.getDocument(lDocID, pUser); + + // Achtung: Hier handelt es sich jeweils um 60er Felder + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + doc.field[Const.gDDF_D3USER67][i] = docTemp.field[Const.gDDF_D3USER67][i] + doc.field[Const.gDDF_BUCHKREIS68][i] = docTemp.field[Const.gDDF_BUCHKREIS68][i] + doc.field[Const.gDDF_HAUPTFUNKTION][i] = docTemp.field[Const.gDDF_HAUPTFUNKTION][i] + } + + doc.field[Const.gDDF_VORGANGSSTATUS] = docTemp.field[Const.gDDF_VORGANGSSTATUS] + doc.field[Const.gDDF_CASEOWNER] = docTemp.field[Const.gDDF_CASEOWNER] + doc.field[Const.gDDF_ZUGRIFF] = docTemp.field[Const.gDDF_ZUGRIFF] + 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 { + d3.log.error("###-> Teamsitzungsakte nicht eindeutig erkannt") + } + } + + } + + /** + * Vererbung der Verkaufsphase auf die Dokumente einer Opportunity beim Import + * @author Opportunity + * @see InsertEntry + * @return keine Rückgabe; im Hintergrund werden Attribute vererbt + */ + public static void inheritSalesProcess( D3Interface d3, Document doc ) { + d3.log.info("Start Functions inheritSalesProcess"); + + def lOppNr = doc.field[Const.gDDF_OPPNUMMER] + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_VKPHASE} as lSalesProc " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNr}' " + + "AND kue_dokuart = '${Const.gDTS_AOPPU}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size()> 0) { + def lSalesProc = sqlResult.getAt(0).get("lSalesProc") + doc.field[Const.gDDF_VKPHASE] = lSalesProc + } + } + + + /** + * Vererbung relevanter Eigenschaften für den Service + * @author Service + * @see UpdateExit + * @return keine Rückgabe; im Hintergrund werden Attribute vererbt + */ + public static void inheritServiceAttributes( D3Interface d3, Document doc, Document oldDoc, DocumentType docType, User user ) { + d3.log.info("Start Functions inheritServiceAttributes"); + + if( checkIfValueChanged(d3, doc, oldDoc, Const.gDDF_KNR) == true ) { + + // Kundennr wurde über SAP geändert + if(!doc.field[Const.gDDF_KNR].equals(oldDoc.field[Const.gDDF_KNR])) { + + // Der Kundename muss über die Kundenakte ermittelt werden + String sqlStatementCustomerName = "SELECT dok_dat_feld_${Const.gDDF_KNAME} as custName FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AKUND}' AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}'"; + List sqlResultCustomerName = d3.sql.executeAndGet(sqlStatementCustomerName); + if(sqlResultCustomerName != null && sqlResultCustomerName.size() > 0) { + // Kundenname ist über die Kundennummer immer eindeutig + doc.field[Const.gDDF_KNAME] = sqlResultCustomerName.getAt(0).get("custName"); + } + + // Ermittlung aller Kinder zur Serviceakte + if(docType.getId().equals(Const.gDTS_ASEBE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_KNR Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServKunden", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSEBE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_BELEGNUMMER), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_BELEGNUMMER], 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 inheritServiceAttributes gDDF_KNR Verarbeitung Asynchron"); + // anhand Belegnummer + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSEBE}' AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_KNAME, doc.field[Const.gDDF_KNAME]); + attribUpdate.put(Const.gDDF_KNR, doc.field[Const.gDDF_KNR]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + + } else if(docType.getId().equals(Const.gDTS_ASERE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_KNR Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServKunden", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSERE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_SRID), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_SRID], 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 inheritServiceAttributes gDDF_KNR Verarbeitung Asynchron"); + // anhand SR_ID + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSERE}' AND dok_dat_feld_${Const.gDDF_SRID} = '${doc.field[Const.gDDF_SRID]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_KNAME, doc.field[Const.gDDF_KNAME]); + attribUpdate.put(Const.gDDF_KNR, doc.field[Const.gDDF_KNR]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + + } else if(docType.getId().equals(Const.gDTS_AEQUI)) { + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_KNR Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServKunden", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DEQUI, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_EQUIPMENT), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_EQUIPMENT], 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 inheritServiceAttributes gDDF_KNR Verarbeitung Asynchron"); + // anhand Equipent No + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${doc.field[Const.gDDF_EQUIPMENT]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_KNAME, doc.field[Const.gDDF_KNAME]); + attribUpdate.put(Const.gDDF_KNR, doc.field[Const.gDDF_KNR]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + } + } + } + + if( checkIfValueChanged(d3, doc, oldDoc, Const.gDDF_PROZESS) == true ) { + + // Prozess wurde über SAP geändert + if(!doc.field[Const.gDDF_PROZESS].equals(oldDoc.field[Const.gDDF_PROZESS])) { + + // Ermittlung aller Kinder zur Serviceakte + if(docType.getId().equals(Const.gDTS_ASEBE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_PROZESS Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServProzess", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSEBE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_BELEGNUMMER), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_BELEGNUMMER], 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 inheritServiceAttributes gDDF_PROZESS Verarbeitung Asynchron"); + // anhand Belegnummer + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSEBE}' AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_PROZESS, doc.field[Const.gDDF_PROZESS]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + + } + + } else if(docType.getId().equals(Const.gDTS_ASERE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_PROZESS Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServProzess", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSERE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_SRID), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_SRID], 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 inheritServiceAttributes gDDF_PROZESS Verarbeitung Asynchron"); + // anhand SR_ID + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSERE}' AND dok_dat_feld_${Const.gDDF_SRID} = '${doc.field[Const.gDDF_SRID]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_PROZESS, doc.field[Const.gDDF_PROZESS]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + + } + + } else if(docType.getId().equals(Const.gDTS_AEQUI)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_PROZESS Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServProzess", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DEQUI, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_EQUIPMENT), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_EQUIPMENT], 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 inheritServiceAttributes gDDF_PROZESS Verarbeitung Asynchron"); + // anhand Equipment No + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${doc.field[Const.gDDF_EQUIPMENT]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_PROZESS, doc.field[Const.gDDF_PROZESS]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + + } + } + } + + // Vererbung der Submission gemäß E-Mail vom 05.08.2020 + if( checkIfValueChanged(d3, doc, oldDoc, Const.gDDF_SUBMISSION) == true ) { + + if( docType.getId().equals(Const.gDTS_ASEBE) ) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_SUBMISSION Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServSubmission", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSEBE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_BELEGNUMMER), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_BELEGNUMMER], 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 inheritServiceAttributes gDDF_SUBMISSION Verarbeitung Asynchron"); + // Ermittlung aller Kinder zur Serviceakte anhand Belegnummer + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSEBE}' AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_SUBMISSION, doc.field[Const.gDDF_SUBMISSION]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + + } else if(docType.getId().equals(Const.gDTS_AEQUI)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_SUBMISSION Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServSubmission", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DEQUI, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_EQUIPMENT), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_EQUIPMENT], 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 inheritServiceAttributes gDDF_SUBMISSION Verarbeitung Asynchron"); + // Ermittlung aller Kinder zur Equipmenteakte anhand Equipment No + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${doc.field[Const.gDDF_EQUIPMENT]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_SUBMISSION, doc.field[Const.gDDF_SUBMISSION]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + } + + } + + // Vererbung der Regionalorganisation gemäß E-Mail vom 05.08.2020 + if( checkIfValueChanged(d3, doc, oldDoc, Const.gDDF_REGIONALORG) == true ) { + + // Ermittlung aller Kinder zur Serviceakte + if(docType.getId().equals(Const.gDTS_ASEBE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_REGIONALORG Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServRegionalorg", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSEBE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_BELEGNUMMER), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_BELEGNUMMER], 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 inheritServiceAttributes gDDF_REGIONALORG Verarbeitung Asynchron"); + // anhand Belegnummer + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSEBE}' AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + List listRegionalorg = new ArrayList<>(); + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + listRegionalorg.add(doc.field[Const.gDDF_REGIONALORG][i]); + } + attribUpdate.put(Const.gDDF_REGIONALORG, listRegionalorg); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + + } + + } else if(docType.getId().equals(Const.gDTS_ASERE)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_REGIONALORG Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServRegionalorg", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DSERE, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_SRID), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_SRID], 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 inheritServiceAttributes gDDF_REGIONALORG Verarbeitung Asynchron"); + // anhand SR_ID + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DSERE}' AND dok_dat_feld_${Const.gDDF_SRID} = '${doc.field[Const.gDDF_SRID]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + List listRegionalorg = new ArrayList<>(); + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + listRegionalorg.add(doc.field[Const.gDDF_REGIONALORG][i]); + } + attribUpdate.put(Const.gDDF_REGIONALORG, listRegionalorg); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + + } else if(docType.getId().equals(Const.gDTS_AEQUI)) { + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritServiceAttributes gDDF_REGIONALORG Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritServRegionalorg", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", Const.gDTS_DEQUI, 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", String.valueOf(Const.gDDF_EQUIPMENT), 0); + d3.call.d3async_job_set_attribute("custom_job_par[4]", doc.field[Const.gDDF_EQUIPMENT], 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 inheritServiceAttributes gDDF_REGIONALORG Verarbeitung Asynchron"); + // anhand Equipment No + String sqlStatementChildren = "SELECT doku_id as dokId FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_DEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${doc.field[Const.gDDF_EQUIPMENT]}'"; + List sqlResultChildren = d3.sql.executeAndGet(sqlStatementChildren); + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResultChildren) { + docIds.add(grr.get("dokId")); + } + Map attribUpdate = new HashMap<>(); + List listRegionalorg = new ArrayList<>(); + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + listRegionalorg.add(doc.field[Const.gDDF_REGIONALORG][i]); + } + attribUpdate.put(Const.gDDF_REGIONALORG, listRegionalorg); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritServiceAttributes"); + } + } + } + } + + /** + * Vererbung eines neuen Kundenamens und der Nummer auf alle darunterliegenden Dokumente und Akten + * @author + * @see UpdateAttributExit + * @return keine Rückgabe; im Hintergrund werden Attribute vererbt + */ + public static void inheritKInfoNew(D3Interface d3, Document doc, User user) { + d3.log.info("Start Functions inheritKInfoNew"); + + if( SystemSpecificConst.workWithAsyncJplForMassDataUpdate == true ) { + d3.log.info("Functions inheritOppAttr Verarbeitung JPL Asynchron"); + try { + d3.call.d3async_job_open(doc.id(), "CUJ001", "d3groovy"); + d3.call.d3async_job_set_attribute("hook_function", "gyInheritKInfoNew", 0); + d3.call.d3async_job_set_attribute("custom_job_par[1]", doc.id(), 0); + d3.call.d3async_job_set_attribute("custom_job_par[2]", doc.field[Const.gDDF_KNAME], 0); + d3.call.d3async_job_set_attribute("custom_job_par[3]", doc.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 inheritOppAttr Verarbeitung Asynchron"); + def lDokIdOppCount + def lOppNr = doc.field[Const.gDDF_OPPNUMMER] + def lReturn + def sqlStatement = "SELECT doku_id as lDokIdOpp " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNr}' " + + "AND kue_dokuart <> '${Const.gDTS_AOPPU}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lDokIdOppCount = sqlResult.size() + List docIds = new ArrayList<>(); + for(GroovyRowResult grr : sqlResult) { + docIds.add(grr.get("lDokIdOpp")); + } + Map attribUpdate = new HashMap<>(); + attribUpdate.put(Const.gDDF_KNAME, doc.field[Const.gDDF_KNAME]); + attribUpdate.put(Const.gDDF_KNR, doc.field[Const.gDDF_KNR]); + createAsyncJobForUpdates(d3, doc, docIds, attribUpdate, "inheritKInfoNew"); + } + } + + /** + * Manuellen Job an den Rendition Server senden + * @author allgemeine Hilfsfunktion + * @see NewVersionExit + * @return Liefert numerisch zurück ob die Erstellung des RenderJobs erfolgreich war + */ + public static int renderDocument(D3Interface d3, Document doc) { + d3.log.info("Start Functions renderDocument"); + + String source = null; // Optional + String destination = null; // Optional + byte render_option = 2; // PDF Datei erzeugen + boolean ocr = false; // keine Verschlagwortung + boolean asynchronous = false; // obsolete + boolean replace_doc = false; // Render-Dokument ersetzt NICHT das Stammdokument + boolean overwrite = false; // Zieldatei soll NICHT ersetzt werden + String doc_id = doc.id(); // Dokument-ID zu dem ein abhängiges Dokument erzeugt werden soll + String user_name = null; // Benutzer in dessen Name der Aufruf efolgt -> auführende Benutzer + String doc_status = null; // Status der Version die gerendert werden soll -> aktuelle Version + int archiv_index = 0; // Index der Achrivversion, nur bei Status Archiv notwendig + String prio = "normal"; + try { + return d3.call.document_render(source, destination, render_option, ocr, asynchronous, replace_doc, overwrite, doc_id, user_name, doc_status, archiv_index, prio); + } catch(Exception e) { + d3.log.error("renderDocument - Exception = " + e); + } + return 0; + } + + /** + * Versenden einer E-Mail, wenn das Dokument "empfohlen" wurde + * @author unterstützende Prozesse + * @see InsertExit, UpdateAttributExit + * @return keine Rückgabe; im Hintergrund wird eine E-Mail verschickt + */ + public static void sendMailRecom(D3Interface d3, Document doc, String pUser) { + d3.log.info("Start Functions sendMailRecom"); + + List emailRecipients = new ArrayList<>(); + def lUsername + def lMail + def lCnt + def h_ReturnValue + def h_RecipientUser = "" // Empfänger + def lCaption = doc.getCaption() + def h_SubjectText = "Das folgende Dokument ${lCaption} wurde Ihnen empfohlen." // Betreff der Email + def h_DokId = doc.id() // zu versendendes zu verlinkendes Dokument + def h_AttachDokId = true // Dokument soll verlinkt werden + def h_Sender = "" // Absender + def h_BodyFile = SystemSpecificConst.gBodyfile + def h_MailFormat = "html" // Formatierten Text verschicken + def h_CCRecipientUser = "" // Empfänger einer eMail-Kopie (CC) + def h_BCCRecipientUser = "" // Empfänger versteckter eMail- Kopie (BCC) + def h_AttachFile = "" // anzuhängende Datei + def h_AttachDep = "" // anzuhängende abhängige Dateien + def h_DocStatus = "Fr" + def h_ArchiveIndex = 0 + def h_bodystring = "Das Dokument ${lCaption} wurde als interessant für Sie markiert. Klicken Sie auf den folgenden Link, um das Dokument anzuschauen:
" + // def h_bodystring = api_str_to_utf8("Das Dokument ${lCaption} wurde als interessant für Sie markiert. Klicken Sie auf den folgenden Link, um das Dokument anzuschauen\:
") + def h_d3onestring = SystemSpecificConst.gD3oneString + doc.id() + ">Link" + + // JPL -> call api_function("file_delete", h_BodyFile) + File bodyFileDel = new File(h_BodyFile) + bodyFileDel.delete() + // JPL -> call api_function("file_add_string", h_BodyFile, UTF8_BOM, "OVERWRITE") + // JPL -> call api_function("file_add_line", h_BodyFile, h_bodystring, "APPEND") + // JPL -> call api_function("file_add_line", h_BodyFile, h_d3onestring, "APPEND") + File bodyFile = new File(h_BodyFile) + bodyFile.append( h_bodystring ) + bodyFile.append( h_d3onestring ) + + def sqlStatement = "SELECT email as lMail FROM benutzer WHERE benutzername = '${pUser}'" + GroovyRowResult grr = d3.sql.firstRow(sqlStatement) + if( grr != null ) { + lMail = grr.get("lMail") + } + + if(lMail != null && !lMail.equals("")) { + h_Sender = pUser + } else { + h_Sender = "d3_mailser" + } + + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_EMPFEHLUNG][i] != null) { + String[] splittedString = doc.field[Const.gDDF_EMPFEHLUNG][i].split("\\(") + if(splittedString != null && splittedString.size() > 0) { + def sqlStatementSec = "SELECT benutzername as lUsername FROM benutzer WHERE realname like '%${splittedString[0].trim()}%'" + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + if( sqlResultSec != null && sqlResultSec.size() > 0 ) { + lCnt = sqlResultSec.size(); + lUsername = sqlResultSec.getAt(0).get("lUsername"); + } + } + if(lCnt == 1) { + // Funktion zum versenden einer E-Mail + emailRecipients.add(lUsername) + } + } + } + + for( String recipient : emailRecipients ) { + // JPL -> h_ReturnValue = api_function ("send_email", h_RecipientUser, h_SubjectText, "", h_DokId, h_Sender, h_BodyFile, h_MailFormat, h_AttachDokId, h_DocStatus, h_ArchiveIndex, h_AttachDep, h_AttachFile, 1, 0, 0) + h_ReturnValue = d3.call.send_email(recipient, h_SubjectText, null, h_DokId, h_Sender, bodyFile.absolutePath, h_MailFormat, h_AttachDokId, h_DocStatus, h_ArchiveIndex, h_AttachDep, h_AttachFile, false, false, false); + d3.log.info("EMail Returnwert ${h_ReturnValue}") + } + + } + + /** + * Befüllung "Zusatztitel" anhand Opportunitynummer + * @author Opportunity + * @see InsertEntry, NewVersionEntry, UpdateAttributEntry + * @return keine Rückgabe; im Hintergrund wird "Zusatztitel" gefüllt + */ + public static void setAdditionalTitle( D3Interface d3, Document doc ) { + d3.log.info("Start Functions setAdditionalTitle"); + + def lOffNo = doc.field[Const.gDDF_OPPANNr] + if(lOffNo != null && !lOffNo.equals("")) { + def lOffNoShort = lOffNo.substring(0,4) + if( lOffNoShort.equals("Neue") || lOffNoShort.equals("9999") ) { + doc.field[Const.gDDF_ADITTITLE] = "" + } else { + doc.field[Const.gDDF_ADITTITLE] = lOffNo; + } + } + } + + /** + * Ermittlung der Eigenschaft "Betreff" über die Administrative Akte + * @author Maschinenprojekt + * @see InsertExit + * @return keine Rückgabe; im Hintergrund wird "Betreff" bzw. "Akte" gefüllt + */ + public static void setAttributSubject(D3Interface d3, Document doc , DocumentType docType, String userId) { + d3.log.info("Start Functions setAttributSubject"); + + 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 lAndClause = ""; + def lSubject = ""; + def lDokGroup = doc.field[Const.gDDF_DOKGROUP]; + def lProcess = doc.field[Const.gDDF_PROZESS]; + + if ( docType.getId().equals(Const.gDTS_DPRST) && (!lProcess.equals("") && lProcess != null ) ) { + lAndClause = "and dok_dat_feld_${Const.gDDF_PROZESS} = '${lProcess}'" + } + else if ( docType.getId().equals(Const.gDTS_DPRST) && (!doc.field[Const.gDDF_AUFTRNR].equals("") && doc.field[Const.gDDF_AUFTRNR] != null) ) { + lAndClause = "and dok_dat_feld_${Const.gDDF_PROZESS} = '0202'" + } else if ( docType.getId().equals(Const.gDTS_DPRST) && (!doc.field[Const.gDDF_OPPNUMMER].equals("") && doc.field[Const.gDDF_OPPNUMMER] != null) ) { + lAndClause = "and dok_dat_feld_${Const.gDDF_PROZESS} = '0201'" + } + + // 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} " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null && sqlResult.size() > 0) { + lSubject = sqlResult.getAt(0).get("lSubject"); + + doc.field[Const.gDDF_SUBJECT] = lSubject; + try { + doc.updateAttributes(userId, 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); + } + } + } + } + + /** + * Befüllung der "internen Version" + * @author Opportunity, Maschinenprojekt, Entwicklungsprojekt, Kundenmanagement, Lieferantenmanagement, Schulung + * @see InsertExit, NewVersionExit, ReleaseExit, DeleteExit + * @return keine Rückgabe; im Hintergrund wird die "interne Version" gefüllt + */ + public static void setInternalVersion( D3Interface d3, String docId ) { + d3.log.info("Start Functions setInternalVersion"); + + // 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 + + def sqlStatement = "SELECT doc_id " + + "FROM doc_versions " + + "WHERE doc_id = '${docId}' " + + "AND doc_state IS NOT NULL " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + + // d3.log.error( "setInternalVersion: ${sqlResult.size()}" ) + Document doc; + try { + doc = d3.archive.getDocument(docId) + doc.field[Const.gDDF_VERSIONINTERN] = sqlResult.size() + doc.updateAttributes("d3groovy", true) + } catch(D3Exception 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) + d3.log.info( "setInternalVersion - Dokument ( " + docId + " )" + " konnte nicht ermittelt werden" ) + } + + d3.log.info( "setInternalVersion - ENDE ( " + docId + " )" ) + + } + + /** + * Erstellung von Teilvorgangsakten gemäß Änderung an der Hauptvorgangsakte. Ggf Eintragung der Vorgangsnummer an der Hauptvorgangsakte. + * @author Unterstützende Prozesse + * @see InsertExit, UpdateAttributExit + * @return keine Rückgabe; im Hintergrund wird eine Akte erstellt + */ + public static void setMainfolder( D3Interface d3, Document docNew ) { + d3.log.info("Start Functions setMainfolder"); + + Document doc = d3.archive.getDocument(docNew.id()); + + String[] teilVorNrArray = new String[2000]; + String[] teilVorBezArray = new String[2000]; + + //Setzen der Hauptvorgangsnummer auf doku_id der Akte + if( doc.field[Const.gDDF_HAUPTVONR] == null) { + doc.field[Const.gDDF_HAUPTVONR] = doc.id() + } + + int lAnzBez = countArrayElements(d3, doc, Const.gDDF_TEILVOBEZGEN); + int lAnzBezNr = countArrayElements(d3, doc, Const.gDDF_TEILVONRM); + + def lOrdnungHaupt = doc.field[Const.gDDF_ORDNUNG] + + if( lAnzBez > lAnzBezNr ) { + lAnzBezNr = lAnzBezNr + 1 + + //Erzeugen der Teilvorgangsnummern + for(int i=lAnzBezNr; i <= lAnzBez; i++) { + doc.field[Const.gDDF_TEILVONRM][i] = doc.field[Const.gDDF_HAUPTVONR] + "-" + i + teilVorNrArray[i] = doc.field[Const.gDDF_TEILVONRM][i] + teilVorBezArray[i] = doc.field[Const.gDDF_TEILVOBEZGEN][i] + } + + def docIdTemp = doc.id(); + //Erzeugen der Teilvorgangsakten + for(int i=lAnzBezNr; i <= lAnzBez; i++) { + String comlNum = fillNullValues(i, 4); + + + Document docTemp = d3.archive.newDocument() + docTemp.setType(Const.gDTS_ATEIL) + docTemp.setStatus("Freigabe") + docTemp.field[Const.gDDF_HAUPTVONR] = docIdTemp + docTemp.field[Const.gDDF_TEILVONR] = teilVorNrArray[i] + docTemp.field[Const.gDDF_TEILVOBEZ] = teilVorBezArray[i] + docTemp.field[Const.gDDF_ORDNUNG] = lOrdnungHaupt + "_" + comlNum + docTemp.field[Const.gDDF_VORGANGSSTATUS] = "offen" + + def lRetVal = d3.call.folder_create(docTemp) + + if(lRetVal != 0) { + d3.log.error("Teilvorgangsakte konnte nicht angelegt werden - ${lRetVal}") + } + } + } + + + // 09.08.2021 imue: Update muss auf jeden Fall ausgeführt werden + 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) + } + } + + /** + * Generierung einer eindeutigen Projektnummer bei der Anlage oder Aktualisierung einer Organisationsprojektakte + * @author Organisationsprojekt + * @see InsertEntry, UpdateEntry + * @return keine Rückgabe; im Hintergrund wird die Projektnummer hochgezählt + */ + public static void setNextProjnr( D3Interface d3, Document doc, def pDokDatFeld, def pLength, String entryPoint ) { + d3.log.info("Start Functions setNextProjnr"); + + if( doc.field[Const.gDDF_PROJVERKN] == null && entryPoint.equals("INSERT") ) { + + // pDokuArt -> Dokumentart zur Grundlage der Ermittlung der Nummer + // pDokDatFeld -> Diesem Feld wird die Nummer zugewiesen (alphanum) + // plength -> Länge der Nummer (mit führenden Nullen) + + // Variablen + def lfd_nr = "" + def puffer = 0 + def stringNull = "" + + SimpleDateFormat dateFormatYear = new SimpleDateFormat("yyyy"); + String currentYear = dateFormatYear.format(new Date()) + + //Ermittle die höchste Projektnummer + def sqlStatement = "SELECT max(dok_dat_feld_${pDokDatFeld}) as lfd_nr " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${doc.getType().id()}' " + + "AND (dok_dat_feld_${pDokDatFeld} like 'OP-${currentYear}%') " + def sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null && sqlResult.size() > 0) { + lfd_nr = sqlResult.getAt(0).get("lfd_nr") + } + + //Es wurde keine Projektnummer für dieses Jahr gefunden. Default = OP-2015-001-00 + if( lfd_nr == null || lfd_nr.equals("") ) { + for(int i=1; i <= (pLength-1); i++) { + stringNull = stringNull + "0" + } + lfd_nr = "OP" + "-"+ currentYear + "-" + stringNull + "1" + "-" + "00" + doc.field[pDokDatFeld] = lfd_nr + + } else { + //Es wurde eine Projektnummer gefunden + + //Akutelle Nummer extrahieren + lfd_nr = lfd_nr.substring(8, 8+pLength) + //Aktuelle Nummer hochzählen + lfd_nr = getNextId(d3, lfd_nr, 3); + //Anzahl der Stellen der Nummer ermitteln + puffer = pLength - lfd_nr.length() + //Führende Nullen auffüllen + for(int i=1; i <= puffer; i++) { + stringNull = stringNull + "0" + } + //Neue Vertragsnummer zusammenstellen: Jahreszahl + Neue Nummer + lfd_nr = "OP" + "-" + currentYear + "-" + stringNull + lfd_nr + "-" + "00" + doc.field[pDokDatFeld] = lfd_nr + } + + } else { + + def lProjVerkalt = "" + def lProjVerkneu = doc.field[Const.gDDF_PROJVERKN] + + def sqlStatementVerkn = "SELECT dok_dat_feld_${Const.gDDF_PROJVERKN} as lProjVerkalt " + + "FROM firmen_spezifisch " + + "WHERE doku_id = '${doc.id()}'" + + List sqlResultVerk = d3.sql.executeAndGet(sqlStatementVerkn) + if(sqlResultVerk != null && sqlResultVerk.size() > 0) { + lProjVerkalt = sqlResultVerk.getAt(0).get("lProjVerkalt") + } + + if( (lProjVerkneu != null && !lProjVerkalt.equals(lProjVerkneu)) || entryPoint.equals("INSERT") ) { + + //Anlage der nächst höheren Projektnummer bei Eingabe einer Projektverknüpfung + def lfd_nr = "" + def lfd_nr_o_suff = "" + def max_projno = "" + def max_projno_OP = "" + def max_projno_suff + + lfd_nr = doc.field[Const.gDDF_PROJVERKN].substring(0,14) + lfd_nr_o_suff = lfd_nr.substring(0,11) + + //Abfrage der höchsten Projektnummer zu einem Projekt + def sqlStatement = "SELECT max(dok_dat_feld_${pDokDatFeld}) as max_projno " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${pDokDatFeld} like ('${lfd_nr_o_suff}%') " + def sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null && sqlResult.size() > 0 ) { + max_projno = sqlResult.getAt(0).get("max_projno") + max_projno_OP = max_projno.substring(0, 11) + max_projno_suff = max_projno.substring(12, 14) + max_projno_suff = getNextId(d3, max_projno_suff, 2); + } + if(max_projno_OP != null && max_projno_suff != null) { + doc.field[pDokDatFeld] = max_projno_OP + "-" + max_projno_suff + } + // Neue Org Hauptprojekt muss auch gesplittet gesetzt werden + if(lfd_nr != null && !lfd_nr.equals("")) { + doc.field[Const.gDDF_PROJVERKN] = lfd_nr; + } + + } + } + } + + /** + * Inhalt eines Mehrfachfelds wird in ein Einfachfeld zusammengeschrieben + * @author Unterstützende Prozesse + * @see InsertEntry, UpdateAttributEntry, NewVersionEntry + * @return keine Rückgabe; im Hintergrund wird ein Bemerkungsfeld gefüllt + */ + public static void sixty2single(D3Interface d3, Document doc) { + d3.log.info("Start Functions sixty2single"); + + if( doc.getType().getId().equals(Const.gDTS_DLOEH) ) { + doc.setText(4,"") + + for (int i = 1; i<=Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_SCHLAGWORT][i] != null && !doc.field[Const.gDDF_SCHLAGWORT][i].equals("") ) { + def tmp = doc.field[Const.gDDF_SCHLAGWORT][i] + if(tmp != null && !tmp.equals("")) { + if( doc.getText(4).equals("") || doc.getText(4) == null ) { + doc.setText(4, tmp) + } else { + doc.setText(4, doc.getText(4) + " I " + tmp) + } + } + } + } + } + + } + + /** + * Buchungskreis (WM 'Buchungskreis') ist zusammengesetzt aus Nummer und Text aus SAP + * @author Unterstützende Prozesse + * @see InsertEntry, SearchEntry + * @return Rückgabe ist die eindeutige Nummer + */ + public static String splitBuKrs(def lValue) { + if(lValue != null) { + String[] splittedString = lValue.split("\\|") + def lRetVal = splittedString.size() + if( lRetVal > 1 ) { + def newValue = splittedString[0].trim() + return newValue + } else { + return lValue + } + } else { + return lValue + } + } + + /** + * Split des zusammengesetzten Wertes Buchungskreis Nummer und Bezeichnung, nach Nummer + * @author + * @see InsertEntry, NewVersionEntry + * @return keine Rückgabe; im Hintergrund wird die Buchungskreis Nummer gesetzt + */ + public static int splitBuchungskreis(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitBuchungskreis"); + + // Ermittlung in welchen Dokumentarten die Eigenschaft Buchungskreis vorkommt (Einfachfeld und Mehrfachfeld) + def sqlStatementBK = "SELECT DISTINCT kue_dokuart as dokuArt " + + "FROM fispe_titel_dokuart " + + "WHERE repository_id = '${SystemSpecificConst.gBuchungskreisID}' " + + " OR repository_id = '${SystemSpecificConst.gBuchungskreiseID}' " + List sqlResultBK = d3.sql.executeAndGet(sqlStatementBK); + List dokuartenBk = new ArrayList<>() + if(sqlResultBK != null) { + for(GroovyRowResult grr : sqlResultBK) { + dokuartenBk.add(grr.get("dokuArt")) + } + } + //Splitten des zusammengesetzten Strings Buchungskreis, Buchungskreistext nach Buchungskreis + if( dokuartenBk.contains(docType.getId()) ) { + if( doc.field[Const.gDDF_BUCHKREIS] != null && !doc.field[Const.gDDF_BUCHKREIS].equals("") ) { + def lBuchKr = doc.field[Const.gDDF_BUCHKREIS].substring(0,4) + doc.field[Const.gDDF_BUCHKREIS] = lBuchKr + } + // Split des Wertes für Intercompany + for( int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_BUCHKREIS68][i] != null && !doc.field[Const.gDDF_BUCHKREIS68][i].equals("") ) { + def lBuchKr68 = doc.field[Const.gDDF_BUCHKREIS68][i] + doc.field[Const.gDDF_BUCHKREIS68][i] = lBuchKr68.substring(0,4) + } + } + } + return 0 + } + + + /** + * Split des zusammengesetzten Wertes für Endkundennummer oder Endkundenname + * @author + * @see SearchEntry + * @return keine Rückgabe; im Hintergrund wird der eingeutige Wert gesetzt + */ + public static void splitEndKunde(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitEndKunde"); + + //Splitten des zusammengesetzten Strings Kundenname und Kundennummer + if( doc.field[Const.gDDF_ENDKUNDENNR] != null || doc.field[Const.gDDF_ENDKUNDENAM] != null ) { + //Splitten des Endkundennamens und der Endkundennummer für die Suche + String[] splittedString + def lReturn = 0 + if( doc.field[Const.gDDF_ENDKUNDENAM] != null ) { + splittedString = doc.field[Const.gDDF_ENDKUNDENAM].split("\\|") + if( splittedString != null ) { + lReturn = splittedString.size() + } + } else if( doc.field[Const.gDDF_ENDKUNDENNR] != null ) { + splittedString = doc.field[Const.gDDF_ENDKUNDENNR].split("\\|") + if( splittedString != null ) { + lReturn = splittedString.size() + } + } + if( lReturn > 1 ) { + doc.field[Const.gDDF_ENDKUNDENNR] = splittedString[0] + doc.field[Const.gDDF_ENDKUNDENAM] = "" + } + } + } + + + /** + * Split des zusammengesetzten Wertes für Kundennummer oder Kundenname + * @author + * @see SearchEntry + * @return keine Rückgabe; im Hintergrund wird der eingeutige Wert gesetzt + */ + public static void splitKunde(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitKunde"); + + //Splitten des zusammengesetzten Strings Kundenname und Kundennummer + if( doc.field[Const.gDDF_KNR] != null || doc.field[Const.gDDF_KNAME] != null ) { + //Splitten des Kundennamens und der Kundennummer für die Suche + String[] splittedString + def lReturn = 0 + if( doc.field[Const.gDDF_KNAME] != null ) { + splittedString = doc.field[Const.gDDF_KNAME].split("\\|") + if( splittedString != null ) { + lReturn = splittedString.size(); + } + } else if( doc.field[Const.gDDF_KNR] != null ) { + splittedString = doc.field[Const.gDDF_KNR].split("\\|") + if( splittedString != null ) { + lReturn = splittedString.size() + } + } + if( lReturn > 1 ) { + doc.field[Const.gDDF_KNR] = splittedString[0] + doc.field[Const.gDDF_KNAME] = "" + } + } + } + + + /** + * Splitten der Kontaktbeschreibung und Prüfung ob es sich um eine valide Kombination aus Lieferanten-Nr, Kontaktbeschreibung, Termin und Kategorie handelt + * @author Lieferantenmanagement + * @see Insert, Update, New Version + * @return Rückgabe ob die Änderung valide ist (0, -170) + */ + public static int splitLieferantenkontaktbeschreibung(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitLieferantenkontaktbeschreibung"); + + def lKontKategorie + def lReturn + def pRowCount + if( doc.field[Const.gDDF_KONTAKTBESCH] != null && !doc.field[Const.gDDF_KONTAKTBESCH].equals("") ) { + // Splitten der Beschreibung und Verteilung der Daten auf die entsprechenden Felder + // Auf diese Weise kann die nachfolgende Plausibilitäts-Prüfung universell (auch für manuelle Eingabe) erfolgen. + // call api_log_error( "Vor dem Split 2018 " ## dok_dat_feld[gDDF_KONTAKTBESCH] ) + lReturn = doc.field[Const.gDDF_KONTAKTBESCH].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_KONTAKTBESCH].split("\\|") + if( splittedString != null && splittedString.size() == 3 ) { + def sqlStatement = "SELECT value_char_allowed as lKontKategorie FROM doc_field_val_lang WHERE predef_value_id = '${SystemSpecificConst.gPredValueIDKatLief}' AND value_char_transl = '${splittedString[1]}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + lKontKategorie = sqlResult.getAt(0).get("lKontKategorie") + try { + // Umwandlung des String Datums in Datentyp Timestamp für den Import notwendig + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + Date parsedDate = dateFormat.parse(splittedString[0].trim()); + Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime()); + doc.field[Const.gDDF_KONTAKTDATE] = timestamp + doc.field[Const.gDDF_LIEFAKTKAT] = lKontKategorie + doc.field[Const.gDDF_KONTAKTBESCH] = splittedString[2].trim() + } catch(Exception e) { //this generic but you can control another types of exception + // look the origin of excption + } + } + } else { + // korrekten ALIAS für die Kategorie ermitteln + def sqlStatement = "SELECT value_char_allowed as lKontKategorie FROM doc_field_val_lang WHERE predef_value_id = '${SystemSpecificConst.gPredValueIDKatLief}' AND ( value_char_transl = '${doc.field[Const.gDDF_KDAKTKAT]}' OR value_char_allowed = '${doc.field[Const.gDDF_KDAKTKAT]}' ) " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + lKontKategorie = sqlResult.getAt(0).get("lKontKategorie") + doc.field[Const.gDDF_LIEFAKTKAT] = lKontKategorie + } + def sqlStatement = "SELECT * " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALONT}' " + + "AND dok_dat_feld_${Const.gDDF_KONTAKTDATE} = '${doc.field[Const.gDDF_KONTAKTDATE]}' " + + "AND dok_dat_feld_${Const.gDDF_LIEFAKTKAT} = '${doc.field[Const.gDDF_LIEFAKTKAT]}' " + + "AND dok_dat_feld_${Const.gDDF_KONTAKTBESCH} = '${doc.field[Const.gDDF_KONTAKTBESCH]}' " + + "AND dok_dat_feld_${Const.gDDF_LNR} = '${doc.field[Const.gDDF_LNR]}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + pRowCount = sqlResult.size() + + if( pRowCount == 1 ) { + d3.log.info( "Alles OK" ) + } else { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT021049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT021001) + } + d3.log.error( "Bitte geben Sie eine gültige Kombination aus Lieferant_Nr, Kontakt_Beschreibung, Kategorie und Termin ein oder wählen Sie eine Kontakt_Beschreibung aus der Auswahlliste." ) + return -170 + } + } else { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT021049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT021001) + } + d3.log.error( "Bitte geben Sie eine gültige Kombination aus Kontakt_Beschreibung, Kategorie und Termin ein oder wählen Sie eine Kontakt_Beschreibung aus der Auswahlliste." ) + return -170 + } + return 0; + } + + /** + * Beschreibung + * @author + * @see InsertEntry, ValidateUpdateEntry, NewVersionEntry + * @return + */ + public static int splitLieferant(D3Interface d3, Document doc, DocumentType docType, User user, String entryPoint, Document docBeforeUpdate ) { + d3.log.info("Start Functions splitLieferant = " + docType.id()); + + def lLFNr = doc.field[Const.gDDF_LNR] + def lLFName = doc.field[Const.gDDF_LNAME] + def lReturn + def lReturn2 + def gTMPLFNr = "" + def userName = user.id(); + + + // 25.11.2022 imue: Keine Einstiegspunkteingrenzung + if ( lLFNr != null && lLFName == null ) { + String[] splittedString = lLFNr.split("\\|") + lReturn = splittedString.size() + //Wenn Lieferantennummer ermittelt wurde, dann Lieferantennummer in Attributfeld schreiben + if( lReturn > 1 && splittedString[0] != null && splittedString[1] != null ) { + if ( !splittedString[0].equals("d3") ) { + // Hinweis 19.03.2018/dkle: Die Lieferantennummer darf für DLIKO und ALIKO nicht mehr aktualisiert werden, dies erfolgt nun per Aktenplan und ist nicht modifizierbar. + if( docType.getId().equals(Const.gDTS_DLIKO) ) { + gTMPLFNr = splittedString[0] + } else { + doc.field[Const.gDDF_LNR] = splittedString[0].trim(); + } + } + if( !docType.getId().equals(Const.gDTS_DLIMA) && !docType.getId().equals(Const.gDTS_DLONT) ) { + // Hinweis: Bei Lieferantendokumenten und Lieferantenkontaktdokumenten darf nur die Lieferantennummer modifiziert werden. Aktualisierung des Names erfolgt per Aktenplan. + doc.field[Const.gDDF_LNAME] = splittedString[1].trim(); + } + } + } else if ( lLFNr == null && lLFName != null ) { + String[] splittedString = lLFName.split("\\|") + lReturn = splittedString.size() + + if(splittedString.size() >= 2) { + if ( lReturn > 1 && splittedString[0] != null && splittedString[1] != null ) { + if ( !splittedString[0].equals("d3") ) { + // Hinweis 19.03.2018/dkle: Die Lieferantennummer darf für DLIKO und ALIKO nicht mehr aktualisiert werden, dies erfolgt nun per Aktenplan und ist nicht modifizierbar. + if( docType.getId().equals(Const.gDTS_DLIKO) ) { + gTMPLFNr = splittedString[0] + } else { + doc.field[Const.gDDF_LNR] = splittedString[0].trim(); + } + } else if( splittedString[0].equals("d3") && !docType.getId().equals(Const.gDTS_DLIKO) ) { + // Hinweis: Ausnahme Projektlieferantendokumente DLIKO, da die Lieferantennummer vererbt wird und nicht leer gesetzt werden darf + doc.field[Const.gDDF_LNR] = "" + } + if( !docType.getId().equals(Const.gDTS_DLIMA) && !docType.getId().equals(Const.gDTS_DLONT) && !docType.getId().equals(Const.gDTS_ALONT) ) { + // Hinweis: Bei Lieferantendokumenten und Lieferantenkontaktdokumenten darf nur die Lieferantennummer modifiziert werden. Aktualisierung des Names erfolgt per Aktenplan. + doc.field[Const.gDDF_LNAME] = splittedString[1].trim(); + } + } + } + + } else if ( lLFNr != null && lLFName != null ) { + + lReturn = lLFNr.indexOf("|") + lReturn2 = lLFName.indexOf("|") + + + if( lReturn > 0 && lReturn2 < 0 ) { + String[] splittedString = lLFNr.split("\\|") + lReturn = splittedString.size() + if ( lReturn > 0 && splittedString[0] != null && splittedString[1] != null ) { + if ( !splittedString[0].equals("d3") ) { + // Hinweis 19.03.2018/dkle: Die Lieferantennummer darf für DLIKO und ALIKO nicht mehr aktualisiert werden, dies erfolgt nun per Aktenplan und ist nicht modifizierbar. + if( docType.getId().equals(Const.gDTS_DLIKO) ) { + gTMPLFNr = splittedString[0] + } else { + doc.field[Const.gDDF_LNR] = splittedString[0].trim(); + } + } else if( docType.getId().equals(Const.gDTS_DLIKO) ) { + // Hinweis: Ausnahme Projektlieferantendokumente DLIKO, da die Lieferantennummer vererbt wird und nicht leer gesetzt werden darf + doc.field[Const.gDDF_LNR] = "" + } + if( !docType.getId().equals(Const.gDTS_DLIMA) && !docType.getId().equals(Const.gDTS_DLONT) && !docType.getId().equals(Const.gDTS_ALONT) ) { + // Hinweis: Bei diesen Dokumentarten darf nur die Lieferantennummer modifiziert werden. Aktualisierung des Names erfolgt per Aktenplan. + // - Lieferantendokumenten DLIMA + // - Lieferantenkontaktdokumenten DLONT + // - Lieferantenkontakt ALONT + doc.field[Const.gDDF_LNAME] = splittedString[1].trim(); + } + } + } else if( lReturn < 0 && lReturn2 > 0 ) { + String[] splittedString = lLFName.split("\\|") + lReturn = splittedString.size() + if ( lReturn > 0 && splittedString[0] != null && splittedString[1] != null) { + if ( !splittedString[0].equals("d3") ) { + // Hinweis 19.03.2018/dkle: Die Lieferantennummer darf für DLIKO und ALIKO nicht mehr aktualisiert werden, dies erfolgt nun per Aktenplan und ist nicht modifizierbar. + if( docType.getId().equals(Const.gDTS_DLIKO) ) { + gTMPLFNr = splittedString[0] + // d3.log.error( "gTMPLFNr: " + gTMPLFNr ) + } else { + doc.field[Const.gDDF_LNR] = splittedString[0].trim(); + } + } else if( splittedString[0].equals("d3") && !docType.getId().equals(Const.gDTS_DLIKO) ) { + // Hinweis: Ausnahme Projektlieferantendokumente DLIKO, da die Lieferantennummer vererbt wird und nicht leer gesetzt werden darf + doc.field[Const.gDDF_LNR] = "" + } + if( !docType.getId().equals(Const.gDTS_DLIMA) && !docType.getId().equals(Const.gDTS_DLONT) && !docType.getId().equals(Const.gDTS_ALONT) ) { + // Hinweis: Bei Lieferantendokumenten und Lieferantenkontaktdokumenten darf nur die Lieferantennummer modifiziert werden. Aktualisierung des Names erfolgt per Aktenplan. + doc.field[Const.gDDF_LNAME] = splittedString[1].trim(); + } + } + } else if( lReturn > 0 && lReturn2 > 0 && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP )) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", "Bitte wählen Sie entweder den Lieferantennamen oder die Lieferantennummer aus der Liste aus, oder geben Sie es manuell ein.") + } else { + d3.hook.setProperty("additional_info_text", "Please choose either a Customer No. or a Customer Name from the Dropdown Box or provide them manually.") + } + d3.log.error( "Bitte wählen Sie entweder den Lieferantennamen oder die Lieferantennummer aus oder geben Sie es manuell ein." ) + return -170 + + // Differenz zu JPL: Umstellung von nicht zutreffenden Dokumentarten auf nur noch zutreffende + } else if( lReturn < 0 && lReturn2 < 0 && ( docType.getId().equals(Const.gDTS_ALIKO) || docType.getId().equals(Const.gDTS_DLIKO) ) && !entryPoint.toLowerCase().equals("insert") ) { + if(userName.equals("d3_async") || docType.getId().equals(Const.gDTS_ALIKO)) { + // 07.03.2023 imue: Anpassung weil der Async ein Update triggert und die Lieferantennummer ungewollt leert + // 07.08.2023 imue: Es ist nun gewünscht an der Projektlieferantakte die Lieferantenangaben im Notfall ändern zu können + } else { + doc.field[Const.gDDF_LNR] = "" + } + } + } + + if( ( doc.field[Const.gDDF_LNAME] == null || doc.field[Const.gDDF_LNAME].equals("")) && + !docType.getId().equals(Const.gDTS_DMEOP) &&!docType.getId().equals(Const.gDTS_DMEOP) && + !docType.getId().equals(Const.gDTS_DLONT) && !docType.getId().equals(Const.gDTS_DLIMA) && + !docType.getId().equals(Const.gDTS_DERZ1) && !docType.getId().equals(Const.gDTS_ALIKO) && + !docType.getId().equals(Const.gDTS_ALIMA) && !docType.getId().equals(Const.gDTS_ALIAK) && + !docType.getId().equals(Const.gDTS_AEINK) && !docType.getId().equals(Const.gDTS_DEINK) && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) ) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT011049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT011001) + } + d3.log.error( "Bitte geben Sie mindestens den Lieferantennamen ein oder wählen Sie ihn aus der Drop Down Liste." ) + return -170 + } + + // Überprüfung doppelter Einträge von Lieferanten + if( docType.getId().equals(Const.gDTS_ALIKO) ) { + lReturn = Functions.checkDuplikateLieferant( d3, doc, entryPoint.toLowerCase(), userName, doc.id() ) + if( lReturn.equals("OK") ) { + // Do nothing call d3.log.error( "Die neue Lieferantenkontaktakte kann abgelegt werden!" ) + } else { + // if( lReturn == "Fehler" ) + 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 + } + } + + return 0 + } + + /** + * @author + * @see SearchEntry + * @return + */ + public static void splitLieferantSearch(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitLieferantSearch"); + + String[] splittedString + def lReturn + if( doc.field[Const.gDDF_LNAME] != null ) { + splittedString = doc.field[Const.gDDF_LNAME].split("\\|") + lReturn = splittedString.size() + } else { + splittedString = doc.field[Const.gDDF_LNR].split("\\|") + lReturn = splittedString.size() + } + + if ( lReturn > 1 ) { + if( !splittedString[0].equals("d3") && !docType.getId().equals(Const.gDTS_ALIKO) && !docType.getId().equals(Const.gDTS_DLIKO) ) { + doc.field[Const.gDDF_LNR] = splittedString[0] + doc.field[Const.gDDF_LNAME] = "" + } else if( splittedString[0].equals("d3") && !docType.getId().equals(Const.gDTS_ALIKO) && !docType.getId().equals(Const.gDTS_DLIKO) ) { + doc.field[Const.gDDF_LNR] = "" + if( !docType.getId().equals(Const.gDTS_AEINK) ) { + doc.field[Const.gDDF_LNAME] = splittedString[1] + } + } else { + doc.field[Const.gDDF_LNAME] = splittedString[1] + } + } + } + + /** + * @author + * @see SearchEntry + * @return + */ + public static void splitActivity(D3Interface d3, Document doc) { + d3.log.info("Start Functions splitActivity"); + + String[] splittedString = doc.field[Const.gDDF_AKTIVITAETSID].split("\\|"); + if( splittedString != null && splittedString.size() == 2 ) { + doc.field[Const.gDDF_AKTIVITAETSID] = splittedString[0] + doc.field[Const.gDDF_BESCHREIBUNG] = splittedString[1] + } + } + + /** + * Splitten aller relevanten Eigenschaften für die Dokumentart Dossier, sowie Ermittlung passender Werte anhand der Haupt- und Teilvorgangsakten + * @author Unterstützende Prozesse + * @see NewVersionEntry, InsertEntry + * @return + */ + public static void splitDossierValue(D3Interface d3, Document doc, DocumentType docType, String entryPoint) { + d3.log.info("Start Functions splitDossierValue ${docType.getId()} ${entryPoint} "); + + + // InsertEntry -> Dossier + // SearchEntry -> Dossier, Hauptvorgangsakte und Teilvorgangsakte + // UpdateEntry -> Dossier + // NewVersionEntry -> Dossier + + // 09.08.2021 imue: Problem bei Dossier bei Änderung durch Benutzer, die eine hookseitige Änderung von nicht modifizierbaren Feldern hervor ruft + if(entryPoint != null && docType.getId().equals(Const.gDTS_DOSSI) && (entryPoint.equals("UPDATEENTRY") || entryPoint.equals("NEWVERSIONENTRY") || entryPoint.equals("UPDATEEXIT") || entryPoint.equals("NEWVERSIONEXIT"))) { + + if(entryPoint.equals("UPDATEENTRY") || entryPoint.equals("NEWVERSIONENTRY")) { + // Hier dürfen im Benuzterkontext nur die NICHT modifizierbaren Felder gefüllt werden + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + String[] splittedString = doc.field[Const.gDDF_HAUPTVONR].split("\\|") + if (splittedString != null && splittedString.size() == 2) { + doc.field[Const.gDDF_HAUPTVONR] = splittedString[1].trim() + } + } + + if( doc.field[Const.gDDF_TEILVONR] != null && !doc.field[Const.gDDF_TEILVONR].equals("")) { + String[] splittedString = doc.field[Const.gDDF_TEILVONR].split("\\|") + if(splittedString != null && splittedString.size() == 2) { + doc.field[Const.gDDF_TEILVONR] = splittedString[1].trim() + } + } + + } else if(entryPoint.equals("UPDATEEXIT") || entryPoint.equals("NEWVERSIONEXIT")) { + + // Modifizierbare Felder im Kontext von d3groovys + Document docNew = d3.archive.getDocument(doc.id()); + if( (doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("")) || (doc.field[Const.gDDF_TEILVONR] != null && !doc.field[Const.gDDF_TEILVONR].equals("")) ) { + def lHauptVoBez + def lTeilVoBez + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_HAUPTVOBEZ} as lHauptVoBez " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AHAUP}' and dok_dat_feld_${Const.gDDF_HAUPTVONR} = '${doc.field[Const.gDDF_HAUPTVONR]}' " + + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_TEILVOBEZ} as lTeilVoBez " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ATEIL}' and dok_dat_feld_${Const.gDDF_TEILVONR} = '${doc.field[Const.gDDF_TEILVONR]}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + if(sqlResult != null && sqlResult.size() > 0) { + docNew.field[Const.gDDF_HAUPTVOBEZ] = sqlResult.getAt(0).get("lHauptVoBez") + } + if(sqlResultSec != null && sqlResultSec.size() > 0) { + docNew.field[Const.gDDF_TEILVOBEZ] = sqlResultSec.getAt(0).get("lTeilVoBez") + } + } + + Document docTemp; + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + try { + docTemp = d3.archive.getDocument(doc.field[Const.gDDF_HAUPTVONR]); + } catch(Exception e) { + d3.log.error(" splitDossierValue - Dokument konnte anhand ${doc.field[Const.gDDF_HAUPTVONR]} nicht ermittelt werden"); + } + } + + if(docTemp != null) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + try { + docNew.field[Const.gDDF_D3USER67][i] = docTemp.field[Const.gDDF_D3USER67][i]; + docNew.field[Const.gDDF_ORGEINHEITEN][i] = docTemp.field[Const.gDDF_ORGEINHEITEN][i]; + } catch(Exception e) { + d3.log.error(" splitDossierValue Fehler mit 60er Feld = " + e); + } + } + } + + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + def lCaseOwner + def lCnt + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_VOROWNER} as lCaseOwner FROM firmen_spezifisch WHERE doku_id = '${doc.field[Const.gDDF_HAUPTVONR]}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null) { + if(sqlResult.size() == 1) { + docNew.field[Const.gDDF_VOROWNER] = sqlResult.getAt(0).get("lCaseOwner") + } else { + docNew.field[Const.gDDF_VOROWNER] = "" + } + } + } + + try { + docNew.updateAttributes("d3groovy", true) + } catch(Exception e) { + String noticeHoldfile = "Eigenschaten konnten nicht aktualisiert werden: " + e + int returnValue = d3.call.hold_file_send ( SystemSpecificConst.recipientHoldFile, noticeHoldfile, docNew.id(), null, null, false, false, null, null, "d3groovy", 0, false, false, null, 0, false) + d3.log.error( "Eigenschaften für Dokument ${docNew.id()} splitDossier konnten NICHT erfolgreich aktualisiert werden!" ) + } + } + } else { + + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + String[] splittedString = doc.field[Const.gDDF_HAUPTVONR].split("\\|") + if (splittedString != null && splittedString.size() == 2) { + doc.field[Const.gDDF_HAUPTVOBEZ] = splittedString[0].trim() + doc.field[Const.gDDF_HAUPTVONR] = splittedString[1].trim() + } + } + + if( doc.field[Const.gDDF_TEILVONR] != null && !doc.field[Const.gDDF_TEILVONR].equals("")) { + String[] splittedString = doc.field[Const.gDDF_TEILVONR].split("\\|") + if(splittedString != null && splittedString.size() == 2) { + doc.field[Const.gDDF_TEILVOBEZ] = splittedString[0].trim() + doc.field[Const.gDDF_TEILVONR] = splittedString[1].trim() + } + } + + if( (doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("")) || (doc.field[Const.gDDF_TEILVONR] != null && !doc.field[Const.gDDF_TEILVONR].equals("")) ) { + def lHauptVoBez + def lTeilVoBez + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_HAUPTVOBEZ} as lHauptVoBez " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AHAUP}' and dok_dat_feld_${Const.gDDF_HAUPTVONR} = '${doc.field[Const.gDDF_HAUPTVONR]}' " + + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_TEILVOBEZ} as lTeilVoBez " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ATEIL}' and dok_dat_feld_${Const.gDDF_TEILVONR} = '${doc.field[Const.gDDF_TEILVONR]}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement) + List sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + if(sqlResult != null && sqlResult.size() > 0) { + doc.field[Const.gDDF_HAUPTVOBEZ] = sqlResult.getAt(0).get("lHauptVoBez") + } + if(sqlResultSec != null && sqlResultSec.size() > 0) { + doc.field[Const.gDDF_TEILVOBEZ] = sqlResultSec.getAt(0).get("lTeilVoBez") + } + } + + Document docTemp; + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + try { + docTemp = d3.archive.getDocument(doc.field[Const.gDDF_HAUPTVONR]); + } catch(Exception e) { + d3.log.error(" splitDossierValue - Dokument konnte anhand ${doc.field[Const.gDDF_HAUPTVONR]} nicht ermittelt werden"); + } + } + + if(docTemp != null) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + try { + doc.field[Const.gDDF_D3USER67][i] = docTemp.field[Const.gDDF_D3USER67][i]; + doc.field[Const.gDDF_ORGEINHEITEN][i] = docTemp.field[Const.gDDF_ORGEINHEITEN][i]; + } catch(Exception e) { + d3.log.error(" splitDossierValue Fehler mit 60er Feld = " + e); + } + } + } + + if( doc.field[Const.gDDF_HAUPTVONR] != null && !doc.field[Const.gDDF_HAUPTVONR].equals("") ) { + def lCaseOwner + def lCnt + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_VOROWNER} as lCaseOwner FROM firmen_spezifisch WHERE doku_id = '${doc.field[Const.gDDF_HAUPTVONR]}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null) { + if(sqlResult.size() == 1) { + doc.field[Const.gDDF_VOROWNER] = sqlResult.getAt(0).get("lCaseOwner") + } else { + doc.field[Const.gDDF_VOROWNER] = "" + } + } + } + } + } + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static int splitOpportunityMehrf(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitOpportunityMehrf"); + + def lRetCode + // Ermittlung in welchen Dokumentarten die Eigenschaft Opportunity-Nummern (Mehrfachfeld) vorkommt + def sqlStatementOppM = "SELECT DISTINCT kue_dokuart as dokuArt " + + "FROM fispe_titel_dokuart " + + "WHERE repository_id = '${SystemSpecificConst.gWeitOpportunityID}' " + + "OR repository_id = '${SystemSpecificConst.gWeitProjektnummerID}' " + List sqlResultOppM = d3.sql.executeAndGet(sqlStatementOppM); + List dokuartenOppM = new ArrayList<>() + if(sqlResultOppM != null) { + for(GroovyRowResult grr : sqlResultOppM) { + dokuartenOppM.add(grr.get("dokuArt")) + } + } + //Splitten des zusammengesetzten String Opportunity-Nummern (Mehrfachfeld Opportunitydokumente) und Submission nach Opportunitynummer + if( dokuartenOppM.contains(docType.getId()) ) { + def lOPPInput + def lPROJInput + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_OPPNRM][i] != null && !doc.field[Const.gDDF_OPPNRM][i].equals("") ) { + lOPPInput = 1 + break; + } + } + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_WEITAUFTRAGSNR][i] != null && !doc.field[Const.gDDF_WEITAUFTRAGSNR][i].equals("") ) { + lPROJInput = 1 + break; + } + } + if( !docType.getId().equals(Const.gDTS_DMEOP) ) { + if( (lPROJInput == 1 && lOPPInput == 1) || (lOPPInput == 1 && doc.field[Const.gDDF_AUFTRNR] != null) || (lPROJInput == 1 && doc.field[Const.gDDF_OPPNUMMER] != null) || (doc.field[Const.gDDF_AUFTRNR] != null && doc.field[Const.gDDF_OPPNUMMER] != null ) ) { + 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. Dabei haben Sie sowohl eine Projekt- als auch eine Opportunitynummer (ggf. unter weitere) eingetragen. Bitte korrigieren Sie Ihre Eingabe." ) + return -170 + } + } + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_OPPNRM][i] != null && doc.field[Const.gDDF_AUFTRNR] == null) { + String[] splittedString = doc.field[Const.gDDF_OPPNRM][i].split(" \\| ") + lRetCode = splittedString.size() + //Wenn Opportunitynummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if (splittedString[0] != null) { + doc.field[Const.gDDF_OPPNRM][i] = splittedString[0] + } + } else if ( doc.field[Const.gDDF_WEITAUFTRAGSNR][i] != null && doc.field[Const.gDDF_OPPNUMMER] == null ) { + String[] splittedString = doc.field[Const.gDDF_WEITAUFTRAGSNR][i].split("\\|") + lRetCode = splittedString.size() + //Wenn Opportunitynummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedString[0] != null ) { + doc.field[Const.gDDF_WEITAUFTRAGSNR][i] = splittedString[0] + } + } + } + lOPPInput = 0 + lPROJInput = 0 + } + return 0 + } + + /** + * Beschreibung + * @author + * @see SearchEntry + * @return + */ + public static void splitOpportunitySubmission(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitOpportunitySubmission"); + + // Ermittlung in welchen Dokumentarten die Eigenschaft Opportunitynummer, Hauptopportunity, Submission vorkommt + def sqlStatementOpp = "SELECT DISTINCT kue_dokuart as dokuArt " + + "FROM fispe_titel_dokuart " + + "WHERE repository_id = '${SystemSpecificConst.gOpportunityNrID}' " + + " OR repository_id = '${SystemSpecificConst.gHauptOpportunityID}' " + List sqlResultOpp = d3.sql.executeAndGet(sqlStatementOpp); + List dokuartenOpp = new ArrayList<>() + if(sqlResultOpp != null) { + for(GroovyRowResult grr : sqlResultOpp) { + dokuartenOpp.add(grr.get("dokuArt")) + } + } + //Splitten der zusammengesetzten Strings Opportunitynummer, Hauptopportunity und jeweils Submission nach Opportunitynummer + if( dokuartenOpp.contains(docType.getId()) ) { + if( doc.field[Const.gDDF_OPPNUMMER] != null ) { + String[] splittedStringOpp = doc.field[Const.gDDF_OPPNUMMER].split(" \\| ") + def lRetCodeOpp = splittedStringOpp.size() + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedStringOpp[0] != null && !splittedStringOpp[0].equals("") ) { + doc.field[Const.gDDF_OPPNUMMER] = splittedStringOpp[0] + } + } + if( doc.field[Const.gDDF_HAUPTOPP] != null ) { + String[] splittedStringHOpp = doc.field[Const.gDDF_HAUPTOPP].split(" \\| ") + def lRetCodeHOpp = splittedStringHOpp.size() + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedStringHOpp[0] != null && !splittedStringHOpp[0].equals("") ) { + doc.field[Const.gDDF_HAUPTOPP] = splittedStringHOpp[0] + } + } + } + } + + /** + * Beschreibung + * @author + * @see InsertEntry, SearchEntry + * @return keine Rückgabe; im Hintergrund wird die Projektnummer und ggf. Projektleiter und Vertreter gesetzt + */ + public static int splitProjekt(D3Interface d3, Document doc, DocumentType docType, User user, String entrypoint) { + d3.log.info("Start Functions splitProjekt"); + + if( doc.field[Const.gDDF_PROJNR] != null && !doc.field[Const.gDDF_PROJNR].equals("") && doc.field[Const.gDDF_PROJNR].length() >= 14 ) { + def h_projnr = doc.field[Const.gDDF_PROJNR].substring(0,14) + doc.field[Const.gDDF_PROJNR] = h_projnr + } + + if(!entrypoint.equals("SEARCH")) { + def lProjLeiterDok = doc.field[Const.gDDF_PROJLEITER] + if( docType.getId().equals(Const.gDTS_DPROO) && lProjLeiterDok == null ) { + List lProjBet = new ArrayList<>() + def lProjBetCount + def lRealNameUser = user.getRealName() + def lProjLeiterDokVertr = doc.field[Const.gDDF_ORGPROJVERT] + def lProjNo = doc.field[Const.gDDF_PROJNR] + // TODO Prüfung notwendig + def lUserFull = lRealNameUser + " (" + user.id() + ")" + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_PROJLEITER} as lProjLeiterProj, dok_dat_feld_${Const.gDDF_ORGPROJVERT} as lProjLeiterProjVertr " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_PROJNR} = '${lProjNo}' " + + "AND kue_dokuart = '${Const.gDTS_APROJ}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + def lProjLeiterProj = sqlResult.getAt(0).get("lProjLeiterProj") + def lProjLeiterProjVertr = sqlResult.getAt(0).get("lProjLeiterProjVertr") + if( lProjLeiterProj.equals(lUserFull) ) { + doc.field[Const.gDDF_PROJLEITER] = lProjLeiterProj + } else if ( lProjLeiterProjVertr.equals(lUserFull) ) { + doc.field[Const.gDDF_ORGPROJVERT] = lProjLeiterProjVertr + } else { + // 31.07.2017 Fehlergefahr: Anwender wählt zuerst Projekt mit 10 Berechtigten und dann nur mit 5, bleiben überz. Zeilen bestehen? + def sqlStatementProjBet = "SELECT mv.value_char as lProjBet " + + "FROM firmen_spezifisch fs " + + "LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id " + + "WHERE fs.dok_dat_feld_${Const.gDDF_PROJNR} = '${lProjNo}' " + + "AND mv.field_no = '${Const.gDDF_PROJBER}' " + + "AND fs.kue_dokuart = '${Const.gDTS_APROJ}' " + List sqlResultProjBet = d3.sql.executeAndGet(sqlStatementProjBet); + lProjBetCount = sqlResultProjBet.size() + for( GroovyRowResult grr : sqlResultProjBet) { + lProjBet.add(grr.get("lProjBet")) + } + for(int i=0; i < lProjBetCount; i++) { + if ( lProjBet.get(i).equals(lUserFull) ) { + doc.field[Const.gDDF_PROJBER][i] = lUserFull + } + } + } + } + } + } + return 0 + } + + + /** + * Beschreibung + * @author + * @see SearchEntry + * @return + */ + public static void splitProjektnummer(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitProjektnummer"); + + // Ermittlung in welchen Dokumentarten die Eigenschaft Projektnummer vorkommt + def sqlStatementProj = "SELECT DISTINCT kue_dokuart as dokuArt " + + "FROM fispe_titel_dokuart " + + "WHERE repository_id = '${SystemSpecificConst.gProjektNrID}' " + List sqlResultProj = d3.sql.executeAndGet(sqlStatementProj); + List dokuartenProj = new ArrayList<>() + if(sqlResultProj != null) { + for(GroovyRowResult grr : sqlResultProj) { + dokuartenProj.add(grr.get("dokuArt")) + } + } + //Splitten der zusammengesetzten Strings Projektnummer und Submission nach Projektnummer + if( dokuartenProj.contains(docType.getId()) ) { + if( doc.field[Const.gDDF_AUFTRNR] != null ) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedString != null && splittedString[0] != null && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_AUFTRNR] = splittedString[0] + } + } + } + } + + + /** + * Splittet den zusammengesetzten Wert der Belegnummer + * @author Service + * @see SearchEntry, UpdateEntry, NewVersionEntry, InsertEntry + * @return keine Rückgabe; im Hintergrund wird die Belegnummer gesetzt + */ + public static void splitServBelegnummer(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitServBelegnummer"); + + if( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) || docType.getId().equals(Const.gDTS_DSER1 ) && doc.field[Const.gDDF_BELEGNUMMER] != null ) { + if(doc.field[Const.gDDF_BELEGNUMMER] != null) { + String[] splittedString = doc.field[Const.gDDF_BELEGNUMMER].split("\\s+"); + if( splittedString != null && splittedString[0] != null && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_BELEGNUMMER] = splittedString[0]; + } + } + + // 13.07.2020 Ergänzung um weitere BelegNummer + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereBelegNrID) ) { + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_WEITEREBELEGNR][i] != null) { + String[] splittedString = doc.field[Const.gDDF_WEITEREBELEGNR][i].split("\\s+"); + if( splittedString != null && splittedString[0] != null && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_WEITEREBELEGNR][i] = splittedString[0]; + } + } + } + } + } + } + + + /** + * Splittet den zusammengesetzten Wert der SR_ID + * @author Service + * @see SearchEntry, UpdateEntry, NewVersionEntry, InsertEntry + * @return keine Rückgabe; im Hintergrund wird die SR_ID gefüllt + */ + public static void splitServSrId(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitServSrId"); + + // 12.04.2021: Ergänzung für Globale Suche + if(docType.getId().equals(Const.gDTS_DUMMY) && doc.field[Const.gDDF_SRID] != null) { + String[] splittedString = doc.field[Const.gDDF_SRID].split(" \\| "); + if( splittedString != null && splittedString.size() > 0 ) { + doc.field[Const.gDDF_SRID] = splittedString[0].trim(); + } + } + + // phoer 20191024: Splitten der zusammengesetzten Strings SR-ID, Beschreibung + // calb 20251204: Anpassen der Validierung + if( ( docType.getId().equals(Const.gDTS_DSERE) || docType.getId().equals(Const.gDTS_ASERE) || docType.getId().equals(Const.gDTS_DSER1) ) && doc.field[Const.gDDF_SRID] != null ) { + String[] splittedString; + if( doc.field[Const.gDDF_SRID] != null ) { + splittedString = doc.field[Const.gDDF_SRID].split(" \\| "); + if(splittedString != null) { + def lRetCodeSR = splittedString.size(); + d3.log.error( "splitServSrId " + lRetCodeSR ) + if( lRetCodeSR > 1 ) { + doc.field[Const.gDDF_SRID] = splittedString[0].trim(); + doc.field[Const.gDDF_SVBESCHREIBUNG] = splittedString[1].trim(); + } + else + { + // split() liefert nur ein Element => (nur) die ID ist gegeben + String dummyvalue = splittedString[0].trim(); + def sql = "select dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} as val FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ASERE}' AND dok_dat_feld_${Const.gDDF_SRID} = '${dummyvalue}'"; + def resultset = d3.sql.executeAndGet(sql); + if ( resultset.size() > 0 ) + { + doc.field[Const.gDDF_SVBESCHREIBUNG] = resultset[ 0 ]["val"]; + } + } + } + } + } + + // 19.02.2020 imue - auch hier gibt es die SRID + if( ( docType.getId().equals(Const.gDTS_DSEBE) || docType.getId().equals(Const.gDTS_ASEBE) || docType.getId().equals(Const.gDTS_DSER1) ) && doc.field[Const.gDDF_SRID] != null ) { + String[] splittedString = doc.field[Const.gDDF_SRID].split(" \\| "); + if( splittedString != null && splittedString.size() > 0 ) { + doc.field[Const.gDDF_SRID] = splittedString[0].trim(); + } + } + + // 13.07.2020 Ergänzung um weitere BelegNummer + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereSRIDID) ) { + for(int i = 1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_WEITERESRID][i] != null) { + String[] splittedString = doc.field[Const.gDDF_WEITERESRID][i].split("\\|"); + if( splittedString != null && splittedString[0] != null && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_WEITERESRID][i] = splittedString[0].trim(); + } + } + } + } + + } + + + /** + * Splitten des zusammengesetzten Strings PSP Element und Validierung + * @author + * @see + * @return + */ + public static String splitFunction( D3Interface d3, Document doc, def lDocTypeShort ) { + d3.log.info("Start Functions splitFunction"); + + if(doc.field[Const.gDDF_FUNKTION] != null) { + + // Splitten des zusammengesetzten Strings PSP Element + if( doc.field[Const.gDDF_FUNKTION].toString().indexOf("|") > 0 ) { + String[] splittedString = doc.field[Const.gDDF_FUNKTION].split("\\|") + if( splittedString != null && splittedString.size() > 0 && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_FUNKTION] = splittedString[0].trim() + } + } + + d3.log.info("Validierung der Funktion") + + //vars fktName = bausteinSucheFunktion() // Tabelle und SAP-Baustein für die Ermittlung der Lieferantenstammdaten + def suchstrName + def lLanguage + def lNetzplan + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = "DE" + } + + if( doc.field[Const.gDDF_FUNKTION] != null && !doc.field[Const.gDDF_FUNKTION].equals("") ) { + suchstrName = doc.field[Const.gDDF_FUNKTION] + d3.log.info("Der Suchstring hat folgenden Wert: << ${suchstrName} >> ") + } + + def lRetCode + //String aufsplitten + if(doc.field[Const.gDDF_NPN] != null) { + String[] splittedStringSec = doc.field[Const.gDDF_NPN].split("\\|") + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedStringSec != null && splittedStringSec.size() > 0 ) { + if(splittedStringSec[0] != null) { + lNetzplan = splittedStringSec[0].trim() + } + } else { + lNetzplan = doc.field[Const.gDDF_NPN].trim() + } + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/NetworkFunctionRelationSet?\$filter=NetworkNo%20eq%20'${lNetzplan}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url != null) { + + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + + def Anzahl_Treffer = arr.length() + List lErgebnis = new ArrayList<>(); + + if( Anzahl_Treffer == 0 ) { + return "FEHLER" + } else { + for (int i = 0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + + String lFUNCTION = metadataObj.getString("FunctionIdNo"); + String lFUNCTIONNAME = metadataObj.getString("Description"); + //d3.log.error( "Funktion: " + ${lFUNCTION} + "|" + ${lFUNCTIONNAME}) + + lErgebnis.add(lFUNCTION) + } + for(int i = 0; i 0) { + // Splitten des zusammengesetzten Strings PSP Element + String[] splittedString = doc.field[Const.gDDF_MODUL].split("\\|") + def lReturn = splittedString.size() + if( lReturn > 0 && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_MODUL] = splittedString[0].trim() + } + } + + d3.log.info("Validierung des Modul") + + def suchstrName + def lLanguage + def lNetzplan + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = "DE" + } + + // 11.10.2022 imue: 00267558 + if(doc.field[Const.gDDF_FUNKTION] != null) { + String[] splittedStringSec = doc.field[Const.gDDF_FUNKTION].split("\\|") + def lRetCode = splittedStringSec.size() + if( lRetCode > 0 && !splittedStringSec[0].equals("") ) { + doc.field[Const.gDDF_FUNKTION] = splittedStringSec[0].trim() + } + if ( lRetCode >= 0 && doc.field[Const.gDDF_NPN] != null ) { + String[] splittedStringThird = doc.field[Const.gDDF_NPN].split("\\|") + lRetCode = splittedStringThird.size() + if( lRetCode > 0 && !splittedStringThird[0].equals("") ) { + lNetzplan = splittedStringThird[0].trim() + } else { + String netzplanTemp = doc.field[Const.gDDF_NPN] + if(netzplanTemp != null) { + lNetzplan = netzplanTemp.trim() + } + } + } else { + d3.log.error("Validate: Das Feld Funktion konnte nicht gesplittet werden! Returncode = ${lRetCode}") + } + } + if(lNetzplan != null) { + lNetzplan = lNetzplan.trim(); + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/NetworkFunctionModuleRelationSet?\$filter=NetworkNo%20eq%20'${lNetzplan}'%20and%20FunctionIdNo%20eq%20'${doc.field[Const.gDDF_FUNKTION]}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + List lErgebnis = new ArrayList<>(); + + if( arr.length() == 0 || arr == null) { + return "FEHLER" + } else { + for (int i=0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + def lMODULE = metadataObj.getString("ModuleIdNo") + def lMODULENAME = metadataObj.getString("Description") + // d3.log.error( "Modul: " + lMODULE + "|" + lMODULENAME + "|" + doc.field[Const.gDDF_MODUL]) + + lErgebnis.add(lMODULE) + } + + for( int i=0; i < arr.length(); i++) { + if( lErgebnis.get(i).equals(doc.field[Const.gDDF_MODUL]) ) { + // d3.log.error( "Gültige Materialnummer ausgewählt" ) + return "OK" + } else if( i == arr.length()-1 ) { + return "FEHLER" + } + } + } + } + } catch(Exception e) { + d3.log.error("stringSplitModule - Verbindung zu OData nicht möglich") + return "FEHLERODATA" + } + } + return "FEHLERFUNKTION" + } + + /** + * Splittet den zusammengesetzten Usernamen in den Einzelwert + * @author Unterstützende Prozesse + * @see UpdateEntry, NewVersionEntry + * @return Einfacher Username + */ + public static void splitUser( D3Interface d3, Document doc ) { + d3.log.info("Start Functions splitUser"); + + def ld3user + for( int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++ ) { + ld3user = doc.field[Const.gDDF_D3USER67][i] + if( ld3user != null ) { + String[] splittedString = ld3user.split("\\=") + if(splittedString != null && splittedString.size() > 0) { + doc.field[Const.gDDF_D3USER67][i] = splittedString[0].trim() + } + } + } + } + + /** + * Splittet den zusammengesetzten Wert Equipment + * @author Equipment + * @see SearchEntry, UpdateEntry, NewVersionEntry, InsertEntry + * @return keine Rückgabe; im Hintergrund wird Equipment gesetzt + */ + public static void splitEquipment(D3Interface d3, Document doc, DocumentType docType, String entryPoint) { + d3.log.info("Start Functions splitEquipment ${docType.id()}"); + + if( checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gEquipmentID) == true ) { + if( doc.field[Const.gDDF_EQUIPMENT] != null ) { + String[] splittedString = doc.field[Const.gDDF_EQUIPMENT].split("\\|"); + if( splittedString != null && splittedString.size() > 0 ) { + if( splittedString.size() >= 3 ) { + doc.field[Const.gDDF_EQUIPMENT] = splittedString[0].trim(); + if(entryPoint != null && !entryPoint.equals("SEARCH")) { + doc.field[Const.gDDF_NPN] = splittedString[1].trim(); + doc.field[Const.gDDF_SVBESCHREIBUNG] = splittedString[2].trim(); + } + } + } + } + } + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true ) { + 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) { + String[] splittedString = currentEquipment.split("\\|"); + if( splittedString != null && splittedString.size() > 0 ) { + if( splittedString.size() > 0 ) { + doc.field[Const.gDDF_WEITEREEQUIPMENT][i] = splittedString[0].trim(); + } + } + } + } + } + } + + /** + * Splittet den zusammengesetzten Wert Equipments + * @author Service / Equipment + * @see SearchEntry, UpdateEntry, NewVersionEntry, InsertEntry + * @return keine Rückgabe; im Hintergrund wird Equipment gesetzt + */ + public static void splitEquipments(D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions splitEquipments ${docType.id()}"); + if( checkIfRepoIDExistsInDocType(d3, docType, SystemSpecificConst.gEquipmentsID) == true ) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_EQUIPMENTS][i] != null ) { + String[] splittedString = doc.field[Const.gDDF_EQUIPMENTS][i].split(" \\| "); + if( splittedString != null && splittedString.size() > 0 ) { + doc.field[Const.gDDF_EQUIPMENTS][i] = splittedString[0].trim(); + } + } + } + } + } + + /** + * Wenn ein weiteres Angebot zur Opportunity angelegt werden soll, setze alle Ergebnisdokumente des bisherigen Angebots, + * die auf Ja standen, auf Nein + * @author + * @see + * @return + */ + public static void updResultDoc( D3Interface d3, Document doc ) { + d3.log.info("Start Functions updResultDoc"); + + def lReturn + def lResultDoc + int childrenListSize = 0; + + // String[] children = d3.call.link_get_children(doc.id(), "d3groovy") -> wenn das Dokument nicht mehr verknüpft war, dann liefert diese Funktion keine Ergebnisse + String sqlStatementChildren = "SELECT doku_id as dokId " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_DOPPD}' " + + "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' " + + "AND dok_dat_feld_${Const.gDDF_OPPANNr} = '${doc.field[Const.gDDF_OPPANNr]}' " + + "AND dok_dat_feld_${Const.gDDF_ERGEBNISDOK} = 'Ja'"; + List children = d3.sql.executeAndGet(sqlStatementChildren); + if(children != null) { + childrenListSize = children.size(); + } + + if( childrenListSize > 0 ) { + for(GroovyRowResult grrChild : children) { + + //Hole dir für jedes Kind Dokument den Wert aus dem Feld Ergebnisdokument (ja,nein) + def sqlStatement = "SELECT fs.dok_dat_feld_${Const.gDDF_ERGEBNISDOK} as lResultDoc , pd.frei_o_gesperrt as lBlocked " + + "FROM firmen_spezifisch fs , phys_datei pd " + + "WHERE fs.doku_id = pd.doku_id " + + "AND fs.doku_id = '${grrChild.get("dokId")}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lResultDoc = sqlResult.getAt(0).get("lResultDoc") + String lBlocked = sqlResult.getAt(0).get("lBlocked") + + //Wenn Ergebnisdokument = Ja und Dokument nicht gesperrt + if( lResultDoc != null && lResultDoc.equals("Ja") && !lBlocked.equals("g") ) { + + def docIdTemp = grrChild.get("dokId"); + Document docTempUpdate = d3.archive.getDocument(docIdTemp) + if(docTempUpdate != null) { + docTempUpdate.field[Const.gDDF_ERGEBNISDOK] = "Nein" + try { + docTempUpdate.updateAttributes("d3groovy", true) + d3.log.info( "Der Status zum Ergebnisdokument für das Angebotsdokument ${grrChild.get("dokId")} wurde erfolgreich aktualisiert!" ) + } 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) + d3.log.error( "Der Status zum Ergebnisdokument für das Angebotsdokument ${grrChild.get("dokId")} wurde NICHT erfolgreich aktualisiert!" ) + } + // in JPL waren die Parameter alle geleert, daher immer default verwenden + d3.call.document_send_to_dsearch( grrChild.get("dokId"), "", 0, "", false, "Fr", 0, "d3groovy") + } + } + } + } else{ + d3.log.error( "Die verknüpften Dokumente zu Angebot ${doc.id()} konnten nicht ermittelt werden!") + } + } + + /** + * Prüfung ob ECR Aktivitäts_ID valide ist + * @author Maschinenprojekt + * @see Insert + * @see Update + * @see NewVersion + * @return Wenn die ID nicht valide ist, dann Abbruch und Meldung an den Benutzer, ansonsten wird die ID und/oder die Beschreibung gesetzt + */ + public static int validateActivity( D3Interface d3, Document doc, def pEntry) { + d3.log.info("Start Functions validateActivity"); + + def lReturnActivity + def lReturnDescription + def lInvalidData + def lECRAtivityID + def lECRDescription + def lRowCount + def lAuftragsnummer + + lReturnActivity = doc.field[Const.gDDF_AUFTRNR].indexOf("|") + if( lReturnActivity > 0 ) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + lReturnActivity = splittedString.size() + lAuftragsnummer = splittedString[0].trim() + } else { + lAuftragsnummer = doc.field[Const.gDDF_AUFTRNR] + } + + lReturnActivity = 0 + + if( doc.field[Const.gDDF_AKTIVITAETSID] != null && !doc.field[Const.gDDF_AKTIVITAETSID].equals("") ) { + + String[] splittedString = doc.field[Const.gDDF_AKTIVITAETSID].split("\\|") + lReturnActivity = splittedString.size() + if( lReturnActivity == 2 ) { + doc.field[Const.gDDF_AKTIVITAETSID] = splittedString[0].trim() + } + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_AKTIVITAETSID} as lECRActivityID, dok_dat_feld_${Const.gDDF_BESCHREIBUNG} as lECRDescription " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lAuftragsnummer}' " + + "AND kue_dokuart = '${Const.gDTS_AMECR}' " + + "AND dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${doc.field[Const.gDDF_AKTIVITAETSID]}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if( sqlResult.size() == 1 && pEntry.equals("Insert") ) { + doc.field[Const.gDDF_BESCHREIBUNG] = sqlResult.getAt(0).get("lECRDescription") + } + else if( sqlResult.size() < 1 ) { + lInvalidData = 1 + } + + } else { + lInvalidData = 1 + } + + if( lInvalidData == 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) + } + return 1 + } + return 0 + } + + /** + * Validierung der Eingaben bei administrativen Akten + * @author Administration + * @see InsertEntry + * @return Rückgabe; im Hintergrund wird die Belegart gesetzt + */ + public static int validateAdminFolder( D3Interface d3, Document doc, String entryPoint ) { + d3.log.info("Start Functions validateAdminFolder"); + + // Register innerhalb administrative Folder muss immer einen Schlüssel aus administrative Translation enthalten + if(doc.getType().getId().equals(Const.gDTS_AAFOL) && doc.field[Const.gDDF_REGISTER] != null) { + String sqlSatement = """SELECT dok_dat_feld_${Const.gDFF_SCHLUESSEL} + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} = ? """; + List params = [ + Const.gDTS_AZTXT, + doc.field[Const.gDDF_REGISTER] + ]; + List sqlResult = d3.sql.executeAndGet(sqlSatement, params); + if(sqlResult != null) { + if(sqlResult.size() >= 1) { + // Eintrag erlaubt - es wurde ein Schlüssel aus den administrative Translation gewählt + return 0; + } else { + d3.hook.setProperty("additional_info_text", "Registereintrag nicht als Schlüssel in den administrative Translations hinterlegt") + return 1; + } + } + } + + // Übersetzungen innerhalb der administrative Translation müssen eindeutig sein + if(doc.getType().getId().equals(Const.gDTS_AZTXT)) { + + if(doc.field[Const.gDFF_SCHLUESSEL] != null) { + + String sqlStatementKey = null; + if(entryPoint != null && entryPoint.equals("INSERT")) { + sqlStatementKey = """SELECT doku_id + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} = ? """; + } else { + // Prüfung ob es den eingegebenen Key schon gibt + sqlStatementKey = """SELECT doku_id + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} = ? + AND doku_id != '${doc.id()}' """; + } + + if(sqlStatementKey != null) { + List paramsKey = [ + Const.gDTS_AZTXT, + doc.field[Const.gDFF_SCHLUESSEL].toString().trim() + ]; + List sqlResultKey = d3.sql.executeAndGet(sqlStatementKey, paramsKey); + + if(sqlResultKey != null) { + if(sqlResultKey.size() >= 1) { + + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_ISOCODE][i] != null && (doc.field[Const.gDDF_UEBERSETZUNG][i])) { + + String sqlStatement = null; + if(entryPoint != null && entryPoint.equals("INSERT")) { + sqlStatement = """SELECT fs.doku_id + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv1 ON fs.doku_id = mv1.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id + WHERE fs.kue_dokuart = ? + AND fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} = ? + AND mv1.field_no = ? + AND mv1.value_char = ? + AND mv2.field_no = ? + AND mv2.value_char = ? """; + } else { + // Wenn ja, dann Prüfung ob die eingetragene Übersetzung mit der Übersetzung der gefundenen Akte übereinstimmt + sqlStatement = """SELECT fs.doku_id + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv1 ON fs.doku_id = mv1.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id + WHERE fs.kue_dokuart = ? + AND fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} = ? + AND mv1.field_no = ? + AND mv1.value_char = ? + AND mv2.field_no = ? + AND mv2.value_char = ? + AND fs.doku_id != '${doc.id()}' """; + } + + if(sqlStatement != null) { + List params = [ + Const.gDTS_AZTXT, + doc.field[Const.gDFF_SCHLUESSEL].toString().trim(), + Const.gDDF_ISOCODE, + doc.field[Const.gDDF_ISOCODE][i], + Const.gDDF_UEBERSETZUNG, + doc.field[Const.gDDF_UEBERSETZUNG][i].toString().trim() + ]; + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + + if(sqlResult != null) { + if(sqlResult.size() >= 1) { + // Kombination gibt es schon, somit keine Wertemengeverletzung + } else { + // Kombination nicht erlaubt + d3.hook.setProperty("additional_info_text", "Dieser Schlüssel existiert bereits, jedoch mit einer anderen Übersetzung. Position = ${i} "); + return 1; + } + } + } + } + } + } else { + // Key gibt es noch nicht + // Prüfung ob die eingetragene Übersetzung bereits vorhanden ist und es somit eventuell zur einer Logikverletzung kommt + // Achtung: Hier werden mehrere Eigenschaften administriert (AK = Akte, PA = Prozessart, PZ = Prozess, DG = Dokumengruppe) + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + + if(doc.field[Const.gDDF_ISOCODE][i] != null && (doc.field[Const.gDDF_UEBERSETZUNG][i])) { + + String sqlStatement = null; + if(entryPoint != null && entryPoint.equals("INSERT")) { + sqlStatement = """SELECT DISTINCT fs.doku_id + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv1 ON fs.doku_id = mv1.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id + WHERE fs.kue_dokuart = ? + AND mv1.field_no = ? + AND mv1.value_char = ? + AND mv2.field_no = ? + AND mv2.value_char = ? + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} LIKE '%' + SUBSTRING('${doc.field[Const.gDFF_SCHLUESSEL]}', 1, 2) + '%' """; + } else { + sqlStatement = """SELECT DISTINCT fs.doku_id + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv1 ON fs.doku_id = mv1.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id + WHERE fs.kue_dokuart = ? + AND mv1.field_no = ? + AND mv1.value_char = ? + AND mv2.field_no = ? + AND mv2.value_char = ? + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} LIKE '%' + SUBSTRING('${doc.field[Const.gDFF_SCHLUESSEL]}', 1, 2) + '%' + AND fs.doku_id != '${doc.id()}' """; + } + + if(sqlStatement != null) { + List params = [ + Const.gDTS_AZTXT, + Const.gDDF_ISOCODE, + doc.field[Const.gDDF_ISOCODE][i], + Const.gDDF_UEBERSETZUNG, + doc.field[Const.gDDF_UEBERSETZUNG][i].toString().trim() + ]; + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + + if(sqlResult != null && sqlResult.size() >= 1) { + // Neuer Key, jedoch auf vorhadene Übersetzung nicht erlaubt + d3.hook.setProperty("additional_info_text", "Schlüssel neu, jedoch existiert die Übersetzung bereits. Position = ${i} "); + return 1 + } + } + } + } + } + } + } + } + } + + return 0; + } + + /** + * Validierung der Belegart zur ausgewählte Belegnummer + * @author Service + * @see InsertEntry, UpdateEntry, NewVersionEntry + * @return keine Rückgabe; im Hintergrund wird die Belegart gesetzt + */ + public static int validateBelegart( D3Interface d3, Document doc ) { + d3.log.info("Start Functions validateBelegart"); + + // Service + if(checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gBelegNrID) && checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gBelegArtID)) { + if(doc.field[Const.gDDF_BELEGNUMMER] != null) { + String sqlSatement = "SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}' "; + List sqlResult = d3.sql.executeAndGet(sqlSatement); + if(sqlResult != null && sqlResult.size() == 1) { + String belegTypTemp = sqlResult.getAt(0).get("val"); + if(belegTypTemp != null && !belegTypTemp.equals("")) { + if(doc.field[Const.gDDF_BELEGTYP] == null || !doc.field[Const.gDDF_BELEGTYP].equals(belegTypTemp) ) { + doc.field[Const.gDDF_BELEGTYP] = belegTypTemp; + } + } + } + } + } + + // Einkauf + if(checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEinkaufsBelegNrID)) { + if(doc.field[Const.gDDF_BELEGNUMMER] != null) { + String sqlSatement = """SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as val + FROM firmen_spezifisch + WHERE kue_dokuart = '${Const.gDTS_AEIBE}' + AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}' """; + List sqlResult = d3.sql.executeAndGet(sqlSatement); + if(sqlResult != null && sqlResult.size() == 1) { + String belegTypTemp = sqlResult.getAt(0).get("val"); + if(belegTypTemp != null && !belegTypTemp.equals("")) { + if(doc.field[Const.gDDF_BELEGTYP] == null || !doc.field[Const.gDDF_BELEGTYP].equals(belegTypTemp) ) { + doc.field[Const.gDDF_BELEGTYP] = belegTypTemp; + } + } + } + } + } + return 0; + } + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static int validateBuchungskreis( D3Interface d3, Document doc, def pEntry ) { + d3.log.info("Start Functions validateBuchungskreis"); + + // 2016-11-23/dkle: Ermittlung des Buchungskreises + // Hinweis: Die Validierung des Buchungskreises sichert gleichzeitig eine korrekte Eingabe der Kundenkontaktdaten (siehe validateKuKoID) ab. + // Wenn die Kundenkontakt-ID nicht leer ist, ermittele anhand der Projekt_Nr oder Opportunity_Nr + // Prüfung ob die Kundenkontakt-ID existiert ist + def lKukoID + def lKuKoIDError + def lKuKoSQL + def lKuKoRowCount + List lBuchkrDKUKO = new ArrayList<>(); + + lKukoID = doc.field[Const.gDDF_KONTAKTNUMMER]; + if( lKukoID != null && !lKukoID.equals("") ) { + if( !doc.field[Const.gDDF_OPPNUMMER].equals("") && doc.field[Const.gDDF_OPPNUMMER] != null) { + lKuKoSQL = "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '" + doc.field[Const.gDDF_OPPNUMMER] + "'" + } else { + lKuKoSQL = "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} IS NULL" + } + if( !doc.field[Const.gDDF_AUFTRNR].equals("") && doc.field[Const.gDDF_AUFTRNR] != null) { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '" + doc.field[Const.gDDF_AUFTRNR] + "'" + } else { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} IS NULL" + } + if( !doc.field[Const.gDDF_KNR].equals("") && doc.field[Const.gDDF_KNR] != null ) { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_KNR} = '" + doc.field[Const.gDDF_KNR] + "'" + } + // d3.log.error( "lKuKoSQL: ${lKuKoSQL}" ) + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_BUCHKREIS} as lBuchkrDKUKO " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${doc.field[Const.gDDF_KONTAKTNUMMER]}' " + + "AND kue_dokuart = '${Const.gDTS_AKONT}' " + lKuKoSQL + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lKuKoRowCount = sqlResult.size() + + if( sqlResult.size() > 0 ) { + for (GroovyRowResult grr : sqlResult) { + lBuchkrDKUKO.add(grr.get("lBuchkrDKUKO")) + } + } + + // d3.log.error( "lKuKoRowCount: ${lKuKoRowCount}" ) + // d3.log.error( "lBuchkrDKUKO[lKuKoRowCount]: ${lBuchkrDKUKO.get(lKuKoRowCount)}" ) + + if( lKuKoRowCount == 1 ) { + if( lBuchkrDKUKO.get(0) != null && pEntry.equals("Insert") ) { + doc.field[Const.gDDF_BUCHKREIS] = lBuchkrDKUKO.get(0) + } + if( lBuchkrDKUKO.get(0) != null && !pEntry.equals("Insert") ) { + // try { + // doc.updateAttributes("d3groovy") + // } 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 { + return -170 + } + } + return 0 + } + + /** + * Anhand der eindeutigen Eigenschaft in der Dokumentart wird der Buchungskreis ermittelt. + * Des Weiteren werden Intercompany und Regionalorganisation gesetzt. + * @author Maschine, Service, Equipment + * @see InsertEntry + * @return keine Rückgabe; im Hintergrund wird der Buchungskreis gesetzt + */ + public static int validateBuchungskreisInsert( D3Interface d3, Document doc, DocumentType docType) { + d3.log.info("Start Functions validateBuchungskreisInsert"); + + def lWhereClause + def lReturn + def lOppNR = doc.field[Const.gDDF_OPPNUMMER] + def lOrdNR = doc.field[Const.gDDF_AUFTRNR] + def lSRID = doc.field[Const.gDDF_SRID] + def lSBID = doc.field[Const.gDDF_BELEGNUMMER] + def lEquip = doc.field[Const.gDDF_EQUIPMENT] + if( lSRID != null && docType.getId().equals(Const.gDTS_DSERE) ) { + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_SRID} = '${lSRID}' AND kue_dokuart = '${Const.gDTS_ASERE}'" + } else if ( lSBID != null && docType.getId().equals(Const.gDTS_DSEBE) ) { + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lSBID}' AND kue_dokuart = '${Const.gDTS_ASEBE}'" + } else if ( lEquip != null && docType.getId().equals(Const.gDTS_DEQUI) ) { + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${lEquip}' AND kue_dokuart = '${Const.gDTS_AEQUI}'" + } else if ( doc.field[Const.gDDF_BELEGNUMMER] != null && docType.getId().equals(Const.gDTS_DEINK) ) { + // 17.01.2023 Ergänzung Einkauf + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${doc.field[Const.gDDF_BELEGNUMMER]}' AND kue_dokuart = '${Const.gDTS_AEIBE}'" + } else if( lOppNR != null ) { + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNR}' AND kue_dokuart = '${Const.gDTS_AOPPU}' " + } else if( lOrdNR != null ) { + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lOrdNR}' AND ( kue_dokuart = '${Const.gDTS_AMPRA}' OR kue_dokuart = '${Const.gDTS_APREN}' )" + } else if( docType.getId().equals(Const.gDTS_DKUKO) ) { + def lCustActID = doc.field[Const.gDDF_KONTAKTNUMMER] + def lCustActDate = doc.field[Const.gDDF_KONTAKTDATE] + def lCustActTitle = doc.field[Const.gDDF_KDAKTNAME] + if( lCustActID != null ) { + def lCustActIDSplit + String[] splittedString = lCustActID.split("\\|") + if(splittedString != null) { + lReturn = splittedString.size() + if( lReturn == 1 ) { + lCustActIDSplit = splittedString[0] + } else { + lCustActIDSplit = splittedString[1] + } + lWhereClause = "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${lCustActIDSplit}' AND kue_dokuart = '${Const.gDTS_AKONT}' " + } + } else { + lWhereClause = "WHERE kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND dok_dat_feld_${Const.gDDF_KDAKTNAME} = '${lCustActTitle}' " + + "AND convert(varchar,dok_dat_feld_${Const.gDDF_KONTAKTDATE},104) = '${lCustActDate}' " + } + } + def sqlStatement = "SELECT doku_id, dok_dat_feld_${Const.gDDF_BUCHKREIS} as lBuchK " + + "FROM firmen_spezifisch " + + "${lWhereClause} " + if(lWhereClause != null) { + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size() > 0) { + if(doc.field[Const.gDDF_BUCHKREIS] == null) { + def lBuchK = sqlResult.getAt(0).get("lBuchK") + if( lBuchK != null ) { + d3.log.info("Für das Dokument wurde der Buchungskreis ${lBuchK} gefunden") + doc.field[Const.gDDF_BUCHKREIS] = lBuchK + } else { + d3.log.error("Für den Import des Dokuments konnte kein Buchungskreis gefunden werden!") + } + } + + // 22.06.2020 Ergänzung der Intercompany für Berechtigungssteuerung + // 12.08.2020 Ergänzung Regionalorganisation gemäß E-Mail vom 05.08.2020 + String docIdKdKontakt = sqlResult.getAt(0).get("doku_id"); + if(docIdKdKontakt != null && !docIdKdKontakt.equals("")) { + Document docKdKontakt = d3.archive.getDocument(docIdKdKontakt); + if(docKdKontakt != null) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(docKdKontakt.field[Const.gDDF_BUCHKREIS68][i] != null && doc.field[Const.gDDF_BUCHKREIS68][i] == null) { + doc.field[Const.gDDF_BUCHKREIS68][i] = docKdKontakt.field[Const.gDDF_BUCHKREIS68][i]; + } + if(docKdKontakt.field[Const.gDDF_REGIONALORG][i] != null && doc.field[Const.gDDF_REGIONALORG][i] == null) { + doc.field[Const.gDDF_REGIONALORG][i] = docKdKontakt.field[Const.gDDF_REGIONALORG][i]; + } + } + } + } + + } + } + return 0; + } + + /** + * Prüfung ob eine Angebotsversion in die ein Angebotsdokument als Ergebnisdokument archiviert werden soll, bereits im Status angenommen oder geschlossen ist + * @author Opportunity + * @see Insert, Update, NewVersion + * @return Wenn eine Angebotsversion angenommen oder geschlossen ist, Meldung an User das kein Angebotsdokument mit Ergebnisdokument = ja archiviert werden darf + */ + public static int validateErgebnisdokumenteAngebot(D3Interface d3, Document doc, User user) { + d3.log.info("Start Functions validateErgebnisdokumenteAngebot"); + + + def lANVersendet + def lANNewOffer + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_ANSTATUS} as lANVersendet, dok_dat_feld_${Const.gDDF_ANNEU} as lANNewOffer " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_ANNAME} = ? " + + "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? " + + "AND dok_dat_feld_${Const.gDDF_OPPANNr} = ? " + + "AND kue_dokuart = '${Const.gDTS_AREGI}' "; + List params = [ + doc.field[Const.gDDF_ANNAME], + doc.field[Const.gDDF_OPPNUMMER], + doc.field[Const.gDDF_OPPANNr] + ]; + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + if(sqlResult != null && sqlResult.size() > 0) { + lANVersendet = sqlResult.getAt(0).get("lANVersendet") + lANNewOffer = sqlResult.getAt(0).get("lANNewOffer") + + // 06.03.2023 imue: Anpassungen aufgrund Änderungen Quicktag.dxp + if( (lANVersendet != null && (lANVersendet.toString().startsWith("versendet") || lANVersendet.toString().startsWith("angenommen") || lANVersendet.toString().startsWith("geschlossen"))) || + (lANNewOffer != null && (lANNewOffer.toString().startsWith("Ja, mit Dokumenten") || lANNewOffer.toString().startsWith("Ja, ohne Dokumente"))) ) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT009049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT009001) + } + + // Ausschluss vom d3_async aufgrund Stammdatenaktualisierung + if(user != null && !user.id().equals("d3_async")) + { + d3.log.error( "Eine der Angebotsakten in die Sie importieren moechten ist versendet, oder bereits angenommen. Es koennen keine weiteren Ergebnisdokumente abgelegt werden. Erstellen Sie ein neues Angebot, oder importieren Sie ein Basisdokument ohne Ergebnischarakter." ) + return -170 + } + } + } + return 0; + } + + /** + * Prüfung ob ECR Change Order (Akte) in dem ein ECR CO Dokument archiviert werden soll, bereits im Status Genehmigung ist + * @author Maschinenprojekt + * @see Insert + * @see Update + * @see NewVersion + * @return Wenn ECR Change Order genehmigt ist, Meldung an User das kein ECR CO Dokument mit Ergebnisdokument = ja archiviert werden darf + */ + public static int validateErgebnisdokumenteECR(D3Interface d3, Document doc, User user) { + d3.log.info("Start Functions validateErgebnisdokumenteECR"); + + def userName = "" + if(user != null) { + userName = user.id() + } + def lOrdNo = doc.field[Const.gDDF_AUFTRNR] + def lActNo = doc.field[Const.gDDF_AKTIVITAETSID] + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedString[0] != null ) { + lOrdNo = splittedString[0] + } + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_ECRSTATUS} as lECRState " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lOrdNo}' " + + "AND dok_dat_feld_${Const.gDDF_AKTIVITAETSID} = '${lActNo}' " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + def lECRState = sqlResult.getAt(0).get("lECRState") + // E0003 = Genehmigung + if( lECRState.equals("E0003") ) { + // dkle, 11.12.2018: Ausnahme für den Import per Hostimport + if( userName.equals("hostimp") ) { + doc.field[Const.gDDF_ERGEBNISDOK] = "Nein" + doc.setText(4, "ToCopy") + } else { + // Meldung an den Benutzer, dass die Projektnummer gefüllt werden muss + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT003049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT003001) + } + d3.log.error( "Sie versuchen ein Ergebnisdokument in einen genehmigten ECR zu importieren. Bitte korrigieren Sie Ihre Eingabe." ) + return -170 + } + } + return 0 + } + + + /** + * Prüfung des Kunden anhang der Kundennummer oder des Kundennamens, abhängig von der Eingabe und des Anwendungsfalls. + * @author Maschinenprojekt, Opportunity, Service, Kundenmanagement + * @see Insert + * @see Update + * @see NewVersion + * @return Wenn der Kunde nicht valide ist, dann Abbruch und Meldung an den Benutzer, das ein valider Kunde ausgewählt werden muss. + */ + public static int validateKunden(D3Interface d3, Document doc, DocumentType docType, User user, String entrypoint) { + d3.log.info("Start Functions validateKunden"); + + def lKDNr = doc.field[Const.gDDF_KNR] + def lKDName = doc.field[Const.gDDF_KNAME] + def lKDNrSplit + def lKDNameSplit + def lValidateKDName + def lCustomerCount + + def userName = "" + if(user != null) { + userName = user.id(); + } + + String[] splittedString + + if( doc.field[Const.gDDF_KNR] != null) { + def lReturn = doc.field[Const.gDDF_KNR].indexOf("|") + if( lReturn > 0 ) { + lKDNrSplit = 1 + } + } + if( doc.field[Const.gDDF_KNAME] != null ) { + def lReturn2 = doc.field[Const.gDDF_KNAME].indexOf("|") + if( lReturn2 > 0 ) { + lKDNameSplit = 1 + } + } + + if( lKDNr != null && lKDName == null && lKDNrSplit == 1 ) { + splittedString = lKDNr.split("\\|") + } else if ( lKDNr == null && lKDName != null && lKDNameSplit == 1 ) { + splittedString = lKDName.split("\\|") + } else if ( lKDNr != null && lKDName != null && lKDNrSplit == 1 ) { + splittedString = lKDNr.split("\\|") + } else if( lKDNr != null && lKDName == null && lKDNrSplit != 1 ) { + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as lValidateKDName " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0) { + lValidateKDName = sqlResult.getAt(0).get("lValidateKDName") + lCustomerCount = sqlResult.size() + } + + if( lCustomerCount != 1 ) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT020049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT020001) + } + d3.log.error( "Bitte geben Sie einen gültigen Kunden an." ) + return -170 + } else if( entrypoint.equals("insert")) { + doc.field[Const.gDDF_KNAME] = lValidateKDName + } + + + } else { + + if( entrypoint.equals("update")) { + + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as lValidateKDName " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if(sqlResult != null && sqlResult.size() > 0) { + lValidateKDName = sqlResult.getAt(0).get("lValidateKDName") + } + lCustomerCount = sqlResult.size() + + } else if( entrypoint.equals("insert")) { + + if( user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) ) { + def tmpKdNr = doc.field[Const.gDDF_KNR] + def tmpKdName = doc.field[Const.gDDF_KNAME] + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as lValidateKDName " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if( sqlResult != null && sqlResult.size() > 0) { + lCustomerCount = sqlResult.size() + lValidateKDName = sqlResult.getAt(0).get("lValidateKDName") + } + } else { + + if( docType.getId().equals(Const.gDTS_DKUKO) && ( doc.field[Const.gDDF_OPPNUMMER] != null || doc.field[Const.gDDF_AUFTRNR] != null ) ) { + def lProjNrTMP + def lOppNrTMP + def lAndClause = "" + // da splittedString oben global gesetzt wird, hier vorsichtshalber leeren + splittedString = null; + if ( doc.field[Const.gDDF_OPPNUMMER] != null ) { + def lReturn = doc.field[Const.gDDF_OPPNUMMER].indexOf("|") + if( lReturn > 0 ) { + splittedString = doc.field[Const.gDDF_OPPNUMMER].split("\\|") + lReturn = splittedString.size() + lOppNrTMP = splittedString[0] + lAndClause = "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNrTMP}' " + } else { + lAndClause = "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' " + } + } + if( doc.field[Const.gDDF_AUFTRNR] != null ) { + def lReturn = doc.field[Const.gDDF_AUFTRNR].indexOf("|") + if( lReturn > 0 ) { + splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + lReturn = splittedString.size() + lProjNrTMP = splittedString[0] + lAndClause = "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNrTMP}' " + } else { + lAndClause = "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}' " + } + } + // 29.05.2020 imue Ergänzung um Kundenkontakt-Id weil ansonsten nicht eindeutig + def sqlStatement = "SELECT DISTINCT f.dok_dat_feld_${Const.gDDF_KNR} as lKdNr, f.dok_dat_feld_${Const.gDDF_KNAME} as lKdName " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "${lAndClause} " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if( sqlResult != null && sqlResult.size() > 0) { + def pRowCount = sqlResult.size() + if( pRowCount == 1 ) { + doc.field[Const.gDDF_KNR] = sqlResult.getAt(0).get("lKdNr") + doc.field[Const.gDDF_KNAME] = sqlResult.getAt(0).get("lKdName") + } else { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT020049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT020001) + } + d3.log.error( "Bitte geben Sie einen gültigen Kunden an." ) + return -170 + } + } + } + + // 27.07.2020 imue Validierung des Kundennames entfernt + // Es führte im Produktivsystem dazu, das wenn ein User versuchte per Drag und Drop ein Dokument auf eine Kundenaktivitätsakte abzulegen + // und der Name auf dieser Akte nicht mit der Kundenakte übereinstimmte, keine Ablage möglich war! + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as lValidateKDName " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if( sqlResult != null && sqlResult.size() > 0) { + lCustomerCount = sqlResult.size() + lValidateKDName = sqlResult.getAt(0).get("lValidateKDName") + } + } + } + + if( lCustomerCount != 1 ) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT020049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT020001) + } + d3.log.error( "Bitte geben Sie einen gültigen Kunden an." ) + return -170 + } + } + + if(splittedString != null) { + if( splittedString[0] != null || ( doc.field[Const.gDDF_KNR] != null && doc.field[Const.gDDF_KNAME] != null ) ) { + if( splittedString[0] != null ) { + doc.field[Const.gDDF_KNR] = splittedString[0] + } + + def sqlStatement = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as lValidateKDName " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}' " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND pd.doku_id = fs.doku_id " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + if( sqlResult != null && sqlResult.size() > 0) { + lValidateKDName = sqlResult.getAt(0).get("lValidateKDName") + lCustomerCount = sqlResult.size() + } + } + } + + if( lCustomerCount != 1 ) { + if( d3.remote.getLanguage().equals("049") ) { + d3.hook.setProperty("additional_info_text", Const.gADITXT020049) + } else { + d3.hook.setProperty("additional_info_text", Const.gADITXT020001) + } + d3.log.error( "Bitte geben Sie einen gültigen Kunden an." ) + return -170 + } + return 0 + } + + /** + * Beschreibung + * @author Opportunity + * @see InsertEntry, NewVersionEntry, ValidateUpdateEntry, SearchEntry + * @return + */ + public static int validateKuKoID( D3Interface d3, Document doc, User user, def pEntry) { + d3.log.info("Start Functions validateKuKoID"); + + // 06.02.2018/dkle: Funktion für Insert, Update, New Version ausgelagert + // Unterscheidung Insert vs. Update/New Version, da nur die Erkennungsattribute änderbar sind (Kundenkontakt_ID, Kunden_Nr, Projekt_Nr, Opportunity_Nr) + // call api_log_error( "proc validateKuKoID( :(pUser), :(pEntry), :(pDocId) )" ) + def lReturn + def lKuKoIDError + def lKuKoSQL + def lKuKoRowCount + def pUser = user.id(); + + String lCustActDate = null; + String lCustActName = null; + String lKuKoOppNr = null; + String lKuKoProjNr = null; + String lKuKoKdNr = null; + + if( doc.field[Const.gDDF_OPPNUMMER] != null && !doc.field[Const.gDDF_OPPNUMMER].equals("") ) { + lReturn = doc.field[Const.gDDF_OPPNUMMER].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_OPPNUMMER].split("\\|") + lReturn = splittedString.size() + if( lReturn == 2 ) { + doc.field[Const.gDDF_OPPNUMMER] = splittedString[0].trim() + } + } + } + + if( doc.field[Const.gDDF_AUFTRNR] != null && !doc.field[Const.gDDF_AUFTRNR].equals("") ) { + lReturn = doc.field[Const.gDDF_AUFTRNR].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + lReturn = splittedString.size() + if( lReturn == 2 ) { + doc.field[Const.gDDF_AUFTRNR] = splittedString[0].trim() + } + } + } + + if( doc.field[Const.gDDF_KNR] != null && !doc.field[Const.gDDF_KNR].equals("") ) { + lReturn = doc.field[Const.gDDF_KNR].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_KNR].split("\\|") + lReturn = splittedString.size() + if( lReturn == 5 ) { + doc.field[Const.gDDF_KNR] = splittedString[0].trim() + } + } + } + + if( ( doc.field[Const.gDDF_KONTAKTNUMMER] != null && !doc.field[Const.gDDF_KONTAKTNUMMER].equals("")) && ( !pUser.equals("hostimp") && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) ) ) { + + // 09.05.2017 Anpassung, da sich der Aufbau geändert hat + // Aufbau: |||| + lReturn = doc.field[Const.gDDF_KONTAKTNUMMER].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_KONTAKTNUMMER].split("\\|") + lReturn = splittedString.size() + if( lReturn == 5 ) { + if( splittedString[0].equals("OP") ) { + if( doc.field[Const.gDDF_OPPNUMMER].equals("") || doc.field[Const.gDDF_OPPNUMMER] == null ) { + doc.field[Const.gDDF_OPPNUMMER] = splittedString[1].trim() + } + } + else if( splittedString[0].equals("PR") ) { + if( doc.field[Const.gDDF_AUFTRNR].equals("") || doc.field[Const.gDDF_AUFTRNR] == null) { + doc.field[Const.gDDF_AUFTRNR] = splittedString[1].trim() + } + } + else if( splittedString[0].equals("CM") ) { + if( doc.field[Const.gDDF_KNR].equals("") || doc.field[Const.gDDF_KNR] == null ) { + doc.field[Const.gDDF_KNR] = splittedString[1].trim() + } + } + + if( pEntry.equals("Insert") ) { + doc.field[Const.gDDF_KONTAKTNUMMER] = splittedString[2].trim() + doc.field[Const.gDDF_KONTAKTDATE] = splittedString[3].trim() + doc.field[Const.gDDF_KDAKTNAME] = splittedString[4].trim() + } else { + doc.field[Const.gDDF_KONTAKTNUMMER] = splittedString[2].trim() + } + } else { + lKuKoIDError = 1 + } + } else { + + if( doc.field[Const.gDDF_OPPNUMMER] != null && !doc.field[Const.gDDF_OPPNUMMER].equals("") ) { + lKuKoSQL = " AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}'" + } else { + lKuKoSQL = " AND dok_dat_feld_${Const.gDDF_OPPNUMMER} IS NULL" + } + if( doc.field[Const.gDDF_AUFTRNR] != null && !doc.field[Const.gDDF_AUFTRNR].equals("") ) { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${doc.field[Const.gDDF_AUFTRNR]}'" + } else { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} IS NULL" + } + if( doc.field[Const.gDDF_KNR] != null && !doc.field[Const.gDDF_KNR].equals("") ) { + lKuKoSQL = lKuKoSQL + " AND dok_dat_feld_${Const.gDDF_KNR} = '${doc.field[Const.gDDF_KNR]}'" + } + // d3.log.error( "lKuKoSQL: ${lKuKoSQL}" ) + + // Test, ob Validierung über Kundenkontakt_ID ein eindeutiges Ergebnis liefert + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_KONTAKTDATE} as lCustActDate, dok_dat_feld_${Const.gDDF_KDAKTNAME} as lCustActName, dok_dat_feld_${Const.gDDF_OPPNUMMER} as lKuKoOppNr, dok_dat_feld_${Const.gDDF_AUFTRNR} as lKuKoProjNr, dok_dat_feld_${Const.gDDF_KNR} as lKuKoKdNr " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${doc.field[Const.gDDF_KONTAKTNUMMER]}' " + + "AND kue_dokuart = '${Const.gDTS_AKONT}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lKuKoRowCount = sqlResult.size() + + if( sqlResult.size() > 1 ) { + // Andernfalls werden alle anderen Attribute hinzu gezogen, nur eindeutige Treffer werden erfolgreich abgelegt/aktualisiert + def sqlStatementSec = "SELECT dok_dat_feld_${Const.gDDF_KONTAKTDATE} as lCustActDate, dok_dat_feld_${Const.gDDF_KDAKTNAME} as lCustActName, dok_dat_feld_${Const.gDDF_OPPNUMMER} as lKuKoOppNr, dok_dat_feld_${Const.gDDF_AUFTRNR} as lKuKoProjNr, dok_dat_feld_${Const.gDDF_KNR} as lKuKoKdNr " + + "FROM firmen_spezifisch " + + "WHERE dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} = '${doc.field[Const.gDDF_KONTAKTNUMMER]}' " + + "AND kue_dokuart = '${Const.gDTS_AKONT}' " + lKuKoSQL + + sqlResult = d3.sql.executeAndGet(sqlStatementSec); + lKuKoRowCount = sqlResult.size() + } + + if(sqlResult.size() > 0) { + lCustActDate = sqlResult.getAt(0).get("lCustActDate"); + lCustActName = sqlResult.getAt(0).get("lCustActName"); + lKuKoOppNr = sqlResult.getAt(0).get("lKuKoOppNr"); + lKuKoProjNr = sqlResult.getAt(0).get("lKuKoProjNr"); + lKuKoKdNr = sqlResult.getAt(0).get("lKuKoKdNr"); + } + + if( lKuKoRowCount > 1 || lKuKoRowCount == 0 ) { + lKuKoIDError = 1 + } else if( lKuKoRowCount == 1 && pEntry.equals("Insert") ) { + if( doc.field[Const.gDDF_KONTAKTDATE].equals("") || doc.field[Const.gDDF_KONTAKTDATE] == null ) { + try { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd hh:mm:ss.SSS"); + Date parsedDate = dateFormat.parse(lCustActDate); + doc.field[Const.gDDF_KONTAKTDATE] = parsedDate; + } catch(Exception e) { + d3.log.error("validateKuKoID Fehler = " + e); + } + } + if( doc.field[Const.gDDF_KDAKTNAME].equals("") || doc.field[Const.gDDF_KDAKTNAME] == null ) { + doc.field[Const.gDDF_KDAKTNAME] = lCustActName + } + if( doc.field[Const.gDDF_OPPNUMMER].equals("") || doc.field[Const.gDDF_OPPNUMMER] == null ) { + doc.field[Const.gDDF_OPPNUMMER] = checkIfNullValue(lKuKoOppNr) + } + if( doc.field[Const.gDDF_AUFTRNR].equals("") || doc.field[Const.gDDF_AUFTRNR] == null ) { + doc.field[Const.gDDF_AUFTRNR] = checkIfNullValue(lKuKoProjNr) + } + if( doc.field[Const.gDDF_KNR].equals("") || doc.field[Const.gDDF_KNR] == null) { + doc.field[Const.gDDF_KNR] = lKuKoKdNr + } + } else if( lKuKoRowCount == 1 && !pEntry.equals("Insert") && !pEntry.equals("SEARCH")) { + if( doc.field[Const.gDDF_OPPNUMMER] == "" ) { + doc.field[Const.gDDF_OPPNUMMER] = checkIfNullValue(lKuKoOppNr) + } + if( doc.field[Const.gDDF_AUFTRNR].equals("") || doc.field[Const.gDDF_AUFTRNR] == null ) { + doc.field[Const.gDDF_AUFTRNR] = checkIfNullValue(lKuKoProjNr) + } + if( doc.field[Const.gDDF_KNR].equals("") || doc.field[Const.gDDF_KNR] == null) { + doc.field[Const.gDDF_KNR] = lKuKoKdNr + } + } + } + + if( lKuKoIDError == 1 ) { + return -170 + } else { + // Hinweis: Die Validierung des Buchungskreises sichert gleichzeitig eine korrekte Eingabe aller Daten ab. + lReturn = validateBuchungskreis( d3, doc, pEntry ) + + if( lReturn == -170 ) { + return -170 + } + } + + } + else if ( (doc.field[Const.gDDF_KONTAKTDATE] != null && !doc.field[Const.gDDF_KONTAKTDATE].equals("")) && (doc.field[Const.gDDF_KDAKTNAME] != null && !doc.field[Const.gDDF_KDAKTNAME].equals("")) && ( !pUser.equals("hostimp") && !user.isMemberOfGroup( Const.gTECHNICAL_GROUP ) ) ) { + + // d3.log.error( "Validierung per Kontaktdatum und Beschreibung" ) + List lCustActID = new ArrayList<>(); + def lCustActDateTemp = doc.field[Const.gDDF_KONTAKTDATE] + def lCustActNameTemp = doc.field[Const.gDDF_KDAKTNAME] + + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_KONTAKTNUMMER} as lCustActID, dok_dat_feld_${Const.gDDF_OPPNUMMER} as lKuKoOppNr, dok_dat_feld_${Const.gDDF_AUFTRNR} as lKuKoProjNr, dok_dat_feld_${Const.gDDF_KNR} as lKuKoKdNr " + + "FROM firmen_spezifisch " + + "WHERE Convert(Varchar(25), dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104) = '${lCustActDateTemp}' " + + "AND dok_dat_feld_${Const.gDDF_KDAKTNAME} = '${lCustActNameTemp}' " + + "AND kue_dokuart = '${Const.gDTS_AKONT}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lKuKoRowCount = sqlResult.size() + + if(sqlResult.size() > 0) { + for (GroovyRowResult grr : sqlResult) { + lCustActID.add(grr.get("lCustActID")) + lKuKoOppNr.add(grr.get("lKuKoOppNr")) + lKuKoProjNr.add(grr.get("lKuKoProjNr")) + lKuKoKdNr.add(grr.get("lKuKoKdNr")) + } + } + + // call api_log_error( "lKuKoRowCount Datensätze gefunden: :(lKuKoRowCount)" ) + if( lKuKoRowCount == 1 ) { + if ( lCustActID != null && lCustActID.size() > 0 && pEntry.equals("Insert") ) { + doc.field[Const.gDDF_KONTAKTNUMMER] = lCustActID.get(0) + doc.field[Const.gDDF_OPPNUMMER] = lKuKoOppNr.get(0) + doc.field[Const.gDDF_AUFTRNR] = lKuKoProjNr.get(0) + doc.field[Const.gDDF_KNR] = lKuKoKdNr.get(0) + } + else if( lCustActID != null && lCustActID.size() > 0 && !pEntry.equals("Insert") ) { + doc.field[Const.gDDF_KONTAKTNUMMER] = lCustActID.get(0) + doc.field[Const.gDDF_OPPNUMMER] = lKuKoOppNr.get(0) + doc.field[Const.gDDF_AUFTRNR] = lKuKoProjNr.get(0) + doc.field[Const.gDDF_KNR] = lKuKoKdNr.get(0) + } + // Hinweis: Die Validierung des Buchungskreises sichert gleichzeitig eine korrekte Eingabe aller Daten ab. + lReturn = validateBuchungskreis( d3, doc, pEntry ) + // call api_log_error( "Ende von dem IF validateBuchungskreis: :(lReturn)" ) + + if( lReturn == -170 ) { + return -170 + } + } else { + return -170 + } + } + + return 0 + // d3.log.error( "Ende proc validateKuKoID( ${pUser}, ${pEntry}, ${pDocId} )" ) + } + + /** + * Beschreibung + * @author + * @see InsertEntry, UpdateAttributeEntry, NewVersionEntry + * @return + */ + public static String validateLiefName( D3Interface d3, Document doc, def pEntry) { + d3.log.info("Start Functions validateLiefName = " + doc.getType().getId()); + + // Umbau auf d.3 Lieferanten + // Ermittlung des Lieferantennamens + // Die Ermittlung erfolgt nun generell per d.3 Akte "Lieferantenakte" (ALIEF) + // Ausnahme: Lieferantenkontaktdokument (DLIMA), hier wird die Lieferantenauswahl anhand Projekt/Opportunitynummer eingeschränkt + + def lLiefSQL + def lOppNr + def lAuftrNr + def lKdNr + def lLiefAnz + def lLiefNr + def lLiefName + def lReturn + def gTMPLFNr + + // 20.01.2023 imue: Ergänzung von Einkaufsbelegdokumenten + if( doc.getType().getId().equals(Const.gDTS_ALIKO) || doc.getType().getId().equals(Const.gDTS_ALONT) || doc.getType().getId().equals(Const.gDTS_DLIMA) || doc.getType().getId().equals(Const.gDTS_DEINK) ) { + // Hier alle Dokumentarten, die weder Projekt noch Opportunitynummer enthalten. + lLiefSQL = " " + } else { + // Hier alle Dokumentarten, die über de Opportunity und Projektnummer verfügen + if( doc.field[Const.gDDF_OPPNUMMER] != null ) { + + lReturn = doc.field[Const.gDDF_OPPNUMMER].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_OPPNUMMER].split("\\|") + lReturn = splittedString.size() + if( lReturn == 2 ) { + lOppNr = splittedString[0].trim() + lLiefSQL = " AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNr}' " + } + } else { + lOppNr = doc.field[Const.gDDF_OPPNUMMER] + lLiefSQL = " AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNr}' " + } + } else { + lLiefSQL = " AND dok_dat_feld_${Const.gDDF_OPPNUMMER} IS NULL " + } + + if( doc.field[Const.gDDF_AUFTRNR] != null ) { + lReturn = doc.field[Const.gDDF_AUFTRNR].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + lReturn = splittedString.size() + if( lReturn == 2 ) { + lAuftrNr = splittedString[0].trim() + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lAuftrNr}' " + } + } else { + lAuftrNr = doc.field[Const.gDDF_AUFTRNR] + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lAuftrNr}' " + } + } else { + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_AUFTRNR} IS NULL " + } + } + + // d3.log.error( "dok_dat_feld[${Const.gDDF_LNAME}] " + ${doc.field[Const.gDDF_LNAME]} ) + // d3.log.error( "dok_dat_feld[${Const.gDDF_LNR}] " + ${doc.field[Const.[gDDF_LNR]} ) + // d3.log.error( "gTMPLFNr " + ${gTMPLFNr} ) + + // Eingabefeld Lieferantennummer freigegeben + if( (!doc.field[Const.gDDF_LNR].equals("") && doc.field[Const.gDDF_LNR] != null) && ( doc.getType().getId().equals(Const.gDTS_ALONT) || doc.getType().getId().equals(Const.gDTS_DLIMA) ) ) { + + lReturn = doc.field[Const.gDDF_LNR].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_LNR].split("\\|") + lReturn = splittedString.size() + if( lReturn == 5 ) { + lLiefNr = splittedString[0].trim() + lLiefName = splittedString[1].trim() + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNR} = '${lLiefNr}' " + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNAME} = '${lLiefName}' " + } + } else { + lLiefNr = doc.field[Const.gDDF_LNR] + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNR} = '${lLiefNr}' " + } + } else if( (doc.field[Const.gDDF_LNR].equals("") || doc.field[Const.gDDF_LNR] == null) && ( doc.getType().getId().equals(Const.gDTS_ALONT) || doc.getType().getId().equals(Const.gDTS_DLIMA) ) ) { + d3.log.error( "Es wurde kein Lieferantennummer eingegeben." ) + return "Fehler" + } + + + // Eingabefeld Lieferantenname freigegeben + if( (!doc.field[Const.gDDF_LNAME].equals("") && doc.field[Const.gDDF_LNAME] != null) && (doc.getType().getId().equals(Const.gDTS_DLIKO) ) ) { + + lReturn = doc.field[Const.gDDF_LNAME].indexOf("|") + if( lReturn > 0 ) { + String[] splittedString = doc.field[Const.gDDF_LNAME].split("\\|") + lReturn = splittedString.size() + if( lReturn == 5 ) { + lLiefName = splittedString[1].trim() + gTMPLFNr = splittedString[0].trim() + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNAME} = '${lLiefName}' " + } + } else { + lLiefName = doc.field[Const.gDDF_LNAME] + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNAME} = '${lLiefName}' " + } + } else if( (doc.field[Const.gDDF_LNAME].equals("") || doc.field[Const.gDDF_LNAME] == null) && (doc.getType().getId().equals(Const.gDTS_DLIKO) ) ) { + d3.log.error( "Es wurde kein Lieferantenname eingegeben." ) + return "Fehler" + } + + if( ( gTMPLFNr != null && !gTMPLFNr.equals("") ) && ( doc.field[Const.gDDF_LNR] == null || doc.field[Const.gDDF_LNR].equals("") ) ) { + lLiefSQL = lLiefSQL + " AND dok_dat_feld_${Const.gDDF_LNR} = '${gTMPLFNr}' " + } + + if( doc.getType().getId().equals(Const.gDTS_ALIKO) || doc.getType().getId().equals(Const.gDTS_ALONT) || doc.getType().getId().equals(Const.gDTS_DLIMA) ) { + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_LNR} as lLiefNr2, dok_dat_feld_${Const.gDDF_LNAME} as lLiefName2 " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIEF}' ${lLiefSQL} " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lLiefAnz = sqlResult.size() + } else { + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_LNR} as lLiefNr2, dok_dat_feld_${Const.gDDF_LNAME} as lLiefName2 " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIKO}' ${lLiefSQL} " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lLiefAnz = sqlResult.size() + } + + if( lLiefAnz >= 1 || ( lLiefAnz == 0 && doc.getType().getId().equals(Const.gDTS_ALIKO) ) ) { + gTMPLFNr = "" + return "OK" + } else { + gTMPLFNr = "" + return "Fehler" + } + + } + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static String validateLiefNum( D3Interface d3, Document doc, def pEntry ) { + d3.log.info("Start Functions validateLiefNum = " + doc.getType().getId()); + + // Die Validierung erfolgt über die d.3 Akte "Lieferantenakte" (ALIEF) + // Ausnahme: Lieferantenkontaktdokument (DLIMA), hier wird die Lieferantenauswahl anhand Projekt/Opportunitynummer eingeschränkt + + def lLiefSQL + def lOppNr + def lAuftrNr + def lKdNr + def lLiefAnz + def lLiefNr + def lLiefName + def lReturn + + if( doc.getType().getId().equals(Const.gDTS_ALIKO) ) { + d3.log.info( "Überprüfung der Lieferantennummer ${doc.getType().getId()}") + + lLiefName = doc.field[Const.gDDF_LNAME] + lLiefNr = doc.field[Const.gDDF_LNR] + + if( lLiefName != null && !lLiefName.equals("") ) { + lReturn = lLiefName.indexOf("|") + if(lReturn > 0) { + String[] splittedString = lLiefName.split("\\|") + lLiefName = splittedString[0].trim() + } + } + if( lLiefNr != null && !lLiefNr.equals("") ) { + lReturn = lLiefNr.indexOf("|") + if(lReturn > 0) { + String[] splittedString = lLiefNr.split("\\|") + lReturn = splittedString.size() + lLiefNr = splittedString[0].trim() + } + } + + // wenn der Lieferantenname gefüllt ist, aber die Lieferantennummer nicht + if( (!doc.field[Const.gDDF_LNAME].equals("") && doc.field[Const.gDDF_LNAME] != null) && (doc.field[Const.gDDF_LNR].equals("") || doc.field[Const.gDDF_LNR] == null) ) { + + // Prüfung ob Lieferantenname einen "neuen" Wert enthält + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_LNR} as lLiefNr2, dok_dat_feld_${Const.gDDF_LNAME} as lLiefName2 " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND dok_dat_feld_${Const.gDDF_LNAME} = '${lLiefName}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lLiefAnz = sqlResult.size() + + // wenn nein, dann fehlt die Lieferantennummer + if( lLiefAnz >= 1 ) { + return "Fehler" + } + // wenn ja - ist alles in Ordnung + if( lLiefAnz == 0 ) { + return "OK" + } + + } + + // wenn der Lieferantname gefüllt ist, muss geprüft werden, ob die Lieferantennummer korrekt ist + if( (!doc.field[Const.gDDF_LNAME].equals("") && doc.field[Const.gDDF_LNAME] != null) && (!doc.field[Const.gDDF_LNR].equals("") && doc.field[Const.gDDF_LNR] != null) ) { + + // Prüfung ob die Lieferantennummer mit Lieferantenname übereinstimmt + def sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_LNR} as lLiefNr2, dok_dat_feld_${Const.gDDF_LNAME} as lLiefName2 " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND dok_dat_feld_${Const.gDDF_LNAME} = '${lLiefName}' " + + "AND dok_dat_feld_${Const.gDDF_LNR} = '${lLiefNr}' " + + List sqlResult = d3.sql.executeAndGet(sqlStatement); + lLiefAnz = sqlResult.size() + + // wenn ja - ist alles In Ordnung + if( lLiefAnz >= 1 ) { + return "OK" + } + // wenn nein - dann ist die Lieferantennummer nicht valide + if( lLiefAnz == 0 ) { + return "Fehler" + } + + } + + } + + } + + /** + * Validierung der Materialnummer gegen Bestandsakten + * @author + * @see Insert, Update, NewVersion + * @see validateMaterialNo + * @return Fehlerausgabe wenn die Materialnummern nicht valide ist + */ + public static String validateMaterialNum(D3Interface d3, Document doc) { + String returnValue = null; + if(doc.getType().getId().equals(Const.gDTS_DMATE)) { + + d3.log.info("Start Functions validateMaterialNum - " + doc.getType().getId() + " und " + doc.field[Const.gDDF_MATERIALNUMMER]); + + // Die Validierung erfolgt über die d.3 Akte "Materialakte" (AMATE) + if(doc.field[Const.gDDF_MATERIALNUMMER] != null) { + + d3.log.info("Überprüfung der Materialnummer ${doc.field[Const.gDDF_MATERIALNUMMER]}"); + + // Prüfung ob Lieferantenname einen "neuen" Wert enthält + String sqlStatement = """SELECT doku_id + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDDF_MATERIALNUMMER} = ? """; + List params = [ + Const.gDTS_AMATE, + doc.field[Const.gDDF_MATERIALNUMMER] + ]; + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + + if(sqlResult != null) { + + d3.log.info("Info Functions validateMaterialNum - Anzahl = " + sqlResult.size()); + + if( sqlResult.size() > 0 ) { + returnValue = "OK"; + } else { + returnValue = "ERROR"; + } + } + } + } + return returnValue; + } + + /** + * Beschreibung + * @author Maschinenprojekt, Entwicklungsprojekt, Opportunity + * @see Insert, Update, NewVersion + * @see validateSAPMaterialNo + * @return Fehlerausgabe wenn die Mustermaterialnummern nicht valide ist + */ + public static int validateMustermaterialNr( D3Interface d3, Document doc, Document docTemp, DocumentType docType, String entryPoint) { + d3.log.info("Start Functions validateMustermaterialNr"); + + def lReturn + if( docType.getId().equals(Const.gDTS_DMEOP) || docType.getId().equals(Const.gDTS_DMSPE) || docType.getId().equals(Const.gDTS_DOPPD) ) { + if(entryPoint.equals("Update") || entryPoint.equals("NewVersion")) { + // d3.log.error( "Multi Field" ) + if(docTemp != null) { + for (int i=1; i < Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( (doc.field[Const.gDDF_MUSTERMATNR69][i] != null && !doc.field[Const.gDDF_MUSTERMATNR69][i].equals("") ) && !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(" \\| ") + if(splittedString != null) { + 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 = 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 + } + } + } + } + } + + } else if(entryPoint.equals("Insert")) { + for (int i=1; i < Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if(doc.field[Const.gDDF_MUSTERMATNR69][i] != null ) { + String[] splittedString = doc.field[Const.gDDF_MUSTERMATNR69][i].split(" \\| ") + if(splittedString != null) { + lReturn = splittedString.size() + if( lReturn == 2 ) { + doc.field[Const.gDDF_MUSTERMATNR69][i] = splittedString[0].trim() + } + 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 + } + } + } + } + } + } + return 0 + } + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static int validateNetzPSP( D3Interface d3, Document doc ) { + d3.log.info("Start Functions validateNetzPSP"); + + def lReturnNetzplan + def lReturnPSPElement + def lPSPElement + int lInvalidData + def lECRAtivityID + def lECRDescription + def lRowCount + + if( doc.field[Const.gDDF_NPN] != null && !doc.field[Const.gDDF_NPN].equals("") ) { + + String[] splittedString = doc.field[Const.gDDF_NPN].split("\\|") + if(splittedString != null) { + lReturnNetzplan = splittedString.size() + if( lReturnNetzplan > 1 ) { + doc.field[Const.gDDF_NPN] = splittedString[0].trim() + doc.field[Const.gDDF_PSPELEMENT] = splittedString[1].trim() + if( lReturnNetzplan > 2 ) { + if(splittedString[2] != null || !splittedString[2].equals("")) { + doc.field[Const.gDDF_MASCHINENTYP] = splittedString[2].trim(); + } + } + } + } + + // Projektnummer ist Pflichtfeld und ob Netzplan gefüllt bereits doch Hook geprüft + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/ProjectNetworkRelationSet?\$filter=ProjExtId%20eq%20'${doc.field[Const.gDDF_AUFTRNR].trim()}'%20and%20NetworkNo%20eq%20'${doc.field[Const.gDDF_NPN].trim()}'&\$format=json"); + + try { + if(url != null) { + + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + + def Anzahl_Treffer = arr.length() + def ergebnis + int lDataOK = 0 + for(int i = 0; i sqlResultOppProj = d3.sql.executeAndGet(sqlStatementOppM); + List dokuartenOppProj = new ArrayList<>() + if(sqlResultOppProj != null) { + for(GroovyRowResult grr : sqlResultOppProj) { + dokuartenOppProj.add(grr.get("dokuArt")) + } + } + if(dokuartenOppProj.contains(doc.getType().getId())) { + //Maschinenprojekt: Wenn weder eine Auftrags- noch eine Opportunity-Nr. eingetragen wird, verhindere die Ablage + if( (doc.field[Const.gDDF_AUFTRNR] == null) && (doc.field[Const.gDDF_OPPNUMMER] == null ) ) { + + def knrTemp = doc.field[Const.gDDF_KNR] + + if( ( doc.getType().getId().equals(Const.gDTS_AKUKO) || doc.getType().getId().equals(Const.gDTS_AKONT) || doc.getType().getId().equals(Const.gDTS_DKUKO) ) && knrTemp != null ) { + // Do nothing, Sonderfall: Ablage zum Kunden + } else { + 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 "WITHOUTPROJOPP" + } + } else if( (!doc.field[Const.gDDF_AUFTRNR].equals("") && doc.field[Const.gDDF_AUFTRNR] != null) && (!doc.field[Const.gDDF_OPPNUMMER].equals("") && doc.field[Const.gDDF_OPPNUMMER] != null) && !doc.getType().getId().equals(Const.gDTS_DMEOP) ) { + 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 "PROJOPP" + } + } + return "BEENDET" + } + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static void validateProcess(D3Interface d3, Document doc) { + if(doc != null && doc.getType() != null) { + d3.log.info("Start Functions validateProcess - " + doc.getType().getId()); + + //Validiert die Prozessart abhängig vom Prozess für Dokumentarten, bei denen die Eigenschaft Prozessart definiert ist + //Aussnamhe bei der Aktenart Prozessart + + def sqlStatement = "SELECT * FROM fispe_titel_dokuart WHERE kue_dokuart = '${doc.getType().getId()}' and repository_id = '${SystemSpecificConst.gRepIDProzessart}'" + def sqlResult = d3.sql.executeAndGet(sqlStatement) + + if(sqlResult != null) { + if( sqlResult.size() == 1 && !doc.getType().getId().equals(Const.gDTS_APROZ) && !doc.getType().getId().equals(Const.gDTS_AAFOL) && doc.field[Const.gDDF_PROZESS] != null && !doc.getType().getId().equals(Const.gDTS_DUMMY ) ) { + def sqlStatementSec = + "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESSART} as prozessart FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' and dok_dat_feld_${Const.gDDF_PROZESS} = '${doc.field[Const.gDDF_PROZESS]}' " + def sqlResultSec = d3.sql.executeAndGet(sqlStatementSec) + if(sqlResultSec != null) { + if ( sqlResultSec.size() == 1) { + doc.field[Const.gDDF_PROZESSART] = sqlResultSec.getAt(0).get("prozessart") + } else { + doc.field[Const.gDDF_PROZESSART] = "Fehler / Error" + } + } + } + } + } + } + + /** + * Validierung der Eingaben für Weitere BelegNr + * @author Service, Einkauf + * @see UpdateAttributeEntry, SearchEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int validateBelegNr(D3Interface d3, Document doc) { + d3.log.info("Start Functions validateBelegNr"); + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereBelegNrID) ){ + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + def lBelegNr = doc.field[Const.gDDF_WEITEREBELEGNR][i]; + def lBelegArt = doc.field[Const.gDDF_BELEGTYP]; + if(lBelegNr != null) { + String sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ASEBE}' AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${lBelegNr}'"; + if(lBelegArt != null) { + sqlStatement = sqlStatement + " AND dok_dat_feld_${Const.gDDF_BELEGTYP} = '${lBelegArt}'"; + } + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + if( sqlResult.size() > 0) { + //return 0; + } else { + return i; + } + } + } + } + } + return 0; + } + + + /** + * Validierung der Eingaben für Equipment / weitere Equipment + * @author Equipment + * @see UpdateAttributeEntry, SearchEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int validateEquipment(D3Interface d3, Document doc, User user, boolean checkFurther) { + if( user != null && user.isMemberOfGroup( Const.gTECHNICAL_GROUP )) { + // Ausschluss des DVELOP_WEB, da dieser ggf. neue Informationen anliefert + } else { + d3.log.info("Start Functions validateEquipment"); + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentID) == true && checkFurther == false ) { + if(doc.field[Const.gDDF_EQUIPMENT] != null) { + // Prüfung ob Split eventuell erfolgen muss + String currentEquipment = doc.field[Const.gDDF_EQUIPMENT] + String[] splittedString = currentEquipment.split("\\|"); + if(splittedString != null && splittedString.size() > 0) { + currentEquipment = splittedString[0]; + } + String sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${currentEquipment}'"; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + if( sqlResult.size() > 0) { + //return 0; + } else { + return 1; + } + } + } + } else if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereEquipmentID) == true && checkFurther == true ) { + 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) { + // Prüfung ob Split eventuell erfolgen muss + String[] splittedString = currentEquipment.split("\\|"); + if(splittedString != null && splittedString.size() > 0) { + currentEquipment = splittedString[0]; + } + String sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${currentEquipment}'"; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + if( sqlResult.size() > 0) { + //return 0; + } else { + return i; + } + } + } + } + } + } + return 0; + } + + /** + * Validierung der Eingaben für Equipments + * @author Service + * @see UpdateAttributeEntry, SearchEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int validateEquipments(D3Interface d3, Document doc, User user) { + d3.log.info("Start Functions validateEquipments"); + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gEquipmentsID) == true) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + if( doc.field[Const.gDDF_EQUIPMENTS][i] != null ) { + // Prüfung ob Split eventuell erfolgen muss + String currentEquipment = doc.field[Const.gDDF_EQUIPMENTS][i] + String[] splittedString = currentEquipment.split(" \\| "); + if(splittedString != null && splittedString.size() > 0) { + currentEquipment = splittedString[0].trim(); + } + String sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AEQUI}' AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = '${currentEquipment}'"; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + if( sqlResult.size() > 0) { + //return 0; + } else { + return 1; + } + } + } + } + } + + return 0; + } + + /** + * Validierung der Eingaben für Weitere SrId für den Service + * @author Service + * @see UpdateAttributeEntry, SearchEntry, NewVersionEntry, InsertEntry + * @return Rückgabe 0 wenn erfolgreich; Rückgabe Zeilennummer wenn nicht erfolgreich + */ + public static int validateSrId(D3Interface d3, Document doc) { + d3.log.info("Start Functions validateSrId"); + if( checkIfRepoIDExistsInDocType(d3, doc.getType(), SystemSpecificConst.gWeitereSRIDID) ) { + for(int i=1; i <= Integer.valueOf(d3.config.value("CUR_60ER_FIELD_NR")); i++) { + def lSrId = doc.field[Const.gDDF_WEITERESRID][i]; + if(lSrId != null) { + String sqlStatement = "SELECT * FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ASERE}' AND dok_dat_feld_${Const.gDDF_SRID} = '${lSrId}'"; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null) { + if( sqlResult.size() > 0) { + //return 0; + } else { + return i; + } + } + } + } + } + return 0; + } + + + /** + * Beschreibung + * @author + * @see + * @return + */ + public static String validateSAPMaterialNo(D3Interface d3, Document doc, def materialNummer) { + d3.log.info("Start Functions validateSAPMaterialNo"); + + def suchstrName + def lLanguage + def lSplitReturn + def lSearchProj + def lSearchOpp + def Anzahl_Treffer + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = "DE" + } + + // Unterscheidung wurde die Opportunity oder Maschinenprojektnummer eingegeben + // 08.05.2017 Split der Opportunity oder Projektnummer, falls nötig + if( doc.field[Const.gDDF_OPPNUMMER] != null && !doc.field[Const.gDDF_OPPNUMMER].equals("") ) { + String[] splittedString = doc.field[Const.gDDF_OPPNUMMER].split(" \\| ") + lSplitReturn = splittedString.size() + if( lSplitReturn > 0 ) { + lSearchOpp = splittedString[0].trim() + } else { + lSearchOpp = doc.field[Const.gDDF_OPPNUMMER] + } + } else if( doc.field[Const.gDDF_AUFTRNR] != null && !doc.field[Const.gDDF_AUFTRNR].equals("") ) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + lSplitReturn = splittedString.size() + if( lSplitReturn > 0 ) { + lSearchProj = splittedString[0].trim() + } else { + lSearchProj = doc.field[Const.gDDF_AUFTRNR] + } + } + + JSONArray arrayOData + // Durch OData zwei Entities notwendig gemäß Herr Kopp + // -> Project + if( lSearchProj != null) { + URL url1 = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/SampleMaterialProjectRelationSet?\$filter=ProjExtId%20eq%20'${lSearchProj}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url1 != null) { + URLConnection con = url1.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + arrayOData = obj.get("d").getJSONArray("results"); + + Anzahl_Treffer = arrayOData.length() + + if( Anzahl_Treffer == 0 ) { + return "FEHLER" + } else { + // weitere Verarbeitung folgt im weiteren Code + } + } + } catch(Exception e) { + d3.log.error("validateSAPMaterialNo - OData Project Exception - " + e.getMessage()) + } + } else if( lSearchOpp != null) { + URL url1 = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/SampleMaterialOpportunityRelationSet?\$filter=OpportunityNo%20eq%20'${lSearchOpp}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url1 != null) { + URLConnection con = url1.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + arrayOData = obj.get("d").getJSONArray("results"); + + Anzahl_Treffer = arrayOData.length() + + if( Anzahl_Treffer == 0 ) { + return "FEHLER" + } else { + // weitere Verarbeitung folgt im weiteren Code + } + } + } catch(Exception e) { + d3.log.error("validateSAPMaterialNo - OData Project Exception - " + e.getMessage()) + } + } + + // d3.log.error( "Anzahl Treffer - Opportunity: ${Anzahl_Treffer_Opportunity} , Project: ${Anzahl_Treffer_Project}" ) + + for(int i = 0; i 0) { + doc.field[Const.gDDF_ITSMID] = splittedString[0].trim(); + } + + def sqlStatement = "SELECT * FROM firmen_spezifisch where dok_dat_feld_${Const.gDDF_ITSMID} = '${doc.field[Const.gDDF_ITSMID]}' and kue_dokuart in ('${Const.gDTS_AITSM}') " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if( sqlResult == null || sqlResult.size() == 0 ) { + return 10 + } else { + return 0 + } + + } + + /** + * Ermittelt die Organisationseinheiten anhand der Projektnummer + * @author Orga-Projekte + * @see InsertEntry, UpdateEntry + * @return keine Rückgabe; im Hintergrund werden die Organisationseinheiten gesetzet gesetzt + */ + public static int getOrgUnitByID(D3Interface d3, Document doc, DocumentType docType) { + + def lProjNo = doc.field[Const.gDDF_PROJNR] + d3.log.info("Start Functions getOrgUnitByID - ${lProjNo}"); + + // Anhand der Projektnummer die Ordg-Einheiten ermitteln + def sqlStatement = """SELECT mv.value_char as lOrgUn + FROM firmen_spezifisch fs, firm_spez_mult_val mv + where fs.dok_dat_feld_${Const.gDDF_PROJNR} = '${lProjNo}' + and fs.doku_id = mv.doku_id + and mv.field_no = '${Const.gDDF_ORGEINHEITEN}' + and fs.kue_dokuart = '${Const.gDTS_APROJ}' """; + + List sqlResultBK = d3.sql.executeAndGet(sqlStatement); + + List lOrgUn = new ArrayList<>(); + for( GroovyRowResult grr : sqlResultBK) { + String currOrgUn = grr.get("lOrgUn"); + if(currOrgUn != null && !currOrgUn.equals("")) { + lOrgUn.add(currOrgUn); + } + } + + int count60 = 1 + for(String s : lOrgUn) { + doc.field[Const.gDDF_ORGEINHEITEN][count60] = s; + count60 = count60 + 1; + } + return 0 + } +} \ No newline at end of file diff --git a/Optima/_Groovy/Hooks.classpath b/Optima/_Groovy/Hooks.classpath new file mode 100644 index 0000000..f6f4203 --- /dev/null +++ b/Optima/_Groovy/Hooks.classpath @@ -0,0 +1,4 @@ +D:\d3\d3server.prg\ext_groovy\Jar-Files\json-20180813.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\commons-io-2.5.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\commons-lang-2.6.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\bcprov-jdk15on-1.62.jar \ No newline at end of file diff --git a/Optima/_Groovy/Hooks.groovy b/Optima/_Groovy/Hooks.groovy new file mode 100644 index 0000000..e7dd6e3 --- /dev/null +++ b/Optima/_Groovy/Hooks.groovy @@ -0,0 +1,4621 @@ +// -------------------------------------------------------------------------------------------------------- +// 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 + } + + +} \ No newline at end of file diff --git a/Optima/_Groovy/SystemSpecificConst.groovy b/Optima/_Groovy/SystemSpecificConst.groovy new file mode 100644 index 0000000..e292c57 --- /dev/null +++ b/Optima/_Groovy/SystemSpecificConst.groovy @@ -0,0 +1,123 @@ +// -------------------------------------------------------------------------------------------------------- +// SystemSpecificConst.groovy -> hier P-System +// -------------------------------------------------------------------------------------------------------- +// +// Groovy Definitionsdatei f�r alle ben�tigten Repositoryabh�ngigen Konfigurationen +// +// -------------------------------------------------------------------------------------------------------- +// +// Historie: +// 25.03.2019 dvelop Erste Version f�r oData-Schnittstelle +// +// -------------------------------------------------------------------------------------------------------- + +public class SystemSpecificConst { + + /* + * Systemspezifische Variablen + */ + + static final String updatedUser = "d3groovy"; + + // imue 06.2019 - Pfad um Datei tempor�r zu kopieren - notwendig da es in Groovy noch keine Funktion zum kopieren gibt, wo die FileExtension nicht verloren geht + static final String cloneDocumentTempPath = "E:\\d3\\d3work\\D3P\\CloneDocumentTemp" + //Aufruf d.3one Link f�r�Wissensdokumente + static final String gD3oneString = " 10.000 Meldung ausgeben + + length = val1.length(); + // d3.log.error("length: " + length.toString()); + // d3.log.error("val1: " + val1.toString()); + + if( val1 != null && !val1.equals("null%") && val1.length() > 3 ) { + if( validate == 1 ) { + // d3.log.error("Validate - Validierung CustomerNameValues: START " + val1.toString()); + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd WHERE fs.kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_ANNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTLAND} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTORT} like ? ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + + // resultset = d3.sql.executeAndGet(sql,[val1, val2, val1, val2, val1, val1, val1]); + // d3.log.error("Validate - Validierung CustomerNameValues: resultset"); + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + // d3.log.error("Validate - Validierung CustomerNameValues: ENDE"); + + resultset = d3.sql.executeAndGet(sql,[ + val1, + val2, + val1, + val2, + val1, + val1, + val1 + ]); + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } else { + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNR},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_ANNAME},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KDAKTLAND},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KDAKTORT},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd WHERE fs.kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_ANNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTLAND} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTORT} like ? ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql,[ + val1, + val2, + val1, + val2, + val1, + val1, + val1 + ]); + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + } + + } + + @ValueSet(entrypoint="CustomerNumberValues") + def getCustomerNumberValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + + // Abfrage Kundennummer + def resultset + def length + def val1 = "" + def val2 = "" + // 31.07.2017 fachlich explizit gewünscht, diese Funktion kann wegen der vielen LIKES zu Performanceeinbußen führen + // 31.07.2017 @dmrowcount abfragen, wenn > 10.000 Meldung ausgeben + + length = val1.length(); + + if( repoField.getPreferedFieldNumber() == Const.gDDF_WEITKDNR ) { + if( doc.field[Const.gDDF_WEITKDNR].getAt(row_no) ) + { + val1 = doc.field[Const.gDDF_WEITKDNR].getAt(row_no).toString() + "%" + if ( val1.length() > 3 ) + val2 = "%" + val1 + "%"; + } + } else if( Integer.valueOf(repoField.getId()) == SystemSpecificConst.gEndkundennrID ) { + // Ergänzung für Endkunden + val1 = doc.field[Const.gDDF_ENDKUNDENNR].toString() + "%" + if ( val1.length() > 3 ) + val2 = "%" + val1 + "%"; + } else { + if( doc.field[Const.gDDF_KNR] ) + { + val1 = doc.field[Const.gDDF_KNR].toString() + "%" + if ( val1.length() > 3 ) + val2 = "%" + val1 + "%"; + } + } + + if( val1 != null && !val1.equals("null%") && val1.length() > 3 ) { + if( validate == 1 ) { + // d3.log.error("Validierung CustomerNumberValues: " + val1.toString()); + + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNR},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd WHERE fs.kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_ANNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTLAND} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTORT} like ? ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + + resultset = d3.sql.executeAndGet(sql,[ + val1, + val2, + val1, + val2, + val1, + val1, + val1 + ]); + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } else { + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KNR},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KNAME},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_ANNAME},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KDAKTLAND},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_KDAKTORT},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd WHERE fs.kue_dokuart = '${Const.gDTS_AKUND}' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KNR} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_ANNAME} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTLAND} like ? " + + "OR fs.dok_dat_feld_${Const.gDDF_KDAKTORT} like ? ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + + resultset = d3.sql.executeAndGet(sql,[ + val1, + val2, + val1, + val2, + val1, + val1, + val1 + ]); + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } + + @ValueSet(entrypoint="ProjNrValues") + def getProjNrValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für die Org. Projektnr. + // d3.log.error("ProjNrValues"); + def resultset + if( validate == 1 ) { + // Rohwerte + String sql = "SELECT dok_dat_feld_${Const.gDDF_PROJNR} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "ORDER BY dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + String sql = "SELECT dok_dat_feld_${Const.gDDF_PROJNR} + '|' + dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "ORDER BY dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="ProjVerknValues") + def getProjVerknValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Org.Hauptprojekt + // Abfrage zur Generierung der dynamischen Wertemenge für die Projektverknüpfung + // d3.log.error("ProjVerknValues"); + def resultset + def ProjInput = doc.field[Const.gDDF_PROJNR].toString(); + String Projectnumber + + if( validate == 1 ) { + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJNR} + '|' + f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_PROJNR} LIKE ? " + + "ORDER BY f.dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + resultset = d3.sql.executeAndGet(sql,[ProjInput]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + // Split, falls Projektnummer zusammengesetzt + if( ProjInput.indexOf('|') >= 1 && ProjInput.length() > 3 && doc.field[Const.gDDF_PROJNR] != "" && doc.field[Const.gDDF_PROJNR] != null ) { + String[] str; + str = ProjInput.split('\\|'); + Projectnumber = str[0]; + + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJNR} + '|' + f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_PROJNR} LIKE ? " + + "ORDER BY f.dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + + resultset = d3.sql.executeAndGet(sql,[Projectnumber]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if( ProjInput.length() > 3 && doc.field[Const.gDDF_PROJNR] != "" && doc.field[Const.gDDF_PROJNR] != null ) { + // Hier wird mit einer bereits gesplitteten Projektnummer gearbeitet + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJNR} + '|' + f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_PROJNR} LIKE ? " + + "ORDER BY f.dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + resultset = d3.sql.executeAndGet(sql,[ProjInput]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + // // Falls die Org.Projekt_Nr. leer ist, Fehlermeldung + // List ErrResultset = ["Bitte füllen Sie zuerst die Org.Projekt_Nr."] + // repoField.provideValuesForValueSet(ErrResultset) + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJNR} + '|' + f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "ORDER BY f.dok_dat_feld_${Const.gDDF_PROJNR} DESC"; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="ProjTitleValues") + def getProjTitleValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für den Org.Projekt_Name + // 31.07.2017 Anpassung, dass die Suchhilfe die Vorfilterung übernimmt. Es werden immer alle Orgaprojekte abgefragt + def resultset + def length + String[] ResRows + + if( validate == 1 ) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + String sql = "SELECT dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + ResRows = resultset.collect{it.get("val")}; + length = ResRows.length + + if( length > 10000 ) { + d3.log.error("Funktion entrypoint='ProjTitleValues' muss angepasst werden, es sind mehr als 10.000 Orgaprojekte in der Auswahl"); + } + } + } + + @ValueSet(entrypoint="DepartmentValues") + def getDepartmentValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage aller vorhandenen Abteilungen aus dem Benutzerstamm + // 14.08.2017 nicht getestet, da nicht mehr im Einsatz (DDF 7 - Projektverantw. Abteilung) + def resultset + String sql = "SELECT distinct(abteilung) as val " + + "FROM benutzer " + + "WHERE abteilung <> ''"; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } + + @ValueSet(entrypoint="MilestoneValues") + def getMilestoneValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage aller Meilensteine zu allen eingegebenen Projekten (Anpassung phoer 20170105: Anpassung nach Redesign Orga Projekte) + def resultset + if( doc.field[Const.gDDF_PROJNR] != "" && doc.field[Const.gDDF_PROJNR] != null ) { + def length + length = doc.field[Const.gDDF_PROJNR].length(); + if( length >= 14 ) { + def val1 = doc.field[Const.gDDF_PROJNR].toString().substring(0,14); + + String sql = "SELECT dok_dat_feld_${Const.gDDF_MSAPS} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AMEIS}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND dok_dat_feld_${Const.gDDF_PROJNR} = ? " ; + resultset = d3.sql.executeAndGet(sql,[val1]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List ErrResultset = [ + "Bitte füllen Sie zuerst die Org.Projekt_Nr." + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } else { + List ErrResultset = [ + "Bitte füllen Sie zuerst die Org.Projekt_Nr." + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } + + @ValueSet(entrypoint="DokumentgruppeValues") + def getDokumentgruppeValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage der Dokumentkategorie abhängig von der ausgewählten Dokumentgruppe + // 15.08.2017 Die Dokumentkategorie existiert nur noch für die Marketingtooldokumente und kann daher als "einfache" SQL Abfrage übernommen werden. + def resultset + def val1 = doc.getType().getId(); + + // Inhalt Attributfeld Dokumentgruppe + if( doc.field[Const.gDDF_DOKGROUP] == "" || doc.field[Const.gDDF_DOKGROUP] == null || doc.field[Const.gDDF_ERGEBNISDOK] == "Ja" ){ + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_CLASS} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " ; + resultset = d3.sql.executeAndGet(sql,[val1]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="DokumentuntergruppeValues") + def getDokumentuntergruppeValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + + // Abfrage der Dokumentgruppen abhängig von der ausgewählten Dokumentkategorie + def resultset + def lProcessType + def lTargetDocType + def lSubject + def fieldLanguage + + if( d3.remote.getLanguage().equals("049") ) { + fieldLanguage = "1" + } else { + fieldLanguage = "2" + } + + // Anpassung 2017-08-14/spet: Sonderbehandlung der Dokumentgruppe für 90 Vorlagen + if( doc.getType().getId() == "${Const.gDTS_DVORL}" ) { + + lTargetDocType = doc.field[Const.gDDF_ZIELDTS] + lProcessType = doc.field[Const.gDDF_PROZESS] + + if ( lTargetDocType == "TMPL" ) { + List ErrResultset = [""] + repoField.provideValuesForValueSet(ErrResultset) + } else if ( lTargetDocType != "" && lTargetDocType != null ) { + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? "; + + if ( lProcessType != "" && lProcessType != null ) { + if ( lProcessType == "020301" || lProcessType == "020302" ) { + lProcessType = "0203"; + } + sql = sql + "AND ( fs1.dok_dat_feld_${Const.gDDF_PROZESS} = ? OR fs1.dok_dat_feld_${Const.gDDF_PROZESS} IS NULL OR fs1.dok_dat_feld_${Const.gDDF_PROZESS} = '' )" + sql = sql + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[lTargetDocType, lProcessType]); + } else { + sql = sql + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[lTargetDocType]); + } + List ResRows = resultset.collect{it.get("val")}; + repoField.provideValuesForValueSet(ResRows); + } else { + List ErrResultset = [ + "Bitte geben Sie ein Dokumentartkürzel ein." + ] + repoField.provideValuesForValueSet(ErrResultset) + } + + } else if( doc.getType().getId() == "${Const.gDTS_DKUKO}" ) { + // Anpassung 2016-11-15/dkle: Dokumentgruppe für Kundenkontaktdokumente + // Unterscheidung ob "02.01 Opportunity" oder "02.02 Maschinenprojekt" + + // Dokumentgruppen für Kundenkontaktdokumente + // Unterschied zwischen Maschinenprojekt und Opportunity + // Prozessart (DDF5) = Opportunity oder Maschinenprojekt + // Anwendungsfall (DDF45) = Dokumentart + // Wenn Opportunity Nummer leer dann Maschinenprojekt + + if( doc.field[Const.gDDF_OPPNUMMER] == "" || doc.field[Const.gDDF_OPPNUMMER] == null ) { + lProcessType = "0202" + } else { + lProcessType = "0201" + } + + // 24.02.2020 imue - Sortierung + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_PROZESS} = ? " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[ + doc.getType().getId(), + lProcessType + ]); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + + + } else if (( doc.getType().getId() == "${Const.gDTS_DMDOK}" || doc.getType().getId() == "${Const.gDTS_DMSPE}" || doc.getType().getId() == "${Const.gDTS_DMAUF}" || doc.getType().getId() == "${Const.gDTS_DERZD}" || doc.getType().getId() == "${Const.gDTS_DLIMA}" || doc.getType().getId() == "${Const.gDTS_DKUMA}" ) && doc.field[Const.gDDF_SUBJECT] != "" && doc.field[Const.gDDF_SUBJECT] != null ) { + // nur Dokumentengruppen zur ausgewählten Akte ermitteln für Maschinenprojektdokumente + lSubject = doc.field[Const.gDDF_SUBJECT] + + // Alle Werte für Maschinenprojekt + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_SUBJECT} = ? " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "AND (fs1.dok_dat_feld_${Const.gDDF_PROZESS} != '0204' OR fs1.dok_dat_feld_${Const.gDDF_PROZESS} IS NULL ) " + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[ + doc.getType().getId(), + lSubject + ]); + + List ResRows = resultset.collect{it.get("val")}; + + // Ergänzung für Primärentwicklung + if(doc.getType() != null && doc.getType().getId().equals(Const.gDTS_DMAUF) && doc.field[Const.gDDF_AUFTRNR] != null && doc.field[Const.gDDF_AUFTRNR].startsWith("EN")){ + String sqlPrimaer = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_SUBJECT} = ? " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_PROZESS} = '0204' " + + "ORDER BY 2 "; + def resultsetPrimaer = d3.sql.executeAndGet(sqlPrimaer,[ + doc.getType().getId(), + lSubject + ]); + List ResRowsPrimaer = resultsetPrimaer.collect{it.get("val")}; + + for(String s : ResRowsPrimaer) { + ResRows.add(s); + } + } + + ResRows.add("DG074"); // Medien + + repoField.provideValuesForValueSet(ResRows); + + + } else if ( doc.getType().getId() == "${Const.gDTS_DPRST}" ) { + + //Wenn die Auftragsnummer gefüllt ist und der Betreff auch, ... + if ( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null && doc.field[Const.gDDF_SUBJECT] != "" && doc.field[Const.gDDF_SUBJECT] != null ) + { + // ... hole alle Dokumentgruppen die in den adminstrative folders für die Projektsteuerung, + // die Prozessart "02.02 Maschinenprojekt und für den Betreff zur Verfügung stehen + lSubject = doc.field[Const.gDDF_SUBJECT] + + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_SUBJECT} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_PROZESS} = '0202' " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[ + doc.getType().getId(), + lSubject + ]); + + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + + repoField.provideValuesForValueSet(ResRows); + + } else if ( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null && ( doc.field[Const.gDDF_SUBJECT] == "" || doc.field[Const.gDDF_SUBJECT] == null )) { + //Wenn der Betreff leer ist, ... + // hole nur die Dokumentgruppen die für die Projektsteuerung und das Maschinenprojekt angelegt sind + + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_PROZESS} = '0202' " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + resultset = d3.sql.executeAndGet(sql,[doc.getType().getId()]); + + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + + repoField.provideValuesForValueSet(ResRows); + + } else if ( doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null ) { + // Ist anstelle der Auftragsnummer die Opportunitynummer gefüllt, .... + // nimm nur Dokumentgruppen, die für die Opportunity in der Projektsteuerung zur Verfügung stehen + + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND fs1.dok_dat_feld_${Const.gDDF_PROZESS} = '0201' " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql,[doc.getType().getId()]); + List ResRows = resultset.collect{it.get("val")}; + repoField.provideValuesForValueSet(ResRows); + } + + } else if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" || doc.getType().getId() == "${Const.gDTS_DBAAU}" || doc.getType().getId() == "${Const.gDTS_DBAAS}" || doc.getType().getId() == "${Const.gDTS_DBABE}" || doc.getType().getId() == "${Const.gDTS_DBAGE}" ) { + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_REGISTER} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? "; + + //WhereClause Baudokumente + if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" && doc.field[Const.gDDF_BAUAKTE] != "" && doc.field[Const.gDDF_BAUAKTE] != null ) + { + sql = sql + "AND dok_dat_feld_${Const.gDDF_CLASS} = ? "; + resultset = d3.sql.executeAndGet(sql,[ + doc.getType().getId(), + doc.field[Const.gDDF_BAUAKTE] + ]); + } else if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" && (doc.field[Const.gDDF_BAUAKTE] == "" || doc.field[Const.gDDF_BAUAKTE] == null ) ) { + List ErrResultset = [ + "Bitte füllen Sie zuerst das Feld Bauakte" + ] + repoField.provideValuesForValueSet(ErrResultset) + } else { + resultset = d3.sql.executeAndGet(sql,[doc.getType().getId()]); + } + + List ResRows = resultset.collect{it.get("val")}; + repoField.provideValuesForValueSet(ResRows); + + } else if ( doc.getType().getId() == "${Const.gDTS_AREME}" || doc.getType().getId() == "${Const.gDTS_AVODA}" || doc.getType().getId() == "${Const.gDTS_DABTE}" ) { + + //jleu - 28.09.2017 - Dokumentgruppe für Abteilungsvorgänge und Dokumente aus den administrativen Akten laden + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_REGISTER} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_DABTE}' "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + repoField.provideValuesForValueSet(ResRows); + + } else if( doc.getType().getId().equals(Const.gDTS_DSEBE) || doc.getType().getId().equals(Const.gDTS_DSERE) ) { + + def belegTypTemp = doc.field[Const.gDDF_BELEGTYP]; + def belegNrTemp = doc.field[Const.gDDF_BELEGNUMMER]; + + if( doc.getType().getId().equals(Const.gDTS_DSEBE) && belegTypTemp != null && !belegTypTemp.equals("") ) { + + // 24.02.2020 imue - Sortierung + String sql = "SELECT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_45 = '${Const.gDTS_DSEBE}' " + + "AND ( fs1.dok_dat_feld_${Const.gDDF_BELEGART} LIKE '%${doc.field[Const.gDDF_BELEGTYP]}%' " + + " OR fs1.dok_dat_feld_${Const.gDDF_BELEGART} IS NULL ) " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + + } else if( doc.getType().getId().equals(Const.gDTS_DSEBE) && belegTypTemp == null ) { + + // 24.02.2020 imue - Sortierung + String sql = "SELECT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_DSEBE}' "; + + // 19.02.2020 imue - Beim Import ist ggf. der Belegtyp noch nicht gesplittet, daher prüfen + if( doc.field[Const.gDDF_BELEGNUMMER] != null ) { + + def belegNr = doc.field[Const.gDDF_BELEGNUMMER] + String[] splittedString = doc.field[Const.gDDF_BELEGNUMMER].split("\\s+"); + if( splittedString.size() > 1) { + belegNr = splittedString[0]; + } + + if ( belegNr != null && !belegNr.equals("") ) { + String sqlGetBelegTyp = "SELECT TOP 1 dok_dat_feld_${Const.gDDF_BELEGTYP} as belegTyp" + + " FROM firmen_spezifisch " + + " WHERE kue_dokuart = '${Const.gDTS_ASEBE}' " + + " AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '" + belegNr +"'"; + + def results = d3.sql.executeAndGet(sqlGetBelegTyp); + List resultRows = results.collect{it.get("belegTyp")}; + def belegTyp = resultRows[0]; + + if ( belegTyp != null && !belegTyp.equals("") ) { + sql += "AND ( fs1.dok_dat_feld_${Const.gDDF_BELEGART} IS NULL OR fs1.dok_dat_feld_${Const.gDDF_BELEGART} LIKE '%${belegTyp}%' ) "; + } + } + } + + sql = sql + " AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + + } else if( doc.getType().getId().equals(Const.gDTS_DSERE) ) { + + // 24.02.2020 imue - Sortierung + String sql = "SELECT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_DSERE}' " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + } + + } else if( doc.getType().getId().equals(Const.gDTS_DEINK) ) { + + def belegTypTemp = doc.field[Const.gDDF_BELEGTYP]; + def belegNrTemp = doc.field[Const.gDDF_BELEGNUMMER]; + + if( belegTypTemp != null && !belegTypTemp.equals("") ) { + + String sql = "SELECT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_45 = '${Const.gDTS_DEINK}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_BELEGART} LIKE '%${doc.field[Const.gDDF_BELEGTYP]}%' " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + + } else if( belegTypTemp == null ) { + + String sql = "SELECT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_DEINK}' "; + + // 19.02.2020 imue - Beim Import ist ggf. der Belegtyp noch nicht hinzuvalidiert, daher prüfen + if( doc.field[Const.gDDF_BELEGNUMMER] != null ) { + + def belegNr = doc.field[Const.gDDF_BELEGNUMMER] + if ( belegNr != null && !belegNr.equals("") ) { + String sqlGetBelegTyp = "SELECT TOP 1 dok_dat_feld_${Const.gDDF_BELEGTYP} as belegTyp" + + " FROM firmen_spezifisch " + + " WHERE kue_dokuart = '${Const.gDTS_AEIBE}' " + + " AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '" + belegNr +"'"; + + def results = d3.sql.executeAndGet(sqlGetBelegTyp); + List resultRows = results.collect{it.get("belegTyp")}; + + def belegTyp = resultRows[0]; + if ( belegTyp != null && !belegTyp.equals("") ) { + // Betreff + sql += "AND fs1.dok_dat_feld_${Const.gDDF_BELEGART} LIKE '%${belegTyp}%' "; + } + } + } + + sql = sql + " AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + } + + } else if( doc.getType().getId().equals(Const.gDTS_DEQUI) ) { + + lSubject = doc.field[Const.gDDF_SUBJECT] + + def where = ""; + + if ( ! ( lSubject == null || lSubject.equals("") ) ) + { + where = " AND fs1.dok_dat_feld_${Const.gDDF_SUBJECT} = '" + lSubject + "' "; + } + + // Alle Werte für Maschinenprojekt + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + where + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "AND (fs1.dok_dat_feld_${Const.gDDF_PROZESS} = 'PZ009' ) " + + " and fs1.dok_dat_feld_26 like 'DG%' " + + "ORDER BY 2 "; + //d3.log.error( "SQL: " + sql ); + //d3.log.error( "Dok-Art " + doc.getType().getId() ); + + + resultset = d3.sql.executeAndGet(sql,[ + doc.getType().getId() + ]); + + List ResRows = resultset.collect{it.get("val")}; + + + + //ResRows.add("DG074"); // Medien + + repoField.provideValuesForValueSet(ResRows); + + + + } else { + String sql = "SELECT DISTINCT fs1.dok_dat_feld_${Const.gDDF_REGISTER} as val, mv.value_char " + + "FROM firmen_spezifisch fs1 " + + "LEFT JOIN firmen_spezifisch fs2 ON fs1.dok_dat_feld_${Const.gDDF_REGISTER} = fs2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "LEFT JOIN firm_spez_mult_val mv ON fs2.doku_id = mv.doku_id " + + "WHERE fs1.kue_dokuart = '${Const.gDTS_AAFOL}' " + + "AND fs1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? " + + "AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "AND mv.row_number = '${fieldLanguage}' " + + "ORDER BY 2 "; + + resultset = d3.sql.executeAndGet(sql,[doc.getType().getId()]); + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("DG074"); // Medien + repoField.provideValuesForValueSet(ResRows); + } + + // d3.getArchive().removeTranslationFromCache("DokumentuntergruppeValues", new Locale("de")); + // d3.getArchive().removeTranslationFromCache("DokumentuntergruppeValues", new Locale("en")); + } + + @ValueSet(entrypoint="GremiumAPValues") + def getGremiumAPValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage des Gremiums aus den zugehörigen Gremien in der Projektakte + // Nicht mehr im Einsatz. + // def resultset + + // String sql = "SELECT mv.value_char as val " + + // "FROM firmen_spezifisch " + + // "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' " + + // "AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = ? "; + // resultset = d3.sql.executeAndGet(sql,[doc.getType().getId()]); + + // List ResRows = resultset.collect{it.get("val")}; + // ResRows.add("Medien") + // repoField.provideValuesForValueSet(ResRows); + + // DBMS ALIAS d3server_value_char_allowed, d3server_repos_id_allowed + // DBMS SQL SELECT mv.value_char, ':repos_id' \ + // FROM firmen_spezifisch fs, firm_spez_mult_val mv \ + // WHERE fs.doku_id = mv.doku_id \ + // AND fs.dok_dat_feld_:gDDF_PROJNR = :+dok_dat_feld[:gDDF_PROJNR] \ + // AND mv.field_no = '64' \ + // AND fs.kue_dokuart = :+gDTS_APROJ + // DBMS ALIAS + } + + @ValueSet(entrypoint="HauptProjValues") + def getHauptProjValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Org.Projektklammer z.B. Dokumentart Organisationsprojektdokumente + // 31.07.2017 Prüfung und ggf. Anpassung '%:dok_dat_feld[gDDF_PROZESS](10)' + //if( doc.field[Const.gDDF_PROZESS] != "" && doc.field[Const.gDDF_PROZESS] != null ) { + + def resultset + def length + List ResRows + + String sql = "SELECT DISTINCT LEFT(f.dok_dat_feld_${Const.gDDF_PROJNR},11) as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_APROJ}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + resultset = d3.sql.executeAndGet(sql); + + ResRows = resultset.collect{it.get("val")}; + ResRows = ResRows.sort(); + repoField.provideValuesForValueSet(ResRows); + } + + @ValueSet(entrypoint="ProjTitleMValues") + def getProjTitleMValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // OFF! + // Abfrage zur Generierung der dynamischen Wertemenge für den Projekttitel + } + + @ValueSet(entrypoint="ProzArtValues") + def getProzArtValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für die Prozessart abhängig von der Prozessgruppe + //def val1 = "%" + doc.field[Const.gDDF_PROZESSGROUP].toString() + "%"; + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESSART} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' "; + + + resultset = d3.sql.executeAndGet(sql); + + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + @ValueSet(entrypoint="ProzessValues") + def getProzessValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + + // Information ob Suchdialog oder Importdialog + def appID + def DocType + def RepoID + + try { + appID = d3.remote.getVersion()[0..2]; + RepoID = d3.remote.getServerId() + RepoID = "%" + RepoID + "%" + } catch (Exception e) { + //d3.log.error("Exception on d3.remote.getVersion = " + e); + } + + d3.log.info("APP ID ${appID} Buchungskreis ${doc.field[Const.gDDF_BUCHKREIS]} "); + + if (doc.getType().getId() == "${Const.gDTS_AHAUP}" || doc.getType().getId() == "${Const.gDTS_DOSSI}" || doc.getType().getId() == "${Const.gDTS_ATEIL}") + { + + // Abfrage zur Generierung der dynamischen Wertemenge für den Prozess abhängig von der Prozessart + def val1 = "%" + doc.field[Const.gDDF_PROZESS].toString() + "%"; + def resultset + def lRow + def lang = d3.remote.language + + if ( lang != "049" ) { + lRow = "2" + } + else { + lRow = "1" + } + + String sql = "select t1.dok_dat_feld_${Const.gDDF_PROZESS} as val " + + "from firmen_spezifisch as t1 " + + "inner join firmen_spezifisch as t2 on t1.dok_dat_feld_${Const.gDDF_PROZESS} = t2.dok_dat_feld_${Const.gDFF_SCHLUESSEL} " + + "inner join firm_spez_mult_val as t3 on t2.doku_id = t3.doku_id " + + "where t1.kue_dokuart = '${Const.gDTS_AAFOL}' and t2.kue_dokuart = '${Const.gDTS_AZTXT}' " + + "and t1.dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_AHAUP}' " + + "and t1.dok_dat_feld_${Const.gDDF_SUBJECT} like '${RepoID}' " + + "and t3.field_no = '${Const.gDDF_UEBERSETZUNG}' " + + "and row_number = '${lRow}' " + + //String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESS} as val " + + // "FROM firmen_spezifisch " + + // "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${Const.gDTS_AHAUP}' "; + + if( doc.field[Const.gDDF_PROZESS] != "" && doc.field[Const.gDDF_PROZESS] != null && validate == 0) { + sql = sql + "AND t3.value_char like '${val1}' order by t3.value_char asc"; + resultset = d3.sql.executeAndGet(sql); + } else { + sql = sql + "order by t3.value_char asc" + resultset = d3.sql.executeAndGet(sql); + } + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + d3.getArchive().removeTranslationFromCache("ProzessValues", new Locale("de")); + d3.getArchive().removeTranslationFromCache("ProzessValues", new Locale("en")); + + } else { + + if(appID == '200' && ( doc.field[Const.gDDF_BUCHKREIS] == "" || doc.field[Const.gDDF_BUCHKREIS] == null )) { + + // Prozess (Kunde) + if( doc.getType().getId() == Const.gDTS_APROZ ) { + DocType = Const.gDTS_APROZ + } else if( doc.getType().getId() == Const.gDTS_AEINK ) { + DocType = Const.gDTS_AEINK + } else if( doc.getType().getId() == Const.gDTS_APROA) { + DocType = Const.gDTS_APROA + } else { + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESS} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' "; + + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}) + } + // d3.log.info("Wert validate -${DocType}-") + + def dokuArtTemp = doc.getType().getId(); + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESS} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${DocType}' "; + + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}) + + } else { + + // Abfrage zur Generierung der dynamischen Wertemenge für den Prozess abhängig von der Prozessart + def val1 = "%" + doc.field[Const.gDDF_PROZESS].toString() + "%"; + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_PROZESS} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AAFOL}' "; + + if( doc.field[Const.gDDF_PROZESS] != "" && doc.field[Const.gDDF_PROZESS] != null ) { + sql = sql + "AND dok_dat_feld_${Const.gDDF_PROZESS} like ? "; + resultset = d3.sql.executeAndGet(sql,[val1]); + } else { + resultset = d3.sql.executeAndGet(sql); + } + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } + } + } + + @ValueSet(entrypoint="HauptProjekteValues") + def getHauptProjekteValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // OFF! + // Abfrage der Werte zu Hauptprojekt (67) für Dokumente + } + + @ValueSet(entrypoint="OppNumValues") + def getOppNumValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für die Opportunitydokumente abhängig von den existierenden Opportunityakten + // - Opportunity_Nr + // - weitere Opportunity_Nr + // - Hauptopportunity + + List valueList = new ArrayList<>(); + String lSQLState1 = ""; + + + if(doc.field[Const.gDDF_OPPNRM][row_no] != null) { + lSQLState1 = "OR dok_dat_feld_${Const.gDDF_OPPNUMMER} like '%${doc.field[Const.gDDF_OPPNRM][row_no]}%' " + } + + def lang = d3.remote.language + def lNoSubmission + + if ( lang != "049" ) { + lNoSubmission = "No Submission" + } + else { + lNoSubmission = "keine Submission" + } + + def resultset + + if( validate == 1 ) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_OPPNUMMER} as val " + + "FROM firmen_spezifisch as fs, phys_datei pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' " + + lSQLState1 + + "OR fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_HAUPTOPP]}') "; + + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + if (doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null){ + String sql = "SELECT dok_dat_feld_${Const.gDDF_OPPNUMMER} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} like '%${doc.field[Const.gDDF_OPPNUMMER]}%' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if (doc.field[Const.gDDF_HAUPTOPP] != "" && doc.field[Const.gDDF_HAUPTOPP] != null) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_OPPNUMMER} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} like '%${doc.field[Const.gDDF_HAUPTOPP]}%' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + String sql = "SELECT dok_dat_feld_${Const.gDDF_OPPNUMMER} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AOPPU}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_OPPNUMMER]}' " + + lSQLState1 + + "OR fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${doc.field[Const.gDDF_HAUPTOPP]}') "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + } + } + + @ValueSet(entrypoint="MProjNumValues") + def getMProjNumValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für die Maschinenprojektdokumente abhängig von den existierenden Maschinenprojektakten + // - Projekt_Nr + // - weitere Projekt_Nr + def lang = d3.remote.language + def lNoSubmission + + if ( lang != "049" ) { + lNoSubmission = "No Submission" + } + else { + lNoSubmission = "keine Submission" + } + + def resultset + if( validate == 1 ) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + if( docType.getId().equals(Const.gDTS_ENTMAP) ) { + // Entwicklungsprojektdokumenten -> in Abhängigkeit zu ProjektNr eingeschränkt auf EN-XXXXX + String sql = "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} LIKE 'EN%' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if( docType.getId().equals(Const.gDTS_DMAP1) ) { + // Maschinenprojektdokumenten -> in Abhängigkeit zu Projekt eingeschränkt auf PR-XXXXX + String sql = "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND dok_dat_feld_${Const.gDDF_AUFTRNR} LIKE 'PR%' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + // 22.08.2022 - Einschränkung auf min 2 Zeichen + int currDdf = repoField.getPreferedFieldNumber(); + String val1 = null; + if(currDdf > 59 && currDdf < 70) { + // Mehrfachfeld (weitere Projektnummer) + if(doc.field[currDdf][row_no] != null) { + val1 = doc.field[currDdf][row_no].toString(); + } + } else { + // Einfachfeld (Projektnummer) + if(doc.field[currDdf] != null) { + val1 = doc.field[currDdf].toString(); + } + } + + int length = 0; + if(val1 != null) { + length = val1.length(); + } + if( length >= 2 ) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_AUFTRNR} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SUBMISSION},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List ErrResultset = [ + "Bitte geben Sie mind. 2 Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset); + } + } + } + } + + + @ValueSet(entrypoint="OffNoValues") + def getOffNoValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage der vorhandenen Angebotsnummern in Abhängigkeit zu Opp. Nr. und Angebotsnamen + def resultset + def lOppNoInput = doc.field[Const.gDDF_OPPNUMMER].toString(); + def lOppNo + + //d3.log.error("doc.field[Const.gDDF_ANNAME]: " + doc.field[Const.gDDF_ANNAME] ); + //d3.log.error("doc.field[Const.gDDF_OPPNUMMER]: " + doc.field[Const.gDDF_OPPNUMMER] ); + + if( doc.field[Const.gDDF_ANNAME] == "angebotsübergreifend/vor Angebot" ) { + List ErrResultset = ["99999"] + repoField.provideValuesForValueSet(ErrResultset) + } + + if( doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null ) { + //Splitten des zusammengesetzten String Opportunitynummer und Submission nach Opportunitynummer + if( lOppNoInput.indexOf('|') >= 1 ) { + String[] str; + str = lOppNoInput.split('\\|'); + lOppNo = str[0]; + } else { + lOppNo = doc.field[Const.gDDF_OPPNUMMER].toString(); + } + } + + // String sql = "SELECT dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + // "FROM firmen_spezifisch " + + // "WHERE kue_dokuart = '${Const.gDTS_AREGI}' " + + // "AND dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? " ; + // resultset = d3.sql.executeAndGet(sql,[lOppNo]); + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + if( ( doc.field[Const.gDDF_OPPNUMMER] == '' || doc.field[Const.gDDF_OPPNUMMER] == null ) && ( doc.field[Const.gDDF_ANNAME] == '' || doc.field[Const.gDDF_ANNAME] == null ) ) { + List ErrResultset = [ + "Bitte wählen Sie zunächst den Angebotsnamen" + ] + repoField.provideValuesForValueSet(ErrResultset) + } else if( ( doc.field[Const.gDDF_ANNAME] == '' || doc.field[Const.gDDF_ANNAME] == null ) && ( doc.field[Const.gDDF_OPPNUMMER] != '' || doc.field[Const.gDDF_OPPNUMMER] != null ) ) { + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AREGI}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? " ; + //resultset = d3.sql.executeAndGet(sql,[doc.field[Const.gDDF_OPPNUMMER]]); + resultset = d3.sql.executeAndGet(sql,[lOppNo]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if( doc.field[Const.gDDF_ANNAME] != '' && doc.field[Const.gDDF_ANNAME] != null && ( doc.field[Const.gDDF_OPPNUMMER] == '' || doc.field[Const.gDDF_OPPNUMMER] == null ) ) { + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AREGI}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_ANNAME} = ? " ; + resultset = d3.sql.executeAndGet(sql,[doc.field[Const.gDDF_ANNAME]]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if( doc.field[Const.gDDF_ANNAME] != '' && doc.field[Const.gDDF_ANNAME] != null && doc.field[Const.gDDF_OPPNUMMER] != '' && doc.field[Const.gDDF_OPPNUMMER] != null ) { + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_PROJTITLE} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AREGI}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_ANNAME} = ? " + + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? " ; + //resultset = d3.sql.executeAndGet(sql,[doc.field[Const.gDDF_ANNAME], doc.field[Const.gDDF_OPPNUMMER]]); + resultset = d3.sql.executeAndGet(sql,[ + doc.field[Const.gDDF_ANNAME], + lOppNo + ]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="OffNameValues") + def getOffNameValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage der Angebotsnamen in Abhängigkeit zur Opportunitynummer + def resultset + if( doc.field[Const.gDDF_OPPNUMMER] == "" || doc.field[Const.gDDF_OPPNUMMER] == null ) { + + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_ANNAME} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AUNTE}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + resultset = d3.sql.executeAndGet(sql); + + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("angebotsübergreifend/vor Angebot") + repoField.provideValuesForValueSet(ResRows); + + } else { + def OpportunityNoInput = doc.field[Const.gDDF_OPPNUMMER].toString(); + def OpportunityNo + + if( OpportunityNoInput.indexOf('|') >= 1 ) { + String[] str; + str = OpportunityNoInput.split('\\|'); + OpportunityNo = str[0]; + } else { + OpportunityNo = doc.field[Const.gDDF_OPPNUMMER].toString() + } + + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_ANNAME} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AUNTE}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? "; + resultset = d3.sql.executeAndGet(sql, [OpportunityNo]); + + List ResRows = resultset.collect{it.get("val")}; + ResRows.add("angebotsübergreifend/vor Angebot") + repoField.provideValuesForValueSet(ResRows); + } + } + + @ValueSet(entrypoint="SubmissionValues") + def getSubmissionValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für die Submission + def resultset + + def length + def val1 = doc.field[Const.gDDF_SUBMISSION].toString() + + length = val1.length(); + // d3.log.error("length: " + length.toString()); + // d3.log.error("val1: " + val1.toString()); + if( val1.length() >= 2 && doc.field[Const.gDDF_SUBMISSION] != "" && doc.field[Const.gDDF_SUBMISSION] != null ) { + + if( docType.getId().equals(Const.gDTS_DOPP1) ) { + // Dokumentsammler Suche - Anzeige aller Werte in Abhängigkeit zu Opportunitydokumente + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_SUBMISSION}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AOPPU}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else if( docType.getId().equals(Const.gDTS_DMAP1) ) { + // Dokumentsammler Suche - Anzeige aller Werte in Abhängigkeit zu Maschinenprojektdokumente + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_SUBMISSION}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AMPRA}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else if( docType.getId().equals(Const.gDTS_ENTMAP) ) { + // Dokumentsammler Suche - Anzeige aller Werte in Abhängigkeit zu Entwicklungsprojektdokumente + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_SUBMISSION}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else { + // Anzeige aller möglichen Werte + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_SUBMISSION}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE ( fs.kue_dokuart = '${Const.gDTS_AOPPU}' " + + "OR fs.kue_dokuart = '${Const.gDTS_ASEBE}' " + + "OR fs.kue_dokuart = '${Const.gDTS_AMPRA}' " + + "OR fs.kue_dokuart = '${Const.gDTS_APREN}' ) " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND dok_dat_feld_${Const.gDDF_SUBMISSION} LIKE '%${doc.field[Const.gDDF_SUBMISSION]}%'"; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens zwei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } + + @ValueSet(entrypoint="RespSalesmanValues") + def getRespSalesmanValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Abfrage zur Generierung der dynamischen Wertemenge für den zust. Verkäufer + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_RESPSALESMAN} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AOPPU}' " + + "OR kue_dokuart = '${Const.gDTS_APREN}' " + + "OR kue_dokuart = '${Const.gDTS_AMPRA}' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + @ValueSet(entrypoint="CustActNameValues") + def getCustActNameValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + // Kundenkontakt_Beschreibung + // dynamische Wertemenge für die Ermittlung der Kundenkontaktakten zu einer Opportunity Kundenkontakt_Beschreibung + def Language = d3.remote.getLanguage(); + if( ( doc.field[Const.gDDF_OPPNUMMER] == "" || doc.field[Const.gDDF_OPPNUMMER] == null ) && ( doc.field[Const.gDDF_AUFTRNR] == "" || doc.field[Const.gDDF_AUFTRNR] == null ) && ( doc.field[Const.gDDF_KNR] == "" || doc.field[Const.gDDF_KNR] == null ) ) { + if( Language != null && Language.equals("049") ) { + List ErrResultset = [ + "Bitte wählen Sie zunächst entweder Opportunity, Maschinenprojekt oder Kundennummer für die Auswahl" + ] + repoField.provideValuesForValueSet(ErrResultset) + } else { + List ErrResultset = [ + "Please choose an Opportunity, Project or Customernumber at first." + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } else { + + def resultset + String sql = "SELECT f.dok_dat_feld_${Const.gDDF_KDAKTNAME} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + // Überprüfung ob die Auftragsnummer gefüllt ist, ggf. Split + + if( doc.field[Const.gDDF_KNR] != null ) { + def CustomerNoInput = doc.field[Const.gDDF_KNR].toString(); + def CustomerNo + + if( CustomerNoInput.indexOf('|') >= 1 ) { + String[] str; + str = CustomerNoInput.split('\\|'); + CustomerNo = str[0]; + } else { + CustomerNo = doc.field[Const.gDDF_KNR].toString() + } + + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KNR} = '${CustomerNo}' "; + } + + if( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null ) { + def ProjectNoInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def ProjectNo + + if( ProjectNoInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjectNoInput.split('\\|'); + ProjectNo = str[0]; + } else { + ProjectNo = doc.field[Const.gDDF_AUFTRNR].toString() + } + + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${ProjectNo}' "; + } else if( doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null ) { + // Überprüfung ob die Opportunitynummer gefüllt ist, ggf. Split + def OpportunityNoInput = doc.field[Const.gDDF_OPPNUMMER].toString(); + def OpportunityNo + + if( OpportunityNoInput.indexOf('|') >= 1 ) { + String[] str; + str = OpportunityNoInput.split('\\|'); + OpportunityNo = str[0]; + } else { + OpportunityNo = doc.field[Const.gDDF_OPPNUMMER].toString() + } + + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${OpportunityNo}' "; + } + + // Überprüfung des Kontaktdatums + if ( doc.field[Const.gDDF_KONTAKTDATE] != null) { + + // d3.log.error("Kontaktdatum: " + doc.field[Const.gDDF_KONTAKTDATE] ); + def KontaktDate = doc.field[Const.gDDF_KONTAKTDATE] + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KONTAKTDATE} = ? "; + resultset = d3.sql.executeAndGet(sql, [KontaktDate]); + } + else{ + resultset = d3.sql.executeAndGet(sql); + } + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="CustActDateValues") + def getCustActDateValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Ermittlung der Kundenkontaktakten zu einer Opportunity + def Language = d3.getNatives().getd3fcLanguage(); + def resultset + def val1 + + String sql = "SELECT CONVERT(varchar, f.dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104) as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " ; + + if( ( doc.field[Const.gDDF_OPPNUMMER] == "" || doc.field[Const.gDDF_OPPNUMMER] == null ) && ( doc.field[Const.gDDF_AUFTRNR] == "" || doc.field[Const.gDDF_AUFTRNR] == null ) && ( doc.field[Const.gDDF_KNR] != "" && doc.field[Const.gDDF_KNR] != null ) ) { + def CustomerNoInput = doc.field[Const.gDDF_KNR].toString(); + def CustomerNo + + if( CustomerNoInput.indexOf('|') >= 1 ) { + String[] str; + str = CustomerNoInput.split('\\|'); + CustomerNo = str[0]; + } else { + CustomerNo = doc.field[Const.gDDF_KNR].toString() + } + val1 = CustomerNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KNR} = ? "; + } else if( doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null ) { + def OpportunityNoInput = doc.field[Const.gDDF_OPPNUMMER].toString(); + def OpportunityNo + + if( OpportunityNoInput.indexOf('|') >= 1 ) { + String[] str; + str = OpportunityNoInput.split('\\|'); + OpportunityNo = str[0]; + } else { + OpportunityNo = doc.field[Const.gDDF_OPPNUMMER].toString() + } + val1 = OpportunityNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? "; + } else if ( dok_dat_feld[gDDF_AUFTRNR] != "" && dok_dat_feld[gDDF_AUFTRNR] != null ) + { + def ProjectNoInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def ProjectNo + + if( ProjectNoInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjectNoInput.split('\\|'); + ProjectNo = str[0]; + } else { + ProjectNo = doc.field[Const.gDDF_AUFTRNR].toString() + } + val1 = ProjectNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? "; + } + + // Überprüfung des Kontaktdatums + if ( doc.field[Const.gDDF_KONTAKTDATE] != "" && doc.field[Const.gDDF_KONTAKTDATE] != null) { + // d3.log.error("Kontaktdatum: " + doc.field[Const.gDDF_KONTAKTDATE] ); + def KontaktDate = doc.field[Const.gDDF_KONTAKTDATE] + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KONTAKTDATE} = ? "; + resultset = d3.sql.executeAndGet(sql, [val1, KontaktDate]); + } else { + resultset = d3.sql.executeAndGet(sql, [val1]); + } + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + @ValueSet(entrypoint="CustActIDValues") + def getCustActIDValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Ermittlung der Kundenkontaktakten zu einer Opportunity + def Language = d3.getNatives().getd3fcLanguage(); + def resultset + def val1 + + String sql = "SELECT DISTINCT ISNULL(f.dok_dat_feld_${Const.gDDF_AUFTRNR},'') as SQLAuftragsnr, ISNULL(f.dok_dat_feld_${Const.gDDF_OPPNUMMER},'') as SQLOpportunityNr, ISNULL(f.dok_dat_feld_${Const.gDDF_KONTAKTNUMMER},'') as SQLKontaktID, ISNULL(CONVERT(varchar, f.dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104),'') as SQLKontaktDatum, ISNULL(f.dok_dat_feld_${Const.gDDF_KDAKTNAME},'') as SQLKontaktBeschr, ISNULL(f.dok_dat_feld_${Const.gDDF_KNR},'') as SQLKundenNr " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + if( doc.field[Const.gDDF_OPPNUMMER] != "" && doc.field[Const.gDDF_OPPNUMMER] != null ) { + def OpportunityNoInput = doc.field[Const.gDDF_OPPNUMMER].toString(); + def OpportunityNo + + if( OpportunityNoInput.indexOf('|') >= 1 ) { + String[] str; + str = OpportunityNoInput.split('\\|'); + OpportunityNo = str[0]; + } else { + OpportunityNo = doc.field[Const.gDDF_OPPNUMMER].toString() + } + val1 = OpportunityNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_OPPNUMMER} = ? "; + } else if ( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null ) + { + def ProjectNoInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def ProjectNo + + if( ProjectNoInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjectNoInput.split('\\|'); + ProjectNo = str[0]; + } else { + ProjectNo = doc.field[Const.gDDF_AUFTRNR].toString() + } + val1 = ProjectNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? "; + }else if( doc.field[Const.gDDF_KNR] != "" && doc.field[Const.gDDF_KNR] != null ) { + def CustomerNoInput = doc.field[Const.gDDF_KNR].toString(); + def CustomerNo + + if( CustomerNoInput.indexOf('|') >= 1 ) { + String[] str; + str = CustomerNoInput.split('\\|'); + CustomerNo = str[0]; + } else { + CustomerNo = doc.field[Const.gDDF_KNR].toString(); + } + val1 = CustomerNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KNR} = ? "; + } else if( doc.field[Const.gDDF_KNAME] != "" && doc.field[Const.gDDF_KNAME] != null ) { + def CustomerNameInput = doc.field[Const.gDDF_KNAME].toString(); + def CustomerName + def CustomerNo + + if( CustomerNameInput.indexOf('|') >= 1 ) { + String[] str; + str = CustomerNameInput.split('\\|'); + CustomerNo = str[0]; + } else { + List ErrResultset = [ + "Bitte wählen Sie die Kundennummer und den Kundennamen aus der Auswahlliste aus." + ] + repoField.provideValuesForValueSet(ErrResultset) + } + val1 = CustomerNo + sql = sql + "AND f.dok_dat_feld_${Const.gDDF_KNR} = ? "; + } + if( val1 == "" || val1 == null ) { + resultset = d3.sql.executeAndGet(sql); + } else { + resultset = d3.sql.executeAndGet(sql, [val1]); + } + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + + List ResRows + def length + ResRows = resultset.collect{it.get("SQLKontaktID")}; + length = ResRows.size(); + + if( validate == 1 ) { + for(int i = 0;i '${Const.gAK_Projektorganisation}' """); + repoField.provideValuesForValueSet(resultset.collect{it.get("subject")}); + return 0; + + } else if ( doc.getType().getId().equals(Const.gDTS_DPRST) && ( !doc.field[Const.gDDF_OPPNUMMER].equals("") || doc.field[Const.gDDF_OPPNUMMER] == null && doc.field[Const.gDDF_AUFTRNR] == null ) ) { + List lEmpty = [""] + repoField.provideValuesForValueSet(lEmpty); + + } else if( doc.getType().getId().equals(Const.gDTS_AAFOL) ) { + List keysReesultset = [] + + // Bereitstellung der bisher manuellen Wertemenge "Betreff" (ID 69) für die administrative folders + def sqlStatement = "SELECT DISTINCT value_char_allowed as value " + + "FROM doc_field_val_names dfvn " + + "LEFT JOIN doc_field_values dfv ON dfvn.predef_val_id = dfv.predef_value_id " + + "WHERE dfvn.predef_val_id = 69 " + List sqlResult = d3.sql.executeAndGet(sqlStatement) + + for(GroovyRowResult grr : sqlResult) { + def value = grr.get("value") + + def sqlStatementShortKey = "SELECT DISTINCT dok_dat_feld_${Const.gDFF_SCHLUESSEL} as shortKey " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = 'AZTXT' " + + "AND dok_dat_feld_${Const.gDDF_ORGENTRY} = '${value}' " + + "AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} LIKE 'AK%' " + List sqlResultShortKey = d3.sql.executeAndGet(sqlStatementShortKey) + if( sqlResultShortKey.size() > 0 ) { + keysReesultset.add(sqlResultShortKey.getAt(0).get("shortKey")) + } + } + repoField.provideValuesForValueSet(keysReesultset); + + } else if ( ( doc.getType().getId().equals(Const.gDTS_DEQUI) ) || ( doc.getType().getId().equals(Const.gDTS_AEQUI) ) ) { + + // Wertemenge für Equipmentakte abhängig von Aktengruppe + // Wertemenge soll Werte liefern, die in der AAFOL-Akte enthalten sind + + def lDokGroup = doc.field[Const.gDDF_DOKGROUP]; + def lFolderGroup = doc.field[Const.gDDF_AKTENGRP]; + + def where = ""; + + if ( ! ( lDokGroup == null || lDokGroup.equals("") ) ) + { + where = " AND dok_dat_feld_26 in (select dok_dat_feld_48 from firmen_spezifisch where dok_dat_feld_26 = '" + lDokGroup + "') "; + } + + if ( ! ( lFolderGroup == null || lFolderGroup.equals("") ) ) + { + where = where + " AND dok_dat_feld_48 = '" + lFolderGroup + "' "; + } + + + //def ergebnis = d3.sql.executeAndGet( "select distinct dok_dat_feld_48 from firmen_spezifisch where kue_dokuart = 'aafol' and dok_dat_feld_48 like 'AK%' and dok_dat_feld_45 = 'DEQUI' " + where + " order by dok_dat_feld_48" ); + def STATEMENT = "select distinct dok_dat_feld_26 from firmen_spezifisch where kue_dokuart = 'aafol' and dok_dat_feld_26 like 'AK%' and dok_dat_feld_45 = 'DEQUI' " + where; + d3.log.error( STATEMENT ); + def ergebnis = d3.sql.executeAndGet( STATEMENT ); + repoField.provideValuesForValueSet( ergebnis.collect{ it.get("dok_dat_feld_26") } ); + + return 0; + + } else { + // Hinweis, da die Dokumentart ECR Dokumente das Attribut "Akte" nicht enthält wurde diese Unterscheidung weggenommen + // Der ELSE Zweig gilt für Spezifikationsdokumente, Maschinenprojektdokumente, Technikdokumente, Vertriebsdokumente, Dummysuche, Alle Maschinenprojekt- und Opportunitydokumente + def resultset = d3.sql.executeAndGet("""SELECT distinct(dok_dat_feld_${Const.gDDF_SUBJECT}) as subject + FROM firmen_spezifisch + WHERE kue_dokuart = '${Const.gDTS_AAFOL}' + AND dok_dat_feld_${Const.gDDF_ANWENDUNGSFALL} = '${docType.id}'"""); + repoField.provideValuesForValueSet(resultset.collect{it.get("subject")}); + + return 0; + } + } + + @ValueSet(entrypoint="SalesgroupValues") + def getSalesgroupValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Verkäufergruppe + def resultset + + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_SALESGROUP} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AOPPU}' " + + "OR kue_dokuart = '${Const.gDTS_APREN}' " + + "OR kue_dokuart = '${Const.gDTS_AMPRA}' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + @ValueSet(entrypoint="BauakteValues") + def getBauakteValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Bauakte + // 31.07.2017 LIKE nur, wenn gefüllt, wenn kleiner 10.000 alle anzeigen und über die automatische Nachfilterung des Clients + def resultset + def lBauprojekt = "%" + doc.field[Const.gDDF_BAUPROJEKT] + "%"; + + if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" || doc.getType().getId() == "${Const.gDTS_ABAUN}" ) { + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_BAUAKTE} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ABAUK}' " + + "AND dok_dat_feld_${Const.gDDF_BAUPROJEKT} like ? " ; + resultset = d3.sql.executeAndGet(sql,[lBauprojekt]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + // 31.07.2017 Vorschlagswertemenge? + List ErrResultset = [doc.field[Const.gDDF_BAUAKTE]] + repoField.provideValuesForValueSet(ErrResultset) + } + } + + @ValueSet(entrypoint="BauakteUnterValues") + def getBauakteUnterValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Untergruppe Bauakte + if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" ) { + def resultset + def lBauakte = doc.field[Const.gDDF_BAUAKTE].toString(); + def lBauprojekt = "%" + doc.field[Const.gDDF_BAUPROJEKT].toString() + "%"; + + String sql = "SELECT dok_dat_feld_${Const.gDDF_UNTERBAUAKTE} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ABAUN}' " + + "AND dok_dat_feld_${Const.gDDF_BAUAKTE} = ? " + + "AND dok_dat_feld_${Const.gDDF_BAUPROJEKT} like ? " ; + resultset = d3.sql.executeAndGet(sql, [lBauakte, lBauprojekt]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + // 31.07.2017 Vorschlagswertemenge? + List SingleResultset = [ + doc.field[Const.gDDF_UNTERBAUAKTE] + ] + repoField.provideValuesForValueSet(SingleResultset) + } + } + + @ValueSet(entrypoint="BauaktengruppeValues") + def getBauaktengruppeValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Bauaktengruppe + if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" || doc.getType().getId() == "${Const.gDTS_ABAUP}" || doc.getType().getId() == "${Const.gDTS_DBAAU}" || doc.getType().getId() == "${Const.gDTS_DBAAS}" || doc.getType().getId() == "${Const.gDTS_DBABE}" || doc.getType().getId() == "${Const.gDTS_DBAGE}" ) { + def resultset + def lBauprojekt = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + String sql = "SELECT dok_dat_feld_${Const.gDDF_BAUAKTENGRUPPE} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ABAUG}' " + + "AND dok_dat_feld_${Const.gDDF_BAUPROJEKT} like ? " ; + resultset = d3.sql.executeAndGet(sql, [lBauprojekt]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List SingleResultset = [ + doc.field[Const.gDDF_BAUAKTENGRUPPE] + ] + repoField.provideValuesForValueSet(SingleResultset) + } + } + + @ValueSet(entrypoint="BauprojektValues") + def getBauprojektValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Bauprojekt + if( doc.getType().getId() == "${Const.gDTS_DBAUD}" || doc.getType().getId() == "${Const.gDTS_ABAUN}" || doc.getType().getId() == "${Const.gDTS_ABAUP}" ) { + def resultset + + String sql = "SELECT dok_dat_feld_${Const.gDDF_BAUPROJEKT} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ABAUP}' "; + resultset = d3.sql.executeAndGet(sql); + + List ResRows + ResRows = resultset.collect{it.get("val")}; + + ResRows = ResRows.sort(); + repoField.provideValuesForValueSet(ResRows); + } else { + List SingleResultset = [ + doc.field[Const.gDDF_BAUPROJEKT] + ] + repoField.provideValuesForValueSet(SingleResultset) + } + } + + @ValueSet(entrypoint="BauplanaenderungValues") + def getBauplanaenderungValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für die Bauplanaenderung -> Bauprojekt Unteraktentitel + // OFF! + def resultset + def val1 + def val2 + + String sql = "SELECT dok_dat_feld_${Const.gDDF_BAUPLANAENDERUNG} as val " + + "FROM firmen_spezifisch "; + + if ( doc.getType().getId() == "${Const.gDTS_DBAUD}" && ( doc.field[Const.gDDF_BAUAKTE](1,1) == "8" || doc.field[Const.gDDF_BAUAKTE](1,1) == "4" || doc.field[Const.gDDF_BAUAKTE](1,1) == "6" ) ) { + sql = sql + "WHERE dok_dat_feld_:gDDF_BAUAKTE = ? " + + "AND dok_dat_feld_:gDDF_BAUPROJEKT = ? "; + val1 = doc.field[Const.gDDF_BAUAKTE].toString(); + val2 = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + } else if (doc.getType().getId() == "${Const.gDTS_DBAAU}") { + sql = sql + "WHERE dok_dat_feld_:gDDF_BAUAKTE = ? " + + "AND dok_dat_feld_:gDDF_BAUPROJEKT = ? "; + val1 = gAUSFUEHRUNG + val2 = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + } else if (doc.getType().getId() == "${Const.gDTS_DBAGE}") { + sql = sql + "WHERE dok_dat_feld_:gDDF_BAUAKTE = ? " + + "AND dok_dat_feld_:gDDF_BAUPROJEKT = ? "; + val1 = gGENEHMIGUNG + val2 = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + } else if (doc.getType().getId() == "${Const.gDTS_DBABE}") { + sql = sql + "WHERE dok_dat_feld_:gDDF_BAUAKTE = ? " + + "AND dok_dat_feld_:gDDF_BAUPROJEKT = ? "; + val1 = gBESPRECHUNG + val2 = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + } else if (doc.getType().getId() == "${Const.gDTS_DBAAS}") { + sql = sql + "WHERE dok_dat_feld_:gDDF_BAUAKTE = ? " + + "AND dok_dat_feld_:gDDF_BAUPROJEKT = ? "; + val1 = gAUSSCHREIBUNG + val2 = doc.field[Const.gDDF_BAUPROJEKT].toString(); + + } else { + // 31.07.2017 Vorschlagswertemenge? + List SingleResultset = [ + doc.field[Const.gDDF_BAUPLANAENDERUNG] + ] + repoField.provideValuesForValueSet(SingleResultset) + return 0; + } + resultset = d3.sql.executeAndGet(sql, [val1, val2]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } + + @ValueSet(entrypoint="MappCustomActionValues") + def getMappCustomActionValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge Zuordnung Kundenkontakt + // Muss Vorschlag bleiben, da später "bereits zugeordnet" ergänzt wird + // d3.log.error("MappCustomActionValues " + user.id ); + if( validate == 1 ) { + def ProjInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def Projectnumber + def resultset + List ResRows + List ResRows2 + def length + + if( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null ) { + if( ProjInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjInput.split('\\|'); + Projectnumber = str[0]; + } else { + Projectnumber = doc.field[Const.gDDF_AUFTRNR].toString(); + } + + String sql = "SELECT 'bereits zugeordnet ' + ISNULL(dok_dat_feld_${Const.gDDF_KONTAKTNUMMER},'') + '|' + Convert(Varchar(25), dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104) + '|' + dok_dat_feld_${Const.gDDF_KDAKTNAME} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? " ; + resultset = d3.sql.executeAndGet(sql,[Projectnumber]); + + ResRows = resultset.collect{it.get("val")} + ResRows2 = resultset.collect{it.get("val")} + length = ResRows.size() + // d3.log.error( "length: " + length.toString() ); + + ResRows.each{ + // d3.log.error( "Werte: " + it ); + // d3.log.error( "Länge: " + it.length().toString() ); + if( it.length() > 19 ) { + + // d3.log.error( "Länger als 19: " + it.length().toString() ); + // d3.log.error( "Länger als 19:-" + it.substring(19) + "-" ); + ResRows2.add( it.substring(19) ) + } + } + ResRows2 = ResRows2.sort(); + repoField.provideValuesForValueSet(ResRows2); + } + } else { + def ProjInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def Projectnumber + def resultset + if( doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null ) { + if( ProjInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjInput.split('\\|'); + Projectnumber = str[0]; + } else { + Projectnumber = doc.field[Const.gDDF_AUFTRNR].toString(); + } + + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KONTAKTNUMMER},'') + '|' + Convert(Varchar(25), dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104) + '|' + dok_dat_feld_${Const.gDDF_KDAKTNAME} as val " + + "FROM firmen_spezifisch as f, phys_datei as p " + + "WHERE f.kue_dokuart = '${Const.gDTS_AKONT}' " + + "AND p.frei_o_gesperrt = 'f' " + + "AND p.doku_id = f.doku_id " + + "AND f.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? " ; + resultset = d3.sql.executeAndGet(sql,[Projectnumber]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List SingleResultset = [ + "Bitte wählen Sie zunächst eine Maschinenprojektnummer" + ] + repoField.provideValuesForValueSet(SingleResultset) + return 0; + } + } + } + + @ValueSet(entrypoint="ActivityIDECRValues") + def getActivityIDECRValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge ECR AktivitätsID + // Eingabe: Projektnummer 19 gDDF_AUFTRNR + Unterakte ECR gDTS_AMECR oder ECR Dokument gDTS_DMECR + // Ausgabe: ECR Aktivitäts ID´s 15 gDDF_AKTIVITAETSID und ECR Beschreibung 24 gDDF_BESCHREIBUNG + def ProjInput = doc.field[Const.gDDF_AUFTRNR].toString(); + def Projectnumber + def resultset + List ResRows + def length + List ErrResultset + + def docFieldValue = doc.docFieldAsString(Const.gDDF_AKTIVITAETSID) + + // d3.log.error("ActivityIDECRValues DocType/docFieldValue " + docType.id + " " + docFieldValue ); + + if( validate == 1 && user.id != "Master" ) { + if( ProjInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjInput.split('\\|'); + Projectnumber = str[0]; + } else { + Projectnumber = doc.field[Const.gDDF_AUFTRNR].toString(); + } + + String sql = "SELECT ISNULL(fs.dok_dat_feld_${Const.gDDF_AKTIVITAETSID},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AMECR}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? " ; + resultset = d3.sql.executeAndGet(sql,[Projectnumber]); + ResRows = resultset.collect{it.get("val")}; + repoField.provideValuesForValueSet(ResRows); + } else { + + if ( ( doc.getType().getId() == "${Const.gDTS_AMECR}" || doc.getType().getId() == "${Const.gDTS_DMECR}" ) && doc.field[Const.gDDF_AUFTRNR] != "" && doc.field[Const.gDDF_AUFTRNR] != null ) { + if( ProjInput.indexOf('|') >= 1 ) { + String[] str; + str = ProjInput.split('\\|'); + Projectnumber = str[0]; + } else { + Projectnumber = doc.field[Const.gDDF_AUFTRNR].toString(); + } + + String sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_AKTIVITAETSID},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_BESCHREIBUNG},'') as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AMECR}' " + + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = ? " + + "AND fs.doku_id = pd.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " ; + resultset = d3.sql.executeAndGet(sql,[Projectnumber]); + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + ResRows = resultset.collect{it.get("val")}; + length = ResRows.size(); + + // 31.07.2017 Überprüfung der Funktion + + if( length > 1000 || length == 0 ) + { + ErrResultset = [ + "Bitte überprüfen Sie Ihre Eingaben. Es wurden " + length + " Ergebnisse gefunden" + ] + repoField.provideValuesForValueSet(ErrResultset) + } else { + repoField.provideValuesForValueSet(ResRows); + } + } else { + ErrResultset = [ + "Bitte wählen Sie zunächst eine Projektnummer" + ] + repoField.provideValuesForValueSet(ErrResultset) + } + } + } + + @ValueSet(entrypoint="PackageValues") + def getPackageValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für Vertriebsmedien -> Attributfeld 6 Package + def lDivision = doc.field[Const.gDDF_DIVISION].getAt(row_no).toString(); + def lMachinesystem = doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no).toString(); + def lMachine = doc.field[Const.gDDF_MACHINE].getAt(row_no).toString(); + def lFunctions = doc.field[Const.gDDF_FUNCTIONS].getAt(row_no).toString(); + def lModules = doc.field[Const.gDDF_MODULES].getAt(row_no).toString(); + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + if( doc.field[Const.gDDF_DIVISION].getAt(row_no) != "" && doc.field[Const.gDDF_DIVISION].getAt(row_no) != null && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != null && doc.field[Const.gDDF_MACHINE].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINE].getAt(row_no) != null && doc.field[Const.gDDF_FUNCTIONS].getAt(row_no) != "" && doc.field[Const.gDDF_FUNCTIONS].getAt(row_no) != null && doc.field[Const.gDDF_MODULES].getAt(row_no) != "" && doc.field[Const.gDDF_MODULES].getAt(row_no) != null ) + { + String sql = "SELECT DISTINCT Package as val " + + "FROM Z_Vertriebsmedien " + + "WHERE Division = ? " + + "AND Machinesystem = ? " + + "AND Machine = ? " + + "AND Functions = ? " + + "AND Modules = ? " ; + resultset = d3.sql.executeAndGet(sql,[ + lDivision, + lMachinesystem, + lMachine, + lFunctions, + lModules + ]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="ModulesValues") + def getModulesValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge 5. Module + def lDivision = doc.field[Const.gDDF_DIVISION].getAt(row_no).toString(); + def lMachinesystem = doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no).toString(); + def lMachine = doc.field[Const.gDDF_MACHINE].getAt(row_no).toString(); + def lFunctions = doc.field[Const.gDDF_FUNCTIONS].getAt(row_no).toString(); + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + if( doc.field[Const.gDDF_DIVISION].getAt(row_no) != "" && doc.field[Const.gDDF_DIVISION].getAt(row_no) != null && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != null && doc.field[Const.gDDF_MACHINE].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINE].getAt(row_no) != null && doc.field[Const.gDDF_FUNCTIONS].getAt(row_no) != "" && doc.field[Const.gDDF_FUNCTIONS].getAt(row_no) != null ) + { + String sql = "SELECT DISTINCT Modules as val " + + "FROM Z_Vertriebsmedien " + + "WHERE Division = ? " + + "AND Machinesystem = ? " + + "AND Machine = ? " + + "AND Functions = ? " ; + resultset = d3.sql.executeAndGet(sql,[ + lDivision, + lMachinesystem, + lMachine, + lFunctions + ]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="FunctionsValues") + def getFunctionsValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge 4. Functions + def lDivision = doc.field[Const.gDDF_DIVISION].getAt(row_no).toString(); + def lMachinesystem = doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no).toString(); + def lMachine = doc.field[Const.gDDF_MACHINE].getAt(row_no).toString(); + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + if( doc.field[Const.gDDF_DIVISION].getAt(row_no) != "" && doc.field[Const.gDDF_DIVISION].getAt(row_no) != null && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != null && doc.field[Const.gDDF_MACHINE].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINE].getAt(row_no) != null ) + { + String sql = "SELECT DISTINCT Functions as val " + + "FROM Z_Vertriebsmedien " + + "WHERE Division = ? " + + "AND Machinesystem = ? " + + "AND Machine = ? " ; + resultset = d3.sql.executeAndGet(sql,[ + lDivision, + lMachinesystem, + lMachine + ]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="MachineValues") + def getMachineValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge 3. Machine + def lDivision = doc.field[Const.gDDF_DIVISION].getAt(row_no).toString(); + def lMachinesystem = doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no).toString(); + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + if( doc.field[Const.gDDF_DIVISION].getAt(row_no) != "" && doc.field[Const.gDDF_DIVISION].getAt(row_no) != null && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != "" && doc.field[Const.gDDF_MACHINESYSTEM].getAt(row_no) != null ) + { + String sql = "SELECT DISTINCT Machine as val " + + "FROM Z_Vertriebsmedien " + + "WHERE Division = ? " + + "AND Machinesystem = ? " ; + resultset = d3.sql.executeAndGet(sql,[lDivision, lMachinesystem]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="MachineSystemValues") + def getMachineSystemValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge 2. Machine system + def lDivision = doc.field[Const.gDDF_DIVISION].getAt(row_no).toString(); + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + if( doc.field[Const.gDDF_DIVISION].getAt(row_no) != "" && doc.field[Const.gDDF_DIVISION].getAt(row_no) != null ) + { + String sql = "SELECT DISTINCT Machinesystem as val " + + "FROM Z_Vertriebsmedien " + + "WHERE Division = ? " ; + resultset = d3.sql.executeAndGet(sql,[lDivision]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + } + + @ValueSet(entrypoint="DivisionValues") + def getDivisionValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge 1. Division + def resultset + + if( doc.getType().getId() == "${Const.gDTS_DVEME}" ) { + String sql = "SELECT DISTINCT Division as val " + + "FROM Z_Vertriebsmedien "; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="CaseValues") + def getCaseValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge Beteiligter Vorgang + def length + def resultset + def ResRows = []; + int ResCount = 0 + def DocCaption1 + def Admin + + if( doc.getType().getId() == "${Const.gDTS_DABTE}" ) + { + if( d3.config.value("d3fc_server_id") == "T" ) { + Admin = "d3tadm"; + } else if( d3.config.value("d3fc_server_id") == "Q" ) { + Admin = "d3qadm"; + } else { + Admin = "d3padm"; + } + + String sql = "SELECT doku_id as ResDocuId, kue_dokuart as ResKueDokuart " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AOPPU}' " + + "OR kue_dokuart = '${Const.gDTS_APREN}' " + + "OR kue_dokuart = '${Const.gDTS_AMPRA}' " ; + resultset = d3.sql.executeAndGet(sql); + length = resultset.size(); + + for(int i = 0;i 10000 ) { + d3.log.error("Funktion entrypoint='CaseValues' muss angepasst werden, es sind mehr als 10.000 Cases in der Auswahl"); + } + } + } + + @ValueSet(entrypoint="AttachmentValues") + def getAttachmentValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge Regelberichte DDF 61 abhängige Anlage + def resultset + + String sql = "SELECT dok_dat_feld_${Const.gDDF_ANLAGE} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_DAREG}' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + @ValueSet(entrypoint="MarketresearchValues") + def getMarketresearchValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge Marktforschung Projektname + if( doc.getType().getId() == "${Const.gDTS_DMARK}" ) { + def resultset + + String sql = "SELECT dok_dat_feld_${Const.gDDF_MARKETINGPROJEKT} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AMARK}' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List SingleResultset = [ + doc.field[Const.gDDF_MARKETINGPROJEKT] + ] + repoField.provideValuesForValueSet(SingleResultset) + return 0; + } + } + + @ValueSet(entrypoint="d3userValues") + def getd3userValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge d.3 Benutzer + if ( doc.getType().getId() == "${Const.gDTS_DMARK}" || doc.getType().getId() == "${Const.gDTS_AVEVO}" || doc.getType().getId() == "${Const.gDTS_DVEDO}" || + doc.getType().getId() == "${Const.gDTS_AREME}" || doc.getType().getId() == "${Const.gDTS_AMARK}" || doc.getType().getId() == "${Const.gDTS_DABTE}" || + doc.getType().getId() == "${Const.gDTS_AHAUP}" || doc.getType().getId() == "${Const.gDTS_DSCHU}" ) + { + def resultset + + String sql = "SELECT ISNULL( benutzername, '') + '=' + ISNULL( realname, '') as val " + + "FROM benutzer " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="EventValues") + def getEventValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // dynamische Wertemenge für Vorgänge im Bereich Abteilungsvorgänge abhängig zur Dokumentgruppe + if ( doc.getType().getId() == "${Const.gDTS_DABTE}" && user.id != "d3_async" || (doc.getType().getId() == "${Const.gDTS_AREME}" && validate == 0)) + { + def lSearch + List lRestrictionSet = [] + def lQueryString + def lValues + String sql + + println(user.id) + def lUser = user.id + + if (doc.field[Const.gDDF_EVENT]) + { + lSearch = "%" + doc.field[Const.gDDF_EVENT] + "%"; + } else { + lSearch = "%"; + } + + //jleu 20190605 - Workaround da API Funktion zur Abfrage von RestrictionSets in Groovy fehlt + sql = "select mv.value_char from firmen_spezifisch fs, firm_spez_mult_val mv " + + "where kue_dokuart = '\$SET\$' and fs.doku_id = mv.doku_id and " + + "fs.dok_dat_feld_48 = 'ORG_Berechtigungen' and fs.dok_dat_feld_49 = '${lUser}'" + + lRestrictionSet = d3.sql.executeAndGet(sql); + lRestrictionSet = lRestrictionSet.collect{it.get("value_char")} + + lValues = lRestrictionSet.toString() + lValues = lValues.replace("[","") + lValues = lValues.replace("]","") + lValues = lValues.split(";") + + for (int i = 0; i < lValues.size(); i++) + { + if (i == 0) + { + lQueryString = "'" + lValues[i] + "'" + } else { + lQueryString = lQueryString + ",'" + lValues[i] + "'" + } + } + + d3.log.info("RestrictionSet Werte für User " + lUser + " - " + lQueryString) + + def resultset + sql = "SELECT DISTINCT fs.dok_dat_feld_${Const.gDDF_EVENT} as val " + + "FROM firmen_spezifisch fs, firm_spez_mult_val fm " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AREME}' " + + "AND fs.dok_dat_feld_${Const.gDDF_EVENT} like ? " + + "AND (fs.dok_dat_feld_${Const.gDDF_CASEOWNER} = ? " + + "OR fm.value_char = ? AND fm.field_no = '${Const.gDDF_D3USER67}') " + + "AND fs.doku_id = fm.doku_id " + + "UNION " + + "select fs.dok_dat_feld_${Const.gDDF_EVENT} as val " + + "from firmen_spezifisch fs, firm_spez_mult_val mv " + + "where fs.kue_dokuart = '${Const.gDTS_AREME}' and fs.doku_id = mv.doku_id " + + "and mv.field_no = '${Const.gDDF_ORGEINHEITEN}' and mv.value_char in (${lQueryString})" + + //String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_EVENT} as val " + + // "FROM firmen_spezifisch " + + // "WHERE kue_dokuart = '${Const.gDTS_AREME}' " + + // "AND dok_dat_feld_${Const.gDDF_DOKGROUP} = ? "; + + resultset = d3.sql.executeAndGet(sql,[lSearch, lUser, lUser]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List SingleResultset = [doc.field[Const.gDDF_EVENT]] + repoField.provideValuesForValueSet(SingleResultset) + return 0; + } + + } + + @ValueSet(entrypoint="StructureValues") + def getStructureValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + //dynamische Wertemenge für Strukturinformationen an Dossier + if ( doc.getType().getId() == "${Const.gDTS_DOSSI}" ) + { + def resultset + + def lTeilVoNr + def lTeilString + def lArrayLength + + if (doc.field[Const.gDDF_TEILVONR]) + { + lTeilString = doc.field[Const.gDDF_TEILVONR].split("\\|"); + lArrayLength = lTeilString.length + + if (lArrayLength == 1) + { + lTeilVoNr = lTeilString[0]; + } else { + lTeilVoNr = lTeilString[1]; + } + } else { + lTeilVoNr = ""; + } + + String sql = "SELECT fm.value_char as val " + + "FROM firmen_spezifisch fs, firm_spez_mult_val fm " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ATEIL}' AND fm.field_no = '${Const.gDDF_STRUKTURINFOS}' AND fs.doku_id = fm.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_TEILVONR} = ? "; + resultset = d3.sql.executeAndGet(sql,[lTeilVoNr]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="MainFolderValues") + def getMainFolderValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + //dynamische Wertemenge für Hauptakten an Dossier + if ( (doc.getType().getId() == "${Const.gDTS_DOSSI}" || doc.getType().getId() == "${Const.gDTS_AHAUP}" || doc.getType().getId() == "${Const.gDTS_ATEIL}" || doc.getType().getId() == "${Const.gDTS_DUMMY}") && (user.id != "d3_async" && user.id != "hostimp") ) + { + def lSearch + def resultset + List lRestrictionSet = [] + def lUser = user.id + def lMainNo + def lArrayLength + String sql + def lValues + def lQueryString + + if (doc.field[Const.gDDF_HAUPTVONR]) + { + lSearch = "%" + doc.field[Const.gDDF_HAUPTVONR] + "%"; + } else { + lSearch = "%"; + } + + //jleu 20190605 - Workaround da API Funktion zur Abfrage von RestrictionSets in Groovy fehlt + sql = "select mv.value_char from firmen_spezifisch fs, firm_spez_mult_val mv " + + "where kue_dokuart = '\$SET\$' and fs.doku_id = mv.doku_id and " + + "fs.dok_dat_feld_48 = 'ORG_Berechtigungen' and fs.dok_dat_feld_49 = '${lUser}'" + + lRestrictionSet = d3.sql.executeAndGet(sql); + lRestrictionSet = lRestrictionSet.collect{it.get("value_char")} + + lValues = lRestrictionSet.toString() + lValues = lValues.replace("[","") + lValues = lValues.replace("]","") + lValues = lValues.split(";") + + for (int i = 0; i < lValues.size(); i++) + { + if (i == 0) + { + lQueryString = "'" + lValues[i] + "'" + } else { + lQueryString = lQueryString + ",'" + lValues[i] + "'" + } + } + + d3.log.info("RestrictionSet Werte für User " + lUser + " - " + lQueryString) + + //Beim Validate nur nach doku_id suchen + if (validate == 1) + { + if (doc.field[Const.gDDF_HAUPTVONR]) + { + lMainNo = doc.field[Const.gDDF_HAUPTVONR].split("\\|") + lSearch = lMainNo[0] + d3.log.info("Wert validate -${lSearch}-") + + sql = "SELECT DISTINCT fs.dok_dat_feld_${Const.gDDF_HAUPTVONR} as val " + + "FROM firmen_spezifisch fs, firm_spez_mult_val fm " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AHAUP}' " + + "AND fs.dok_dat_feld_${Const.gDDF_HAUPTVONR} = ? " + + "AND (fs.dok_dat_feld_${Const.gDDF_CASEOWNER} = ? " + + "OR fm.value_char = ? AND fm.field_no = '${Const.gDDF_D3USER67}') " + + "AND fs.doku_id = fm.doku_id " + + "UNION " + + "select fs.dok_dat_feld_${Const.gDDF_HAUPTVONR} as val " + + "from firmen_spezifisch fs, firm_spez_mult_val mv " + + "where fs.kue_dokuart = '${Const.gDTS_AHAUP}' and fs.doku_id = mv.doku_id " + + "and mv.field_no = '${Const.gDDF_ORGEINHEITEN}' and mv.value_char in (${lQueryString})" + + resultset = d3.sql.executeAndGet(sql,[lSearch, lUser, lUser]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List SingleResultset = [ + doc.field[Const.gDDF_HAUPTVONR] + ] + repoField.provideValuesForValueSet(SingleResultset) + return Const.RETURNCODE_OK; + } + //Suche nach Vorgängen für den Benutzer + } else { + sql = "SELECT DISTINCT (fs.dok_dat_feld_${Const.gDDF_HAUPTVOBEZ} + '|' + fs.dok_dat_feld_${Const.gDDF_HAUPTVONR}) as val " + + "FROM firmen_spezifisch fs, firm_spez_mult_val fm " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AHAUP}' " + + "AND fs.dok_dat_feld_${Const.gDDF_HAUPTVOBEZ} like ? " + + "AND (fs.dok_dat_feld_${Const.gDDF_CASEOWNER} = ? " + + "OR fm.value_char = ? AND fm.field_no = '${Const.gDDF_D3USER67}') " + + "AND fs.doku_id = fm.doku_id " + + "UNION " + + "select fs.dok_dat_feld_${Const.gDDF_HAUPTVOBEZ} + '|' + fs.dok_dat_feld_${Const.gDDF_HAUPTVONR} as val " + + "from firmen_spezifisch fs, firm_spez_mult_val mv " + + "where fs.kue_dokuart = '${Const.gDTS_AHAUP}' and fs.doku_id = mv.doku_id " + + "and mv.field_no = '${Const.gDDF_ORGEINHEITEN}' and mv.value_char in (${lQueryString})" + resultset = d3.sql.executeAndGet(sql,[lSearch, lUser, lUser]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + } else { + List SingleResultset = [ + doc.field[Const.gDDF_HAUPTVONR] + ] + repoField.provideValuesForValueSet(SingleResultset) + return Const.RETURNCODE_OK; + } + } + + @ValueSet(entrypoint="SubFolderValues") + def getSubFolderValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + //dynamische Wertemenge für Hauptakten an Dossier + if ( doc.getType().getId() == "${Const.gDTS_DOSSI}" || doc.getType().getId() == "${Const.gDTS_AHAUP}" ) + { + if (doc.field[Const.gDDF_HAUPTVONR]) + { + def resultset + def lMainNo = doc.field[Const.gDDF_HAUPTVONR].split("\\|") + def lArrayLength = lMainNo.length + def lMain + String sql + + println(lArrayLength) + + if (lArrayLength == 1) + { + sql = "SELECT dok_dat_feld_${Const.gDDF_TEILVONR} as val "; + lMain = lMainNo[0] + } else { + sql = "SELECT dok_dat_feld_${Const.gDDF_TEILVOBEZ} + '|' + dok_dat_feld_${Const.gDDF_TEILVONR} as val "; + lMain = lMainNo[1] + } + + sql = sql + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ATEIL}' " + + "AND dok_dat_feld_${Const.gDDF_HAUPTVONR} = ? "; + + resultset = d3.sql.executeAndGet(sql,[lMain]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } else { + List SingleResultset = [ + doc.field[Const.gDDF_TEILVONR] + ] + repoField.provideValuesForValueSet(SingleResultset) + return Const.RETURNCODE_OK; + } + } + + @ValueSet(entrypoint="ContractNoValues") + def getContractNoValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + //dynamische Wertemenge für Vertragsnummer intern + if ( doc.getType().getId() == "${Const.gDTS_EVDOK}" || doc.getType().getId() == "${Const.gDTS_EVUNT}" ) + { + def resultset + def lSearch + String sql + + if (doc.field[Const.gDDF_CONTRACTNO]) + { + lSearch = "%" + doc.field[Const.gDDF_CONTRACTNO] + "%"; + } else { + lSearch = "%"; + } + + sql = "SELECT dok_dat_feld_${Const.gDDF_CONTRACTNO} + '|' + dok_dat_feld_${Const.gDDF_CONTRACTNAME} as val " + + "FROM firmen_spezifisch where kue_dokuart in ('${Const.gDTS_EVERT}','${Const.gDTS_RVERT}') " + + "AND dok_dat_feld_${Const.gDDF_CONTRACTNO} like ?" + + + resultset = d3.sql.executeAndGet(sql,[lSearch]); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else { + List SingleResultset = [ + doc.field[Const.gDDF_CONTRACTNO] + ] + repoField.provideValuesForValueSet(SingleResultset) + return Const.RETURNCODE_OK; + } + } + + @ValueSet(entrypoint="SupplierNoValues") + def getSupplierNoValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Ermittlung der Werte für das Feld "Akte" + // d3.log.error("Groovy - ValueSets: start SubjectValues " + doc.getType().getId()); + + def resultset + def lSearch + def lSearch1 + def lSearch2 + def lSearch3 + String sql + def val1 = "" + + if( repoField.getPreferedFieldNumber() == Const.gDDF_WEITLIEFNR ) + { + d3.log.info("Nummer 1"); + if( doc.field[Const.gDDF_WEITLIEFNR].getAt(row_no) ) + { + val1 = doc.field[Const.gDDF_WEITLIEFNR].getAt(row_no).toString() + "%" + if ( val1.length() > 3 ) + { + lSearch1 = "%" + val1 + "%"; + lSearch2 = val1 + "%"; + lSearch3 = val1; + } + d3.log.info("val1 " + val1 ); + d3.log.info("lSearch1 " + lSearch1 ); + d3.log.info("lSearch2 " + lSearch2 ); + d3.log.info("lSearch3 " + lSearch3 ); + } + } + else + { + if( doc.field[Const.gDDF_LNR] ) + { + val1 = doc.field[Const.gDDF_LNR].toString() + "%" + if ( val1.length() > 3 ) + { + lSearch1 = "%" + val1 + "%"; + lSearch2 = val1 + "%"; + lSearch3 = val1; + } + } + } + sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_LNR},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_LNAME},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_LNAME2},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_LLAND},'') + '|' + ISNULL(dok_dat_feld_${Const.gDDF_LORT},'') as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + + if ( val1.length() > 3 ) + { + sql = sql + "AND ( dok_dat_feld_${Const.gDDF_LNAME} like ? OR dok_dat_feld_${Const.gDDF_LNAME} like ? OR dok_dat_feld_${Const.gDDF_LNAME} like ? " + + "OR dok_dat_feld_${Const.gDDF_LNR} like ? OR dok_dat_feld_${Const.gDDF_LNR} like ? OR dok_dat_feld_${Const.gDDF_LNR} like ? ) " + resultset = d3.sql.executeAndGet(sql,[ + lSearch1, + lSearch2, + lSearch3, + lSearch1, + lSearch2, + lSearch3 + ]); + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + + // 06.09.2018: Auf Wunsch von Frau Luk wird eine Leersuche nicht mehr unterstützt + // lSearch = "%"; + // sql = sql + "AND dok_dat_feld_${Const.gDDF_LNAME} like ? " + + // resultset = d3.sql.executeAndGet(sql,[lSearch]); + // d3.log.error( "Es wurden ${resultset.size()} Lieferanten gefunden. Eingabe: ${doc.field[Const.gDDF_LNAME]}" ) + // if( resultset.size() >= 10000 ) { + // List ErrResultset = ["Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden."] + // repoField.provideValuesForValueSet(ErrResultset) + // return 0; + // } else { + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + // return 0; + // } + } + } + + @ValueSet(entrypoint="SupplierNameValues") + def getSupplierNameValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Ermittlung des Lieferantennamens + // Die Ermittlung erfolgt nun generell per d.3 Akte "Lieferantenakte" (ALIEF) + // Ausnahme: Lieferantenkontaktdokument (DLIMA), hier wird die Lieferantenauswahl anhand Projekt/Opportunitynummer eingeschränkt + + // d3.log.error("Ermittlung des Lieferantennamens ${docType.id}") + + def lCallID = d3.remote.getVersion()[0..2]; + // d3.log.error("lCallID ${lCallID}") + + // Vorherige Programmierung: + // CallID 220 d.3 Import + // CallID 231 Change Attribute DXP + // CallID 200 d.xplorer + + // Bei Dokumenten wird immer komplett eingeschränkt: + // if ( ldokuartShort == "D" ) + // { + // lSearchParamCutSet = "X" + // } + // Bei Akten wird NICHT eingeschränkt bei + // - 220 d.3 Import und 231 Change Attribute DXP + // - 200 d.xplorer wenn der Buchungskreis gefüllt ist + // Bei Akten wird eingeschränkt, wenn es der d.xplorer ist und der Buchungskreis leer ist (Suche) + // else + // { + // if ( lCallID == "220" || lCallID == "231" ) + // { + // lSearchParamCutSet = "" + // } + // else if ( lCallID == "200" && dok_dat_feld[gDDF_BUCHKREIS] != "" ) + // { + // lSearchParamCutSet = "" + // } + // else if ( lCallID == "200" && dok_dat_feld[gDDF_BUCHKREIS] == "" ) + // { + // lSearchParamCutSet = "X" + // } + // else + // { + // lSearchParamCutSet = "X" + // } + // } + + def resultset + def Additionalresultset + def lSearch1 + def lSearch2 + def lSearch3 + def lSearch4 + def lALIKOSearch + def lOppNoInput + def lProjNoInput + String[] str; + String sql + def lSupplierNames + List AdditionalResults = [] + def val1 = doc.field[Const.gDDF_LNAME].toString() + "%" + def length + length = val1.length(); + + // if( docType.id != Const.gDTS_DLIKO && docType.id != Const.gDTS_ALIKO ) + // Besonderheit Projektlieferantendokumente (DLIKO): Hier wird der Lieferant aus den Projektliefertanten (ALIKO) ausgewählt. + if( docType.id != Const.gDTS_DLIKO ) + { + // Grundsätzliche Erstellung des MSSQL Statements je nach Dokumentart. Es gibt 14 Dokumentarten, in denen der Lieferanten_Name verfügbar ist + // Sonderfälle sind hier Projektliefertanten (ALIKO) und Projektlieferantendokumente (DLIKO), aus dem Grund die hier programmierten Ausnahmen + if( docType.id == Const.gDTS_ALIKO && lCallID == "200" && ( doc.field[Const.gDDF_BUCHKREIS] == "" || doc.field[Const.gDDF_BUCHKREIS] == null ) ) + { + // Bei der Suche innerhalb der Projektlieferantenakte (Erkennung per 200 d.xplorer und leerem Buchungskreis) + // wird die Suche anhand Opportunity/Projektnummer ggf. eingeschränkt und nur über Projektlieferant (ALIKO) gesucht + // gDDF_LNR gDDF_LNAME gDDF_LNAME2 gDDF_LLAND gDDF_LORT + lALIKOSearch = 1 + sql = "SELECT DISTINCT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNR},'') as LNR, ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME},'') as LName " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND fs.kue_dokuart = '${Const.gDTS_ALIKO}' " + + "AND pd.frei_o_gesperrt = 'f'" + + if( doc.field[Const.gDDF_AUFTRNR] && !doc.field[Const.gDDF_OPPNUMMER] ) { + lProjNoInput = doc.field[Const.gDDF_AUFTRNR] + if( lProjNoInput.indexOf('|') >= 1 ) { + str = lProjNoInput.split('\\|'); + lProjNoInput = str[0]; + } + sql = sql + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNoInput}' " + } else if( !doc.field[Const.gDDF_AUFTRNR] && doc.field[Const.gDDF_OPPNUMMER] ) { + lOppNoInput = doc.field[Const.gDDF_OPPNUMMER] + if( lOppNoInput.indexOf('|') >= 1 ) { + str = lOppNoInput.split('\\|'); + lOppNoInput = str[0]; + } + sql = sql + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNoInput}' " + } + } + else + { + // Bei allen anderen Dokumentarten, außer Projektlieferantendokumnte DLIKO, erfolgt keine Einschränkung + sql = "SELECT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNR},'') + '|' + ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME},'') + '|' + ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME2},'') + '|' + ISNULL(fs.dok_dat_feld_${Const.gDDF_LLAND},'') + '|' + ISNULL(fs.dok_dat_feld_${Const.gDDF_LORT},'') as val " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND fs.kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND pd.frei_o_gesperrt = 'f'" + } + + // Hier erfolgt eine weitere Einschränkung des MSSQL Statements auf den Lieferantennamen. + // Falls kein Name (mind. 3 Zeichen) angegeben wurde und es keine Suche nach einem Projektliefertanten (ALIKO) ist wird ein Fehler ausgegeben. + if ( ( val1.length() > 3 && doc.field[Const.gDDF_LNAME] ) || (docType.id == Const.gDTS_ALIKO && lCallID == "200" && ( doc.field[Const.gDDF_BUCHKREIS] == "" || doc.field[Const.gDDF_BUCHKREIS] == null )) ) + { + if( doc.field[Const.gDDF_LNAME] ) + { + lSearch1 = "%" + doc.field[Const.gDDF_LNAME] + "%"; + lSearch2 = doc.field[Const.gDDF_LNAME] + "%"; + lSearch3 = doc.field[Const.gDDF_LNAME]; + + // IMUE 12.03.2019 - das Verhalten bei Kundenname und Lieferantname war anders - bei Kundenname konnte auch nach Nummer gefiltert werden, bei Lieferantname nicht, daher Änderung der SQL Abfrage notwendig + //sql = sql + "AND ( fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? )" + + sql = sql + "AND ( fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR " + + "fs.dok_dat_feld_${Const.gDDF_LNR} like ? OR fs.dok_dat_feld_${Const.gDDF_LNR} like ? OR fs.dok_dat_feld_${Const.gDDF_LNR} like ? ) "; + + resultset = d3.sql.executeAndGet(sql,[ + lSearch1, + lSearch2, + lSearch3, + lSearch1, + lSearch2, + lSearch3 + ]); + } + else + resultset = d3.sql.executeAndGet(sql); + + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + if( lALIKOSearch == 1 ){ + + resultset.each { + if( it.LNR != "" ) { + sql = "SELECT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME2},'') as LName2, ISNULL(fs.dok_dat_feld_${Const.gDDF_LLAND},'') as LLand, ISNULL(fs.dok_dat_feld_${Const.gDDF_LORT},'') as LOrt " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND fs.kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND fs.dok_dat_feld_${Const.gDDF_LNAME} = '$it.LName' " + + "AND fs.dok_dat_feld_${Const.gDDF_LNR} = '$it.LNR' " + + "AND pd.frei_o_gesperrt = 'f' " + + Additionalresultset = d3.sql.executeAndGet(sql); + + if( Additionalresultset.size() == 1 ) { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + Additionalresultset.each{ + AdditionalResults.add( TMPLieferantennr + "|" + TMPLieferantenname + "|" + it.LName2 + "|" + it.LLand + "|" + it.Lort ) + } + } else { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + AdditionalResults.add( TMPLieferantennr + "|" + it.LName + "|||" ) + } + + } else { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + AdditionalResults.add( TMPLieferantennr + "|" + it.LName + "|||" ) + } + + } + + repoField.provideValuesForValueSet(AdditionalResults) + + // lSupplierNames = + + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + } + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + + // 06.09.2018: Auf Wunsch von Frau Luk wird eine Leersuche nicht mehr unterstützt + // lSearch1 = "%"; + + // sql = sql + "AND dok_dat_feld_${Const.gDDF_LNAME} like ? " + + // resultset = d3.sql.executeAndGet(sql,[lSearch1]); + // d3.log.error( "Es wurden ${resultset.size()} Lieferanten gefunden. Eingabe: ${doc.field[Const.gDDF_LNAME]}" ) + // if( resultset.size() >= 10000 ) { + // List ErrResultset = ["Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden."] + // repoField.provideValuesForValueSet(ErrResultset) + // return 0; + // } else { + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + // return 0; + // } + } + } else { + sql = "SELECT DISTINCT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNR},'') as LNR, ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME},'') as LName " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND fs.kue_dokuart = '${Const.gDTS_ALIKO}' " + + "AND pd.frei_o_gesperrt = 'f'" + + // IMUE 27.02.2019 - OPG-2105 - Änderung bei der Suche + //if( lCallID == "200" && ( doc.field[Const.gDDF_BUCHKREIS] == "" || doc.field[Const.gDDF_BUCHKREIS] == null )) { + // // Bei der Suche - Mache was anderes + // sql = "SELECT DISTINCT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNR},'') as LNR, ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME},'') as LName " + + // "FROM firmen_spezifisch fs, phys_datei pd " + + // "WHERE pd.doku_id = fs.doku_id " + + // "AND fs.kue_dokuart = '${Const.gDTS_ALIKO}' " + + // "AND pd.frei_o_gesperrt = 'f'" + //} else { + if( doc.field[Const.gDDF_AUFTRNR] && !doc.field[Const.gDDF_OPPNUMMER] ) { + lProjNoInput = doc.field[Const.gDDF_AUFTRNR] + if( lProjNoInput.indexOf('|') >= 1 ) { + str = lProjNoInput.split('\\|'); + lProjNoInput = str[0]; + } + sql = sql + "AND fs.dok_dat_feld_${Const.gDDF_AUFTRNR} = '${lProjNoInput}' " + } else if( !doc.field[Const.gDDF_AUFTRNR] && doc.field[Const.gDDF_OPPNUMMER] ) { + lOppNoInput = doc.field[Const.gDDF_OPPNUMMER] + if( lOppNoInput.indexOf('|') >= 1 ) { + str = lOppNoInput.split('\\|'); + lOppNoInput = str[0]; + } + sql = sql + "AND fs.dok_dat_feld_${Const.gDDF_OPPNUMMER} = '${lOppNoInput}' " + } else { + if( lCallID == "200" && ( doc.field[Const.gDDF_BUCHKREIS] == "" || doc.field[Const.gDDF_BUCHKREIS] == null )) { + // IMUE 27.02.2019 - OPG-2105 - in der Suche ist die Eingabe der Oppertuntiy oder Maschinenprojekt kein Pflicht, wenn diese aber eingegeben wird, soll das Ergebnis trotzdem beschränkt werden + } else { + List ErrResultset = [ + "Bitte wählen Sie zunächst entweder Opportunity oder Maschinenprojekt aus." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } + } + //} + + if (doc.field[Const.gDDF_LNAME]) { + lSearch1 = "%" + doc.field[Const.gDDF_LNAME] + "%"; + lSearch2 = doc.field[Const.gDDF_LNAME] + "%"; + lSearch3 = doc.field[Const.gDDF_LNAME]; + + // IMUE 12.03.2019 - das Verhalten bei Kundenname und Lieferantname war anders - bei Kundenname konnte auch nach Nummer gefiltert werden, bei Lieferantname nicht, daher Änderung der SQL Abfrage notwendig + // sql = sql + "AND ( fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? ) " + + sql = sql + "AND ( fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR fs.dok_dat_feld_${Const.gDDF_LNAME} like ? OR " + + "fs.dok_dat_feld_${Const.gDDF_LNR} like ? OR fs.dok_dat_feld_${Const.gDDF_LNR} like ? OR fs.dok_dat_feld_${Const.gDDF_LNR} like ? ) "; + + resultset = d3.sql.executeAndGet(sql,[ + lSearch1, + lSearch2, + lSearch3, + lSearch1, + lSearch2, + lSearch3 + ]); + } else { + lSearch1 = "%"; + sql = sql + "AND fs.dok_dat_feld_${Const.gDDF_LNAME} like ? " + resultset = d3.sql.executeAndGet(sql,[lSearch1]); + } + + resultset.each { + if( it.LNR != "" ) { + sql = "SELECT ISNULL(fs.dok_dat_feld_${Const.gDDF_LNAME2},'') as LName2, ISNULL(fs.dok_dat_feld_${Const.gDDF_LLAND},'') as LLand, ISNULL(fs.dok_dat_feld_${Const.gDDF_LORT},'') as LOrt " + + "FROM firmen_spezifisch fs, phys_datei pd " + + "WHERE pd.doku_id = fs.doku_id " + + "AND fs.kue_dokuart = '${Const.gDTS_ALIEF}' " + + "AND fs.dok_dat_feld_${Const.gDDF_LNAME} = '$it.LName' " + + "AND fs.dok_dat_feld_${Const.gDDF_LNR} = '$it.LNR' " + + "AND pd.frei_o_gesperrt = 'f' " + + Additionalresultset = d3.sql.executeAndGet(sql); + + if( Additionalresultset.size() == 1 ) { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + Additionalresultset.each{ + AdditionalResults.add( TMPLieferantennr + "|" + TMPLieferantenname + "|" + it.LName2 + "|" + it.LLand + "|" + it.Lort ) + + } + } else { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + AdditionalResults.add( TMPLieferantennr + "|" + it.LName + "|||" ) + } + + } else { + def TMPLieferantenname = it.LName + def TMPLieferantennr = it.LNR + + if( TMPLieferantennr == "" ) + TMPLieferantennr = "d3" + + AdditionalResults.add( TMPLieferantennr + "|" + it.LName + "|||" ) + } + + } + + repoField.provideValuesForValueSet(AdditionalResults) + + // lSupplierNames = + + // repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + return 0; + } + } + + @ValueSet(entrypoint="SupplierContactDescription") + def getSupplierContactDescriptionValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + def appID + try { + appID = d3.remote.getVersion()[0..2]; + } catch (Exception e) { + d3.log.error("Exception on d3.remote.getVersion = " + e); + } + // wenn ALONT und Import / Update dann leere Wertemenge + if(docType.getId().equals(Const.gDTS_ALONT) && appID == '220') { + // IMPORT und UPDATE + List Results = [] + repoField.provideValuesForValueSet(Results); + return 0; + + } else { + // gDDF_KONTAKTDATE, gDDF_KDAKTKAT, gDDF_KDAKTBESCH + def sql + def resultset + def TMPLNR + String[] str + List AdditionalResults = [] + List KategorieResult = [] + + if( doc.field[Const.gDDF_LNR] ) { + TMPLNR = doc.field[Const.gDDF_LNR] + if( TMPLNR.indexOf('|') >= 1 ) { + str = TMPLNR.split('\\|'); + TMPLNR = str[0]; + } + + if( validate == 1 ) { + + if( docType.id == Const.gDTS_ALONT ) { + List NewResultset = [ + doc.field[Const.gDDF_KONTAKTBESCH] + ] + repoField.provideValuesForValueSet(NewResultset) + } else { + sql = "SELECT ISNULL(dok_dat_feld_${Const.gDDF_KONTAKTBESCH},'') as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ALONT}' " + + "AND dok_dat_feld_${Const.gDDF_LNR} = '${TMPLNR}' " + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + return 0; + } + } else { + + // IMUE 02.04.2019 - Ergänzung, das nur Akten angegeben werden, die nicht den Status "Freigabe/gesperrt" haben - https://jira.d-velop.de/browse/OPG-2135 + sql = "SELECT ISNULL(CONVERT(varchar, fs.dok_dat_feld_${Const.gDDF_KONTAKTDATE}, 104),'') as date, ISNULL(fs.dok_dat_feld_${Const.gDDF_LIEFAKTKAT},'') as kdkat, ISNULL(fs.dok_dat_feld_${Const.gDDF_KONTAKTBESCH},'') as kdbsch " + + "FROM firmen_spezifisch fs " + + "LEFT JOIN doc_versions dv ON fs.doku_id = dv.doc_id " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ALONT}' " + + "AND fs.dok_dat_feld_${Const.gDDF_LNR} = '${TMPLNR}' " + + "AND dv.doc_state LIKE 'fr' AND dv.block_date IS NULL " + + resultset = d3.sql.executeAndGet(sql); + + resultset.each{ + def KontDate = it.date + def KontBesch = it.kdbsch + def lang = d3.remote.language + + // IMUE 16.04.2019 - Umstellung der Wertemenge durch KD - somit hat sich die ID von 52 (Kategorie) auf 125 (Kategorie_Lieferant) geändert + sql = "SELECT value_char_transl as kdkattransl FROM doc_field_val_lang WHERE language = '${lang}' AND predef_value_id = '${SystemSpecificConst.gPredValueIDKatLief}' AND value_char_allowed = '${it.kdkat}' " + KategorieResult = d3.sql.executeAndGet(sql); + + KategorieResult.each{ + AdditionalResults.add( KontDate + "|" + it.kdkattransl + "|" + KontBesch ) + + } + } + + repoField.provideValuesForValueSet(AdditionalResults); + + return 0; + } + } else { + List ErrResultset = [ + "Bitte wählen Sie zuerst eine Lieferant_Nr aus." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } + } + + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSet(entrypoint="MachineDocumentModuls") + def getMachineDocumentsModuls(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + List modulsResultset = []; + + // Information ob Suchdialog oder Importdialog + def appID + try { + appID = d3.remote.getVersion()[0..2]; + } catch (Exception e) { + d3.log.error("Exception on d3.remote.getVersion = " + e); + } + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url; + /* + * wenn der Import- oder Updatedialog aufgerufen wird, sollen nur die "nicht gelöschten" Objekte angezeigt werden (Deleted = false) + * bei der Suche sollen nur bereits verwendete Eigenschaften angezeigt werden + * Lösungsweg: + * appID -- 200 = d.xplorer | 220 = d.3 import + * verstecktes Attribut das immer gefüllt ist -- Suche = null | Update = | Import = null + */ + if(appID == '220' || doc.field[Const.gDDF_VERSIONINTERN] != null) { + // IMPORT und UPDATE + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/ModuleSet?$filter=Deleted%20eq%20false%20&$format=json&$orderby=Id'); + } else if(appID == '200') { + // SUCHE + String query = "SELECT DISTINCT fs.dok_dat_feld_" + Const.gDDF_MODULM + " as value FROM firmen_spezifisch fs WHERE fs.kue_dokuart = '" + Const.gDTS_DERZ1 + "' AND fs.dok_dat_feld_" + Const.gDDF_MODULM + " IS NOT NULL"; + List result = d3.sql.executeAndGet(query); + for(GroovyRowResult grr : result) { + modulsResultset.add(grr.get("value")); + } + } else { + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/ModuleSet?$format=json&$orderby=Id'); + } + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige GUID + String guid = metadataObj.getString("GUID"); + + modulsResultset.add(guid); + + } + } + } catch(Exception e) { + d3.log.error( " ## ValueSet for MachineDocumentsFunctions - Exception = " + e.getMessage() ); + } + + repoField.provideValuesForValueSet(modulsResultset) + + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSet(entrypoint="MachineDocumentFunctions") + def getMachineDocumentsFunctions(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + List functionsResultset = []; + + // Information ob Suchdialog oder Importdialog + def appID + try { + appID = d3.remote.getVersion()[0..2]; + } catch (Exception e) { + d3.log.error("Exception on d3.remote.getVersion = " + e); + } + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url; + /* + * wenn der Import- oder Updatedialog aufgerufen wird, sollen nur die "nicht gelöschten" Objekte angezeigt werden (Deleted = false) + * bei der Suche sollen nur bereits verwendete Eigenschaften angezeigt werden + * Lösungsweg: + * appID -- 200 = d.xplorer | 220 = d.3 import + * verstecktes Attribut das immer gefüllt ist -- Suche = null | Update = | Import = null + */ + if(appID == '220' || doc.field[Const.gDDF_VERSIONINTERN] != null) { + // IMPORT und UPDATE + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/FunctionSet?$filter=Deleted%20eq%20false%20&$format=json&$orderby=Id'); + } else if(appID == '200') { + // SUCHE + String query = "SELECT DISTINCT fsmv.value_char as value FROM firmen_spezifisch fs LEFT JOIN firm_spez_mult_val fsmv on fs.doku_id = fsmv.doku_id WHERE fs.kue_dokuart = '" + Const.gDTS_DERZ1 + "' AND fsmv.field_no = '" + Const.gDDF_FUNKTIONM + "' AND fsmv.field_no IS NOT NULL"; + List result = d3.sql.executeAndGet(query); + for(GroovyRowResult grr : result) { + functionsResultset.add(grr.get("value")); + } + } else { + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/FunctionSet?$format=json&$orderby=Id'); + } + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Guid + String guid = metadataObj.getString("GUID"); + functionsResultset.add(guid); + + } + } + } catch(Exception e) { + d3.log.error( " ## ValueSet for MachineDocumentsFunctions - Exception = " + e.getMessage() ); + } + + repoField.provideValuesForValueSet(functionsResultset) + + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSet(entrypoint="MachineDocumentMachineType") + def getMachineDocumentsMachineType(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + List machineTypeResultset = []; + + // Information ob Suchdialog oder Importdialog + def appID + try { + appID = d3.remote.getVersion()[0..2]; + } catch (Exception e) { + d3.log.error("Exception on d3.remote.getVersion = " + e); + } + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url; + /* + * wenn der Import- oder Updatedialog aufgerufen wird, sollen nur die "nicht gelöschten" Objekte angezeigt werden (Deleted = false) + * bei der Suche sollen nur bereits verwendete Eigenschaften angezeigt werden + * Lösungsweg: + * appID -- 200 = d.xplorer | 220 = d.3 import + * verstecktes Attribut das immer gefüllt ist -- Suche = null | Update = | Import = null + */ + if(appID == '220' || doc.field[Const.gDDF_VERSIONINTERN] != null) { + // IMPORT und UPDATE + + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/MachineSimpleSet?$filter=Deleted%20eq%20false&$format=json&$orderby=Id'); + } else if(appID == '200') { + // SUCHE + String query = "SELECT DISTINCT fsmv.value_char as value FROM firmen_spezifisch fs LEFT JOIN firm_spez_mult_val fsmv on fs.doku_id = fsmv.doku_id WHERE fs.kue_dokuart = '" + Const.gDTS_DERZ1 + "' AND fsmv.field_no = '" + Const.gDDF_MASCHINENTYPEN + "' AND fsmv.field_no IS NOT NULL"; + List result = d3.sql.executeAndGet(query); + for(GroovyRowResult grr : result) { + machineTypeResultset.add(grr.get("value")); + } + } else { + url =new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/MachineSimpleSet?$format=json&$orderby=Id'); + } + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Id + String id = metadataObj.getString("Id"); + machineTypeResultset.add(id); + + } + } + } catch(Exception e) { + d3.log.error( " ## ValueSet for MachineDocumentsFunctions - Exception = " + e.getMessage() ); + } + + repoField.provideValuesForValueSet(machineTypeResultset); + } + + @ValueSet(entrypoint="VorlagenProzArtValues") + def VorlagenProzArtValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + def resultset; + + def sqlQuery = """SELECT DISTINCT dok_dat_feld_${Const.gDFF_SCHLUESSEL} as val + FROM firmen_spezifisch fs + JOIN firm_spez_mult_val fsmv + ON fsmv.doku_id = fs.doku_id + WHERE kue_dokuart = '${Const.gDTS_AZTXT}' + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} in ( SELECT processtypes + FROM opg_tmpl_mgmt_processtypes )"""; + + if( doc.field[Const.gDDF_PROZESS] != "" && doc.field[Const.gDDF_PROZESS] != null ) { + sqlQuery = sqlQuery + " AND fsmv.value_char like ? and fsmv.field_no = ${Const.gDDF_UEBERSETZUNG} OR fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} like ?"; + resultset = d3.sql.executeAndGet(sqlQuery, [ + "%" + doc.field[Const.gDDF_PROZESS].toString() + "%", + "%" + doc.field[Const.gDDF_PROZESS].toString() + "%" + ]); + } else { + resultset = d3.sql.executeAndGet(sqlQuery); + } + + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + d3.getArchive().removeTranslationFromCache("VorlagenProzArtValues", new Locale("de")); + d3.getArchive().removeTranslationFromCache("VorlagenProzArtValues", new Locale("en")); + } + + @ValueSet(entrypoint="RegisterValues") + def getRegisterValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + //d3.log.info("RegisterValues loaded"); + + def registerValueList = []; + def registerResultset = []; + + registerValueList = d3.sql.executeAndGet("SELECT DISTINCT value_char_allowed FROM dbo.doc_field_val_lang WHERE predef_value_id = '${SystemSpecificConst.gPredValueIDRegister}'"); + + for ( int i = 0; i < registerValueList.size(); i++ ) { + registerResultset.add( registerValueList.get(i).get("value_char_allowed") ); + } + + repoField.provideValuesForValueSet(registerResultset); + } + + @ValueSet(entrypoint="OGValues") + def getOGValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + //def OGValueList = []; + //def OGResultset = []; + + //OGValueList = d3.sql.executeAndGet("SELECT dok_dat_feld_38 FROM firmen_spezifisch WHERE kue_dokuart = 'AZTXT' and dok_dat_feld_38 like 'OG%'"); + + //for ( int i = 0; i < OGValueList.size(); i++ ) { + //OGResultset.add( OGValueList.get(i).get("dok_dat_feld_38") ); + //} + + //repoField.provideValuesForValueSet(OGResultset); + //d3.getArchive().removeTranslationFromCache("OGValues", new Locale("de")); + //d3.getArchive().removeTranslationFromCache("OGValues", new Locale("en")); + List OGValuesResultset = []; + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url; + + url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZCA_D3_AUTHORIZATIONS_SRV/OrgUnitSet?$format=json&$orderby=ExternalId'); + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + //d3.log.error("## getMachineDocumentsMachineType - Aufruf der Connection"); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Id + String id = metadataObj.getString("Id"); + OGValuesResultset.add(id); + + } + } + } catch(Exception e) { + d3.log.error( " ## ValueSet for OGValues - Exception = " + e.getMessage() ); + } + + repoField.provideValuesForValueSet(OGValuesResultset); + d3.getArchive().removeTranslationFromCache("OGValues", new Locale("de")); + d3.getArchive().removeTranslationFromCache("OGValues", new Locale("en")); + + } + + @ValueSet(entrypoint="BuchungskreisValues") + def getValuesBuchungskreis(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + // Hinweis ehemals JPL - > Verwendung von "GetValueList_SAP_Buchungskreis" und SAP Baustein "ZBC_D3_GETVALUELIST_BUKRS" + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + + d3.log.info("getValuesBuchungskreis gestartet"); + + List buchungskreisResultset = []; + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/CompanySet?$format=json&$orderby=CompanyCode'); + + try { + if(url != null) { + + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Id + String companyCode = metadataObj.getString("CompanyCode"); + buchungskreisResultset.add(companyCode); + + } + } + } catch(Exception e) { + d3.log.error( " ## BuchungskreisValues - Exception = " + e.getMessage() ); + } + + repoField.provideValuesForValueSet(buchungskreisResultset); + } + + + @ValueSet(entrypoint="getValueListSAPFunction") + def getValueListSAPFunction(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + // Hinweis ehemals JPL - > Verwendung von "GetValueList_SAP_Funktion" und SAP Baustein "ZBC_D3_GETVALUELIST_FUNCTION" + + def lLanguage + List functionResultset = []; + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = d3.remote.getLanguage() + } + + if( doc.field[Const.gDDF_NPN].equals("") || doc.field[Const.gDDF_NPN] == null ) { + if( d3.remote.getLanguage().equals("049") ) { + functionResultset[0] = 'Bitte geben Sie zuerst eine gültige Netzplannummer ein' + repoField.provideValuesForValueSet(functionResultset) + } else { + functionResultset[0] = 'Please choose a valid Network No. at first.' + repoField.provideValuesForValueSet(functionResultset) + } + } else { + + //String aufsplitten + String[] splittedString = doc.field[Const.gDDF_NPN].split("\\|") + + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedString != null && splittedString.size() > 0 && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_NPN] = splittedString[0].trim(); + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/NetworkFunctionRelationSet?\$filter=NetworkNo%20eq%20'${doc.field[Const.gDDF_NPN]}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url != null) { + + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + JSONArray arr = obj.get("d").getJSONArray("results"); + + if( arr.length() > 0 ) { + for (int i = 0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + + String lFUNCTION = metadataObj.getString("FunctionIdNo"); + String lFUNCTIONNAME = metadataObj.getString("Description"); + + functionResultset.add(lFUNCTION + "|" + lFUNCTIONNAME) + } + } else { + d3.log.error("getValueListSAPFunction - Es konnten keine Werte ermittelt werden") + if( d3.remote.getLanguage().equals("049") ) { + functionResultset[0] = 'Zur angegebenen Netzplannummer konnte keine Funktion ermittelt werden.' + repoField.provideValuesForValueSet(functionResultset) + } else { + functionResultset[0] = 'No functions could be determined for the specified network number.' + repoField.provideValuesForValueSet(functionResultset) + } + } + } + } catch(Exception e) { + d3.log.error( " ## getValueListSAPFunction - Exception = " + e.getMessage() ); + } + } + } + repoField.provideValuesForValueSet(functionResultset) + } + + // imue 30.07.2019 - für die Eigenschaft "Mustermaterial_Nr" bereits im Einsatz + @ValueSet(entrypoint="getValueListSAPMaterialNo") + def getValueListSAPMaterialNo(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + // Hinweis ehemals JPL - > Verwendung von "GetValueList_SAP_MaterialNo" und SAP Baustein "ZBC_D3_GETVALUELIST_SAMPLE_MAT" + + def lLanguage + def lSearchProj + def lSearchOpp + List materialNoResultset = []; + + // Unterscheidung wurde die Opportunity oder Maschinenprojektnummer eingegeben + // Übergabe des passenden Wertes + Sparchschlüssel Variable: d3server_letzte_api_sprache + // Hinweis für Deutsch oder Englisch ist es nicht der korrekte Ländercode, daher die Übersetzung an dieser Stelle weiteres kommt per d.3 national + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = "DE" + } + + // 08.05.2017 Split der Opportunity oder Projektnummer, falls nötig + if( !doc.field[Const.gDDF_OPPNUMMER].equals("") && doc.field[Const.gDDF_OPPNUMMER] != null) { + String[] splittedString = doc.field[Const.gDDF_OPPNUMMER].split(" \\| ") + if( splittedString != null && splittedString.size() > 0 ) { + lSearchOpp = splittedString[0].trim() + } else { + lSearchOpp = doc.field[Const.gDDF_OPPNUMMER] + } + } else if( !doc.field[Const.gDDF_AUFTRNR].equals("") && doc.field[Const.gDDF_AUFTRNR] != null) { + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + if( splittedString != null && splittedString.size() > 0 ) { + lSearchProj = splittedString[0].trim() + } else { + lSearchProj = doc.field[Const.gDDF_AUFTRNR] + } + } + + // Durch OData zwei Entities notwendig + JSONArray jsonResult + if( lSearchProj != null && !lSearchProj.equals("") ) { + // -> Project + URL url1 = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/SampleMaterialProjectRelationSet?\$filter=ProjExtId%20eq%20'${lSearchProj}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url1 != null) { + URLConnection con = url1.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + jsonResult = obj.get("d").getJSONArray("results"); + + } + } catch(Exception e) { + d3.log.error("validateSAPMaterialNo - OData Project Exception - " + e.getMessage()) + } + + } else if( lSearchOpp != null && !lSearchOpp.equals("") ) { + // -> Opportunity + URL url2 = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/SampleMaterialOpportunityRelationSet?\$filter=OpportunityNo%20eq%20'${lSearchOpp}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url2 != null) { + URLConnection con = url2.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + jsonResult = obj.get("d").getJSONArray("results"); + } + } catch(Exception e) { + d3.log.error("validateSAPMaterialNo - OData Opportunity Exception - " + e.getMessage()) + } + } + + if(jsonResult != null && jsonResult.size() > 0 ) { + for(int i = 0; i < jsonResult.size(); i++) { + + JSONObject metadataObj = jsonResult.getJSONObject(i); + + String lMaterialNo = metadataObj.getString("MaterialNo"); + String lMaterialBezeichnung = metadataObj.getString("ShortText"); + + materialNoResultset.add(lMaterialNo + " | " + lMaterialBezeichnung) + } + } else { + d3.log.error("getValueListSAPMaterialNo - Es konnten keine Werte ermittelt werden") + } + repoField.provideValuesForValueSet(materialNoResultset); + } + + + @ValueSet(entrypoint="getValueListSAPModul") + def getValueListSAPModul(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + // Hinweis ehemals JPL - > Verwendung von "GetValueList_SAP_Modul" und SAP Baustein "ZBC_D3_GETVALUELIST_MODULE" + + List modulResultset = []; + def lLanguage + + if( d3.remote.getLanguage().equals("049") ) { + lLanguage = "DE" + } else if( d3.remote.getLanguage().equals("001") ) { + lLanguage = "EN" + } else { + lLanguage = d3.remote.getLanguage() + } + + String test1 = doc.field[Const.gDDF_FUNKTION] + String test2 = doc.field[Const.gDDF_NPN] + + if( doc.field[Const.gDDF_FUNKTION].equals("") || doc.field[Const.gDDF_FUNKTION] == null) { + if( d3.remote.getLanguage().equals("049") ) { + modulResultset[0] = 'Bitte geben Sie zuerst eine gültige Funktion und eine gültige Netzplannummer ein.' + repoField.provideValuesForValueSet(modulResultset) + } else { + modulResultset[0] = 'Please choose valid Network No. and Function at first.' + repoField.provideValuesForValueSet(modulResultset) + } + } else { + def lRetCode + String[] splittedString = doc.field[Const.gDDF_FUNKTION].split("\\|") + lRetCode = splittedString.size() + if( lRetCode > 0 && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_FUNKTION] = splittedString[0].trim(); + } else { + d3.log.error("getValueListSAPModul: Das Feld Funktion konnte nicht gesplittet werden!") + } + + String[] splittedStringSec = doc.field[Const.gDDF_NPN].split("\\|") + lRetCode = splittedStringSec.size() + if( lRetCode > 0 && !splittedStringSec[0].equals("") ) { + doc.field[Const.gDDF_NPN] = splittedStringSec[0].trim(); + } else { + d3.log.error("getValueListSAPModul: Das Feld Netzplannummer konnte nicht gesplittet werden!") + } + + // Filterung im oData Aufruf ist ein Pflichtfelder, daher folgende Prüfung vorher notwendig + if(!doc.field[Const.gDDF_NPN].equals("") && doc.field[Const.gDDF_NPN] != null && !doc.field[Const.gDDF_FUNKTION].equals("") && doc.field[Const.gDDF_FUNKTION] != null) { + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/NetworkFunctionModuleRelationSet?\$filter=NetworkNo%20eq%20'${doc.field[Const.gDDF_NPN]}'%20and%20FunctionIdNo%20eq%20'${doc.field[Const.gDDF_FUNKTION]}'%20and%20LanguageIso639_1%20eq%20'${lLanguage}'&\$format=json"); + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + + if( arr.length() > 0 ) { + for (int i = 0; i < arr.length(); i++) { + + JSONObject metadataObj = arr.getJSONObject(i); + + def lMODULE = metadataObj.getString("ModuleIdNo"); + def lMODULENAME = metadataObj.getString("Description"); + + modulResultset[i] = lMODULE + "|" + lMODULENAME + } + } else { + d3.log.error("getValueListSAPModul - Es konnten keine Werte ermittelt werden") + if( d3.remote.getLanguage().equals("049") ) { + modulResultset[0] = 'Zur angegebenen Netzplannummer und Funktion konnte kein Modul ermittelt werden.' + repoField.provideValuesForValueSet(modulResultset) + } else { + modulResultset[0] = 'No module could be determined for the specified network number and function.' + repoField.provideValuesForValueSet(modulResultset) + } + } + } + + } catch(Exception e) { + d3.log.error("getValueListSAPModul - Exception = " + e.getMessage()) + } + } else { + // sollte eigentlich nie erreicht werden, da es direkt am Anfang abgefangen wird + if( d3.remote.getLanguage().equals("049") ) { + modulResultset[0] = 'Bitte geben Sie zuerst eine gültige Funktion und eine gültige Netzplannummer ein' + } else { + modulResultset[0] = 'Please choose valid Network No. and Function at first.' + } + } + } + repoField.provideValuesForValueSet(modulResultset); + } + + + @ValueSet(entrypoint="NetzplanSAPValues") + def getValueListSAPNetzplan(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + // imue 10.2019 - Ergänzung um Maschinentyp (Feld ist nicht modifizierbar) + // wenn Maschinentyp in der Suche ausgewählt wird, zeige alle vorhandenen Werte, ansonsten alles wie gehabt + def lApiIdTemp = d3.remote.getVersion()[0..2]; + + if( repoField.getId().equals(SystemSpecificConst.gMaschinentypID) && lApiIdTemp != null && lApiIdTemp == 200 && doc.field[Const.gDDF_VERSIONINTERN] == null && doc.field[Const.gDDF_NPN] == null && doc.field[Const.gDDF_AUFTRNR] == null ) { + // Suche -> wenn ID gleich 200 und verstecktes Attribut ist leer + List lMaschinentypen = new ArrayList<>(); + + def sqlStatement = "SELECT DISTINCT dok_dat_feld_4 as maschinentyp" + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = 'DMDOK' " + + "AND dok_dat_feld_4 IS NOT NULL " + List sqlResult = d3.sql.executeAndGet(sqlStatement); + if(sqlResult != null && sqlResult.size() > 0) { + for(GroovyRowResult grr : sqlResult) { + lMaschinentypen.add(grr.get("maschinentyp")); + } + + } + repoField.provideValuesForValueSet(lMaschinentypen); + + } else { + List netzplanResultset = new ArrayList<>(); + + // Workaround da es aktuell keinen Weg gibt, die Repo-ID über Groovy-Objekt zu ermitteln + int reposIdDBField = repoField.getPreferedFieldNumber(); + String reposIDName = repoField.getName(); + String sqlStatement = "SELECT rt.repository_id as repoID " + + "FROM field_repository fr " + + "LEFT JOIN repository_titles rt ON fr.repository_id = rt.repository_id " + + "WHERE rt.repository_title = '${reposIDName}'" + + "AND fr.doc_field_nr_pref = '${reposIdDBField}'" + List sqlResult = d3.sql.executeAndGet(sqlStatement); + + if(sqlResult != null && sqlResult.size() > 0) { + int repos_id = sqlResult.getAt(0).get("repoID"); + + if( doc.field[Const.gDDF_AUFTRNR] == null || doc.field[Const.gDDF_AUFTRNR].equals("") ) { + + if( d3.remote.getLanguage().equals("049") ) { + netzplanResultset.add("Bitte geben Sie zuerst eine Projektnummer ein"); + repoField.provideValuesForValueSet(netzplanResultset); + } else { + netzplanResultset.add("Please choose a Projectnumber at first."); + repoField.provideValuesForValueSet(netzplanResultset); + } + + } else { + + //String aufsplitten + String[] splittedString = doc.field[Const.gDDF_AUFTRNR].split("\\|") + + //Wenn Vertragsnummer ermittelt wurde, dann Vertragsnummer in Attributfeld schreiben + if( splittedString != null && splittedString.size() > 0 && !splittedString[0].equals("") ) { + doc.field[Const.gDDF_AUFTRNR] = splittedString[0].trim(); + } + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/ProjectNetworkRelationSet?\$filter=ProjExtId%20eq%20'${doc.field[Const.gDDF_AUFTRNR]}'&\$format=json"); + + try { + if(url != null) { + + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + + if(arr.length() > 0) { + for(int i = 0; i < arr.size(); i++) { + + JSONObject metadataObj = arr.getJSONObject(i); + + // 07.05.2020: Umgestellt von ProjExtId auf NetworkNo + String lNPN = metadataObj.getString("NetworkNo"); + // 07.05.2020: Umgestellt von Description auf MachineType gewechselt + String lNPNAME = metadataObj.getString("MachineType"); + String lPSPElement = metadataObj.getString("PSPElement"); + + if(repos_id == SystemSpecificConst.gNetzplanNrId) { + netzplanResultset.add(lNPN + " | " + lPSPElement + " | " + lNPNAME); + + } else if(repos_id == SystemSpecificConst.gPSPElementId ) { + netzplanResultset.add(lPSPElement + " | " + lNPN + " | " + lNPNAME); + + } else if(repos_id == SystemSpecificConst.gMaschinentypID ) { + + if( doc.field[Const.gDDF_NPN] != null ) { + String[] splittedStringNPN = doc.field[Const.gDDF_NPN].toString().split("\\|"); + if(splittedStringNPN != null && splittedStringNPN.size() > 0) { + String lDocFieldNetzplan = splittedStringNPN[0]; + // in Abhängigkeit zum eingetragenen Netzplan + if(lNPN.trim().equals(lDocFieldNetzplan.trim())) { + netzplanResultset.add(lNPN + " | " + lPSPElement + " | " + lNPNAME); + } + } + + } else if( doc.field[Const.gDDF_PSPELEMENT] != null ) { + String[] splittedStringPSP = doc.field[Const.gDDF_PSPELEMENT].toString().split("\\|"); + if(splittedStringPSP != null && splittedStringPSP.size() > 0) { + String lDocFieldNetzplan = splittedStringPSP[1]; + // in Abhängigkeit zum eingetragenen Netzplan + if(lNPN.trim().equals(lDocFieldNetzplan.trim())) { + netzplanResultset.add(lNPN + " | " + lPSPElement + " | " + lNPNAME); + } + } + + } else { + netzplanResultset.add(lNPN + " | " + lPSPElement + " | " + lNPNAME); + } + + } else { + netzplanResultset.add(lNPN + " | " + lPSPElement + " | " + lNPNAME); + } + } + } else { + d3.log.error("getValueListSAPNetzplan - Es konnten keine Werte ermittelt werden") + if( d3.remote.getLanguage().equals("049") ) { + netzplanResultset.add("Zur angegebenen Projektnummer konnte keine Netzplan_Nr ermittelt werden."); + repoField.provideValuesForValueSet(netzplanResultset); + } else { + netzplanResultset.add("No networkplan_no could be determined for the specified project number."); + repoField.provideValuesForValueSet(netzplanResultset); + } + } + } + } catch(Exception e) { + d3.log.error("getValueListSAPNetzplan - Exception = " + e.getMessage()) + } + } + } + repoField.provideValuesForValueSet(netzplanResultset); + } + } + + // imue 02.07.2019 noch nicht in Verwendung und noch nicht getestet - Wird überhaupt nicht mehr gebraucht? + @ValueSet(entrypoint="getValueListSAPNetzplanVorg") + def getValueListSAPNetzplanVorg(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) { + + List netzplanResultset = []; + + d3.log.info("Ermittlung der Netzplanvorgangsnummer") + + def suchstrName + + if( !doc.field[Const.gDDF_NPN].equals("") && doc.field[Const.gDDF_NPN] != null ) { + suchstrName = doc.field[Const.gDDF_NPN].substring(0,11) + d3.log.info("Der Suchstring hat folgenden Wert: << ${suchstrName} >> ") + } + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/ProjectNetworkRelationSet?\$filter=ProjExtId%20eq%20'${suchstrName}'&\$format=json"); + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + + if(arr.length() > 0) { + for(int i = 0; i < arr.size(); i++) { + + JSONObject metadataObj = arr.getJSONObject(i); + + def lNPN = metadataObj.getString("ProjExtId"); + def lNPNAME = metadataObj.getString("Description"); + def lPSPElement = metadataObj.getString("PSPElement"); + + if( !lNPN.equals("") ) { + netzplanResultset.add(lNPN) + } + } + } else { + d3.log.error("getValueListSAPNetzplanVorg - Es konnten keine Werte ermittelt werden") + } + } + } catch(Exception e) { + d3.log.error("getValueListSAPNetzplanVorg - Exception = " + e.getMessage()) + } + + repoField.provideValuesForValueSet(netzplanResultset); + } + + @ValueSet(entrypoint="ThemaValues") + def getThemaValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + def val1 + def sqlext + + if ( doc.field[Const.gDDF_THEMA][row_no] != null && !doc.field[Const.gDDF_THEMA][row_no].equals("") ) { + val1 = "%" + doc.field[Const.gDDF_THEMA].getAt(row_no).toString() + "%"; + sqlext = "AND mv.value_char like '${val1}'" + } + else { + sqlext = "" + } + + // dynamische Wertemenge d.3 Benutzer + if ( doc.getType().getId() == "${Const.gDTS_DWISS}" ) + { + def resultset + + String sql = "SELECT DISTINCT TOP 100 mv.value_char as val " + + "FROM firmen_spezifisch fs, firm_spez_mult_val mv " + + "WHERE fs.kue_dokuart = '${Const.gDTS_DWISS}' AND fs.doku_id = mv.doku_id " + + "AND mv.field_no = '${Const.gDDF_THEMA}' "; + + sql = sql + sqlext; + + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="ServiceRequestIDValues") + def getServiceRequestIDValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) + { + def lang = d3.remote.language + def lNoSubmission + + if ( lang != "049" ) { + lNoSubmission = "No Description" + } + else { + lNoSubmission = "keine Beschreibung" + } + + // Anzeige abhängig zum aktuellen Eigenschaftsfeld + String currSrIdToCheck = null; + if(repoField.id().equals(String.valueOf(SystemSpecificConst.gSRIDID))) { + currSrIdToCheck = doc.field[Const.gDDF_SRID]; + } else if(repoField.id().equals(String.valueOf(SystemSpecificConst.gWeitereSRIDID))) { + currSrIdToCheck = doc.field[Const.gDDF_WEITERESRID][row_no]; + } + + int length = 0 + if ( currSrIdToCheck != null ) { + length = currSrIdToCheck.length(); + } + + def resultset + if( validate == 1 ) { + String sql = "SELECT dok_dat_feld_${Const.gDDF_SRID} as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASERE}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND dok_dat_feld_${Const.gDDF_SRID} = '${currSrIdToCheck}'" + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else if(length < 6) { + List ErrResultset = [ + "Bitte geben Sie mindestens sechs Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset); + + } else if(length >= 6) { + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_SRID} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASERE}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND (dok_dat_feld_${Const.gDDF_SRID} LIKE '%${currSrIdToCheck}%' " + + " OR dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} LIKE '%${currSrIdToCheck}%')" + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else { + String sql = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_SRID} + ' | ' + ISNULL( dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG},'${lNoSubmission}' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASERE}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + } + + @ValueSet(entrypoint="ServicBelegIDValues") + def getServicBelegIDValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) + { + + // Weitere Belegnummer immer abhängig vom bisherigem Belegtyp, daher voherige Hinuzvalidierung notwendig + if(Integer.valueOf(repoField.id()) == SystemSpecificConst.gWeitereBelegNrID) { + if(doc.field[Const.gDDF_BELEGNUMMER] != null) { + String belegNummerTemp = doc.field[Const.gDDF_BELEGNUMMER] + String[] splittedString = doc.field[Const.gDDF_BELEGNUMMER].split("\\s+"); + if( splittedString != null && splittedString[0] != null && !splittedString[0].equals("") ) { + belegNummerTemp = splittedString[0]; + } + String sqlSatement = "SELECT dok_dat_feld_${Const.gDDF_BELEGTYP} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${belegNummerTemp}' "; + List sqlResult = d3.sql.executeAndGet(sqlSatement); + if(sqlResult != null && sqlResult.size() == 1) { + String belegTypTemp = sqlResult.getAt(0).get("val"); + if(belegTypTemp != null && !belegTypTemp.equals("")) { + if(doc.field[Const.gDDF_BELEGTYP] == null || !doc.field[Const.gDDF_BELEGTYP].equals(belegTypTemp) ) { + doc.field[Const.gDDF_BELEGTYP] = belegTypTemp; + } + } + } + } + } + + String belegTyp = doc.field[Const.gDDF_BELEGTYP]; + + def resultset + if( validate == 1 ) { + + String belegNummerTemp = doc.field[Const.gDDF_BELEGNUMMER] + String sql = "SELECT dok_dat_feld_${Const.gDDF_BELEGNUMMER} as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND pd.doku_id = fs.doku_id " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = '${belegNummerTemp}' " + + "AND pd.frei_o_gesperrt = 'f' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else if( belegTyp != null ) { + String sql = "SELECT top 9000 dok_dat_feld_${Const.gDDF_BELEGNUMMER} + ' ' + ISNULL( dok_dat_feld_${Const.gDDF_KURZTEXT},'' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGTYP} = '${belegTyp}'" + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } else { + + String val1 = "" + int length = 0 + if ( doc.field[Const.gDDF_BELEGNUMMER] != null ) { + val1 = "%" + doc.field[Const.gDDF_BELEGNUMMER].toString() + "%" + length = val1.length(); + } + + if ( length >= 3 && doc.field[Const.gDDF_BELEGNUMMER] != null ) { + String sql = "SELECT top 9000 dok_dat_feld_${Const.gDDF_BELEGNUMMER} + ' ' + ISNULL( dok_dat_feld_${Const.gDDF_KURZTEXT},'' ) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_ASEBE}' " + + "AND (fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} like '${val1}'" + + "OR fs.dok_dat_feld_${Const.gDDF_KURZTEXT} like '${val1}' )" + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " ; + resultset = d3.sql.executeAndGet(sql); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ] + repoField.provideValuesForValueSet(ErrResultset) + } + + } + } + + @ValueSet(entrypoint="ServicBelegartValues") + def ServicBelegTypValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + //d3.log.error("Start ServicBelegartValues"); + String belegNrFull = doc.field[Const.gDDF_BELEGNUMMER]; + String belegTyp = doc.field[Const.gDDF_BELEGTYP]; + + String belegNr = null; + if( belegNrFull != null ) { + String[] splittedBelegNr = belegNrFull.split(); + if(splittedBelegNr.size() >= 1) { + belegNr = splittedBelegNr[0]; + } + } + if( validate == 1 ) { + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_BELEGTYP}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = ? " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = ? " + + "AND dok_dat_feld_${Const.gDDF_BELEGTYP} = ? "; + List params = [ + Const.gDTS_ASEBE, + "f", + belegTyp + ]; + def resultset = d3.sql.executeAndGet(sql, params); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else if( belegNr != null ) { + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_BELEGTYP}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = ? " + + "AND fs.dok_dat_feld_${Const.gDDF_BELEGNUMMER} = ? " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = ? " ; + List params = [ + Const.gDTS_ASEBE, + belegNr, + "f" + ]; + def resultset = d3.sql.executeAndGet(sql, params); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } else { + String sql = "SELECT distinct(dok_dat_feld_${Const.gDDF_BELEGTYP}) as val " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = ? " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = ? " ; + List params = [Const.gDTS_ASEBE, "f"]; + def resultset = d3.sql.executeAndGet(sql, params); + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + } + + } + + /* Anpassung jleu 28.11.2025 Like und Validate Suche eingefuegt*/ + @ValueSet(entrypoint="ServiceAllBeschreibungValues") + def serviceAllBeschreibungValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + + String sql + String dummyvalue = doc.field[Const.gDDF_SRID].trim(); + String where = ""; + + + if( doc.field[Const.gDDF_SRID] != null ) + { + String[] splittedString; + splittedString = doc.field[Const.gDDF_SRID].split(" \\| "); + if(splittedString != null) { + def lRetCodeSR = splittedString.size(); + if( lRetCodeSR > 1 ) { + dummyvalue = splittedString[0].trim(); + } + } + } + + if ( dummyvalue.length() > 0 ) + { + where = " AND dok_dat_feld_${Const.gDDF_SRID} = '${dummyvalue}'"; + } + + sql = "select distinct dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} as val FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ASERE}' " + where; + + + def resultset = d3.sql.executeAndGet(sql); + + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + + } + + @ValueSet(entrypoint="GeschaeftspartnerValues") + def getGeschaeftspartnerValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + + List valueList = new ArrayList<>(); + String lSQLState1 = ""; + String lSQLState2 = ""; + String lSQLState3 = ""; + + int ltmp = 0; + if(doc.field[Const.gDDF_GESPART] != null && doc.field[Const.gDDF_GESPART][row_no] != null) { + ltmp = doc.field[Const.gDDF_GESPART][row_no].toString().length(); + } + + if (ltmp >= 3) { + lSQLState1 = "AND (dok_dat_feld_${Const.gDDF_LNAME} like '%${doc.field[Const.gDDF_GESPART][row_no]}%' or dok_dat_feld_${Const.gDDF_LNR} like '%${doc.field[Const.gDDF_GESPART][row_no]}%')"; + lSQLState2 = "AND (dok_dat_feld_${Const.gDDF_KNAME} like '%${doc.field[Const.gDDF_GESPART][row_no]}%' or dok_dat_feld_${Const.gDDF_KNR} like '%${doc.field[Const.gDDF_GESPART][row_no]}%')"; + lSQLState3 = "AND (dok_dat_feld_${Const.gDDF_PARTNERNAME} like '%${doc.field[Const.gDDF_GESPART][row_no]}%' or dok_dat_feld_${Const.gDDF_PARTNERID} like '%${doc.field[Const.gDDF_GESPART][row_no]}%')"; + + + + + //Anpassung für Lieferantenname + String sqlStatementSupp = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_LNAME} as lSuppName, dok_dat_feld_${Const.gDDF_LNR} as lSuppNr FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + lSQLState1; + List sqlResultSupp = d3.sql.executeAndGet(sqlStatementSupp); + if(sqlResultSupp != null && sqlResultSupp.size() > 0) { + for(GroovyRowResult grr : sqlResultSupp) { + valueList.add(grr.get("lSuppName") + " (" + grr.get("lSuppNr") + ")"); + } + } + + //Anpassung für Kundenname + String sqlStatementCust = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_KNAME} as lCustName, dok_dat_feld_${Const.gDDF_KNR} as lCustNr FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_AKUND}' " + lSQLState2; + List sqlResultCust = d3.sql.executeAndGet(sqlStatementCust); + if(sqlResultCust != null && sqlResultCust.size() > 0) { + for(GroovyRowResult grr : sqlResultCust) { + valueList.add(grr.get("lCustName") + " (" + grr.get("lCustNr") + ")"); + } + } + + //Anpassung für Partnerakte + String sqlStatementPart = "SELECT dok_dat_feld_${Const.gDDF_PARTNERNAME} as lPartName, dok_dat_feld_${Const.gDDF_PARTNERID} as lPartNr FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_PRTNR}' " + lSQLState3; + List sqlResultPart = d3.sql.executeAndGet(sqlStatementPart); + if(sqlResultPart != null && sqlResultPart.size() > 0) { + for(GroovyRowResult grr : sqlResultPart) { + valueList.add(grr.get("lPartName") + " (" + grr.get("lPartNr") + ")"); + } + } + + + } else { + valueList.add("Bitte wenigstens 3 Zeichen eingeben"); + } + + repoField.provideValuesForValueSet(valueList); + } + + @ValueSet(entrypoint="GeschaeftspartnerNrValues") + def getGeschaeftspartNrValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + + List valueList = new ArrayList<>(); + String lSQLState1 = ""; + String lSQLState2 = ""; + + if(doc.field[Const.gDDF_GESPART] != null && doc.field[Const.gDDF_GESPARTNR60][row_no] != null) { + lSQLState1 = "AND dok_dat_feld_${Const.gDDF_LNAME} like '%${doc.field[Const.gDDF_GESPARTNR60][row_no]}%'" + lSQLState2 = "AND dok_dat_feld_${Const.gDDF_KNAME} like '%${doc.field[Const.gDDF_GESPARTNR60][row_no]}%'" + } + + //Anpassung für Lieferantennr + String sqlStatementSupp = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_LNR} as lSuppNr FROM firmen_spezifisch WHERE kue_dokuart = '${Const.gDTS_ALIEF}' " + lSQLState1 + " ORDER BY dok_dat_feld_${Const.gDDF_LNR}"; + List sqlResultSupp = d3.sql.executeAndGet(sqlStatementSupp); + if(sqlResultSupp != null && sqlResultSupp.size() > 0) { + for(GroovyRowResult grr : sqlResultSupp) { + valueList.add(grr.get("lSuppNr")); + } + } + + //Anpassung für Kundennr + String sqlStatementCust = "SELECT DISTINCT dok_dat_feld_${Const.gDDF_KNR} as lCustNr FROM firmen_spezifisch WHERE kue_dokuart = '$Const.gDTS_AKUND}' " + lSQLState2 + " ORDER BY dok_dat_feld_${Const.gDDF_KNR}"; + List sqlResultCust = d3.sql.executeAndGet(sqlStatementCust); + if(sqlResultCust != null && sqlResultCust.size() > 0) { + for(GroovyRowResult grr : sqlResultCust) { + valueList.add(grr.get("lCustNr")); + } + } + + repoField.provideValuesForValueSet(valueList); + } + + @ValueSet(entrypoint="EquipmentValues") + def getEquipmentValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + String currentValue = null; + if( Integer.valueOf(repoField.id()) == SystemSpecificConst.gEquipmentID ) { + currentValue = doc.field[Const.gDDF_EQUIPMENT]; + } else if( Integer.valueOf(repoField.id()) == SystemSpecificConst.gWeitereEquipmentID ) { + currentValue = doc.field[Const.gDDF_WEITEREEQUIPMENT][row_no]; + } + if( currentValue != null && currentValue.length() >= 3 ) { + // Alle bestehenden Werte holen anhand der Equipment Akte + String sqlStatement = "SELECT dok_dat_feld_${Const.gDDF_EQUIPMENT} as equ, dok_dat_feld_${Const.gDDF_NPN} as netz, dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} as besch " + + "FROM firmen_spezifisch as fs, phys_datei as pd " + + "WHERE fs.kue_dokuart = '${Const.gDTS_AEQUI}' " + + "AND pd.doku_id = fs.doku_id " + + "AND pd.frei_o_gesperrt = 'f' " + + "AND ( fs.dok_dat_feld_${Const.gDDF_EQUIPMENT} like '%${currentValue}%' " + + "OR fs.dok_dat_feld_${Const.gDDF_NPN} like '%${currentValue}%' " + + "OR fs.dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} like '%${currentValue}%' )"; + List sqlResult = d3.sql.executeAndGet(sqlStatement); + List valueList = new ArrayList<>(); + if(sqlResult != null && sqlResult.size() > 0) { + for(GroovyRowResult grr : sqlResult) { + String currentNetzplan = grr.get("netz"); + if( currentNetzplan != null && !currentNetzplan.trim().equals("") && !currentNetzplan.trim().equals("null") ) { + valueList.add(grr.get("equ") + " | " + grr.get("netz") + " | " + grr.get("besch")); + } else { + valueList.add(grr.get("equ") + " | " + "| " + grr.get("besch")); + } + } + } + repoField.provideValuesForValueSet(valueList); + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ]; + repoField.provideValuesForValueSet(ErrResultset); + } + } + + @ValueSet(entrypoint="getITSMValues") + def getITSMValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc) + { + // Ermittelt die Beschreibung - bei ITSM wird auch die Nummer gesucht und zusammengesetzet + // d3.log.error("Groovy - ValueSets: start SubjectValues " + doc.getType().getId()); + + def resultset + String sql + def val1 = "" + int length = 0 + + if ( doc.field[Const.gDDF_ITSMID] != null ) { + val1 = "%" + doc.field[Const.gDDF_ITSMID].toString() + "%" + } else { + val1 = "%" + } + length = val1.length(); + + + if ( docType.id == Const.gDTS_DITSM ) { + sql = "SELECT dok_dat_feld_${Const.gDDF_ITSMID} +'|' + dok_dat_feld_${Const.gDDF_SAPBESCHREIBUNG} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${Const.gDTS_AITSM}' " + + "AND dok_dat_feld_${Const.gDDF_SAPBESCHREIBUNG} like '${val1}'" + } else { + sql = "SELECT dok_dat_feld_${Const.gDDF_ITSMID} as val " + + "FROM firmen_spezifisch " + + "WHERE kue_dokuart = '${doc.getType().getId()}' " + + "ORDER BY dok_dat_feld_${Const.gDDF_ITSMID} "; + } + + resultset = d3.sql.executeAndGet(sql); + if( resultset.size() >= 10000 ) { + List ErrResultset = [ + "Bitte grenzen Sie Ihre Auswahl weiter ein, es wurden mehr als 10.000 Einträge gefunden." + ] + repoField.provideValuesForValueSet(ErrResultset) + return 0; + } else { + repoField.provideValuesForValueSet(resultset.collect{it.get("val")}); + return 0; + } + + } + + // Deaktivierung der Zertifikatsprüfung + def deactivateCertificateCheck() { + // CONNECT WITHOUT SSL CHECK + TrustManager[] trustAllCerts = new TrustManager[1] + def tm = new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] certs, String authType) { } + public void checkServerTrusted(X509Certificate[] certs, String authType) { } + } + trustAllCerts[0] = tm; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { return true; } + }; + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + // CONNECT WITHOUT SSL CHECK + } + + @ValueSet(entrypoint="EinkaufsbelegValues") + def getEinkaufsbelegValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + + String currentValue = null; + + if( Integer.valueOf(repoField.getId()) == SystemSpecificConst.gEinkaufsBelegNrID ) { + currentValue = doc.field[Const.gDDF_BELEGNUMMER]; + } else if( Integer.valueOf(repoField.getId()) == SystemSpecificConst.gWeitereEinkaufBelegNrID ) { + currentValue = doc.field[Const.gDDF_WEITEREBELEGNR][row_no]; + } + + if( currentValue != null && currentValue.length() >= 3 ) { + // Alle bestehenden Werte (Änderung auf Hook aufgrund Mengenbeschränkung und daher notwendiger Mindesteingabe) + String sqlStatement = """SELECT DISTINCT dok_dat_feld_${Const.gDDF_BELEGNUMMER} val + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} LIKE '%${currentValue}%' """; + List params = [Const.gDTS_AEIBE] + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + List valueList = new ArrayList<>(); + if(sqlResult != null && sqlResult.size() > 0) { + for(GroovyRowResult grr : sqlResult) { + String currentNewValue = grr.get("val"); + if(currentNewValue != null) { + valueList.add(currentNewValue); + } + } + } + repoField.provideValuesForValueSet(valueList); + } else { + List ErrResultset = [ + "Bitte geben Sie mindestens drei Zeichen ein" + ]; + repoField.provideValuesForValueSet(ErrResultset); + } + + } + + // 12.12.2022 Equipment Anwendungsfall Service + @ValueSet(entrypoint="EquipmentsValues") + def getEquipmentsValues(D3Interface d3, RepositoryField repoField, User user, DocumentType docType, Integer row_no, Integer validate, Document doc ) { + + List valueList = new ArrayList<>(); + + // Bei Service Beleg Dokumente muss die SR_ID auf Basis der Beleg-Nummer und der Service Beleg Akte ermittelt werden + // Bei Service Request Dokumente und Akten ist die SR_ID direkt gefüllt und kann genutzt werden + if(docType.getId().equals(Const.gDTS_DSEBE)) { + + Functions.splitServBelegnummer(d3, doc, docType); + + if(doc.field[Const.gDDF_BELEGNUMMER] != null) { + String sqlStatementBel = """SELECT dok_dat_feld_${Const.gDDF_SRID} currSrId + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDDF_BELEGNUMMER} = ? """; + List paramsBel = [Const.gDTS_ASEBE, doc.field[Const.gDDF_BELEGNUMMER]]; + List sqlResultBel = d3.sql.executeAndGet(sqlStatementBel, paramsBel); + if(sqlResultBel != null && sqlResultBel.size() > 0) { + String currSrdId = sqlResultBel.getAt(0).get("currSrId"); + if(currSrdId != null) { + doc.field[Const.gDDF_SRID] = currSrdId; + } + } + } + } + + // Werte ausschließlich aus dem zugrundeliegenden Service Request + if(doc.field[Const.gDDF_SRID] != null) { + + Functions.splitServSrId(d3, doc, docType); + + String sqlStatement = """SELECT DISTINCT mv.value_char currValue + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id + WHERE fs.kue_dokuart = ? + AND mv.field_no = ? + AND fs.dok_dat_feld_${Const.gDDF_SRID} = ? """; + List params = [Const.gDTS_ASERE, Const.gDDF_EQUIPMENTS, doc.field[Const.gDDF_SRID]]; + List sqlResult = d3.sql.executeAndGet(sqlStatement, params); + + if(sqlResult != null) { + for(GroovyRowResult grr : sqlResult) { + String currEquipments = grr.get("currValue"); + if(currEquipments != null) { + + // Es sollen nur Werte angezeigt werden, zu denen es zusätzlich auch eine Equipmentakte gibt + String sqlStatementFol = null; + if(doc.field[Const.gDDF_EQUIPMENTS][row_no] != null) { + sqlStatementFol = """SELECT dok_dat_feld_${Const.gDDF_EQUIPMENT} equipmentNo, dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} equipmentDesc + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = ? + AND (dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} LIKE '%${doc.field[Const.gDDF_EQUIPMENTS][row_no]}%' OR dok_dat_feld_${Const.gDDF_EQUIPMENT} LIKE '%${doc.field[Const.gDDF_EQUIPMENTS][row_no]}%')"""; + } else { + sqlStatementFol = """SELECT dok_dat_feld_${Const.gDDF_EQUIPMENT} equipmentNo, dok_dat_feld_${Const.gDDF_SVBESCHREIBUNG} equipmentDesc + FROM firmen_spezifisch + WHERE kue_dokuart = ? + AND dok_dat_feld_${Const.gDDF_EQUIPMENT} = ? """; + } + List paramsFol = [Const.gDTS_AEQUI, currEquipments]; + List sqlResultFol = d3.sql.executeAndGet(sqlStatementFol, paramsFol); + if(sqlResultFol != null && sqlResultFol.size() > 0) { + for(GroovyRowResult grrFold : sqlResultFol) { + + // Bezeichnung soll mit in Wertemenge erscheinen, damit danach gesucht werden kann + String currEquipmentNo = grrFold.get("equipmentNo"); + String currEquipmentDesc = grrFold.get("equipmentDesc"); + if(currEquipmentNo != null) { + if(currEquipmentDesc != null) { + valueList.add(currEquipments + " | " + currEquipmentDesc); + } else { + valueList.add(currEquipments); + } + } + } + } + } + } + } + } + + repoField.provideValuesForValueSet(valueList); + } + +} // Abschluss von ValueSets_Common \ No newline at end of file diff --git a/Optima/_Groovy/ValueSets_Translation.classpath b/Optima/_Groovy/ValueSets_Translation.classpath new file mode 100644 index 0000000..b2af2b8 --- /dev/null +++ b/Optima/_Groovy/ValueSets_Translation.classpath @@ -0,0 +1,2 @@ +D:\d3\d3server.prg\ext_groovy\Jar-Files\json-20180813.jar +D:\d3\d3server.prg\ext_groovy\Jar-Files\commons-io-2.5.jar \ No newline at end of file diff --git a/Optima/_Groovy/ValueSets_Translation.groovy b/Optima/_Groovy/ValueSets_Translation.groovy new file mode 100644 index 0000000..48335d1 --- /dev/null +++ b/Optima/_Groovy/ValueSets_Translation.groovy @@ -0,0 +1,744 @@ +// -------------------------------------------------------------------------------------------------------- +// ValueSets_Common.groovy +// -------------------------------------------------------------------------------------------------------- +// +// Grrovy Wertemengen Übersetzungen +// +// -------------------------------------------------------------------------------------------------------- +// +// Historie: +// 26.06.2017 phoer/dvelop Erste Version zur Umstellung der dynamischen Wertemengen und Übersetzung +// +// -------------------------------------------------------------------------------------------------------- + +import com.dvelop.d3.server.Entrypoint; +import com.dvelop.d3.server.core.D3Interface; +import com.dvelop.d3.server.Document; +import com.dvelop.d3.server.User; +import com.dvelop.d3.server.DocumentType; +import com.dvelop.d3.server.RepositoryField; +import com.dvelop.d3.server.UserOrUserGroup; +import com.dvelop.d3.server.ValueSet; +import com.dvelop.d3.server.ValueSetTranslation; +import com.dvelop.d3.server.Validation; +import com.dvelop.d3.server.Translation; +import com.dvelop.d3.server.*; + +// zusätzliche Imports für oData Zugriff 21.01.2019 +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.cert.X509Certificate; +import org.json.JSONArray; +import org.json.JSONObject; +import org.apache.commons.io.IOUtils; +import groovy.sql.GroovyRowResult; +import groovy.io.FileType; + + +class ValueSets_Translation +{ + + @ValueSetTranslation(entrypoint="SubjectValues") + def SubjectValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + d3.log.info("Groovy - ValueSets: start SubjectValueTranslation " + lang + " - locale: " + transl.locale); + + if( lang == "de" ) { + lang = "DEU" + } else if( lang == "en" ) { + lang = "ENG" + } + + // IMUE 26.08.2019 neue Wertemenge bei Umstellung auf Schlüssel statt LangKey + // NEU = def lSQL = """select fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as ShortKey, value_char as TransVal + // ALT = def lSQL = """select fs.dok_dat_feld_${Const.gDDF_ORGENTRY} as LangKey, value_char as TransVal + + def lSQL = """select fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as ShortKey, value_char as TransVal + from firm_spez_mult_val as mv + join firmen_spezifisch as fs on fs.doku_id = mv.doku_id + where field_no = '${Const.gDDF_UEBERSETZUNG}' + and mv.doku_id in ( + select doku_id + from firmen_spezifisch + where kue_dokuart = '${Const.gDTS_AZTXT}' + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} like 'AK%' ) + and row_number in ( + select row_number + from firm_spez_mult_val as mv, firmen_spezifisch as fs + where value_char like '${lang}%' + and mv.field_no = '${Const.gDDF_ISOCODE}' + and fs.kue_dokuart = '${Const.gDTS_AZTXT}' + and fs.doku_id = mv.doku_id )"""; + + def resultlist = d3.sql.executeAndGet( lSQL ); + + d3.log.info("Es wurden " + resultlist.size() + " Eintraege gefunden!"); + + for ( def i = 0; i < resultlist.size(); i++ ) { + transl.set( resultlist.get(i).get("ShortKey"), resultlist.get(i).get("TransVal") ); + } + } + + @ValueSetTranslation(entrypoint="MProjNumValues") + def getMProjNumValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + if ( lang != "DEU" ) { + transl.set( "keine Submission", "No Submission" ); + } + } + + @ValueSetTranslation(entrypoint="DokumentuntergruppeValues") + def DokumentuntergruppeValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + d3.log.info("Groovy - ValueSets: start DokumentuntergruppeValueTranslation " + lang + " - locale: " + transl.locale); + if( lang == "de" ) { + lang = "DEU" + } else if( lang == "en" ) { + lang = "ENG" + } + + + // IMUE 05.03.2019 neue Wertemenge bei Umstellung auf Schlüssel statt LangKey + // ALT = def lSQL = """select fs.dok_dat_feld_${Const.gDDF_ORGENTRY} as LangKey, value_char as TransVal + + def lSQL = """select fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as ShortKey, value_char as TransVal + from firm_spez_mult_val as mv + join firmen_spezifisch as fs on fs.doku_id = mv.doku_id + where field_no = '${Const.gDDF_UEBERSETZUNG}' + and mv.doku_id in ( + select doku_id + from firmen_spezifisch + where kue_dokuart = '${Const.gDTS_AZTXT}' + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} like 'DG%' ) + and row_number in ( + select row_number + from firm_spez_mult_val as mv, firmen_spezifisch as fs + where value_char like '${lang}%' + and field_no = '${Const.gDDF_ISOCODE}' + and fs.kue_dokuart = '${Const.gDTS_AZTXT}' + and fs.doku_id = mv.doku_id )"""; + + def resultlist = d3.sql.executeAndGet( lSQL ); + + d3.log.info("Es wurden " + resultlist.size() + " Eintraege gefunden!"); + + for ( def i = 0; i < resultlist.size(); i++ ) + { + // IMUE 05.03.2019 neue Wertemenge bei Umstellung auf Schlüssel statt LangKey + // Alt = transl.set( resultlist.get(i).get("LangKey"), resultlist.get(i).get("TransVal") ); + transl.set( resultlist.get(i).get("ShortKey"), resultlist.get(i).get("TransVal") ); + } + } + + @ValueSetTranslation(entrypoint="ProzessValues") + def ProzessValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + d3.log.info("Groovy - ValueSets: start ProzessValuesTranslation " + lang + " - locale: " + transl.locale); + + if( lang == "de" ) { + lang = "DEU" + } else if( lang == "en" ) { + lang = "ENG" + } + + // IMUE 05.02.2019 - Folgendes Statement ergibt die Schlüssel und die jeweilige Übersetzung nach Prozessumbau + def lSQL = """ SELECT fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as LangKey, mv.value_char as TransVal + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id AND mv.row_number = mv2.row_number + WHERE fs.kue_dokuart = '${Const.gDTS_AZTXT}' + AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' + AND mv2.field_no = '${Const.gDDF_ISOCODE}' + AND mv2.value_char LIKE '${lang}%' + ORDER BY mv2.value_char asc """; + + /* + def lSQL = """select fs.dok_dat_feld_${Const.gDDF_ORGENTRY} as LangKey, value_char as TransVal + from firm_spez_mult_val as mv + join firmen_spezifisch as fs on fs.doku_id = mv.doku_id + where field_no = '${Const.gDDF_UEBERSETZUNG}' + and mv.doku_id in ( + select doku_id + from firmen_spezifisch + where kue_dokuart = '${Const.gDTS_AZTXT}' + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} like 'PZ%' ) + and row_number in ( + select row_number + from firm_spez_mult_val as mv, firmen_spezifisch as fs + where value_char like '${lang}%' + and field_no = '${Const.gDDF_ISOCODE}' + and fs.kue_dokuart = '${Const.gDTS_AZTXT}' + and fs.doku_id = mv.doku_id )"""; + */ + + def resultlist = d3.sql.executeAndGet( lSQL ); + + d3.log.info("Es wurden " + resultlist.size() + " Eintraege gefunden!"); + + for ( def i = 0; i < resultlist.size(); i++ ) + { + transl.set( resultlist.get(i).get("LangKey"), resultlist.get(i).get("TransVal") ); + } + } + + @ValueSetTranslation(entrypoint="ProzArtValues") + def ProzArtValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + d3.log.info("Groovy - ValueSets: start ProzArtValuesTranslation " + lang + " - locale: " + transl.locale); + + if( lang == "de" ) { + lang = "DEU" + } else if( lang == "en" ) { + lang = "ENG" + } + + def lSQL = """ SELECT fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as LangKey, mv.value_char as TransVal + FROM firmen_spezifisch fs + LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id + LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id AND mv.row_number = mv2.row_number + WHERE fs.kue_dokuart = '${Const.gDTS_AZTXT}' + AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' + AND mv2.field_no = '${Const.gDDF_ISOCODE}' + AND mv2.value_char LIKE '${lang}%' """; + + /*def lSQL = """select fs.dok_dat_feld_${Const.gDDF_ORGENTRY} as LangKey, value_char as TransVal + from firm_spez_mult_val as mv + join firmen_spezifisch as fs on fs.doku_id = mv.doku_id + where field_no = '${Const.gDDF_UEBERSETZUNG}' + and mv.doku_id in ( + select doku_id + from firmen_spezifisch + where kue_dokuart = '${Const.gDTS_AZTXT}' + AND dok_dat_feld_${Const.gDFF_SCHLUESSEL} like 'PA%' ) + and row_number in ( + select row_number + from firm_spez_mult_val as mv, firmen_spezifisch as fs + where value_char like '${lang}%' + and field_no = '${Const.gDDF_ISOCODE}' + and fs.kue_dokuart = '${Const.gDTS_AZTXT}' + and fs.doku_id = mv.doku_id )"""; + */ + + def resultlist = d3.sql.executeAndGet( lSQL ); + + d3.log.info("Es wurden " + resultlist.size() + " Eintraege gefunden!"); + + for ( def i = 0; i < resultlist.size(); i++ ) + { + transl.set( resultlist.get(i).get("LangKey"), resultlist.get(i).get("TransVal") ); + } + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSetTranslation(entrypoint="MachineDocumentModuls") + def MachineDocumentsModulsTranslation(D3Interface d3, Translation transl) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + def lang = transl.locale.language + lang = lang.toUpperCase(); + def fallbackLangEng = "EN"; + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL( 'https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/ModuleTextSet?$filter=Deleted%20eq%20false%20&$format=json'); + + try { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + JSONArray arr = obj.get("d").getJSONArray("results"); + + List guidList = new ArrayList<>(); + HashMap guidJsonObMap = new HashMap<>(); + + if(arr.length() > 0) { + for (int i = 0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige GUID einmalig holen + String guid = metadataObj.getString("ModuleGUID"); + boolean exist = guidList.contains(guid); + if(exist == false) { + guidList.add(guid); + } + // Je GUID das JsonObject zwischernspeichern - Eine GUID ist nur je Sprache eindeutig, daher Zusammensetzung für den HashMap-Key notwendig + String language = metadataObj.getString("LanguageSap"); + guidJsonObMap.put(guid + "_" + language, metadataObj); + } + } else { + d3.log.error( " ## ValueSetTranslation for MachineDocumentModuls - JSONArray Size = 0 ") ; + } + + // für jede eindeutige GUID müssen die weiteren Informationen in der Anmeldesprache gefunden werden + // wenn kein Ergebnis gefunden wurde - Fallback Englisch + for(String guid : guidList) { + JSONObject jsonTempOb = guidJsonObMap.get(guid + "_" + lang); + // wenn es Informationen zu der GUID und der Anmeldesprache gibt + if(jsonTempOb != null) { + // Eindeutige ID holen + String id = jsonTempOb.getString("Id"); + // Beschreibung holen + String description = jsonTempOb.getString("Description"); + transl.set( guid, id + " - " + description); + } else { + // Fallback - gibt es keine Informationen in der Anmeldesprache, nehme Englisch + JSONObject jsonTempObEng = guidJsonObMap.get(guid + "_" + fallbackLangEng); + // Eindeutige ID holen + String id = jsonTempObEng.getString("Id"); + // Beschreibung holen + String description = jsonTempObEng.getString("Description"); + //d3.log.error( " ## ValueSetTranslation for MachineDocumentModuls - " + fallbackLangEng + " - " + guid + " - " + id + " - " + description); + transl.set( guid, id + " - " + description); + } + } + + } catch(Exception e) { + d3.log.error( " ## ValueSetTranslation for MachineDocumentModuls - Exception = " + e.getMessage() ); + } + + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSetTranslation(entrypoint="MachineDocumentFunctions") + def MachineDocumentsFunctionsTranslation(D3Interface d3, Translation transl) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + def lang = transl.locale.language + lang = lang.toUpperCase(); + def fallbackLangEng = "EN"; + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + // aktuell ist es noch nicht möglich ohne Filterung den oData Aufruf auszuführen + URL url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/FunctionTextSet?$filter=Deleted%20eq%20false%20&$format=json'); + + try { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + JSONArray arr = obj.get("d").getJSONArray("results"); + + List guidList = new ArrayList<>(); + HashMap guidJsonObMap = new HashMap<>(); + + if(arr.length() > 0) { + for (int i = 0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige GUID einmalig holen + String guid = metadataObj.getString("FunctionGUID"); + boolean exist = guidList.contains(guid); + if(exist == false) { + guidList.add(guid); + } + // Je GUID das JsonObject zwischernspeichern - Eine GUID ist nur je Sprache eindeutig, daher Zusammensetzung für den HashMap-Key notwendig + String language = metadataObj.getString("LanguageSap"); + guidJsonObMap.put(guid + "_" + language, metadataObj); + } + } else { + d3.log.error( " ## ValueSetTranslation for MachineDocumentFunctions - JSONArray Size = 0 ") ; + } + + // für jede eindeutige GUID müssen die weiteren Informationen in der Anmeldesprache gefunden werden + // wenn kein Ergebnis gefunden wurde - Fallback Englisch + for(String guid : guidList) { + JSONObject jsonTempOb = guidJsonObMap.get(guid + "_" + lang); + // wenn es Informationen zu der GUID und der Anmeldesprache gibt + if(jsonTempOb != null) { + // Eindeutige ID holen + String id = jsonTempOb.getString("Id"); + // Beschreibung holen + String description = jsonTempOb.getString("Description"); + transl.set( guid, id + " - " + description); + } else { + // Fallback - gibt es keine Informationen in der Anmeldesprache, nehme Englisch + JSONObject jsonTempObEng = guidJsonObMap.get(guid + "_" + fallbackLangEng); + // Eindeutige ID holen + String id = jsonTempObEng.getString("Id"); + // Beschreibung holen + String description = jsonTempObEng.getString("Description"); + //d3.log.error( " ## ValueSetTranslation for MachineDocumentFunctions - " + fallbackLangEng + " - " + guid + " - " + id + " - " + description); + transl.set( guid, id + " - " + description); + } + } + + } catch(Exception e) { + d3.log.error( " ## ValueSetTranslation for MachineDocumentFunctions - Exception = " + e.getMessage() ); + } + + } + + // 07.2019 wird produktiv noch nicht genutzt + @ValueSetTranslation(entrypoint="MachineDocumentMachineType") + def MachineDocumentMachineTypeTranslation(D3Interface d3, Translation transl) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + def lang = transl.locale.language + lang = lang.toUpperCase(); + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZPS_MACHINE_MASTER_SRV/MachineSimpleSet?$format=json'); + + try { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + JSONArray arr = obj.get("d").getJSONArray("results"); + + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Id holen + String id = metadataObj.getString("Id"); + + // Beschreibung holen + String description = metadataObj.getString("Description"); + transl.set( id, id + " - " + description); + + } + + } catch(Exception e) { + d3.log.error( " ## ValueSetTranslation for MachineDocumentModuls - Exception = " + e.getMessage() ); + } + + } + + @ValueSetTranslation(entrypoint="VorlagenProzArtValues") + def VorlagenProzArtValuesTranslation(D3Interface d3, Translation transl) + { + def lang = transl.locale.language + + if( lang == "de" ) { + lang = "DEU" + } else if( lang == "en" ) { + lang = "ENG" + } + + def lSQL = """select fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as LangKey, value_char as TransVal + from firm_spez_mult_val as mv + join firmen_spezifisch as fs on fs.doku_id = mv.doku_id + where field_no = '${Const.gDDF_UEBERSETZUNG}' + and mv.doku_id in ( + select doku_id + from firmen_spezifisch + where kue_dokuart = '${Const.gDTS_AZTXT}' ) + and row_number in ( + select row_number + from firm_spez_mult_val as mv, firmen_spezifisch as fs + where value_char like '${lang}%' + and field_no = '${Const.gDDF_ISOCODE}' + and fs.kue_dokuart = '${Const.gDTS_AZTXT}' + and fs.doku_id = mv.doku_id )"""; + + def resultlist = d3.sql.executeAndGet( lSQL ); + + for ( def i = 0; i < resultlist.size(); i++ ) + { + transl.set( resultlist.get(i).get("LangKey"), resultlist.get(i).get("TransVal") ); + } + + } + + @ValueSetTranslation(entrypoint="RegisterValues") + def RegisterTranslation(D3Interface d3, Translation transl) + { + //d3.log.error("RegisterValues Translation started"); + + def lang = transl.locale.language + + // Erweiterte Eigenschaft Register hat die ID 51 und muss pro System geprüft werden + def registerResultsetTransMan = d3.sql.executeAndGet("SELECT value_char_allowed, value_char_transl FROM dbo.doc_field_val_lang WHERE predef_value_id = 51"); + + + + if( lang == "de" ) { + // manuelle Wertemenge + for ( int i = 0; i < registerResultsetTransMan.size(); i++ ) { + transl.set( registerResultsetTransMan.get(i).get("value_char_allowed"), registerResultsetTransMan.get(i).get("value_char_allowed") ); + } + // dynamische Wertemenge + def registerResultsetTransDyn = d3.sql.executeAndGet("SELECT fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as ShortKey, mv.value_char as ValueTrans FROM firmen_spezifisch fs LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id WHERE fs.kue_dokuart = '${Const.gDTS_AZTXT}' AND fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} LIKE 'DG%' AND field_no = ${Const.gDDF_UEBERSETZUNG} AND mv.row_number = 1"); + for ( int i = 0; i < registerResultsetTransDyn.size(); i++ ) { + transl.set( registerResultsetTransDyn.get(i).get("ShortKey"), registerResultsetTransDyn.get(i).get("ValueTrans") ); + } + } else if( lang == "en" ) { + // manuelle Wertemenge + for ( int i = 0; i < registerResultsetTransMan.size(); i++ ) { + transl.set( registerResultsetTransMan.get(i).get("value_char_allowed"), registerResultsetTransMan.get(i).get("value_char_transl") ); + } + // dynamische Wertemenge + def registerResultsetTransDyn = d3.sql.executeAndGet("SELECT fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as ShortKey, mv.value_char as ValueTrans FROM firmen_spezifisch fs LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id WHERE fs.kue_dokuart = '${Const.gDTS_AZTXT}' AND fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} LIKE 'DG%' AND field_no = ${Const.gDDF_UEBERSETZUNG} AND mv.row_number = 2"); + for ( int i = 0; i < registerResultsetTransDyn.size(); i++ ) { + transl.set( registerResultsetTransDyn.get(i).get("ShortKey"), registerResultsetTransDyn.get(i).get("ValueTrans") ); + } + } + + } + + @ValueSetTranslation(entrypoint="OGValues") + def OGValuesTranslation(D3Interface d3, Translation transl) + { + //def lang = transl.locale.language + + //d3.log.info("Groovy - ValueSets: start OGValuesTranslation " + lang + " - locale: " + transl.locale); + + //if( lang == "de" ) { + //lang = "DEU" + //} else if( lang == "en" ) { + //lang = "ENG" + //} + + //def lSQL = """ SELECT fs.dok_dat_feld_${Const.gDFF_SCHLUESSEL} as LangKey, mv.value_char as TransVal + // FROM firmen_spezifisch fs + // LEFT JOIN firm_spez_mult_val mv ON fs.doku_id = mv.doku_id + // LEFT JOIN firm_spez_mult_val mv2 ON fs.doku_id = mv2.doku_id AND mv.row_number = mv2.row_number + // WHERE fs.kue_dokuart = '${Const.gDTS_AZTXT}' + // AND mv.field_no = '${Const.gDDF_UEBERSETZUNG}' + // AND mv2.field_no = '${Const.gDDF_ISOCODE}' + // AND mv2.value_char LIKE '${lang}%' """; + + //def resultlist = d3.sql.executeAndGet( lSQL ); + + //d3.log.info("Es wurden " + resultlist.size() + " Eintraege gefunden!"); + + //for ( def i = 0; i < resultlist.size(); i++ ) + //{ + // transl.set( resultlist.get(i).get("LangKey"), resultlist.get(i).get("TransVal") ); + //} + + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + def lang = transl.locale.language + lang = lang.toUpperCase(); + + /* + // Create a trust manager that does not validate certificate chains -> entfernt 13.02.2019 + Dafür ist es erforderlich das Zertifikat in Java als vertrauenswürdig hinzuzufügen: + cd D:\d3\d3server.prg\JRE\bin keytool.exe -import -keystore "D:\d3\d3server.prg\JRE\lib\security\cacerts" -file "E:\optima_group_ca.cer" + */ + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZCA_D3_AUTHORIZATIONS_SRV/OrgUnitSet?$format=json'); + + try { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + JSONArray arr = obj.get("d").getJSONArray("results"); + + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + + // Eindeutige Id holen + String id = metadataObj.getString("Id"); + + // Beschreibung holen + String description = metadataObj.getString("DisplayName"); + transl.set( id, description); + + } + + } catch(Exception e) { + d3.log.error( " ## ValueSetTranslation for OGValuesTranslation - Exception = " + e.getMessage() ); + } + + + } + + @ValueSetTranslation(entrypoint="BuchungskreisValues") + def getValuesBuchungskreis(D3Interface d3, Translation transl) + { + // Persistierung nur der eindeutigen ID - In der Wertemenge wird über die Translation "ID - Beschreibung" angezeigt" + + List buchungskreisResultset = []; + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL('https://' + SystemSpecificConst.baseOdata + '/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/CompanySet?$format=json&$orderby=CompanyCode'); + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) + { + JSONObject metadataObj = arr.getJSONObject(i); + // Buchungskreis holen + String companyCode = metadataObj.getString("CompanyCode"); + + // Beschreibung holen + String description = metadataObj.getString("Description"); + transl.set( companyCode, companyCode + " | " + description); + + } + } + } catch(Exception e) { + d3.log.error( " ## BuchungskreisTranslationValues - Exception = " + e.getMessage() ); + } + + } + + @ValueSetTranslation(entrypoint="ServicBelegartValues") + def ServicBelegartTransValues(D3Interface d3, Translation transl) { + + def lang = transl.locale.language + + d3.log.info("Groovy - ValueSets: start ServicBelegartValues " + lang + " - locale: " + transl.locale); + + if( lang == "de" ) { + lang = "DE" + } else if( lang == "en" ) { + lang = "EN" + } + + List buchungskreisResultset = []; + + if(SystemSpecificConst.needCertificateCheck == false) { + deactivateCertificateCheck(); + } + + URL url = new URL("https://" + SystemSpecificConst.baseOdata + "/sap/opu/odata/sap/ZCA_D3_VALUE_LISTS_SRV/DocumentTypeSet?\$format=json&\$filter=LanguageIso%20eq%20'" + lang + "'"); + + try { + if(url != null) { + URLConnection con = url.openConnection(); + + String userpass = SystemSpecificConst.lUserOdata + ":" + SystemSpecificConst.lPassOdata; + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + + InputStream is = con.getInputStream(); + String responseValue = IOUtils.toString(is, "UTF-8"); + is.close(); + + JSONObject obj = new JSONObject(responseValue); + + JSONArray arr = obj.get("d").getJSONArray("results"); + for (int i = 0; i < arr.length(); i++) { + JSONObject metadataObj = arr.getJSONObject(i); + // Belegart holen + String documentTypeShort = metadataObj.getString("Id"); + // Beschreibung holen + String documentTypeDescription = metadataObj.getString("Description"); + transl.set( documentTypeShort, documentTypeDescription ); + } + } + } catch(Exception e) { + d3.log.error( " ## ServicBelegartTransValues - Exception = " + e.getMessage() ); + } + + } + + // Deaktivierung der Zertifikatsprüfung + def deactivateCertificateCheck() { + // CONNECT WITHOUT SSL CHECK + TrustManager[] trustAllCerts = new TrustManager[1] + def tm = new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] certs, String authType) { } + public void checkServerTrusted(X509Certificate[] certs, String authType) { } + } + trustAllCerts[0] = tm; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { return true; } + }; + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + // CONNECT WITHOUT SSL CHECK + } + +} // End of file \ No newline at end of file diff --git a/Optima/_Groovy/case-mngmnt-hook.jar b/Optima/_Groovy/case-mngmnt-hook.jar new file mode 100644 index 0000000..9eec1e0 Binary files /dev/null and b/Optima/_Groovy/case-mngmnt-hook.jar differ diff --git a/Optima/_Groovy/dbsCaseContractHooks.classpath b/Optima/_Groovy/dbsCaseContractHooks.classpath new file mode 100644 index 0000000..003f413 --- /dev/null +++ b/Optima/_Groovy/dbsCaseContractHooks.classpath @@ -0,0 +1 @@ +D:\d3\d3server.prg\ext_groovy\Jar-Files\case-mngmnt-hook.jar \ No newline at end of file diff --git a/Optima/_Groovy/dbsCaseContractHooks.groovy b/Optima/_Groovy/dbsCaseContractHooks.groovy new file mode 100644 index 0000000..58a1ebd --- /dev/null +++ b/Optima/_Groovy/dbsCaseContractHooks.groovy @@ -0,0 +1,408 @@ +import groovy.sql.GroovyRowResult + +import java.io.File; +import java.lang.reflect.Field +import java.net.URI; +import java.util.Calendar; +import java.util.Date + +import javax.swing.text.html.FrameSetView; + +import com.dvelop.casemanagement.clients.ConditionExecutionClient; +import com.dvelop.casemanagement.clients.HTTPClientException; +import com.dvelop.casemanagement.config.io.HookHandler; +import com.dvelop.casemanagement.constants.IniConstants; +import com.dvelop.d3.server.ArchiveObject; +import com.dvelop.d3.server.Condition +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; + +//TODO: Refactor statics into a util class +public class dbsCaseContractHooks { + private static HookHandler handler; + private static Map> langMap; + private static final int leadingZeroCount = 5; + static { + langMap = new HashMap>(); + langMap.put("001", new HashMap()); + langMap.put("049", new HashMap()); + } + private String getTranslation(String language, String key) { + Map l; + if(langMap.containsKey( language)) { + l = langMap.get( language); + } else { + l = langMap.get( "001"); + } + if(l.containsKey(key)) { + return l.get(key); + } + return key; + } + private static HookHandler getHandler(D3Interface d3) { + if(dbsCaseContractHooks.handler == null) { + List paths = new ArrayList(); + for(int i = 0; i < 100; i++) { + String path = d3.conf.value("HOOK_GROOVY_DIRS_CUSTOMER", i); + if(path != null && path.length() > 0) { + paths.add(path); + } else { + break; + } + } + dbsCaseContractHooks.handler = new HookHandler(paths); + } + return dbsCaseContractHooks.handler; + } + + @Entrypoint( entrypoint = "hook_upd_attrib_entry_20" ) + public int hook_upd_attrib_entry_20_dbsContract ( D3Interface d3, Document doc , User user, DocumentType docType, DocumentType docTypeNew) { + String docTypeShort = docType.id; + if(getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTRAG).equals( docTypeShort) || getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_RAHMEN).equals( docTypeShort)) { + String completeAction = "${user.getLongName()} aktualisierte Eigenschaften.".toString(); + Integer updateField = Integer.parseInt( getHandler(d3).getOption( IniConstants.DBS_CASEORCONTRACT_LASTCHANGEACTION)); + String currentActionValue = doc.field[updateField]; + if(currentActionValue == null || "".equals(currentActionValue)) { + doc.field[updateField] = completeAction; + } else { + Document file = d3.archive.getDocument(doc.id, user.id); + if(file != null) { + String oldValue = file.field[updateField]; + if(currentActionValue.equals( oldValue )) { + doc.field[updateField] = completeAction; + } + } + } + } + return 0; + } + + @Entrypoint( entrypoint = "hook_insert_exit_20" ) + public int hook_insert_exit_20_dbsContract (D3Interface d3 , Document doc, String fileDestination, def importOk, User user, DocumentType docType) { + // check importOk for int and string -> type change after update of d.3 server + if(importOk == "1" || importOk == 1 ) { + String docTypeShort = docType.id; + String restPath = getHandler(d3).getOption( IniConstants.DBS_PRESENTATION_SERVER_BASE_URL); + ConditionExecutionClient client = new ConditionExecutionClient(restPath); + switch(docTypeShort) { + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTRAG): + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_RAHMEN): + try { + d3.log.info("Informing dbs | case manager contract about import of document with doc id " + doc.id + "."); + if(!client.importOfDocument( doc.id, user.id)) { + d3.log.error("Could not inform dbs | case manager contract about import of document!"); + return -1; + } + } catch (HTTPClientException e) { + d3.log.error("Could not inform dbs | case manager contract about import of document with doc id " + doc.id + ": " + e.getLogMsg() + " entity was: " + e.getEntityMsg() ); + return -1; + } catch (Exception e) { + d3.log.error("Could not inform dbs | case manager contract about import of document with doc id " + doc.id + ": " + e.getMessage() ); + return -1; + } + break; + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTR_VUNT): + try { + d3.log.info("Informing dbs | case manager contract about import of contract paper with doc id " + doc.id + "."); + if(!client.importOfMail( doc.id)) { + d3.log.error("Could not inform dbs | case manager contract about import of contract paper with doc id " + doc.id + "."); + return -1; + } + } catch (HTTPClientException e) { + d3.log.error("Could not inform dbs | case manager contract about import of contract paper with doc id " + doc.id + ": " + e.getLogMsg() + " entity was: " + e.getEntityMsg() ); + return -1; + } catch (Exception e) { + d3.log.error("Could not inform dbs | case manager contract about import of contract paper with doc id " + doc.id + ": " + e.getMessage() ); + return -1; + } + //Break is missing intentionally! + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTR_DOK): + updateLastActionOfContract(d3, user, doc, " importierte ein neues Dokument."); + break; + } + } + return 0; + } + + @Entrypoint( entrypoint = "hook_upd_attrib_exit_20" ) + public int hook_upd_attrib_exit_20_dbsContract ( D3Interface d3, Document doc , Integer errorCode, User user, DocumentType docType, DocumentType docTypeNew) { + if(errorCode == 0) { + String docTypeShort = docType.id; + String restPath = getHandler(d3).getOption( IniConstants.DBS_PRESENTATION_SERVER_BASE_URL); + ConditionExecutionClient client = new ConditionExecutionClient(restPath); + switch(docTypeShort) { + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTRAG): + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_RAHMEN): + try { + d3.log.info("Informing dbs | case manager contract about update of document with doc id " + doc.id + "."); + if(!client.updateOfDocument( doc.id, user.id)) { + d3.log.error("Could not inform dbs | case manager contract about update of document with doc id " + doc.id + "."); + return -1; + } + } catch (HTTPClientException e) { + d3.log.error("Could not inform dbs | case manager contract about update of document with doc id " + doc.id + ": " + e.getLogMsg() + " entity was: " + e.getEntityMsg() ); + return -1; + } catch (Exception e) { + d3.log.error("Could not inform dbs | case manager contract about update of document with doc id " + doc.id + ": " + e.getMessage() ); + return -1; + } + break; + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTR_DOK): + case getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTR_VUNT): + updateLastActionOfContract(d3, user, doc, " aktualisierte ein bestehendes Dokument."); + break; + } + } + return 0; + } + + private void updateLastActionOfContract(D3Interface d3, User user, Document doc, String action) { + Integer internalNumberField = Integer.parseInt( getHandler(d3).getOption(IniConstants.DBS_VERTRAGSNUMMER)); + Integer updateField = Integer.parseInt( getHandler(d3).getOption( IniConstants.DBS_CASEORCONTRACT_LASTCHANGEACTION)); + String frameStart = getHandler(d3).getOption( IniConstants.DBS_PREFIX_RAHMEN); + String docTypeFather = getHandler(d3).getOption( IniConstants.DBS_KUE_DOKUART_VERTRAG); + String internalNumberFather = doc.field[internalNumberField]; + if(internalNumberFather != null && internalNumberFather.startsWith( frameStart)) { + docTypeFather = getHandler(d3).getOption( IniConstants.DBS_KUE_DOKUART_RAHMEN); + } + if(internalNumberField != null && updateField != null && internalNumberFather != null && docTypeFather != null ) { + def query = "SELECT doku_id FROM firmen_spezifisch WHERE dok_dat_feld_${internalNumberField} = ? AND kue_dokuart = ?"; + def params = [internalNumberFather, docTypeFather]; + GroovyRowResult resultRow = d3.sql.firstRow(query, params); + if(resultRow != null && resultRow.containsKey("doku_id" ) && resultRow.getProperty("doku_id") != null) { + String docIdFile = resultRow.getProperty("doku_id"); + String completeAction = "${user.getLongName()} ${action}".toString(); + Document file = d3.archive.getDocument(docIdFile, user.id); + if(file != null) { + file.field[updateField] = completeAction; + file.updateAttributes(user.id, true); + } + } else { + throw new RuntimeException("Could not find any contract files with the internal contract number ${internalNumberFather}" ); + } + } else { + throw new RuntimeException("dbs | case manager contract hook configuration not found or the configuration was not completed! Please check your configuration."); + } + } + + // To provide the hook for entrypoint 'hook_validate_import_entry_10' uncomment the following annotation. + // Mind that for this method the d.3 server version 8.1 is required. + @Entrypoint( entrypoint = "hook_validate_import_entry_10" ) + public int hook_validate_import_entry_10_dbsContract ( D3Interface d3, User user, DocumentType docType, Document doc, String nextcall ) { + String docTypeContractRV = getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_RAHMEN); + String docTypeContractEV = getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTRAG); + String docTypeContractEVDOK = getHandler(d3).getOption( IniConstants.DBS_KUE_DOKUART_VERTR_DOK); + String docTypeContractEVUNT = getHandler( d3).getOption( IniConstants.DBS_KUE_DOKUART_VERTR_VUNT); + String docTypeShort = docType.id; + Integer internalNumberField = Integer.parseInt( getHandler(d3).getOption(IniConstants.DBS_VERTRAGSNUMMER)); + + if(docTypeContractRV == null || docTypeContractEV == null || docTypeContractEVDOK == null || docTypeContractEVUNT == null) { + throw new RuntimeException("dbs | case manager hook configuration not found or the configuration was not completed! Please check your configuration."); + } + try + { + if( docTypeContractRV.equals(docTypeShort) || docTypeContractEV.equals(docTypeShort)) { + String importAction = "${user.getLongName()} importierte Akte.".toString(); + Integer updateField = Integer.parseInt( getHandler(d3).getOption( IniConstants.DBS_CASEORCONTRACT_LASTCHANGEACTION)); + doc.field[updateField] = importAction; + } + // date validation if activated in administration + if ( Integer.parseInt( getHandler(d3).getOption( IniConstants.DBS_VALIDATEDATE)) == 1) { + if ( docTypeContractEV.equals( docTypeShort)) { + d3.log.info("checking internal contract number for blanket contract agreement"); + Integer internalFrameContractNumberField = Integer.parseInt( getHandler( d3).getOption( IniConstants.DBS_VERTRAG_DOKDAT_RAHMEN)); + String internalFrameContractNumber = doc.field[internalFrameContractNumberField]; + if ( internalFrameContractNumber != null && internalFrameContractNumber != "" ) { + Integer startDateField = Integer.parseInt(getHandler( d3).getOption( IniConstants.DBS_CONTRACT_STARTDATE_CONTRACT)); + Date startDateEV = doc.field[startDateField]; + Integer endDateField = Integer.parseInt(getHandler( d3).getOption( IniConstants.DBS_CONTRACT_ENDDATE_CONTRACT)); + Date endDateEV = doc.field[endDateField]; + String docIdFrameContract = getDocId(d3, internalFrameContractNumber, docTypeContractRV, internalNumberField); + if ( docIdFrameContract != "" ) { + d3.log.info("comparing contract start / end dates with corresponding dates of blanket contract agreement") + Date startDateRV = getDate(d3, docIdFrameContract, docTypeContractRV, startDateField); + if (startDateRV != null ) { + if (startDateEV != null && startDateEV.before( startDateRV)) { + d3.log.error("An error occurred validating the contract dates! The specified start date lies before the start date of the blanket agreement."); + return -8140505; + } + if ( endDateEV != null && endDateEV.before( startDateRV)) { + d3.log.error("An error occurred validating the contract dates! The specified end date lies before the start date of the blanket agreement."); + return -8140506; + } + } + Date endDateRV = getDate(d3, docIdFrameContract, docTypeContractRV, endDateField); + if (endDateRV != null ){ + if (startDateEV != null && startDateEV.after( endDateRV)) { + d3.log.error("An error occurred validating the contract dates! The specified start date lies after the end date of the blanket agreement."); + return -8140507; + } + if ( endDateEV != null && endDateEV.after( endDateRV)) { + d3.log.error("An error occurred validating the contract dates! The specified end date lies after the end date of the blanket agreement."); + return -8140508; + } + } + } else { + d3.log.error("Please check the specified internal contract number for the blanket agreement."); + return -8140502; + } + } + } + } + + if ( docTypeContractEV.equals( docTypeShort) || docTypeContractRV.equals( docTypeShort) || docTypeContractEVDOK.equals( docTypeShort)) { + if ( doc.field[internalNumberField] != null && doc.field[internalNumberField] != "") { + d3.log.info("docfield[${internalNumberField}] for the internal contract number was not empty"); + int numberOfFoundInternalContractNumber = countExistingInternalContractNumber(d3, docTypeShort, doc.field[internalNumberField], internalNumberField ); + if (numberOfFoundInternalContractNumber >= 1) { + d3.log.info("next api function: ${nextcall}"); + if ( !"ImportNewVersionDocument".equals( nextcall) || numberOfFoundInternalContractNumber > 1 ) { + d3.log.error("Please check the internal contract number. The internal contract number '${doc.field[internalNumberField]}' is already assigned to other contract files and it is forbidden to use duplicates."); + return -8140503; + } + } + doc.number = doc.field[internalNumberField]; + return 0; + } else { + if ( doc.number != null && doc.number != "") { + d3.log.info("doc number was not empty"); + doc.field[internalNumberField] = doc.number; + int numberOfFoundInternalContractNumber = countExistingInternalContractNumber(d3, docTypeShort, doc.field[internalNumberField], internalNumberField ); + if (numberOfFoundInternalContractNumber >= 1) { + d3.log.error("Please check the internal contract number. The internal contract number '${doc.field[internalNumberField]}' is already assigned to other contract files and it is forbidden to use duplicates."); + return -8140503; + } + return 0; + } + } + d3.log.info("Need to generate a new number: "); + setNextContractNumber(d3, docType, doc); + } else if ( docTypeContractEVUNT.equals( docTypeShort)) { + int numberOfFoundInternalContractNumberEV = countExistingInternalContractNumber(d3, docTypeContractEV, doc.field[internalNumberField], internalNumberField ); + if ( numberOfFoundInternalContractNumberEV == 0 ) { + int numberOfFoundInternalContractNumberRV = countExistingInternalContractNumber(d3, docTypeContractRV, doc.field[internalNumberField], internalNumberField ); + if ( numberOfFoundInternalContractNumberRV == 0) { + d3.log.error("Please check the internal contract number."); + return -8140509; + } + } + } + } + catch( Exception e) + { + d3.log.error("An Exception occured: ${e.getCause()} StackTrace: ${e}"); + return -1; + } + return 0; + } + + + private void setNextContractNumber(D3Interface d3, DocumentType docType, Document doc) { + String docTypeContractRV = getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_RAHMEN); + String docTypeContractEV = getHandler(d3).getOption(IniConstants.DBS_KUE_DOKUART_VERTRAG); + if(docTypeContractRV == null || docTypeContractEV == null) { + throw new RuntimeException("dbs | case manager hook configuration not found or the configuration was not completed! Please check your configuration."); + } + String prefixType = null; + String docTypeShortForPrefix = docTypeContractEV; + if ( docType.id == docTypeContractRV){ + docTypeShortForPrefix = docTypeContractRV; + } + switch(docTypeShortForPrefix) { + case docTypeContractRV: + prefixType = IniConstants.DBS_PREFIX_RAHMEN; + break; + case docTypeContractEV: + prefixType = IniConstants.DBS_PREFIX_ID; + break; + default: + throw new RuntimeException("The hook function \"setNextContractNumber\" was called with an unknown doc type! Expected ${docTypeContractEV} or ${docTypeContractRV} but was ${docTypeShortForPrefix}"); + } + String configuredPrefix = getHandler(d3).getOption(prefixType); + Integer internalNumberField = Integer.parseInt( getHandler(d3).getOption(IniConstants.DBS_VERTRAGSNUMMER)); + if(configuredPrefix == null || internalNumberField == null) { + throw new RuntimeException("dbs | case manager hook configuration not found or the configuration was not completed! Please check your configuration."); + } + + GroovyObject prefixGenerator = preparePrefixGenerator(d3); + String prefix = prefixGenerator.generateContractNumberPrefix(configuredPrefix); + d3.log.info("Generated prefix for internal contract number: ${prefix}"); + + String query = "select max( dok_dat_feld_${internalNumberField} ) as docNumberCount from firmen_spezifisch where kue_dokuart = ? and (dok_dat_feld_${internalNumberField} like ?)"; + GroovyRowResult resultRow = d3.sql.firstRow(query, [docTypeShortForPrefix, (prefix + "%")]); + int number = 0; + if(resultRow != null && resultRow.containsKey("docNumberCount" ) && resultRow.getProperty("docNumberCount") != null) { + Integer result = Integer.parseInt(resultRow.getProperty("docNumberCount").substring( prefix.length())); + number = result != null ? result : 0; + } + number++; + + String numberString = String.valueOf( number); + if(numberString.length() > leadingZeroCount) { + throw new RuntimeException("Could not generate a valid contract number. There are no more contract numbers left! Please use a higher leading zero count."); + } + while(numberString.length() < leadingZeroCount) { + numberString = "0" + numberString; + } + + String contractNumberResult = prefix + numberString; + d3.log.info("Generated contractNumber: ${contractNumberResult} setting docfield[${internalNumberField}]"); + doc.field[internalNumberField] = contractNumberResult; + doc.number = contractNumberResult; + } + + private int countExistingInternalContractNumber(D3Interface d3, String docTypeShort, String internalNumberValue, Integer internalNumberField ) { + int countedInternalNumbers = 0; + if ( internalNumberValue == null || internalNumberValue.trim().equals( "")){ + return countedInternalNumbers; + } + String query = "select count( doku_id) as countedIdenticalInternalNumbers from firmen_spezifisch where kue_dokuart = ? and (dok_dat_feld_${internalNumberField} = ?)"; + List params = [docTypeShort, internalNumberValue]; + GroovyRowResult resultRow = d3.sql.firstRow(query, params); + if(resultRow != null && resultRow.containsKey("countedIdenticalInternalNumbers" ) && resultRow.getProperty("countedIdenticalInternalNumbers") != null) { + countedInternalNumbers = resultRow.getProperty("countedIdenticalInternalNumbers"); + } + return countedInternalNumbers; + } + + private String getDocId( D3Interface d3, String internalContractNumber, String docTypeShort, Integer internalNumberField) { + String docId = ""; + String query = "SELECT doku_id FROM firmen_spezifisch WHERE dok_dat_feld_${internalNumberField} = ? AND kue_dokuart = ?"; + List params = [internalContractNumber, docTypeShort]; + List resultRowList = d3.sql.executeAndGet( query, params, 2); + if(resultRowList != null ) { + if (resultRowList.size() == 2) { + d3.log.error("More than one blanket agreement with the internal contract number ${internalContractNumber} was found."); + } else if ( resultRowList.size() == 1) { + docId = resultRowList[0].getProperty("doku_id"); + } + } + return docId; + } + + private Date getDate(D3Interface d3, String docId, String docTypeShort, Integer dateField) { + Date requestedDate = null; + String query = "select dok_dat_feld_${dateField} as returnedDate from firmen_spezifisch where kue_dokuart = ? and doku_id = ?"; + List params = [ docTypeShort, docId]; + GroovyRowResult resultRow = d3.sql.firstRow(query, params); + if(resultRow != null && resultRow.containsKey("returnedDate" ) && resultRow.getProperty("returnedDate") != null) { + requestedDate = resultRow.getProperty("returnedDate"); + } + return requestedDate; + } + + private GroovyObject preparePrefixGenerator(D3Interface d3) { + String currentPath = getClass().protectionDomain.codeSource.location.path; + d3.log.info("Looking for file to generate prefix here (encoded): ${currentPath}"); + URI uri = new URI(currentPath); + d3.log.info("Looking for file to generate prefix here (decoded): ${uri.getPath()}"); + File sourceFilePrefixGeneration = new File(new File( uri.getPath()).getParentFile(), "dbsCaseContractHooks_prefixGen.groovy"); + d3.log.info("Found file to generate prefix: ${sourceFilePrefixGeneration.getPath()}"); + Class prefixGenerationClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(sourceFilePrefixGeneration); + GroovyObject prefixGenerationObject = (GroovyObject) prefixGenerationClass.newInstance(); + return prefixGenerationObject; + } +} diff --git a/Optima/_Groovy/dbsCaseContractHooks_prefixGen.groovy b/Optima/_Groovy/dbsCaseContractHooks_prefixGen.groovy new file mode 100644 index 0000000..8e929f6 --- /dev/null +++ b/Optima/_Groovy/dbsCaseContractHooks_prefixGen.groovy @@ -0,0 +1,15 @@ +public class dbsCaseContractHooks_prefixGen { + + /* ######################################################################################## + * ################### The functions below may be edited by customers ##################### + * ######################################################################################## + */ + public String generateContractNumberPrefix(String configuredPrefix) { + int year = Calendar.getInstance().get( Calendar.YEAR); + if ( configuredPrefix == null || configuredPrefix == ""){ + return "${year}-"; + } else { + return "${configuredPrefix}-${year}-"; + } + } +} \ No newline at end of file diff --git a/Optima/_Groovy/dbsCase_contract_functions.ini b/Optima/_Groovy/dbsCase_contract_functions.ini new file mode 100644 index 0000000..a9b413a --- /dev/null +++ b/Optima/_Groovy/dbsCase_contract_functions.ini @@ -0,0 +1,34 @@ +# Version: 1.0.0.3 +# +# Beschreibung dieser Datei +# +# dbsCase_vertragsnummer - Datenbankposition der Vertragsnummer intern +# dbsCase_dokuart_vertrag_kue - Kürzel der Dokumentart der Verträge +# dbsCase_dokuart_vertrag_vunt_kue - Kürzel der Dokumentart der vertragsrelevanten Unterlagen +# +# Description of this file +# +# dbsCase_vertragsnummer - Database location of the Internal contract number +# dbsCase_dokuart_vertrag_kue - doc_type_short of doctype "Contracts" +# dbsCase_dokuart_vertrag_vunt_kue - doc_type_short of doctype "Contract related documents" +# + +[dbsContractFunctions] +dbsCase_vertragsnummer = 1 +dbsCase_vorgangsnummer = 1 +dbsCase_vertrag_dokdat_rahmen = 13 +dbsCase_contract_startDate_contract = 51 +dbsCase_contract_endDate_contract = 52 +dbsCase_caseOrContract_lastChangeAction = 47 +dbsCase_dokuart_rahmen_kue = RVERT +dbsCase_dokuart_vertrag_kue = EVERT +dbsCase_dokuart_vorgang_kue = CASE +dbsCase_dokuart_vorgang_dok_kue = DCASE +dbsCase_dokuart_vertrag_dok_kue = EVDOK +dbsCase_dokuart_vertrag_vunt_kue = EVUNT +dbsCase_prefix_id = DV +dbsCase_prefix_rahmen = RV +dbsCase_prefix_vorgang = +dbsCase_validateDate = 1 +dbsCase_presentation_server_base_url = https://sde01d3p01.optima-group.org:8444/case-mngmnt-core/ +