Files
d.velop/Stadt Essen/proz01_prozessakte.groovy

603 lines
19 KiB
Groovy

// (1) Global d.3 libraries
import com.dvelop.d3.server.core.D3Interface
import com.dvelop.d3.server.Document
import com.dvelop.d3.server.User
import com.dvelop.d3.server.Condition
import com.dvelop.d3.server.DocumentType
import groovy.sql.GroovyRowResult
import com.dvelop.d3.server.ValueSet
import com.dvelop.d3.server.RepositoryField
import java.sql.Timestamp
import java.util.Calendar
import java.text.SimpleDateFormat
// Libraries to handle the different hook types
import com.dvelop.d3.server.Entrypoint
public class proz01_prozessakte {
boolean logging = true;
private static int POS_AZ = 1;
private static int POS_Jahr = 2;
private static int POS_StatZ = 3;
private static int POS_GerichtAZ = 4;
private static int POS_Klaeger = 9;
private static int POS_Zda = 13;
private static int POS_Beklaeger = 15;
private static int POS_AusArt = 23;
private static int POS_DokGrp = 30;
private static int POS_DokTyp = 31;
private static int POS_AusDat = 51;
private static int POS_ZLM = 35;
private static int POS_LOESCHGRD = 36;
private static int POS_GADRESSE = 33;
private static int POS_Gericht = 20;
private static int POS_DOKIDORG = 10;
private static int POS_DOKDAT = 55;
// Feldpostitionen Adressverwaltung
private static int POS_FFOE = 2;
private static int POS_Name = 9;
private static int POS_Strasse = 21;
private static int POS_Hnr = 29;
private static int POS_Plz = 24;
private static int POS_Ort = 25;
private static String WM_TRENNZEICHEN = ";";
// Variablen - Aufbewahrungsfristen (in Jahren)
private static int FRIST_AUSSONDERUNG = 10; // 10 Jahre
private static int STATUS_ZDA = 0;
private static int NEUES_AZ = 0;
private static int CHANGE_GERICHT = 0;
// Datenbanktabelle
private static String TB_DokGrpTyp = "DV_PROZ_Doktyp";
private static String G01_DS_PROZESSA = "APROZ";
private static String G01_DS_PROZESSD = "DPROZ";
private static String G01_DS_ORGANI = "DPROZ";
// Offenbar eigentlich zentral abzulegen
private static String G01_STR_JA = "Ja";
private static String G01_STR_NEIN = "Nein";
@Entrypoint( entrypoint = "hook_insert_entry_10" )
public int hook_insert_entry_10(D3Interface d3, User user, DocumentType docType, Document doc)
{
!logging ?: d3.log.info(" hook_insert_entry_10: Anfang")
proz01_split_AZ( 1, doc, d3 );
proz01_split_Gericht( doc, d3 );
!logging ?: d3.log.info(" hook_insert_entry_10: Ende")
return 0;
}
@Entrypoint( entrypoint = "hook_insert_exit_10" )
public int hookInsertExit10 (D3Interface d3, Document doc, String fileDestination, Integer importOk, User user, DocumentType docType)
{
!logging ?: d3.log.info("START | hookInsertExit10 ");
if ( docType == G01_DS_PROZESSA )
{
proz01_fill_AZ_Nummer( 0, doc, d3 );
}
!logging ?: d3.log.info("ENDE | hookInsertExit10 ");
return 0;
}
@Entrypoint( entrypoint = "hook_upd_attrib_entry_20" )
public int hookUpdAttribEntry20(D3Interface d3, Document doc, User user, DocumentType docType, DocumentType docTypeNew)
{
d3.log.info("START | hookUpdAttribEntry20")
// temporäres Objekt holen, um zu prüfen, das sich Eigenschaften geändert haben
def oldDocAttributes = d3.archive.getDocument(doc.id());
//d3.log.error( "1 Dokumentart: " + docType.id() );
//d3.log.error( "1 Gericht (" + POS_Gericht + "): " + doc.field[ POS_Gericht ] + " ll " + oldDocAttributes.field[ POS_Gericht ] );
//d3.log.error( "1 Adresse (" + POS_GADRESSE + "): " + doc.field[ POS_GADRESSE ] + " ll " + oldDocAttributes.field[ POS_GADRESSE ] );
if ( docType.id() == G01_DS_ORGANI )
{
if ( doc.field[ POS_Name ] != oldDocAttributes.field[ POS_Name ] )
{
CHANGE_GERICHT = 1;
}
if ( doc.field[ POS_Strasse ] != oldDocAttributes.field[ POS_Strasse ] )
{
CHANGE_GERICHT = 1;
}
if ( doc.field[ POS_Hnr ] != oldDocAttributes.field[ POS_Hnr ] )
{
CHANGE_GERICHT = 1;
}
if ( doc.field[ POS_Plz ] != oldDocAttributes.field[ POS_Plz ] )
{
CHANGE_GERICHT = 1;
}
if ( doc.field[ POS_Ort ] != oldDocAttributes.field[ POS_Ort ] )
{
CHANGE_GERICHT = 1;
}
d3.log.error( "hookUpdAttribEntry20 " + CHANGE_GERICHT );
}
else
{
proz01_split_AZ( 1, doc, d3 );
proz01_split_Gericht( doc, d3 );
if ( doc.field[ POS_Zda ] != oldDocAttributes.field[ POS_Zda ] )
{
STATUS_ZDA = 1;
}
// Wenn das Feld zum Löschen markiert auf Ja gesetzt wurde, überprüfe ob beim Löschgrund etwas eingetragen wurde. Falls nicht, gebe eine Fehlermeldung aus.
// Wenn das Feld zum Löschen markiert auf Nein gesetzt wurde, dann leere das Feld Löschgrund
if ( doc.field[ POS_ZLM ] != oldDocAttributes.field[ POS_ZLM ] )
{
if ( doc.field[ POS_ZLM ] == G01_STR_JA )
{
if ( doc.field[ POS_LOESCHGRD ] == "" )
{
return -403;
}
}
else if ( doc.field[ POS_ZLM ] == G01_STR_NEIN )
{
doc.field[ POS_LOESCHGRD ] = "";
}
}
}
if ( ( docType.id() == G01_DS_PROZESSA ) && ( doc.field[ POS_Jahr ] != oldDocAttributes.field[ POS_Jahr ] ) )
{
NEUES_AZ = 1;
}
d3.log.error( "2 Dokumentart: " + docType.id() );
d3.log.error( "2 Gericht (" + POS_Gericht + "): " + doc.field[ POS_Gericht ] + " ll " + oldDocAttributes.field[ POS_Gericht ] );
d3.log.error( "2 Adresse (" + POS_GADRESSE + "): " + doc.field[ POS_GADRESSE ] + " ll " + oldDocAttributes.field[ POS_GADRESSE ] );
if ( ( docType.id() == G01_DS_PROZESSA ) && ( ( doc.field[ POS_Gericht ] != oldDocAttributes.field[ POS_Gericht ] ) || ( doc.field[ POS_GADRESSE ] != oldDocAttributes.field[ POS_GADRESSE ] ) ) )
{
def sqlQuery = "SELECT dok_dat_feld_" + POS_Name + " POS_Name, dok_dat_feld_" + POS_Strasse + " POS_Strasse, dok_dat_feld_" + POS_Hnr + " POS_Hnr, dok_dat_feld_" + POS_Plz + " POS_Plz, dok_dat_feld_" + POS_Ort + " POS_Ort FROM firmen_spezifisch WHERE kue_dokuart = 'AAORG' AND dok_dat_feld_" + POS_Name + " = '" + doc.field[POS_Gericht] + "'";
def ergebnis = d3.sql.executeAndGet( sqlQuery );
//d3.log.error( "Name: " + ergebnis[ 0 ].POS_Name );
//d3.log.error( "POS_Strasse: " + ergebnis[ 0 ].POS_Strasse );
//d3.log.error( "POS_Hnr: " + ergebnis[ 0 ].POS_Hnr );
//d3.log.error( "POS_Plz: " + ergebnis[ 0 ].POS_Plz );
//d3.log.error( "POS_Ort: " + ergebnis[ 0 ].POS_Ort );
if ( ( ergebnis[ 0 ].POS_Name == "" ) || ( ergebnis[ 0 ].POS_Strasse == "" ) || ( ergebnis[ 0 ].POS_Hnr == "" ) || ( ergebnis[ 0 ].POS_Plz == "" ) || ( ergebnis[ 0 ].POS_Ort == "" ) )
{
//Gerichtsdaten nicht gepflegt! Bitte in der Organisation pflegen.
return -569;
}
def Gerichtsadresse = ergebnis[ 0 ].POS_Strasse + " " + ergebnis[ 0 ].POS_Hnr + ", " + ergebnis[ 0 ].POS_Plz + " " + ergebnis[ 0 ].POS_Ort;
if ( Gerichtsadresse != doc.field[ POS_GADRESSE ] )
{
//Gerichtsadresse entspricht nicht dem aktuell ausgewählten Gericht!
return -570;
}
}
d3.log.info("ENDE | hookUpdAttribEntry20")
return 0;
}
@Entrypoint( entrypoint = "hook_upd_attrib_exit_20" )
public int hookUpdAttribExit20(D3Interface d3, Document doc, Integer errorCode, User user, DocumentType docType, DocumentType docTypeOld)
{
d3.log.info("START | hookUpdAttribExit20 ")
def strZDA, strDatum;
if ( ( NEUES_AZ == 1 ) && ( docType != G01_DS_ORGANI ) )
{
NEUES_AZ = 0;
proz01_fill_AZ_Nummer( doc, d3, 1 );
}
if ( ( STATUS_ZDA == 1 ) && ( docType != G01_DS_ORGANI ) )
{
STATUS_ZDA = 0;
if ( doc.field[ POS_Zda ] == G01_STR_JA )
{
strZDA = G01_STR_JA;
strDatum = proz01_getAussonderungsdatum( FRIST_AUSSONDERUNG );
}
else
{
if ( doc.field[ POS_Zda ] == G01_STR_NEIN )
{
strZDA = G01_STR_NEIN;
strDatum = "";
}
}
// hier wird das docSearchCreate übernommen; dafür gibt es aber aktuell keine Entsprechung in Groovy.
// das wird in Groovy direkt umgesetzt; d.h. man macht das manuell, was der JPL-Massenänderungs-Code en gros macht:
def massen_sql = "select doku_id from firmen_spezifisch where ( kue_dokuart = '" + G01_DS_PROZESSA + "' or kue_dokuart = '" + G01_DS_PROZESSD + "' ) and dok_dat_feld_" + POS_AZ + " = '" + doc.field(POS_AZ) + "'";
def massen_ergebnis = d3.sql.executeAndGet( massen_sql );
if ( massen_ergebnis.size() > 0 )
{
int i;
for ( i = 0 ; i < massen_ergebnis.size(); i++ )
{
def updateDoc = d3.archive.getDocument( massen_ergebnis[ i ].doku_id );
updateDoc.field[ POS_Zda ] = strZDA;
updateDoc.field[ POS_AusDat ] = strDatum;
updateDoc.field[ POS_AusArt ] = doc.field[ POS_AusArt ];
updateDoc.updateAttributes( "Master" );
}
}
if ( CHANGE_GERICHT == 1 && docType == G01_DS_ORGANI )
{
CHANGE_GERICHT = 0;
def m_sql2 = "SELECT dok_dat_feld_" + POS_Name + " name, dok_dat_feld_" + POS_Strasse + " strasse, dok_dat_feld_" + POS_Hnr + " hnr, dok_dat_feld_" + POS_Plz + " plz, dok_dat_feld_" + POS_Ort + " ort FROM firmen_spezifisch WHERE kue_dokuart = 'AAORG' AND doku_id = '" + doc.id + "'";
def me2 = d3.sql.executeAndGet( m_sql2 );
if ( me2.size() == 1 )
{
def strGAdresse = me2[ 0 ].strasse + " " + me2[ 0 ].hnr + " " + me2[ 0 ].plz + " " + me2[ 0 ].ort;
m_sql3 = "select doku_id from firmen_spezifisch where kue_dokuart = '" + G01_DS_PROZESSA + "' and dok_dat_feld_" + POS_DOKIDORG + " = '" + doc.id + "'";
def me3 = d3.sql.executeAndGet( m_sql1 );
if ( me3.size() > 0 )
{
def ud2 = d3.archive.getDocument( me3[ i ].doku_id );
ud2.field[ POS_GADRESSE ] = strGAdresse;
ud2.field[ POS_Gericht ] = me2[ 0 ].name;
ud2.updateAttributes( "Master" );
}
}
}
}
d3.log.info("ENDE | hookUpdAttribExit20 ")
return 0;
}
@Entrypoint( entrypoint = "hook_validate_update_entry_10" )
public int hookValidateUpdateEntry10(D3Interface d3, User user, DocumentType docType, Document doc, String nextcall) {
d3.log.error("START | hookValidateUpdateEntry10 ");
proz01_split_AZ( 1, doc, d3 );
proz01_split_Gericht( doc, d3 );
d3.log.error("ENDE | hookValidateUpdateEntry10 ");
return 0;
}
@Entrypoint( entrypoint = "hook_search_entry_10" )
public int hookSearchEntry10(D3Interface d3, User user, DocumentType docType, Document searchContext) {
d3.log.error("START | hookSearchEntry10 ");
proz01_split_AZ( 0, searchContext, d3 );
proz01_split_Gericht( searchContext, d3 );
d3.log.error("ENDE | hookSearchEntry10 ");
return 0;
}
///////////////////////////////////////
// Wertemengenhooks
///////////////////////////////////////
@ValueSet( entrypoint = "proz01_fill_Klaeger" )
def proz01_fill_Klaeger( D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def where = "";
if ( doc.field[ POS_Klaeger ] != null )
{
if ( doc.field[ POS_Klaeger ].length() >= 3 )
{
where = " AND (dok_dat_feld_" + POS_AZ + " LIKE '%" + doc.field[ POS_Klaeger ] + "%' OR dok_dat_feld_" + POS_Klaeger + " LIKE '%" + doc.field[ POS_Klaeger ] + "%')";
}
}
def sqlStatement = "SELECT DISTINCT top 1000 dok_dat_feld_" + POS_AZ + " feld_1, dok_dat_feld_" + POS_Klaeger + " feld_2, dok_dat_feld_" + POS_GerichtAZ + " feld_3 FROM firmen_spezifisch WHERE kue_dokuart = '" + G01_DS_PROZESSA + "' " + where;
def resultRows = d3.sql.executeAndGet( (String) sqlStatement );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.feld_1 + ";" + it.feld_2 + ";" + it.feld_3 } );
}
}
@ValueSet( entrypoint = "proz01_fill_Beklagter" )
def proz01_fill_Beklagter( D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def where = "";
if ( doc.field[ POS_Beklaeger ] != null )
{
if ( doc.field[ POS_Beklaeger ].length() >= 3 )
{
where = " AND (dok_dat_feld_" + POS_Beklaeger + " LIKE '%" + doc.field[ POS_Beklaeger ] + "%' )";
}
}
def sqlStatement = "SELECT DISTINCT top 1000 dok_dat_feld_" + POS_Beklaeger + " feld_1 FROM firmen_spezifisch WHERE kue_dokuart = '" + G01_DS_PROZESSA + "'" + where;
def resultRows = d3.sql.executeAndGet( (String) sqlStatement );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.feld_1 } );
}
}
@ValueSet( entrypoint = "proz01_WM_DOKGRP" )
def proz01_WM_DOKGRP( D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def where = "";
if ( ( doc.field[ POS_DokTyp ] != "" ) && ( doc.field[ POS_DokTyp ] != null ) && ( doc.field[ POS_DokTyp ] != "null" ) )
{
where = " where Dokumenttyp = '" + doc.field[ POS_DokTyp ] + "'";
}
def sqlStatement = "select distinct Dokumentgruppe from " + TB_DokGrpTyp;
def resultRows = d3.sql.executeAndGet( (String) sqlStatement );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.Dokumentgruppe } );
}
}
@ValueSet( entrypoint = "proz01_WM_DOKTYP" )
def proz01_WM_DOKTYP( D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def where = "";
if ( ( doc.field[ POS_DokGrp ] != "" ) && ( doc.field[ POS_DokGrp ] != null ) && ( doc.field[ POS_DokGrp ] != "null" ) )
{
where = " where Dokumentgruppe = '" + doc.field[ POS_DokGrp ] + "'";
}
def sqlStatement = "select distinct Dokumenttyp from " + TB_DokGrpTyp + where;
def resultRows = d3.sql.executeAndGet( (String) sqlStatement );
d3.log.error( sqlStatement );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.Dokumenttyp } );
}
}
@ValueSet( entrypoint = "proz01_getGericht" )
def proz01_getGericht( D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def where = "";
if ( doc.field[ POS_Gericht ] != null )
{
if ( doc.field[ POS_Gericht ].length() >= 3 )
{
where = " AND dok_dat_feld_" + POS_Name + " LIKE '%:" + doc.field[ POS_Gericht ] + "%' ";
}
}
def sqlQuery = "SELECT fs.dok_dat_feld_" + POS_Name + " feld_1, fs.dok_dat_feld_" + POS_Strasse + " feld_2, fs.dok_dat_feld_" + POS_Hnr + " feld_3, fs.dok_dat_feld_" + POS_Plz + " feld_4, fs.dok_dat_feld_" + POS_Ort + " feld_5, fs.doku_id \
FROM firmen_spezifisch fs \
LEFT JOIN benutzergruppen gruppe \
ON gruppe.benutzergruppe = fs.dok_dat_feld_" + POS_FFOE + " \
Left JOIN benutzer_in_gruppe bInGrp \
ON gruppe.gruppen_id = bInGrp.benutzergruppe \
WHERE fs.kue_dokuart = 'AAORG' AND (bInGrp.benutzername = '" + user + "' OR fs.dok_dat_feld_" + POS_FFOE + " IS NULL) " + where;
def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.feld_1 + "|" + it.feld_2 + "|" + it.feld_3 + "|" + it.feld_4 + "|" + it.feld_5 + "|" + it.doku_id } );
}
}
///////////////////////////////////////
// Arbeitsfunktionen
///////////////////////////////////////
//////////////////// proz01_split_AZ /////////////////////////////////////////////////
// Funktion zum Aufteilen des Feldes Aktenzeichen nach AZ;Klaeger;Gerichtszeichen
// und fuellen in die jeweiligen Felder
//////////////////////////////////////////////////////////////////////////////////
public void proz01_split_AZ( int NotSearch, Document doc, D3Interface d3 )
{
def strKlaeger = doc.field[ POS_Klaeger ].toString();
if ( strKlaeger != null )
{
def erg = strKlaeger.tokenize( WM_TRENNZEICHEN );
if ( erg.size() > 2 )
{
doc.field[ POS_Klaeger ] = "";
doc.field[ POS_AZ ] = erg[ 0 ];
if ( NotSearch == 1 )
{
doc.field[ POS_Klaeger ] = erg[ 1 ];
doc.field[ POS_GerichtAZ ] = erg[ 2 ];
}
}
}
}
/////////////////////////// proz01_fill_AZ_Nummer //////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
public void proz01_fill_AZ_Nummer( Document doc, D3Interface d3, int update )
{
def treffer;
def strNummer;
if ( update == 0 )
{
def sqlQuery = "SELECT TOP (1) right(dok_dat_feld_" + POS_AZ + ", 4) + 1 nummero_uno from firmen_spezifisch WHERE kue_dokuart = '" + G01_DS_PROZESSA + "' ORDER BY right(dok_dat_feld_" + POS_AZ +" ,4) DESC ";
treffer = d3.sql.executeAndGet( (String) sqlQuery );
strNummer = doc.field[ POS_Jahr ] + "-" + (String) treffer[ 0 ].nummero_uno.padLeft( 4, '0' );
}
else
{
if ( update == 1 )
{
if ( doc.field[ POS_AZ ] != null )
{
def docfield_pos_az = doc.field[ POS_AZ ].toString();
def tok = docfield_pos_az.tokenize( "-" );
if ( tok.size() > 1 )
{
strNummer = doc.field[ POS_Jahr ] + "-" + tok.get(2);
}
}
}
}
def currentDoc = d3.archive.getDocument( doc.id );
currentDoc.field[ POS_AZ ] = strNummer;
currentDoc.updateAttributes( "Master" );
// Update-Call returniert nichts definitiv Verwertbares, daher wird keine Logmeldung ausgegeben (anders als im JPL-Code).
}
//////////////////// l01_split_Gericht /////////////////////////////////////////////////
// Funktion zum Aufteilen des Felds Aktenzeichen nach AZ;Klaeger;Gerichtszeichen
// und fuellen in die jeweiligen Felder
//////////////////////////////////////////////////////////////////////////////////
public void proz01_split_Gericht( Document doc, D3Interface d3 )
{
def strGericht = doc.field[ POS_Gericht ].toString();
if ( strGericht != null )
{
def erg = strGericht.tokenize( "|" );
if ( erg.size() > 1 )
{
doc.field[ POS_Gericht ] = erg[ 0 ];
doc.field[ POS_GADRESSE ] = erg[ 1 ] + " " + erg[ 2 ] + ", " + erg[ 3 ] + " " + erg[ 4 ];
doc.field[ POS_DOKIDORG ] = erg[ 5 ];
}
}
}
//////////////////// proz01_getAussonderungsdatum /////////////////////////////////////////////////
// Liefert das Aussonderungsdatum anhand einer Frist
// Parameter: iFrist - Aufbewahrungsfrist
//////////////////////////////////////////////////////////////////////////////////
public String proz01_getAussonderungsdatum( String iFrist )
{
def ergebnis = "";
Date date = new Date();
int dateYear = date.format( "yyyy" );
ergebnis = dateYear + iFrist;
return "31.12." + ergebnis;
}
}