Files
d.velop/Stadt Essen/sg02_Sozialakte.groovy

622 lines
20 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 sg02_sozialakte {
// Dokumentarten
private static String SG02_DS_SOZ_AKTE = "ASOZ";
private static String SG02_DS_SOZ_DOKU = "DSOZ";
private static String G01_DS_POSTEINGANG = "";
// DB-Positionen
private static int POS_SACHGEBIET = 1 // Sachgebiet
private static int POS_AZ = 2 // Aktenzeichen
private static int POS_NACHNAME = 3 // Nachname (HV)
private static int POS_VORNAME = 4 // Vorname (HV)
private static int POS_STRASSE = 9 // Straße
private static int POS_PLZ = 10 // PLZ
private static int POS_ZDA = 13 // zdA-verfügt
private static int POS_DOKTYP = 14 // Dokumenttyp
private static int POS_DOKGRP = 15 // Dokumentgruppe
private static int POS_HNR = 16 // Hausnummer
private static int POS_ORT = 17 // Ort
private static int POS_AUSART = 23 // Aussonderungsart
private static int POS_STORNO = 27 // in LISSA storbniert
private static int POS_WIDERSPRUCH = 30 // Interne 50-1-4 Widerspruchsnummer
private static int POS_AZ_RECHT = 31 // Aktenzeichen Rechtsanwälte
private static int POS_LOESCH_FLAG = 33 // zum Löschen markiert
private static int POS_GEBURTSDATUM = 50 // Geburtsdatum (HV)
private static int POS_AUSSONDDAT = 51 // Aussonderungsdatum
private static int POS_LOESCHGRD = 35 // Löschgrund
private static int POS_ZLM = 33 // Zum Löschen Markiert
// DB Tabellen
private static String TB_LISSA_DOKTYP = "CS_LISSA_DOKTYP"
// kundenspezifische Werte
private static int FRIST_AUSSONDERUNG = 84
// statische Werte (nicht ändern)
private static int STATUS_SACHGEBIET = 0
private static int STATUS_ZDA = 0
private static int SG01_SCHALTER_POST = 0 //Diesen schalter auf 1 setzen, wenn die Posteingangsbearbeitung in Verbindung mit Sozialdokumenten genutzt wird.
private static String STR_JA = "Ja"
private static String STR_NEIN = "Nein"
private static int laengeAZ = 8 // Länge des Aktenzeichens
private static String G01_STR_NEIN = "Nein"
private static String G01_STR_JA = "Ja"
@Entrypoint( entrypoint = "hook_insert_entry_10" )
public int hook_insert_entry_10(D3Interface d3, User user, DocumentType docType, Document doc)
{
d3.log.error("START | hook_insert_entry_10 " + doc.id() );
sg02_split_AZ( d3, doc, 0 );
def iRet = sg02_fuelleFelder( d3, doc, docType.id );
d3.log.error("ENDE | hook_insert_entry_10 " + doc.id() );
return iRet;
}
@Entrypoint( entrypoint = "hook_new_version_entry_10" )
public int hookNewVersionEntry10(D3Interface d3, Document doc, String fileSource, String fileDestination, User user, DocumentType docType)
{
d3.log.error("START | hookNewVersionEntry10 " + doc.id() );
sg02_split_AZ( d3, doc, 0 );
def iRet = sg02_fuelleFelder( d3, doc, docType.id );
d3.log.error("ENDE | hookNewVersionEntry10 " + doc.id() );
return iRet;
}
@Entrypoint( entrypoint = "hook_upd_attrib_entry_20" )
public int hookUpdAttribEntry20(D3Interface d3, Document doc, User user, DocumentType docType, DocumentType docTypeNew)
{
d3.log.error("START | hookUpdAttribEntry20" + doc.id() );
def rc = 0;
// temporäres Objekt holen, um zu prüfen, das sich Eigenschaften geändert haben
oldDocAttributes = d3.archive.getDocument(doc.id());
sg02_split_AZ( d3, doc, 0);
if ( docType.id == SG02_DS_SOZ_AKTE )
{
STATUS_SACHGEBIET = 1;
}
if ( oldDocAttributes.field[ POS_ZDA ] == doc.field[ POS_ZDA ] )
{
def massen_sql = "select f.doku_id from firmen_spezifisch f, phys_datei p where f.kue_dokuart = 'SG02_DS_SOZ_DOKU' and f.dok_dat_feld_" + POS_AZ + " = '" + doc.field[ POS_AZ ] + "' and p.logi_verzeichnis = 'Be' and f.doku_id = p.doku_id";
def massen_ergebnis = d3.sql.executeAndGet( massen_sql );
if ( massen_ergebnis.size() > 0 )
{
d3.log.error( "[sg02_upd_attrib_entry_20] Sozialakte (" + doc.field[POS_AZ] + ") kann nicht zdA-verfügt werden da noch Dokumente in Bearbeitung sind." );
rc = -350;
}
if ( rc == 0 )
{
STATUS_ZDA = 1;
}
}
if ( docType.id == SG02_DS_SOZ_DOKU )
{
if ( doc.field[ POS_ZLM ] == STR_JA )
{
if ( doc.field[ POS_LOESCHGRD ] == "" )
{
return -403;
}
}
else if ( doc.field[ POS_ZLM ] == STR_NEIN )
{
doc.field[ POS_LOESCHGRD ] = "";
}
if ( oldDocAttributes.field[ POS_STORNO ] == doc.field[ POS_STORNO ] )
{
if ( doc.field[ POS_STORNO ] == G01_STR_JA )
{
doc.field[ POS_LOESCH_FLAG ] = G01_STR_JA;
doc.field[ POS_LOESCHGRD ] = "In LISSA storniert.";
}
}
}
if ( rc == 0 && docType.id == G01_DS_POSTEINGANG )
{
sg02_clear_vorname( d3, doc, docType.id );
}
d3.log.error("ENDE | hookUpdAttribEntry20" + doc.id() );
return rc;
}
@Entrypoint( entrypoint = "hook_upd_attrib_exit_20" )
public int hookUpdAttribExit20(D3Interface d3, Document doc, Integer errorCode, User user, DocumentType docType, DocumentType docTypeOld)
{
d3.log.error("START | hookUpdAttribExit20 " + doc.id() );
if ( errorCode == 0 )
{
if ( STATUS_SACHGEBIET == 1 )
{
STATUS_SACHGEBIET = 0;
// 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 = '" + SG02_DS_SOZ_DOKU + "' 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_SACHGEBIET ] = doc.field[ POS_SACHGEBIET ];
updateDoc.updateAttributes( "Master" );
}
}
}
if ( STATUS_ZDA == 1 )
{
STATUS_ZDA = 0;
def strZDA, strDatum, strArt;
if ( doc.field[ POS_ZDA ] == G01_STR_JA )
{
strZDA = G01_STR_JA;
strDatum = sg02_getDate( FRIST_AUSSONDERUNG, 1 );
}
else if ( doc.field[POS_ZDA] == G01_STR_NEIN )
{
strZDA = G01_STR_NEIN;
strDatum = "";
}
strArt = doc.field[ POS_AUSART ]
if ( strArt == "" )
{
strArt = "B";
}
// 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 = '" + SG02_DS_SOZ_AKTE + "' or kue_dokuart = '" + SG02_DS_SOZ_DOKU + "' )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_AUSSONDDAT ] = strDatum;
updateDoc.field[ POS_AZ ] = strArt;
// man könnte updateAttributes auch mit dem zweiten Parameter "true" aufrufen, das sollte dann das Ausführen von Hooks
// für das Update unterbinden. Beim JPL-Masterdata-update läuft das vermutlich nämlich genau so. Machen wir hier aber erstmal nicht.
updateDoc.updateAttributes( "Master" );
}
}
}
}
d3.log.error("ENDE | hookUpdAttribExit20 " + doc.id() );
return 0;
}
@Entrypoint( entrypoint = "hook_search_entry_10" )
public int hookSearchEntry10(D3Interface d3, User user, DocumentType docType, Document searchContext)
{
d3.log.error("START | hookSearchEntry10 " );
sg02_split_AZ( d3, doc, 1 );
if ( isNumeric( doc.field[ POS_AZ ] ) )
{
if ( doc.field[ POS_AZ ].length() > 0 && doc.field[ POS_AZ ].length() < laengeAZ )
{
doc.field[ POS_AZ ] = sg02_FillLeadingChar( doc.field[ POS_AZ ] );
}
}
d3.log.error("ENDE | hookSearchEntry10 " );
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 " + doc.id() );
sg02_split_AZ( d3, doc, 0 );
if ( doc.field[ POS_AZ ].length() < laengeAZ )
{
doc.field[ POS_AZ ] = sg02_FillLeadingChar( doc.field[ POS_AZ ] );
}
def rc = sg02_fuelleFelder( d3, doc, docType.id );
d3.log.error("ENDE | hookValidateUpdateEntry10 " + doc.id() );
return rc;
}
// ---------------------------------- Wertemengen ----------------------------------
//////////////////////////////// sg02_SOZ_WM_Aktenzeichen ////////////////////////////
// -> Funktion füllt das Feld Aktenzeichen mit Wertemenge
// aus der d.3 Datenbank
//////////////////////////////////////////////////////////////////////////////////////
@ValueSet( entrypoint = "sg02_SOZ_WM_Aktenzeichen" )
def sg02_SOZ_WM_Aktenzeichen(D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
if ( doc.field[ POS_AZ ] != null )
{
if ( doc.field[ POS_AZ ].length() > 2 )
{
def sqlQuery = "select dok_dat_feld_" + POS_AZ + " POS_AZ, dok_dat_feld_" + POS_NACHNAME + " POS_NACHNAME, dok_dat_feld_" + POS_VORNAME + " POS_VORNAME, dok_dat_feld_" + POS_SACHGEBIET + " POS_SACHGEBIET, CONVERT(varchar, dok_dat_feld_" + POS_GEBURTSDATUM + ", 104) POS_GEBURTSDATUM from firmen_spezifisch where kue_dokuart = '" + SG02_DS_SOZ_AKTE + "' and ( dok_dat_feld_" + POS_AZ + " like '%" + doc.field[ POS_AZ ] + "%' or dok_dat_feld_" + POS_NACHNAME + " like '%" + doc.field[ POS_AZ ] + "%' or dok_dat_feld_" + POS_VORNAME + " like '%" + doc.field[ POS_AZ ] + "%' or dok_dat_feld_" + POS_SACHGEBIET + " like '%" + doc.field[ POS_AZ ] + "%' or CONVERT(varchar, dok_dat_feld_" + POS_GEBURTSDATUM + ", 104) like '%" + doc.field[ POS_AZ ] + "%' ) ";
def resultRows = d3.sql.executeAndGet( sqlQuery );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.POS_AZ + "~" + it.POS_NACHNAME + "~" + it.POS_VORNAME + "~" + it.POS_GEBURTSDATUM + "~" + it.POS_SACHGEBIET } );
}
}
}
}
//////////////////////////////// sg02_SOZ_WM_Dokumentgruppe //////////////////////////
//
// füllt das Feld Dokumenttruppe anhand des Feldes Kategorie
//////////////////////////////////////////////////////////////////////////////////////
@ValueSet( entrypoint = "sg02_SOZ_WM_Dokumentgruppe" )
def sg02_SOZ_WM_Dokumentgruppe(D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def resultRows = d3.sql.executeAndGet( "select distinct Dokumentgruppe from " + TB_LISSA_DOKTYP );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.Dokumentgruppe } );
}
}
//////////////////////////////// sg02_SOZ_WM_Dokumenttyp /////////////////////////////
//
// füllt das Feld Dokumenttyp anhand des Feldes Dokumentgruppe
//////////////////////////////////////////////////////////////////////////////////////
@ValueSet( entrypoint = "sg02_SOZ_WM_Dokumenttyp" )
def sg02_SOZ_WM_Dokumenttyp(D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
def sqlQuery = "";
if ( doc.field[ POS_AZ ] != null && ! doc.field[ POS_AZ ].isEmpty() )
{
sqlQuery = "select distinct Dokumenttyp from " + TB_LISSA_DOKTYP + " where Dokumentgruppe = '" + doc.field[ POS_DOKGRP ] + "' ";
}
else
{
sqlQuery = "select distinct Dokumenttyp from " + TB_LISSA_DOKTYP;
}
def resultRows = d3.sql.executeAndGet( sqlQuery );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.Dokumenttyp } );
}
}
//////////////////////////////// sg02_SOZ_WM_WiderspruchNr /////////////////////////////
//
// füllt das Feld Widerspruchsnummern anhand des Feldes Aktenzeichen
//////////////////////////////////////////////////////////////////////////////////////
@ValueSet( entrypoint = "sg02_SOZ_WM_WiderspruchNr" )
def sg02_SOZ_WM_WiderspruchNr(D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
sg02_split_AZ( d3, doc, 1 );
def sqlQuery = "";
if ( doc.field[ POS_AZ ] != "" )
{
sqlQuery = "select distinct dok_dat_feld_" + POS_WIDERSPRUCH + " POS_WIDERSPRUCH from firmen_spezifisch where dok_dat_feld_" + POS_AZ + " = '" + doc.field[ POS_AZ ] + "' ";
}
else
{
sqlQuery = "select distinct dok_dat_feld_" + POS_WIDERSPRUCH + " POS_WIDERSPRUCH from firmen_spezifisch";
}
def resultRows = d3.sql.executeAndGet( sqlQuery );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.POS_WIDERSPRUCH } );
}
}
//////////////////////////////// sg02_SOZ_WM_AZ_Rechtsanwalt /////////////////////////////
//
// füllt das Feld Aktenzeichen Rechtsanwälte anhand des Feldes Aktenzeichen
//////////////////////////////////////////////////////////////////////////////////////
@ValueSet( entrypoint = "sg02_SOZ_WM_AZ_Rechtsanwalt" )
def sg02_SOZ_WM_AZ_Rechtsanwalt(D3Interface d3, RepositoryField reposField, User user, DocumentType docType, int rowNo, int validate, Document doc )
{
sg02_split_AZ( d3, doc, 1 );
def sqlQuery = "";
if ( doc.field[ POS_AZ ] != "" )
{
sqlQuery = "select distinct dok_dat_feld_" + POS_AZ_RECHT + " POS_AZ_RECHT from firmen_spezifisch where dok_dat_feld_" + POS_AZ + " = '" + doc.field[ POS_AZ ] + "' ";
}
else
{
sqlQuery = "select distinct dok_dat_feld_" + POS_AZ_RECHT + " POS_AZ_RECHT from firmen_spezifisch";
}
def resultRows = d3.sql.executeAndGet( sqlQuery );
if ( resultRows.size() > 0 )
{
reposField.provideValuesForValueSet( resultRows.collect{ it.POS_AZ_RECHT } );
}
}
// ---------------------------------- Funktionen ----------------------------------
/////////////////////////// sg02_isSozial //////////////////////////////////////////
// Püft ob das übergebene Dokumentartkürzel zur Lösung gehört
//////////////////////////////////////////////////////////////////////////////////////
public int sg02_isSozial(doc_type_short)
{
if ( doc_type_short == SG02_DS_SOZ_AKTE || doc_type_short == SG02_DS_SOZ_DOKU )
{
return true;
}
return false;
}
//////////////////////////////// sg02_split_AZ ///////////////////////////////////////
// -> Ermittelt den Wert Aktenzeichen aus der Wertemenge
//////////////////////////////////////////////////////////////////////////////////////
public void sg02_split_AZ( D3Interface d3, Document doc, int IsSearch )
{
if ( doc.field[ POS_AZ ] != null )
{
if ( ! doc.field[ POS_AZ ].isEmpty() )
{
if ( doc.field[ POS_AZ ].indexOf( "~" ) >= 0 )
{
def tok = doc.field[ POS_AZ ].tokenize( "~" );
if ( tok.size() > 1 )
{
doc.field[ POS_AZ ] = tok[ 0 ];
if ( IsSearch == 0 )
{
doc.field[ POS_NACHNAME ] = tok[ 1 ];
doc.field[ POS_VORNAME ] = tok[ 2 ];
SimpleDateFormat dateFormat = new SimpleDateFormat( "dd.MM.yyyy" );
Date parsedDate = dateFormat.parse( tok[ 3 ] );
doc.field[ POS_GEBURTSDATUM ] = new Timestamp( parsedDate.getTime() );
doc.field[ POS_SACHGEBIET ] = tok[ 4 ];
}
}
}
}
}
}
/////////////////////////// sg02_getDate /////////////////////////////////////////////
// Gibt das Tagesdatum + Frist zurück
//
// strFrist Die Frist in Monaten um die das Tagesdatum erhoeht wird
// iEndOfYear Unterscheidung ob der genaue Wert oder der letzte Tag des Jahres berechnet wird
// 0 = genauer Wert / 1 = Ende des Jahres
//////////////////////////////////////////////////////////////////////////////////////
public String sg02_getDate( int iFrist, int iEndOfYear )
{
String strDatum = "";
String strEndOfYear = "";
def STATEMENT = "SELECT DATEADD(month, " + iFrist + ", GETDATE()) zeitstempel, '31.12.' + CONVERT(varchar,YEAR(DATEADD(month, " + iFrist + ", GETDATE()))) datum";
def resultRows = d3.sql.executeAndGet( STATEMENT );
if ( resultRows.size() > 0 )
{
if ( iEndOfYear == 1 )
{
return resultRows[ 0 ].datum;
}
else
{
return resultRows[ 0 ].zeitstempel;
}
}
}
////////////////////////// sg02_fuelleFelder /////////////////////////////////////////////
public int sg02_fuelleFelder( D3Interface d3, Document doc, String doc_type_short )
{
int retVal = 0;
if ( doc_type_short == SG02_DS_SOZ_DOKU )
{
def STATEMENT = "select doku_id from firmen_spezifisch where kue_dokuart = '" + SG02_DS_SOZ_AKTE + "' and dok_dat_feld_" + POS_AZ + " = '" + doc.field[ POS_AZ ] + "' ";
def treffer = d3.sql.executeAndGet( (String) STATEMENT );
if ( treffer.size() > 0 )
{
int i;
for ( i = 0 ; i < treffer.size(); i++ )
{
def updateDoc = d3.archive.getDocument( treffer[ i ].doku_id );
if ( updateDoc.field[ POS_ZDA ] == G01_STR_JA )
{
d3.log.error( "[sg02_fuelleFelder] Sozialakte (:dok_dat_feld[POS_AZ]) ist zdA-verfügt und darf nicht bearbeitet werden." );
retVal = -316; //Änderung oder Archivierung nicht erlaubt - Akte oder Vorgang ist schon abgeschlossen
}
else
{
if ( doc.field[ POS_SACHGEBIET ] == "" )
{
doc.field[ POS_SACHGEBIET ] = updateDoc.field[ POS_SACHGEBIET ];
}
if ( doc.field[ POS_NACHNAME ] == "" )
{
doc.field[ POS_NACHNAME ] = updateDoc.field[ POS_NACHNAME ];
}
if ( doc.field[ POS_VORNAME ] == "" )
{
doc.field[ POS_VORNAME ] = updateDoc.field[ POS_VORNAMEPOS_VORNAME ];
}
if ( doc.field[ POS_STRASSE ] == "" )
{
doc.field[ POS_STRASSE ] = updateDoc.field[ POS_STRASSE ];
}
if ( doc.field[ POS_PLZ ] == "" )
{
doc.field[ POS_PLZ ] = updateDoc.field[ POS_PLZ ];
}
if ( doc.field[ POS_HNR ] == "" )
{
doc.field[ POS_HNR ] = updateDoc.field[ POS_HNR ];
}
if ( doc.field[ POS_ORT ] == "" )
{
doc.field[ POS_ORT ] = updateDoc.field[ POS_ORT ];
}
if ( doc.field[ POS_GEBURTSDATUM ] == "" )
{
doc.field[ POS_GEBURTSDATUM ] = updateDoc.field[ POS_GEBURTSDATUM ];
}
}
}
}
}
return retVal;
}
// Funktion: Wenn ein Posteingangsdokument in ein Sozialdokument umgewandelt wird, muss das Dokdatfeld Vorname geleert werden,
// da es ansonsten in der Aktenbildung nach oben vererbt wird. In der Posteingangsbearbeitung ist das Dokdatfeld 4 Original behalten.
// Rückgabewert:
// 0 = wurde geleert.
public int sg02_clear_vorname( D3Interface d3, Document doc, String doc_type_short )
{
if ( doc.field[ POS_VORNAME ] == "Nein" || doc.field[ POS_VORNAME ] == "Ja" )
{
doc.field[ POS_VORNAME ] = "";
}
return 0;
}
// Kommentar in JPL-Datei passt nicht zur Funktion.
public String sg02_FillLeadingChar( String strAZ )
{
def paddedString = String.format( "%08d", strAZ );
return paddedString;
}
}