import com.dvelop.d3.server.Condition import com.dvelop.d3.server.Document import com.dvelop.d3.server.DocumentType import com.dvelop.d3.server.DocumentVersion import com.dvelop.d3.server.PhysicalVersion import com.dvelop.d3.server.Entrypoint import com.dvelop.d3.server.RepositoryField import com.dvelop.d3.server.User import com.dvelop.d3.server.UserGroup import com.dvelop.d3.server.UserOrUserGroup import com.dvelop.d3.server.Document.DocStatus import com.dvelop.d3.server.core.D3Interface import com.dvelop.d3.server.exceptions.D3Exception import groovy.sql.GroovyRowResult import groovy.sql.Sql public class Hooks { @Entrypoint( entrypoint = "hook_insert_entry_10" ) public int hookInsertEntry10(D3Interface d3, User user, DocumentType docType, Document doc) { d3.log.error("START | hookInsertEntry10 "); ////////////////////////////////////////////////// // Prüfung, ob Ablage erlaubt ist / Geräte-/Produktakte | calb d.velop 2025.12.17 START // Zu einer Position darf es nur eine Geräte oder Produktakte geben - nicht beide gleichzeitig. // Da die Dokumentarten nach Akte aufgeteilt sind, kann man also prüfen, ob bei einer Ablage eines Dokuments in die Produktakte bereits eine entsprechende Geräteakte existiert, und - falls ja - die Ablage ablehnen. (Umgekehrt natürlich genauso.) // Diese Logik wird benötigt, weil die Kollegen die Dokumentart während der Ablage ändern könnten. String dokumentarten_produktakte = "DBESC;DCSTR;DEAUS;DDBLT;DERST;DGSPZ;DHAND;DKAEL;DKONF;DSOND;DSTRO;DWINP;DWINS"; String dokumentarten_geraeteakte = "DCHEA;DCHEP;DCHLP;DCHEC;DDFAD;DLAUF;DPDK1;DPDK2;DPDK3;DPDW1;DPDW2;DPDW3;DPRSP;DPR01;DTYPD;DTYPS;DVSAK"; String such_aktenart = ""; String aktenname = ""; def do_it = false; String sqlStatement = ""; if ( dokumentarten_produktakte.contains( docType.id() ) ) { // Es handelt sich um eine Produktakten-Dokumentart, daher darf keine Geraeteakte existieren do_it = true; such_aktenart = "AGAKE"; aktenname = "Geraeteakte Kundeneinzel"; } if ( dokumentarten_geraeteakte.contains( docType.id() ) ) { // Es handelt sich um eine Geraeteakten-Dokumentart, daher darf keine Produktakte existieren do_it = true; such_aktenart = "APRKE"; aktenname = "Produktakte Kundeneinzel"; } if ( do_it ) { // DDF22: Vertriebsbelegposition DDF60: Auftrags-Nr. sqlStatement = "select doku_id from firmen_spezifisch where kue_dokuart = '" + such_aktenart + "' and dok_dat_feld_22 = '" + doc.field[ 22 ] + "' and doku_id in ( select doku_id from firm_spez_mult_val where value_char = '" + doc.field[ 60 ][ 1 ] + "' and field_no = 60 )"; def rows = d3.sql.executeAndGet( sqlStatement ); if ( rows.size() > 0 ) { // Es wurde ein Treffer gefunden => Fehler d3.hook.setProperty( "additional_info_text", "Da eine Akte vom Typ " + aktenname + " mit den Eigenschaften Auftrags-Nr. " + doc.field[ 60 ][ 1 ] + " / Vertriebsbelegposition " + doc.field[ 22 ] + " bereits existiert, ist eine Ablage dieses Dokuments in dieser Dokumentart nicht erlaubt." ); return -142; } } // Prüfung, ob Ablage erlaubt ist / Geräte-/Produktakte | calb d.velop 2025.12.17 ENDE ////////////////////////////////////////////////// ////////////////////////////////////////////////// // Prüfung ob Doppelablage bei Dokumentarten, bei denen das nicht vorgesehen ist / Geräte-/Produktakte | calb d.velop 2025.12.17 START // Bei den hier angegebenen Dokumentarten der Produkt-/Geräteakte sind nur eindeutige Dokumente erlaubt, d.h. pro Auftrags-Nr., Vertriebsbelegposition darf es nur ein Dokument pro Dokumentart geben String dokumentarten_produktakte_pruef = "DBESC;DCSTR;DEAUS;DDBLT;DERST;DGSPZ;DHAND;DKAEL;DKONF;DSTRO;DWINP;DWINS"; if ( dokumentarten_produktakte_pruef.contains( docType.id() ) ) { // DDF22: Vertriebsbelegposition DDF60: Auftrags-Nr. sqlStatement = "select doku_id from firmen_spezifisch where kue_dokuart = '" + docType.id() + "' and dok_dat_feld_22 = '" + doc.field[ 22 ] + "' and doku_id in ( select doku_id from firm_spez_mult_val where value_char = '" + doc.field[ 60 ][ 1 ] + "' and field_no = 60 )"; def rows = d3.sql.executeAndGet( sqlStatement ); if ( rows.size() > 0 ) { // Es wurde ein Treffer gefunden => Fehler d3.hook.setProperty( "additional_info_text", "Fuer die Auftrags-Nr. " + doc.field[ 60 ][ 1 ] + " / Vertriebsbelegposition " + doc.field[ 22 ] + " existiert bereits ein Dokument in dieser Dokumentart (Doku-ID " + rows[ 0 ].doku_id + " )." ); return -142; } } String dokumentarten_geraeteakte_pruef = "DCHEA;DCHEP;DCHLP;DCHEC;DDFAD;DLAUF;DPDK1;DPDK2;DPDK3;DPDW1;DPDW2;DPDW3;DPRSP;DPR01;DTYPD;DTYPS;DVSAK"; // Eindeutig: Auftrags-Nr., Vertriebsbelegposition, Materialnummer, Fertigungsauftragsnummer und wenn angegeben, Serialnummer, außerdem Dokumentart ist eindeutig if ( dokumentarten_geraeteakte_pruef.contains( docType.id() ) ) { def where = ""; def meld = ""; if ( doc.field[ 24 ] ) { where = " and dok_dat_feld_24 = '" + doc.field[ 24 ] + "'"; meld = " / Serialnummer " + doc.field[ 24 ] + " "; } // DDF22: Vertriebsbelegposition DDF60: Auftrags-Nr. DDF21: Materialnummer DDF26: Fertigungsauftragsnummer DDF24 Serialnummer sqlStatement = "select doku_id from firmen_spezifisch where kue_dokuart = '" + docType.id() + "' and dok_dat_feld_22 = '" + doc.field[ 22 ] + "' and dok_dat_feld_21 = '" + doc.field[ 21 ] + "' and dok_dat_feld_26 = '" + doc.field[ 26 ] + "' and doku_id in ( select doku_id from firm_spez_mult_val where value_char = '" + doc.field[ 60 ][ 1 ] + "' and field_no = 60 ) " + where; def rows = d3.sql.executeAndGet( sqlStatement ); if ( rows.size() > 0 ) { // Es wurde ein Treffer gefunden => Fehler d3.hook.setProperty( "additional_info_text", "Fuer die Auftrags-Nr. " + doc.field[ 60 ][ 1 ] + " / Vertriebsbelegposition " + doc.field[ 22 ] + " / Materialnummer " + doc.field[ 21 ] + " / Materialnummer " + doc.field[ 26 ] + meld + " existiert bereits ein Dokument in dieser Dokumentart (Doku-ID " + rows[ 0 ].doku_id + " )." ); return -142; } } // Prüfung ob Doppelablage bei Dokumentarten, bei denen das nicht vorgesehen ist / Geräte-/Produktakte | calb d.velop 2025.12.17 ENDE ////////////////////////////////////////////////// d3.log.error("ENDE | hookInsertEntry10 "); return 0; } }