3465 lines
99 KiB
Groovy
3465 lines
99 KiB
Groovy
package com.dvelop.hooks;
|
|
|
|
|
|
import com.amazonaws.util.IOUtils
|
|
import com.dvelop.d3.server.Document
|
|
import com.dvelop.d3.server.DocumentType
|
|
import com.dvelop.d3.server.User
|
|
import com.dvelop.d3.server.core.D3Interface
|
|
import com.dvelop.d3.server.exceptions.D3Exception
|
|
import com.google.gson.JsonArray
|
|
import com.google.gson.JsonElement
|
|
import com.google.gson.JsonObject
|
|
import com.google.gson.JsonParser
|
|
import groovy.json.StringEscapeUtils
|
|
import org.apache.http.HttpEntity
|
|
import org.apache.http.client.methods.CloseableHttpResponse
|
|
import org.apache.http.client.methods.HttpGet
|
|
import org.apache.http.client.methods.HttpPost
|
|
import org.apache.http.entity.StringEntity
|
|
import org.apache.http.impl.client.CloseableHttpClient
|
|
import org.apache.http.impl.client.HttpClientBuilder
|
|
import org.apache.http.util.EntityUtils
|
|
import groovy.json.JsonSlurper
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
import wslite.*
|
|
import wslite.soap.*
|
|
|
|
// 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.DocumentType;
|
|
|
|
// Libraries to handle the diferent hook types
|
|
import com.dvelop.d3.server.Entrypoint;
|
|
|
|
|
|
|
|
|
|
public class D3Hooks
|
|
{
|
|
|
|
|
|
@Entrypoint( entrypoint = "hook_insert_entry_10" )
|
|
public int insertEntry_10( D3Interface d3, User user, DocumentType docTypeShort, Document doc )
|
|
{
|
|
//Alle Dokumente und Akten sollen im Status Freigabe importiert werden:
|
|
doc.setStatus( "Freigabe" );
|
|
|
|
|
|
//def e = getUserIdpId( d3, "dvelop", "b3be8a21-9cc1-5079-8dac-1c719ac7f80f", "https://d3one-test.kleeberg.kleeberg.de/", "lEtMJfO/jQqDvrfHTtdD5GZ0Ro8S5/UVO1NQkxGwrFCTznNl78gKtcUXXBn1mdVZh75+Nym9PjcZTZyIGrT16Nt9Lbqjpz0A3B/qCF9kDZI=&_z_A0V5ayCRn_Bn5wFTNnf3FUYT7AzFYDFJtTKz2vib1R4XhvF5pT8ZXjCzqiNkbw6I2Nrk4uR-QafuJy0XujnfyNQFfItf3" );
|
|
def sqlQuery = "";
|
|
def where = "";
|
|
def resultRows = "";
|
|
def oreg, reg, ureg, ureg2, ureg3, such_doku_art;
|
|
def where_allg = " dok_dat_feld_1 = '"+ doc.field[ 1 ] + "' ";
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Prüfen, ob in einem der Benutzerfelder eine E-Mail-Adresse angegeben wurde. Ist das der Fall, so wird der entsprechende Benutzer in der Benutzer-Tabelle gesucht und mit seinem Kürzel eingetragen. START
|
|
//////////////////////////////////////
|
|
|
|
if ( docTypeShort.id == "AMAND" )
|
|
{
|
|
|
|
// Hier wird für die Eigenschaft Geschäftsführer aus der Tribus-Schnittstelle das DDF45 gefüllt. Benutzt wird in der Akte das Feld 25. Gemacht wird diese Brücke, damit sich Änderungen
|
|
// an der Akte im DATEV nicht direkt in Aktenaktualisierungsjobs im d.3 manifestieren. Das gleiche Verfahren wird für den Mandatsverantwortlichen verwendet.
|
|
|
|
|
|
|
|
///////////////////////////////////////////
|
|
// DDF 25 / Geschäftsführer
|
|
///////////////////////////////////////////
|
|
def benutzername = "nicht ermittelbar";
|
|
if ( doc.field[ 45 ] )
|
|
{
|
|
if ( doc.field[ 45 ].indexOf( "@" ) > 0 )
|
|
{
|
|
def sql_STATEMENT = "select realname + ' (' + benutzername + ')' as realbenutzername from benutzer where email = '" + doc.field[ 45 ] + "'";
|
|
|
|
def sql_resultRows = d3.sql.executeAndGet( (String) sql_STATEMENT );
|
|
|
|
if ( sql_resultRows.size() > 0 )
|
|
{
|
|
benutzername = sql_resultRows[ 0 ].realbenutzername;
|
|
}
|
|
}
|
|
}
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : GF " + benutzername );
|
|
|
|
doc.field[ 25 ] = benutzername;
|
|
|
|
|
|
///////////////////////////////////////////
|
|
// DDF 37 / Mandatsverantwortlicher
|
|
///////////////////////////////////////////
|
|
benutzername = "nicht ermittelbar";
|
|
if ( doc.field[ 44 ] )
|
|
{
|
|
if ( doc.field[ 44 ].indexOf( "@" ) > 0 )
|
|
{
|
|
def sql_STATEMENT = "select realname + ' (' + benutzername + ')' as realbenutzername from benutzer where email = '" + doc.field[ 44 ] + "'";
|
|
|
|
def sql_resultRows = d3.sql.executeAndGet( (String) sql_STATEMENT );
|
|
|
|
if ( sql_resultRows.size() > 0 )
|
|
{
|
|
benutzername = sql_resultRows[ 0 ].realbenutzername;
|
|
}
|
|
}
|
|
}
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : GF " + benutzername );
|
|
|
|
doc.field[ 37 ] = benutzername;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Prüfen, ob in einem der Benutzerfelder eine E-Mail-Adresse angegeben wurde. Ist das der Fall, so wird der entsprechende Benutzer in der Benutzer-Tabelle gesucht und mit seinem Kürzel eingetragen. ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Setzen der Aktennummer bei content-crawler-Ablagen in die Dokumentart Debitorendokumente START
|
|
// siehe E-Mail von Nils Küthe/d.velop an Hrn. Schlicht/Kleeberg vom 28.05.2024
|
|
/////////////////////////////////////////
|
|
|
|
if ( ( docTypeShort.id == "DDEBD" ) && ( user.id == "dvelop-cra" ) )
|
|
{
|
|
d3.log.info( " => Ablage in Debitorendokumente durch den User dvelop-crawler." );
|
|
d3.log.info( " => Setze Aktennummer = <Mandant-Nr> + 'RE000100' ..." );
|
|
d3.log.info( " => <Mandant-Nr> = <" + doc.field[ 1 ] + "> ");
|
|
if ( doc.field[ 1 ] )
|
|
{
|
|
doc.field[ 10 ] = doc.field[ 1 ] + "RE000100";
|
|
d3.log.info( " => <Aktennummer> = <" + doc.field[ 10 ] + "> ");
|
|
}
|
|
else
|
|
{
|
|
d3.log.warn( "Die Mandant-Nr. ist leer. Kann daher Aktennummer nicht setzen." );
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Setzen der Aktennummer bei content-crawler-Ablagen in die Dokumentart Debitorendokumente ENDE
|
|
/////////////////////////////////////////
|
|
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Allgemeines START
|
|
/////////////////////////////////////////
|
|
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
// Das folgende betrifft alle Mandantenakte-Dokument- und Aktenarten:
|
|
case "DBETR":
|
|
case "DDAUE":
|
|
case "DABSC":
|
|
case "DBERA":
|
|
case "DSTEU":
|
|
case "DFIBU":
|
|
case "DLOHN":
|
|
case "DDEBD":
|
|
case "DLSTD":
|
|
case "DKRED":
|
|
|
|
case "AMAND":
|
|
|
|
case "ABPSA":
|
|
case "ABESA":
|
|
case "AFBSA":
|
|
case "AJASA":
|
|
case "ALOSA":
|
|
case "ASTSA":
|
|
|
|
case "AJAOB":
|
|
case "ALBRE":
|
|
case "AJAAB":
|
|
case "ABERO":
|
|
case "ABERA":
|
|
case "ASTOR":
|
|
case "ASTRA":
|
|
case "ABEPA":
|
|
case "ABEOR":
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
case "ALBOR":
|
|
case "ALBSO":
|
|
case "AAURR":
|
|
case "AKROR":
|
|
case "DUMMY":
|
|
case "AOREG":
|
|
case "AREGS":
|
|
case "AUREG":
|
|
case "AURG2":
|
|
case "AURG3":
|
|
case "AAURU":
|
|
case "AAUR2":
|
|
case "ABEUR":
|
|
case "ABEU2":
|
|
case "ABPUR":
|
|
case "ABPU2":
|
|
case "AFIUR":
|
|
case "AFIU2":
|
|
case "AJAUR":
|
|
case "AJAU2":
|
|
case "ALJUR":
|
|
case "ALOUR":
|
|
case "ALJR2":
|
|
case "ALBU2":
|
|
case "ASTU2":
|
|
case "ASTUR":
|
|
case "ADAUR":
|
|
case "ABERB":
|
|
case "ABETR":
|
|
case "AFIBA":
|
|
case "AJAAA":
|
|
case "AKRED":
|
|
case "ALOJA":
|
|
case "ALBSA":
|
|
case "ASTEU":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Falls "gesperrt" nicht gesetzt ist, setze das Feld auf "Nein" START
|
|
//////////////////////////////////////
|
|
|
|
if ( ! doc.field[ 43 ] )
|
|
{
|
|
doc.field[ 43 ] = "Nein";
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Falls "gesperrt" nicht gesetzt ist, setze das Feld auf "Nein" ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Falls "Benachrichtigung Postempfänger" nicht gesetzt ist, setze das Feld auf "Nein" START
|
|
//////////////////////////////////////
|
|
|
|
if ( ! doc.field[ 38 ] )
|
|
{
|
|
doc.field[ 38 ] = "Nein";
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Falls "Benachrichtigung Postempfänger" nicht gesetzt ist, setze das Feld auf "Nein" ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Falls Aktennummer gesetzt, fülle die Mandantinformationen: START
|
|
//////////////////////////////////////
|
|
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
doc.field[ 1 ] = doc.field[ 10 ].substring( 0, 5 );
|
|
|
|
sqlQuery = "select dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_13 from firmen_spezifisch where kue_dokuart = 'AMAND' and dok_dat_feld_1 = '" + doc.field[ 1 ] + "'";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 2 ] = resultRows[ 0 ].dok_dat_feld_2;
|
|
doc.field[ 13 ] = resultRows[ 0 ].dok_dat_feld_13;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Falls Aktennummer gesetzt, fülle die Mandantinformationen: ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
|
|
// Prüfe, ob Aktennummer angegeben wurde und gleichzeitig die Mandantennummer weggelassen wurde. Dann kann die Mandantennummer aus der Aktennummer extrahiert werden.
|
|
if ( ( ! doc.field[ 1 ] ) && ( doc.field[ 10 ] ) )
|
|
{
|
|
doc.field[ 1 ] = doc.field[ 10 ].substring( 0, 5 );
|
|
}
|
|
|
|
|
|
|
|
|
|
// Falls Unterregister leer: leere auch Unterregister 2
|
|
if ( ! doc.field[ 23 ] )
|
|
{
|
|
doc.field[ 17 ] = "";
|
|
}
|
|
|
|
// Falls Unterregister 2 leer: leere auch Unterregister 3
|
|
if ( ! doc.field[ 17 ] )
|
|
{
|
|
doc.field[ 32 ] = "";
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Setzen der Register START
|
|
/////////////////////////////////////////
|
|
|
|
|
|
def wm_typ = "";
|
|
def do_it = 0; // Steuerung des Füllens des Registers auf Basis des Dokumenttyps
|
|
def gj_do_it = 0; // Steuerung des Füllens des Feldes Geschäftsjahr
|
|
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "DDAUE":
|
|
wm_typ = "Dauerakte";
|
|
|
|
// Sonderfall Unterregister: Unterregister gefüllt? Falls ja: Oberregister + Register können direkt gefüllt werden.
|
|
//
|
|
if ( doc.field[ 23 ] != null )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_2, dok_dat_feld_3 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = '" + wm_typ + "' and dok_dat_feld_4 = '" + doc.field[ 23 ] + "'";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 3 ] = resultRows[ 0 ].dok_dat_feld_2;
|
|
doc.field[ 4 ] = resultRows[ 0 ].dok_dat_feld_3;
|
|
}
|
|
else
|
|
{
|
|
do_it = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
do_it = 1;
|
|
}
|
|
break;
|
|
case "DABSC":
|
|
do_it = 1;
|
|
wm_typ = "Jahresabschlussakte";
|
|
gj_do_it = 1;
|
|
break;
|
|
case "DBERA":
|
|
case "ABERA":
|
|
do_it = 1;
|
|
wm_typ = "Beratungsakte";
|
|
gj_do_it = 1;
|
|
break;
|
|
case "DSTEU":
|
|
do_it = 1;
|
|
wm_typ = "Steuerakte";
|
|
gj_do_it = 2;
|
|
break;
|
|
case "DBETR":
|
|
do_it = 1;
|
|
wm_typ = "Betriebspruefungsakte";
|
|
gj_do_it = 2;
|
|
break;
|
|
case "DLOHN":
|
|
do_it = 1;
|
|
wm_typ = "Lohnbuchhaltungjahresakte";
|
|
gj_do_it = 2;
|
|
break;
|
|
case "DLSTD":
|
|
do_it = 1;
|
|
wm_typ = "Lohnbuchhaltungsstammdatenakte";
|
|
// In den Lohnbuchhaltungsstammdaten gibt es kein Geschäftsjahr, daher bleibt gj_do_it unverändert
|
|
break;
|
|
case "DDEBD":
|
|
do_it = 1;
|
|
wm_typ = "Ausgangsrechnungsregister";
|
|
gj_do_it = 1;
|
|
break;
|
|
case "DKRED":
|
|
do_it = 1;
|
|
wm_typ = "Kreditorenaktenregister";
|
|
gj_do_it = 1;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
// Register gefüllt?
|
|
if ( ( doc.field[ 4 ] != null ) && ( do_it == 1 ) )
|
|
{
|
|
// Füllen des Registers auf Basis des Dokumenttyps
|
|
sqlQuery = "select dok_dat_feld_2 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = '" + wm_typ + "' and dok_dat_feld_3 = '" + doc.field[ 4 ] + "'";
|
|
|
|
resultRows = d3.sql.executeAndGet( sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 3 ] = resultRows[ 0 ].dok_dat_feld_2;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ( gj_do_it )
|
|
{
|
|
case 1:
|
|
// Wird verwendet für Dokumentarten in der Mandantenakte, die sowohl das Geschäftsjahr als auch das Belegdatum enthalten.
|
|
// Falls ein Belegdatum angegeben wurde, aber kein Geschäftsjahr, setze Geschäftsjahr auf das Jahr des Belegdatums
|
|
if ( ( doc.field[ 50 ] ) && ( ! doc.field[ 5 ] ) )
|
|
{
|
|
def jahr = doc.field[ 50 ].getYear().toInteger() + 1900;
|
|
doc.field[ 5 ] = jahr.toString();
|
|
}
|
|
break;
|
|
case 2:
|
|
// Wird verwendet für Dokumentarten in der Mandantenakte, die das Geschäftsjahr, nicht aber das Belegdatum enthalten.
|
|
// Falls Geschäftsjahr leer ist: setze aktuelles Jahr
|
|
if ( ! doc.field[ 5 ] )
|
|
{
|
|
def jahr = new Date().getYear().toInteger() + 1900;
|
|
doc.field[ 5 ] = jahr.toString();
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Setzen der Register ENDE
|
|
/////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Allgemeines ENDE
|
|
/////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Kreditor Stammdatenergänzung START
|
|
/////////////////////////////////////////
|
|
|
|
|
|
if ( docTypeShort.id == "DKRED" )
|
|
{
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
doc.field[ 19 ] = doc.field[ 10 ].substring( 0, 5 );
|
|
}
|
|
|
|
if ( ( doc.field[ 19 ] ) && ( ! doc.field[ 20 ] ) )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_20 from firmen_spezifisch where kue_dokuart = 'AKRED' and dok_dat_feld_19 = '" + doc.field[ 19 ] + "' ";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 20 ] = resultRows[ 0 ].dok_dat_feld_20;
|
|
}
|
|
}
|
|
|
|
if ( ( doc.field[ 20 ] ) && ( ! doc.field[ 19 ] ) )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_19 from firmen_spezifisch where kue_dokuart = 'AKRED' and dok_dat_feld_20 = '" + doc.field[ 20 ] + "' ";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 19 ] = resultRows[ 0 ].dok_dat_feld_19;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Kreditor Stammdatenergänzung ENDE
|
|
/////////////////////////////////////////
|
|
|
|
|
|
/////////////////////////////////////////
|
|
// Eigenverwaltungsakte Stammdatenergänzung START
|
|
/////////////////////////////////////////
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "DEVDO":
|
|
case "AEVAK":
|
|
case "AEVOR":
|
|
case "AEVRE":
|
|
|
|
if ( ( doc.field[ 10 ] ) && ( ! doc.field[ 21 ] ) )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_21 from firmen_spezifisch where kue_dokuart = 'AEVAK' and dok_dat_feld_10 = '" + doc.field[ 10 ] + "' ";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 21 ] = resultRows[ 0 ].dok_dat_feld_21;
|
|
}
|
|
}
|
|
|
|
if ( ( doc.field[ 21 ] ) && ( ! doc.field[ 10 ] ) )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_10 from firmen_spezifisch where kue_dokuart = 'AEVAK' and dok_dat_feld_21 = '" + doc.field[ 21 ] + "' ";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 10 ] = resultRows[ 0 ].dok_dat_feld_10;
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////
|
|
// Eigenverwaltungsakte Stammdatenergänzung ENDE
|
|
/////////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Verarbeitung Mandantenakte START
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "AMAND":
|
|
|
|
|
|
break;
|
|
case "DBETR":
|
|
|
|
//////////////////////////////////////
|
|
// Bei Betriebsprüfungsdokumenten müssen die Prüfungsart und der Prüfungszeitraum von der Akte geholt und an das Dokument ergänzt werden START
|
|
//////////////////////////////////////
|
|
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
sqlQuery = "select dok_dat_feld_12, dok_dat_feld_14 from firmen_spezifisch where kue_dokuart = 'ABETR' and dok_dat_feld_10 = '" + doc.field[ 10 ] + "' ";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
if ( resultRows[ 0 ].dok_dat_feld_12 )
|
|
{
|
|
doc.field[ 12 ] = resultRows[ 0 ].dok_dat_feld_12;
|
|
}
|
|
|
|
if ( resultRows[ 0 ].dok_dat_feld_14 )
|
|
{
|
|
doc.field[ 14 ] = resultRows[ 0 ].dok_dat_feld_14;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Bei Betriebsprüfungsdokumenten müssen die Prüfungsart und der Prüfungszeitraum von der Akte geholt und an das Dokument ergänzt werden ENDE
|
|
//////////////////////////////////////
|
|
|
|
case "DDAUE":
|
|
case "DEVDO":
|
|
case "DABSC":
|
|
case "DBERA":
|
|
case "DSTEU":
|
|
case "DFIBU":
|
|
case "DLOHN":
|
|
case "DDEBD":
|
|
case "DLSTD":
|
|
case "DKRED":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Falls Betreff leer: setze Betreff auf den Dateinamen
|
|
if ( ! doc.field[ 6 ] )
|
|
{
|
|
doc.field[ 6 ] = doc.getFilename();
|
|
d3.log.info( "setze Betreff auf " + doc.getFilename() );
|
|
}
|
|
|
|
// Falls Dokumentdatum leer: Setze Dokumentdatum auf Tagesdatum
|
|
if ( ! doc.field[ 50 ] )
|
|
{
|
|
doc.field[ 50 ] = new Date();
|
|
}
|
|
|
|
|
|
// Für Eigenverwaltungsdokumente ist hier Schluss.
|
|
if ( docTypeShort.id == "DEVDO" )
|
|
{
|
|
break;
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Im Zuge der Archivierung muss geprüft werden, ob es unterhalb der angegebenen Register noch weitere Unterregister gibt. Ist das der Fall, müssen diese vom Anwender ausgewählt werden;
|
|
// d.h. eine Archivierung wird dann abgelehnt. START
|
|
//////////////////////////////////////
|
|
|
|
// Diese Logik ist aufgrund einer E-Mail von Hrn. Meyer vom 11. Februar 2022 13:58 Uhr an JFEL, ISTRE und CBUE deaktiviert.
|
|
|
|
|
|
if ( false ) // Logik ist deaktiviert
|
|
{
|
|
// Festlegen, in welcher Aktenart gesucht werden soll:
|
|
|
|
switch( docTypeShort.id )
|
|
{
|
|
case "DDAUE": // Dauerakte
|
|
oreg = "AOREG";
|
|
reg = "AREGS";
|
|
ureg = "AUREG";
|
|
ureg2 = "AURG2";
|
|
ureg3 = "AURG3";
|
|
break;
|
|
case "DABSC": // Jahresabschlussakte
|
|
oreg = "AJAOB";
|
|
reg = "AJAAB";
|
|
ureg = "AJAUR";
|
|
ureg2 = "AJAU2";
|
|
break;
|
|
case "DBERA": // Beratungsakte
|
|
oreg = "ABERO";
|
|
reg = "ABERA";
|
|
ureg = "ABEUR";
|
|
ureg2 = "ABEU2";
|
|
break;
|
|
case "DSTEU": // Steuerakte
|
|
oreg = "ASTOR";
|
|
reg = "ASTRA";
|
|
ureg = "ASTUR";
|
|
ureg2 = "ASTU2";
|
|
break;
|
|
case "DBETR": // Betriebspruefungsakte
|
|
oreg = "ABEOR";
|
|
reg = "ABEPA";
|
|
ureg = "ABPUR";
|
|
ureg2 = "ABPU2";
|
|
break;
|
|
case "DFIBU": // Finanzbuchhaltungsakte
|
|
oreg = "AFIOR";
|
|
reg = "AFIRA";
|
|
ureg = "AFIUR";
|
|
ureg2 = "AFIU2";
|
|
break;
|
|
case "DLOHN": // Lohnbuchhaltungjahresakte
|
|
oreg = "ALBOR";
|
|
reg = "ALBRE";
|
|
ureg = "ALJUR";
|
|
ureg2 = "ALJR2";
|
|
break;
|
|
case "DDEBD": // Ausgangsrechnungsakte
|
|
oreg = "AAURR";
|
|
reg = "AAURA";
|
|
ureg = "AAURU";
|
|
ureg2 = "AAUR2";
|
|
break;
|
|
case "DLSTD": // Lohnbuchhaltungsstammdatenakte
|
|
oreg = "ALBSO";
|
|
reg = "ALORE";
|
|
ureg = "ALOUR";
|
|
ureg2 = "ALBU2";
|
|
break;
|
|
case "DKRED": // Kreditorenakte
|
|
oreg = "AKROR";
|
|
reg = "AKRER";
|
|
ureg = "AKREU";
|
|
ureg2 = "AKRU2";
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
|
|
def such_feld;
|
|
def such_ok = false;
|
|
def add_i_t;
|
|
|
|
where = "";
|
|
|
|
if ( doc.field[ 3 ] ) // Oberregister
|
|
{
|
|
where = " and dok_dat_feld_3 = '" + doc.field[ 3 ] + "' ";
|
|
such_doku_art = reg;
|
|
such_feld = 4;
|
|
add_i_t = "Es gibt Register unterhalb von '" + doc.field[ 3 ] + "'. Bitte verwenden Sie diese.";
|
|
such_ok = true;
|
|
|
|
if ( doc.field[ 4 ] ) // Register
|
|
{
|
|
where = where + " and dok_dat_feld_4 = '" + doc.field[ 4 ] + "' ";
|
|
such_doku_art = ureg;
|
|
such_feld = 23;
|
|
add_i_t = "Es gibt Register unterhalb von '" + doc.field[ 4 ] + "'. Bitte verwenden Sie diese.";
|
|
such_ok = true;
|
|
|
|
if ( doc.field[ 23 ] ) // Unterregister
|
|
{
|
|
where = where + " and dok_dat_feld_23 = '" + doc.field[ 23 ] + "' ";
|
|
such_doku_art = ureg2;
|
|
such_feld = 17;
|
|
add_i_t = "Es gibt Register unterhalb von '" + doc.field[ 23 ] + "'. Bitte verwenden Sie diese.";
|
|
such_ok = true;
|
|
|
|
if ( doc.field[ 17 ] ) // 2. Unterregister
|
|
{
|
|
where = where + " and dok_dat_feld_17 = '" + doc.field[ 17 ] + "' ";
|
|
such_doku_art = ureg3;
|
|
such_feld = 32;
|
|
add_i_t = "Es gibt Register unterhalb von '" + doc.field[ 17 ] + "'. Bitte verwenden Sie diese.";
|
|
such_ok = true;
|
|
|
|
if ( doc.field[ 32 ] ) // 3. Unterregister
|
|
{
|
|
// Wenn das 3. Unterregister gefüllt ist, braucht die Prüfung nicht stattzufinden, weil der Anwender eh keine weiteren Register angeben kann.
|
|
// Da ist dann nur noch die Prüfung fällig, ob das Register auch existiert, die findet aber an anderer Stelle statt.
|
|
|
|
such_ok = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( such_ok )
|
|
{
|
|
|
|
where = where_allg + where + " and dok_dat_feld_" + such_feld + " is not null ";
|
|
|
|
sqlQuery = "select count(*) anzahl from firmen_spezifisch where kue_dokuart = '" + such_doku_art + "' and " + where;
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
if ( resultRows[ 0 ].anzahl > 0 )
|
|
{
|
|
// Es wurde eine Kombination gefunden => es gibt vorhandene, aber nicht vom Anwender ausgewählte Unterregister.
|
|
d3.hook.setProperty( "additional_info_text", add_i_t );
|
|
return -502;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Im Zuge der Archivierung muss geprüft werden, ob es unterhalb der angegebenen Register noch weitere Unterregister gibt. Ist das der Fall, müssen diese vom Anwender ausgewählt werden;
|
|
// d.h. eine Archivierung wird dann abgelehnt. ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "AJAOB":
|
|
case "ALBRE":
|
|
case "AJAAB":
|
|
case "ABERO":
|
|
case "ABERA":
|
|
case "ASTOR":
|
|
case "ASTRA":
|
|
case "ABEPA":
|
|
case "ABEOR":
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
case "ALBOR":
|
|
case "ALBSO":
|
|
case "AAURR":
|
|
case "AKROR":
|
|
case "DUMMY":
|
|
case "AOREG":
|
|
case "AREGS":
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Grundstücksangabe muss ein Pflichtfeld sein, wenn eine 04.01 Grundstück-Akte ausgewählt wurde START
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
// Diese Logik ist aufgrund einer E-Mail von Hrn. Meyer vom 11. Februar 2022 13:58 Uhr an JFEL, ISTRE und CBUE deaktiviert.
|
|
|
|
if ( false ) // Logik ist deaktiviert
|
|
{
|
|
// Gilt für Daueraktendokumente, Daueraktenunterregister und 2. Daueraktenunterregister
|
|
// Bedingungen:
|
|
// o DDF 4 (Register) wurde angegeben
|
|
// o DDF 30 ist leer => ein Grundstück wurde nicht angegeben
|
|
// o DDF 23 ist gefüllt => es wurde ein Unterregister angegeben
|
|
// o Dokumentart ist DDAUE oder AUREG oder AURG2
|
|
if ( ( doc.field[ 4 ] ) && ( ! doc.field[ 30 ] ) && ( doc.field[ 23 ] ) && ( ( docTypeShort.id == "DDAUE" ) || ( docTypeShort.id == "AUREG" ) || ( docTypeShort.id == "AURG2" ) ) )
|
|
{
|
|
def grundstueck_korrekter_ordner = false;
|
|
def grundstueck_ordner = doc.field[ 23 ].substring( 0, 8 );
|
|
|
|
switch ( grundstueck_ordner )
|
|
{
|
|
case "04.01.01":
|
|
case "04.01.02":
|
|
case "04.01.03":
|
|
case "04.01.04":
|
|
grundstueck_korrekter_ordner = true;
|
|
}
|
|
|
|
|
|
if ( ( grundstueck_korrekter_ordner ) && ( doc.field[ 4 ].substring( 0, 13 ) == "04.01 Grundst" ) )
|
|
{
|
|
return -505;
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Grundstücksangabe muss ein Pflichtfeld sein, wenn eine 04.01 Grundstück-Akte ausgewählt wurde ENDE
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "AUREG":
|
|
case "AURG2":
|
|
case "AURG3":
|
|
|
|
case "AAURU":
|
|
case "AAUR2":
|
|
|
|
case "ABEUR":
|
|
case "ABEU2":
|
|
|
|
case "ABPUR":
|
|
case "ABPU2":
|
|
|
|
case "AFIUR":
|
|
case "AFIU2":
|
|
|
|
case "AJAUR":
|
|
case "AJAU2":
|
|
|
|
case "ALJUR":
|
|
case "ALOUR":
|
|
case "ALJR2":
|
|
case "ALBU2":
|
|
|
|
case "ASTU2":
|
|
case "ASTUR":
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
// Es muss geprüft werden, ob eine gewählte Registerkombination valide ist, d.h. für einen Mandanten so existiert. Dabei muss unterschieden werden, ob die Akte gerade angelegt werden soll oder ein
|
|
// Dokument innerhalb der Akte abgelegt werden soll. START
|
|
////////////////////////////////////////////////////////
|
|
|
|
def doktyp_art = docTypeShort.id.substring( 0, 1 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( doktyp_art == "D" )
|
|
{
|
|
// Es soll ein Dokument abgelegt werden
|
|
// Hier müssen alle angegebenen Register existieren
|
|
|
|
|
|
// Festlegen, in welcher Aktenart gesucht werden soll:
|
|
//def oreg, reg, ureg, ureg2, ureg3;
|
|
|
|
where_allg = " dok_dat_feld_10 = '" + doc.field[ 10 ] + "' ";
|
|
|
|
switch( docTypeShort.id )
|
|
{
|
|
case "DDAUE":
|
|
oreg = "AOREG";
|
|
reg = "AREGS";
|
|
ureg = "AUREG";
|
|
ureg2 = "AURG2";
|
|
ureg3 = "AURG3";
|
|
break;
|
|
case "DABSC":
|
|
oreg = "AJAOB";
|
|
reg = "AJAAB";
|
|
ureg = "AJAUR";
|
|
ureg2 = "AJAU2";
|
|
break;
|
|
case "DBERA":
|
|
oreg = "ABERO";
|
|
reg = "ABERA";
|
|
ureg = "ABEUR";
|
|
ureg2 = "ABEU2";
|
|
break;
|
|
case "DSTEU":
|
|
oreg = "ASTOR";
|
|
reg = "ASTRA";
|
|
ureg = "ASTUR";
|
|
ureg2 = "ASTU2";
|
|
break;
|
|
case "DBETR":
|
|
oreg = "ABEOR";
|
|
reg = "ABEPA";
|
|
ureg = "ABPUR";
|
|
ureg2 = "ABPU2";
|
|
break;
|
|
case "DFIBU":
|
|
oreg = "AFIOR";
|
|
reg = "AFIRA";
|
|
ureg = "AFIUR";
|
|
ureg2 = "AFIU2";
|
|
break;
|
|
case "DLOHN":
|
|
oreg = "ALBOR";
|
|
reg = "ALBRE";
|
|
ureg = "ALJUR";
|
|
ureg2 = "ALJR2";
|
|
break;
|
|
case "DDEBD":
|
|
oreg = "AAURR";
|
|
reg = "AAURA";
|
|
ureg = "AAURU";
|
|
ureg2 = "AAUR2";
|
|
break;
|
|
case "DLSTD":
|
|
oreg = "ALBSO";
|
|
reg = "ALORE";
|
|
ureg = "ALOUR";
|
|
ureg2 = "ALBU2";
|
|
break;
|
|
case "DKRED":
|
|
oreg = "AKROR";
|
|
reg = "AKRER";
|
|
ureg = "AKREU";
|
|
ureg2 = "AKRU2";
|
|
where_allg = " dok_dat_feld_19 = '"+ doc.field[ 19 ] + "' ";
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
where = "";
|
|
|
|
if ( doc.field[ 3 ] ) // Oberregister
|
|
{
|
|
where = " and " + where_allg + " and dok_dat_feld_3 = '" + doc.field[ 3 ] + "' ";
|
|
such_doku_art = oreg;
|
|
|
|
if ( doc.field[ 4 ] ) // Register
|
|
{
|
|
where = where + " and dok_dat_feld_4 = '" + doc.field[ 4 ] + "' ";
|
|
such_doku_art = reg;
|
|
|
|
if ( doc.field[ 23 ] ) // Unterregister
|
|
{
|
|
where = where + " and dok_dat_feld_23 = '" + doc.field[ 23 ] + "' ";
|
|
such_doku_art = ureg;
|
|
|
|
if ( doc.field[ 17 ] ) // 2. Unterregister
|
|
{
|
|
where = where + " and dok_dat_feld_17 = '" + doc.field[ 17 ] + "' ";
|
|
such_doku_art = ureg2;
|
|
|
|
if ( doc.field[ 32 ] ) // 3. Unterregister
|
|
{
|
|
where = where + " and dok_dat_feld_32 = '" + doc.field[ 32 ] + "' ";
|
|
such_doku_art = ureg3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
sqlQuery = "select count(*) anzahl from firmen_spezifisch where kue_dokuart = '" + such_doku_art + "' " + where;
|
|
|
|
//d3.log.error( sqlQuery );
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
if ( resultRows[ 0 ].anzahl == 0 )
|
|
{
|
|
d3.log.error( "Es konnte keine passende Registerkombination gefunden werden. Der Import wird abgelehnt." )
|
|
|
|
return -501;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
|
|
// Es soll eine Akte angelegt werden
|
|
// Hier müssen alle bis auf das unterste Register existieren
|
|
|
|
// Welche Register müssen vorhanden sein? (_mds => müssen da sein).
|
|
// Oberregister werden nicht geprüft, weil sie immer da sein müssen.
|
|
|
|
def reg_mds, ureg_mds, ureg2_mds;
|
|
|
|
def pruefe_register = true;
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "AOREG": // Mandantenakte + Ebene Oberregister: müssen nicht geprüft werden
|
|
case "AJAOB":
|
|
case "ABERO":
|
|
case "ASTOR":
|
|
case "ABEOR":
|
|
case "AFIOR":
|
|
case "ALBOR":
|
|
case "AAURR":
|
|
case "ALBSO":
|
|
case "AKROR":
|
|
case "AMAND":
|
|
pruefe_register = false;
|
|
break;
|
|
case "AURG3": // Ebene Unterregister 3 (nur Dauerakte)
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = true;
|
|
such_doku_art = "AURG2";
|
|
break;
|
|
case "AURG2": // Ebene Unterregister 2
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AUREG";
|
|
break;
|
|
case "AJAU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AJAUR";
|
|
break;
|
|
case "ABEU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABEUR";
|
|
break;
|
|
case "ASTU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ASTUR";
|
|
break;
|
|
case "ABPU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABPUR";
|
|
break;
|
|
case "AFIU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AFIUR";
|
|
break;
|
|
case "ALJR2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALJUR";
|
|
break;
|
|
case "AAUR2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AAURU";
|
|
break;
|
|
case "ALBU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALOUR";
|
|
break;
|
|
case "AKRU2":
|
|
reg_mds = true;
|
|
ureg_mds = true;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AKREU";
|
|
break;
|
|
case "AUREG": // Ebene Unterregister
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AREGS";
|
|
break;
|
|
case "AJAUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AJAAB";
|
|
break;
|
|
case "ABEUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABERA";
|
|
break;
|
|
case "ASTUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ASTRA";
|
|
break;
|
|
case "ABPUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABEPA";
|
|
break;
|
|
case "AFIUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AFIRA";
|
|
break;
|
|
case "ALJUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALBRE";
|
|
break;
|
|
case "AAURU":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AAURA";
|
|
break;
|
|
case "ALOUR":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALORE";
|
|
break;
|
|
case "AKREU":
|
|
reg_mds = true;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AKRER";
|
|
break;
|
|
case "AREGS": // Ebene Register
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AOREG";
|
|
break;
|
|
case "AJAAB":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AJAOB";
|
|
break;
|
|
case "ABERA":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABERO";
|
|
break;
|
|
case "ASTRA":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ASTOR";
|
|
break;
|
|
case "ABEPA":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ABEOR";
|
|
break;
|
|
case "AFIRA":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AFIOR";
|
|
break;
|
|
case "ALBRE":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALBOR";
|
|
break;
|
|
case "AAURA":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AAURR";
|
|
break;
|
|
case "ALORE":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "ALBSO";
|
|
break;
|
|
case "AKRER":
|
|
reg_mds = false;
|
|
ureg_mds = false;
|
|
ureg2_mds = false;
|
|
such_doku_art = "AKROR";
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
where = where_allg + " and dok_dat_feld_3 = '" + doc.field[ 3 ] + "' ";
|
|
|
|
if ( reg_mds )
|
|
{
|
|
where = where + " and dok_dat_feld_4 = '" + doc.field[ 4 ] + "' ";
|
|
}
|
|
|
|
if ( ureg_mds )
|
|
{
|
|
where = where + " and dok_dat_feld_23 = '" + doc.field[ 23 ] + "' ";
|
|
}
|
|
|
|
if ( ureg2_mds )
|
|
{
|
|
where = where + " and dok_dat_feld_17 = '" + doc.field[ 17 ] + "' ";
|
|
}
|
|
|
|
if ( pruefe_register )
|
|
{
|
|
|
|
sqlQuery = "select count(*) anzahl from firmen_spezifisch where kue_dokuart = '" + such_doku_art + "' and " + where;
|
|
|
|
//d3.log.error( "sqlQuery: 1 " + sqlQuery );
|
|
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
if ( resultRows[ 0 ].anzahl == 0 )
|
|
{
|
|
d3.log.error( "Es konnte keine passende Registerkombination gefunden werden. Der Import wird abgelehnt." )
|
|
|
|
return -501;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
// Es muss geprüft werden, ob eine gewählte Registerkombination valide ist, d.h. für einen Mandanten so existiert. Dabei muss unterschieden werden, ob die Akte gerade angelegt werden soll oder ein
|
|
// Dokument innerhalb der Akte abgelegt werden soll. ENDE
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "ADAUR":
|
|
case "ABERB":
|
|
case "ABETR":
|
|
case "AFIBA":
|
|
case "AJAAA":
|
|
case "AKRED":
|
|
case "ALOJA":
|
|
case "ALBSA":
|
|
case "ASTEU":
|
|
|
|
// Prüfe, ob Aktennummer und Mandant zusammenpassen, ggf. Meldung
|
|
if ( ( doc.field[ 1 ] ) && ( doc.field[ 10 ] ) )
|
|
{
|
|
// Aktennummer und Mandantnummer sind beide gefüllt
|
|
|
|
if ( doc.field[ 1 ] != doc.field[ 10 ].substring( 0, 5 ) )
|
|
{
|
|
// Aktennummer passt nicht zur Mandantennummer
|
|
d3.log.error( "Die angegebene Aktennummer passt nicht zur angegeben Mandantennummer. Der Import wird abgelehnt." )
|
|
return -503;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////
|
|
// Aktenkürzel-Buchstabenanteil groß schreiben:
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
doc.field[ 10 ] = doc.field[ 10 ].toUpperCase();
|
|
}
|
|
|
|
|
|
///////////////////////
|
|
// Prüfe, ob Aktennummer zu ausgewählter Dokumentart passt START
|
|
///////////////////////
|
|
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
def aktenkuerzel = "";
|
|
def lzahlen = "0123456789";
|
|
|
|
for ( int m = 0; m <= doc.field[ 10 ].length() -1 ; m++ )
|
|
{
|
|
if ( lzahlen.indexOf( doc.field[ 10 ].substring( m, m + 1 ) ) == -1 )
|
|
{
|
|
aktenkuerzel = aktenkuerzel + doc.field[ 10 ].substring( m, m + 1 );
|
|
}
|
|
}
|
|
|
|
d3.log.info( "Dokument-/Aktenart " + docTypeShort.id + " / gefundenes Aktenkuerzel " + aktenkuerzel );
|
|
|
|
// RC -507: Es wurde versucht, ein Dokument mit einer Aktennummer in eine für diese Aktennummer nicht passende Dokumentart zu importieren.
|
|
|
|
|
|
|
|
|
|
|
|
switch( docTypeShort.id )
|
|
{
|
|
case "DDAUE": // Dauerakte
|
|
case "AOREG":
|
|
case "AREGS":
|
|
case "AUREG":
|
|
case "AURG2":
|
|
case "AURG3":
|
|
if ( aktenkuerzel != "DA" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DABSC": // Jahresabschlussakte
|
|
case "AJAOB":
|
|
case "AJAAB":
|
|
case "AJAUR":
|
|
case "AJAU2":
|
|
if ( aktenkuerzel != "JA" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DBERA": // Beratungsakte
|
|
case "ABERO":
|
|
case "ABERA":
|
|
case "ABEUR":
|
|
case "ABEU2":
|
|
if ( aktenkuerzel != "BE" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DSTEU": // Steuerakte
|
|
case "ASTOR":
|
|
case "ASTRA":
|
|
case "ASTUR":
|
|
case "ASTU2":
|
|
if ( aktenkuerzel != "ST" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DBETR": // Betriebspruefungsakte
|
|
case "ABEOR":
|
|
case "ABEPA":
|
|
case "ABPUR":
|
|
case "ABPU2":
|
|
if ( aktenkuerzel != "BP" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DFIBU": // Finanzbuchhaltungsakte
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
case "AFIUR":
|
|
case "AFIU2":
|
|
if ( aktenkuerzel != "FI" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DLOHN": // Lohnbuchhaltungjahresakte
|
|
case "ALBOR":
|
|
case "ALBRE":
|
|
case "ALJUR":
|
|
case "ALJR2":
|
|
if ( aktenkuerzel != "LO" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DDEBD": // Ausgangsrechnungsakte
|
|
case "AAURR":
|
|
case "AAURA":
|
|
case "AAURU":
|
|
case "AAUR2":
|
|
if ( aktenkuerzel != "RE" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DLSTD": // Lohnbuchhaltungsstammdatenakte
|
|
case "ALBSO":
|
|
case "ALORE":
|
|
case "ALOUR":
|
|
case "ALBU2":
|
|
if ( aktenkuerzel != "LS" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
case "DKRED": // Kreditorenakte
|
|
case "AKROR":
|
|
case "AKRER":
|
|
case "AKREU":
|
|
case "AKRU2":
|
|
if ( aktenkuerzel != "KA" )
|
|
{
|
|
return -507;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
///////////////////////
|
|
// Prüfe, ob Aktennummer zu ausgewählter Dokumentart passt ENDE
|
|
///////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////
|
|
// Mandantinformationen ergänzen START
|
|
///////////////////////
|
|
|
|
if ( doc.field[ 1 ] )
|
|
{
|
|
def sql = groovy.sql.Sql.newInstance( "jdbc:sqlserver://kp-sql01\\D3;databaseName=D3P_Datev", 'd3_master', 'Xbn8"Ep4', 'com.microsoft.sqlserver.jdbc.SQLServerDriver' );
|
|
|
|
def row = sql.firstRow( "select clientname, number from DatevClients where number = '" + doc.field[ 1 ] + "'" );
|
|
|
|
if ( row )
|
|
{
|
|
doc.field[ 1 ] = (String) row.number;
|
|
doc.field[ 2 ] = row.clientname;
|
|
//doc.field[ 13 ] = (String) row.number;
|
|
}
|
|
|
|
sql.close();
|
|
}
|
|
|
|
|
|
///////////////////////
|
|
// Mandantinformationen ergänzen ENDE
|
|
///////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////
|
|
// Setzen des Feldes Briefkopf, falls noch nicht gefüllt START
|
|
///////////////////////
|
|
|
|
if ( ! doc.field[ 42 ] )
|
|
{
|
|
doc.field[ 42 ] = "Kleeberg";
|
|
}
|
|
|
|
///////////////////////
|
|
// Setzen des Feldes Briefkopf, falls noch nicht gefüllt ENDE
|
|
///////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
// automatisches Vergeben einer Aktennummer, ggf. Füllen des Aktennamens START
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def akten_kuerzel;
|
|
def akten_name;
|
|
def akten_verfahren;
|
|
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "ADAUR": // Dauerakte
|
|
case "DDAUE": // Daueraktendokumente
|
|
case "AOREG": // Oberregister
|
|
case "AREGS": // Register
|
|
case "AUREG": // Unterregister
|
|
case "AURG2": // 2. Unterregister
|
|
akten_kuerzel = "DA";
|
|
akten_name = "Dauerakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
|
|
case "AAURE": // Ausgangsrechnungsakte
|
|
case "DDEBD": // Debitorendokumente
|
|
case "AAURR": // Ausgangsrechnungsregister
|
|
akten_kuerzel = "RE";
|
|
akten_name = "Ausgangsrechnungsakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
case "ABERA":
|
|
case "DBERA":
|
|
case "ABERO":
|
|
case "ABERB":
|
|
akten_kuerzel = "BE";
|
|
akten_name = "Beratungsakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
case "DSTEU":
|
|
case "ASTEU":
|
|
case "ASTRA":
|
|
case "ASTOR":
|
|
akten_kuerzel = "ST";
|
|
akten_name = "Steuerakte";
|
|
akten_verfahren = 2;
|
|
break;
|
|
case "DBETR":
|
|
case "ABETR":
|
|
case "ABEPA":
|
|
case "ABEOR":
|
|
akten_kuerzel = "BP";
|
|
akten_name = "Betriebspruefungsakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
case "DFIBU":
|
|
case "AFIBA":
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
akten_kuerzel = "FI";
|
|
akten_name = "Finanzbuchhaltungsakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
case "DLOHN":
|
|
case "ALOJA":
|
|
case "ALBOR":
|
|
case "ALBRE":
|
|
akten_kuerzel = "LO";
|
|
akten_name = "Lohnbuchhaltungs-Jahresakte";
|
|
akten_verfahren = 2;
|
|
break;
|
|
case "DLSTD":
|
|
case "ALBSO":
|
|
case "ALBSA":
|
|
akten_kuerzel = "ST";
|
|
akten_name = "Steuerakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
case "DKRED":
|
|
case "AKRED":
|
|
case "ALBSA":
|
|
akten_kuerzel = "KR";
|
|
akten_name = "Kreditorakte";
|
|
akten_verfahren = 1;
|
|
break;
|
|
}
|
|
|
|
if ( doc.field[ 10 ] )
|
|
{
|
|
// Aktennummer ist gefüllt
|
|
if ( ! doc.field[ 21 ] )
|
|
{
|
|
// Es wurde kein Aktenname angegeben
|
|
sqlQuery = "select dok_dat_feld_21 from firmen_spezifisch where dok_dat_feld_10 = '" + doc.field[10] + "' and kue_dokuart in ( 'ADAUR', 'AAURE', 'ABERB', 'ABETR', 'AFIBA', 'AJAAA', 'AKRED', 'ALOJA', 'ALBSA', 'ASTEU' )";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 21 ] = resultRows[ 0 ].dok_dat_feld_21;
|
|
}
|
|
else
|
|
{
|
|
doc.field[ 21 ] = akten_name;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
// Aktennummer ist leer
|
|
if ( akten_verfahren == 1 )
|
|
{
|
|
// Aktennummer: <Mandant-Nr 5St.><Aktenkürzel 2St.><Aktensuffixnummer 4St.><Unteraktennummer 2St.>
|
|
|
|
// Mit diesem Verfahren wird bei leerer Aktennummer nach Akten dieses Typs gesucht. Die höchste gefundene Aktensuffixnummer wird dann um 1 inkrementiert und als
|
|
// Grundlage für die neue Aktennummer verwendet.
|
|
|
|
if ( docTypeShort.id.substring( 0,1 ) == "A" )
|
|
{
|
|
// Bei Aktenanlage wird die Aktennummer generiert, falls nicht angegeben.
|
|
|
|
sqlQuery = "select distinct dok_dat_feld_10 from firmen_spezifisch where kue_dokuart in ( \
|
|
'ADAUR', 'AAURE', 'ABERB', 'ABETR', 'AFIBA', 'AJAAA', 'AKRED', 'ALOJA', 'ALBSA', 'ASTEU', 'DBERA', 'DDAUE', 'DBETR', 'DDEBD', 'DFIBU', 'DABSC', 'DKRED', 'DLOHN', 'DLSTD', 'DSTEU' \
|
|
) and dok_dat_feld_10 like '" + doc.field[ 1 ] + akten_kuerzel + "%' order by dok_dat_feld_10 desc"
|
|
|
|
resultRows = d3.sql.executeAndGet( sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
//12345DA000100
|
|
def akten_suffix = resultRows[ 0 ].dok_dat_feld_10;
|
|
|
|
|
|
// Transformieren des DB-Treffers in die Ziel-Aktennummer
|
|
akten_suffix = akten_suffix.substring( 7, 11 ); // Ausschneiden der Aktensuffixnummer
|
|
int akt_suff = akten_suffix as Integer; // Typkonvertierung nach Integer
|
|
akt_suff = akt_suff + 1; // +1 weil neue Akte/Dokument
|
|
akten_suffix = akt_suff.toString(); // Typkonvertierung zurück nach String
|
|
akten_suffix = akten_suffix.padLeft( 4, "0" ); // Hinzufügen von Nullen bis zu einer Gesamtlänge von 4 Stellen
|
|
|
|
|
|
// Setzen der neuen Aktennummer + des Aktennamens
|
|
doc.field[ 10 ] = doc.field[ 1 ] + akten_kuerzel + akten_suffix + "00";
|
|
doc.field[ 21 ] = akten_name;
|
|
|
|
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
// Es wurde keine passende Akte/Dokument gefunden:
|
|
doc.field[ 10 ] = doc.field[ 1 ] + akten_kuerzel + "0000" + "00";
|
|
doc.field[ 21 ] = akten_name;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Bei Dokumentarten wird eine Aktennummer gesucht und bei Erfolg als erste vorgeschlagen
|
|
sqlQuery = "select distinct dok_dat_feld_10, dok_dat_feld_21 from firmen_spezifisch where kue_dokuart in ( \
|
|
'ADAUR', 'AAURE', 'ABERB', 'ABETR', 'AFIBA', 'AJAAA', 'AKRED', 'ALOJA', 'ALBSA', 'ASTEU', 'DBERA', 'DDAUE', 'DBETR', 'DDEBD', 'DFIBU', 'DABSC', 'DKRED', 'DLOHN', 'DLSTD', 'DSTEU' \
|
|
) and dok_dat_feld_10 like '" + doc.field[ 1 ] + akten_kuerzel + "%' order by dok_dat_feld_10 desc"
|
|
|
|
resultRows = d3.sql.executeAndGet( sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
doc.field[ 10 ] = resultRows[ 0 ].dok_dat_feld_10;
|
|
doc.field[ 21 ] = resultRows[ 0 ].dok_dat_feld_21;
|
|
}
|
|
else
|
|
{
|
|
// Der Benutzer muss zuerst die entsprechende Akte erstellen (siehe msglib.usr)
|
|
return -506;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Aktuell haben die Unterstrukturen der Kreditorakte keine Aktennummer, daher werden diese hier nochmal explizit ausgenommen
|
|
if ( "AKROR".equals( docTypeShort.id ) || "AKRER".equals( docTypeShort.id ) || "AKREU".equals( docTypeShort.id ) )
|
|
{
|
|
d3.log.info( "keine Aktennummer bei Kreditorstrukturakten vorhanden" );
|
|
}
|
|
else
|
|
{
|
|
// Jahresakten haben ein etwas anderes Schema
|
|
def jahr = new Date().getYear().toInteger() + 1900;
|
|
def akten_suffix = jahr.toString();
|
|
// Setzen der neuen Aktennummer + des Aktennamens
|
|
doc.field[ 10 ] = doc.field[ 1 ] + akten_kuerzel + akten_suffix + "00";
|
|
doc.field[ 21 ] = akten_name;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
// automatisches Vergeben einer Aktennummer, ggf. Füllen des Aktennamens ENDE
|
|
//////////////////////////////////////////////////////
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Verarbeitung Mandantenakte ENDE
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
@Entrypoint( entrypoint = "hook_insert_exit_20" )
|
|
public int insertExit_20( D3Interface d3, Document doc, String fileDestination, int importOk, User user, DocumentType docTypeShort )
|
|
{
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Erstellen des Aktenbaums bei Anlage einer Mandantenakte START
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
if ( docTypeShort.id == "AMAND" )
|
|
{
|
|
|
|
//xlog( d3, 4, "1 *********************************************************" );
|
|
//xlog( d3, 4, "insertExit_20: " + docTypeShort.id + " / " + doc.id + " START " );
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " / " + doc.field[ 2 ] );
|
|
//xlog( d3, 4, "1 *********************************************************" );
|
|
|
|
//////////////////////////////////////////
|
|
// erste Ebene unterhalb der neuen Mandantenakte anlegen
|
|
// (Dauerakte, Ausgangsrechnungsakte sowie alle Sammelakten)
|
|
def akten_ebene_1 = [ "ADAUR", "ALOSA", "ASTSA", "AJASA", "AFBSA", "ABPSA", "ABESA", "AAURE" ];
|
|
|
|
|
|
// Daueraktennummer, -name
|
|
def daueraktennr = doc.field[ 1 ] + "DA000000";
|
|
def daueraktenname = "Dauerakte";
|
|
|
|
def ausgangsrechaktennr = doc.field[ 1 ] + "RE000100";
|
|
def ausgangsrechaktenname = "Ausgangsrechnungsakte";
|
|
|
|
def splitted_str_array_69 = [];
|
|
|
|
|
|
akten_ebene_1.each
|
|
{
|
|
|
|
|
|
|
|
|
|
xlog( d3, 4, "-----------------------" );
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : erstelle Akte vom Typ " + it );
|
|
//d3.log.info( " erstelle Akte vom Typ " + it );
|
|
def zieltabelle;
|
|
def resultRows;
|
|
def akte_aus_migration = false;
|
|
def check_db = false;
|
|
|
|
|
|
Document newDoc = d3.archive.newDocument();
|
|
|
|
newDoc.type = it;
|
|
|
|
newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING;
|
|
newDoc.editor = "dvelop";
|
|
|
|
// Mandantnummer, -name, -gruppennummer, physischer Aufbewahrungsort, Geschäftsführer
|
|
newDoc.field[ 1 ] = doc.field[ 1 ];
|
|
newDoc.field[ 2 ] = doc.field[ 2 ];
|
|
newDoc.field[ 13 ] = doc.field[ 13 ];
|
|
newDoc.field[ 22 ] = "Digital";
|
|
newDoc.field[ 25 ] = doc.field[ 25 ]; // Geschäftsführer
|
|
newDoc.field[ 37 ] = doc.field[ 37 ]; // Mandatsverantwortlicher
|
|
newDoc.field[ 42 ] = "Kleeberg";
|
|
|
|
switch ( it )
|
|
{
|
|
case "ADAUR":
|
|
zieltabelle = "mig_dauerakte";
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : erstelle Dauerakte mit GF " + doc.field[ 25 ] );
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : erstelle Dauerakte mit MV " + doc.field[ 37 ] );
|
|
|
|
newDoc.field[ 10 ] = daueraktennr;
|
|
newDoc.field[ 21 ] = daueraktenname;
|
|
newDoc.field[ 60 ][ 1 ] = doc.field[ 25 ];
|
|
if ( doc.field[ 25 ] != doc.field[ 37 ] )
|
|
{
|
|
newDoc.field[ 60 ][ 2 ] = doc.field[ 37 ];
|
|
}
|
|
|
|
check_db = true;
|
|
|
|
break;
|
|
|
|
case "AAURE":
|
|
zieltabelle = "mig_ausgangsrechnungsakte";
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : erstelle AR-Akte mit GF " + doc.field[ 25 ] );
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + " / " + doc.field[ 1 ] + " : erstelle AR-Akte mit MV " + doc.field[ 37 ] );
|
|
|
|
newDoc.field[ 10 ] = ausgangsrechaktennr;
|
|
newDoc.field[ 21 ] = ausgangsrechaktenname;
|
|
newDoc.field[ 60 ][ 1 ] = doc.field[ 25 ];
|
|
if ( doc.field[ 25 ] != doc.field[ 37 ] )
|
|
{
|
|
newDoc.field[ 60 ][ 2 ] = doc.field[ 37 ];
|
|
}
|
|
|
|
check_db = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
check_db = false;
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
if ( check_db )
|
|
{
|
|
def sqlQuery = "select id,ddf1,ddf48,ddf10,ddf21,ddf22,ddf25,ddf37,ddf42,ddf60,ddf69 from " + zieltabelle + " where ddf1 = '" + doc.field[ 1 ] + "' and fehler is null and doku_id is null";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
akte_aus_migration = true;
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + ": Datensatz fuer Dauerakte gefunden." );
|
|
// Falls ein Wert in der Tabelle gefunden wurde, überschreibt der in der Tabelle gefundene Wert den "geerbten" von der Mandantenakte:
|
|
// Daueraktennummer:
|
|
if ( resultRows[ 0 ].ddf10 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF10: " + resultRows[ 0 ].ddf10 );
|
|
newDoc.field[ 10 ] = resultRows[ 0 ].ddf10;
|
|
}
|
|
|
|
// Daueraktenname:
|
|
if ( resultRows[ 0 ].ddf21 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF21: " + resultRows[ 0 ].ddf21 );
|
|
newDoc.field[ 21 ] = resultRows[ 0 ].ddf21;
|
|
}
|
|
|
|
// Physischer Aufbewahrungsort:
|
|
if ( resultRows[ 0 ].ddf22 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF22: " + resultRows[ 0 ].ddf22 );
|
|
newDoc.field[ 22 ] = resultRows[ 0 ].ddf22;
|
|
}
|
|
|
|
// Geschäftsführer:
|
|
if ( resultRows[ 0 ].ddf25 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF25: " + resultRows[ 0 ].ddf25 );
|
|
newDoc.field[ 25 ] = resultRows[ 0 ].ddf25;
|
|
newDoc.field[ 60 ][ 1 ] = doc.field[ 25 ];
|
|
}
|
|
|
|
// Mandatsverantwortlicher:
|
|
if ( resultRows[ 0 ].ddf37 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF37: " + resultRows[ 0 ].ddf37 );
|
|
newDoc.field[ 37 ] = resultRows[ 0 ].ddf37;
|
|
newDoc.field[ 60 ][ 2 ] = doc.field[ 37 ];
|
|
}
|
|
|
|
// Briefkopf:
|
|
if ( resultRows[ 0 ].ddf42 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF42: " + resultRows[ 0 ].ddf42 );
|
|
newDoc.field[ 42 ] = resultRows[ 0 ].ddf42;
|
|
}
|
|
|
|
// Unique-ID:
|
|
if ( resultRows[ 0 ].ddf48 )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF48: " + resultRows[ 0 ].ddf48 );
|
|
newDoc.field[ 48 ] = resultRows[ 0 ].ddf48;
|
|
}
|
|
|
|
// Postempfänger:
|
|
if ( resultRows[ 0 ].ddf60 )
|
|
{
|
|
newDoc.field[ 60 ][ 1 ] = "";
|
|
newDoc.field[ 60 ][ 2 ] = "";
|
|
|
|
def splitted_str_array = resultRows[ 0 ].ddf60.split( ';' );
|
|
for ( int i = 0; i < splitted_str_array.size(); i++ )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF60 / " + i + ": " + splitted_str_array[ i ] );
|
|
newDoc.field[ 60 ][ i + 1 ] = splitted_str_array[ i ];
|
|
}
|
|
}
|
|
|
|
// Berechtigter:
|
|
if ( resultRows[ 0 ].ddf69 )
|
|
{
|
|
splitted_str_array_69 = resultRows[ 0 ].ddf69.split( ';' );
|
|
for ( int i = 0; i < splitted_str_array_69.length; i++ )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze DDF69 / " + i + ": " + splitted_str_array_69[ i ] );
|
|
newDoc.field[ 69 ][ i + 1 ] = splitted_str_array_69[ i ];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xlog( d3, 3, "Mandatenakte " + doc.id + ": Es wurde kein DB-Treffer gefunden (Tabelle " + zieltabelle + ", Aktenart " + it + ")." );
|
|
}
|
|
}
|
|
|
|
|
|
// Prüfen, ob die zu erstellende Akte existiert:
|
|
|
|
def sqlQuery_pruef = "select doku_id from firmen_spezifisch where kue_dokuart = '" + newDoc.type + "' and dok_dat_feld_10 = '" + newDoc.field[ 10 ] + "'";
|
|
|
|
def resultRows2 = d3.sql.executeAndGet( (String) sqlQuery_pruef );
|
|
|
|
if ( resultRows2.size() == 0 )
|
|
{
|
|
|
|
try
|
|
{
|
|
newDoc = d3.archive.importDocument( newDoc );
|
|
}
|
|
catch ( D3Exception e )
|
|
{
|
|
xlog( d3, 2, "Dokument konnte nicht erzeugt werden: " + e.message );
|
|
|
|
if ( akte_aus_migration )
|
|
{
|
|
def meldung_db;
|
|
if ( e.message.length() > 250 )
|
|
{
|
|
meldung_db = e.message.substring( 0, 249 );
|
|
}
|
|
else
|
|
{
|
|
meldung_db = e.message;
|
|
}
|
|
def sqlQuery = "update " + zieltabelle + " set fehler = '" + meldung_db + "' where id = " + resultRows[ 0 ].id;
|
|
d3.sql.execute( sqlQuery );
|
|
}
|
|
return -175;
|
|
}
|
|
|
|
if ( akte_aus_migration )
|
|
{
|
|
//xlog( d3, 2, "Angekommen?" );
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + ": Setze Doku-ID " + newDoc.id + " fuer Element-ID " + resultRows[ 0 ].id + " in der Tabelle " + zieltabelle + "." );
|
|
def sqlQuery = "update " + zieltabelle + " set doku_id = '" + newDoc.id + "' where id = " + resultRows[ 0 ].id;
|
|
d3.sql.execute( sqlQuery );
|
|
}
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + ": erzeugte Doku-Id: " + newDoc.id + " / " + newDoc.type );
|
|
|
|
}
|
|
else
|
|
{
|
|
xlog( d3, 3, "Mandatenakte " + doc.id + ": Akte vom Typ " + newDoc.type + " existiert bereits: " + resultRows[ 0 ].doku_id );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////
|
|
// Ebene unterhalb der Dauerakte / Ausgangsrechnungsakte anlegen
|
|
// Dokumentart: Daueraktenoberregister / Ausgangsrechnungsberregister, darin alle in den Stammdaten angelegten Oberregister
|
|
|
|
def sqlQuery = "select distinct dok_dat_feld_2, dok_dat_feld_24 from firmen_spezifisch where kue_dokuart = 'AVMNT' and ( dok_dat_feld_1 = 'Dauerakte' or dok_dat_feld_1 = 'Ausgangsrechnungsakte' )";
|
|
|
|
def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
resultRows.each
|
|
{
|
|
d3.log.info( " erstelle Oberregister-Akte: " + it.dok_dat_feld_24 + " / " + it.dok_dat_feld_2 );
|
|
|
|
Document newDoc = d3.archive.newDocument();
|
|
|
|
if ( it.dok_dat_feld_24 == "RE" )
|
|
{
|
|
newDoc.type = "AAURR";
|
|
newDoc.field[ 10 ] = ausgangsrechaktennr; // Daueraktennummer
|
|
newDoc.field[ 21 ] = ausgangsrechaktenname; // Daueraktenname
|
|
}
|
|
else
|
|
{
|
|
newDoc.type = "AOREG";
|
|
newDoc.field[ 10 ] = daueraktennr; // Daueraktennummer
|
|
newDoc.field[ 21 ] = daueraktenname; // Daueraktenname
|
|
}
|
|
|
|
newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING;
|
|
newDoc.editor = "dvelop";
|
|
|
|
newDoc.field[ 1 ] = doc.field[ 1 ]; // Mandantnummer
|
|
newDoc.field[ 2 ] = doc.field[ 2 ]; // Mandantname
|
|
newDoc.field[ 13 ] = doc.field[ 13 ]; // Mandantgruppennummer
|
|
newDoc.field[ 3 ] = it.dok_dat_feld_2; // Oberregister
|
|
newDoc.field[ 25 ] = doc.field[ 25 ]; // Geschäftsführer
|
|
newDoc.field[ 37 ] = doc.field[ 37 ]; // Mandatsverantwortlicher
|
|
|
|
if ( splitted_str_array_69.size() > 0 )
|
|
{
|
|
for ( int i = 0; i < splitted_str_array_69.size(); i++ )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + " / OR " + newDoc.field[ 3 ] + ":Setze DDF69 / " + i + ": " + splitted_str_array_69[ i ] );
|
|
newDoc.field[ 69 ][ i + 1 ] = splitted_str_array_69[ i ];
|
|
}
|
|
}
|
|
|
|
//def ergebnis = d3.archive.importDocument( newDoc );
|
|
// Prüfen, ob die zu erstellende Akte existiert:
|
|
|
|
def sqlQuery_pruef = "select doku_id from firmen_spezifisch where kue_dokuart = '" + newDoc.type + "' and dok_dat_feld_10 = '" + newDoc.field[ 10 ] + "' and dok_dat_feld_3 = '" + newDoc.field[ 3 ] + "'";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery_pruef );
|
|
|
|
if ( resultRows.size() == 0 )
|
|
{
|
|
|
|
try
|
|
{
|
|
newDoc = d3.archive.importDocument( newDoc );
|
|
}
|
|
catch ( D3Exception e )
|
|
{
|
|
xlog( d3, 2, "Dokument konnte nicht erzeugt werden: " + e.message );
|
|
|
|
return -175;
|
|
}
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + ": Akte vom Typ " + newDoc.type + " / Register [" + newDoc.field[ 3 ] + "]: erzeugte Doku-Id: " + newDoc.id );
|
|
|
|
}
|
|
else
|
|
{
|
|
xlog( d3, 3, "Mandatenakte " + doc.id + ": Akte vom Typ " + newDoc.type + " / Oberregister [" + newDoc.field[ 3 ] + "] existiert bereits: " + resultRows[ 0 ].doku_id );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////
|
|
// 2. Ebene unterhalb der Dauerakte anlegen
|
|
// Dokumentart: Daueraktenregister, darin alle in den Stammdaten angelegten Register
|
|
|
|
sqlQuery = "select distinct dok_dat_feld_2, dok_dat_feld_3 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = 'Dauerakte' and dok_dat_feld_3 != ''";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
resultRows.each
|
|
{
|
|
d3.log.info( " erstelle Daueraktenregister-Akte: " + it.dok_dat_feld_2 + " / " + it.dok_dat_feld_3 );
|
|
|
|
Document newDoc = d3.archive.newDocument();
|
|
|
|
newDoc.type = "AREGS";
|
|
|
|
newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING;
|
|
newDoc.editor = "dvelop";
|
|
|
|
newDoc.field[ 1 ] = doc.field[ 1 ]; // Mandantnummer
|
|
newDoc.field[ 2 ] = doc.field[ 2 ]; // Mandantname
|
|
newDoc.field[ 13 ] = doc.field[ 13 ]; // Mandantgruppennummer
|
|
newDoc.field[ 10 ] = daueraktennr; // Daueraktennummer
|
|
newDoc.field[ 21 ] = daueraktenname; // Daueraktenname
|
|
newDoc.field[ 3 ] = it.dok_dat_feld_2; // Oberregister
|
|
newDoc.field[ 4 ] = it.dok_dat_feld_3; // Register
|
|
newDoc.field[ 25 ] = doc.field[ 25 ]; // Geschäftsführer
|
|
newDoc.field[ 37 ] = doc.field[ 37 ]; // Mandatsverantwortlicher
|
|
|
|
if ( splitted_str_array_69.size() > 0 )
|
|
{
|
|
for ( int i = 0; i < splitted_str_array_69.size(); i++ )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + " / OR " + newDoc.field[ 4 ] + ":Setze DDF69 / " + i + ": " + splitted_str_array_69[ i ] );
|
|
newDoc.field[ 69 ][ i + 1 ] = splitted_str_array_69[ i ];
|
|
}
|
|
}
|
|
|
|
//def ergebnis = d3.archive.importDocument( newDoc );
|
|
// Prüfen, ob die zu erstellende Akte existiert:
|
|
|
|
def sqlQuery_pruef = "select doku_id from firmen_spezifisch where kue_dokuart = '" + newDoc.type + "' and dok_dat_feld_10 = '" + newDoc.field[ 10 ] + "' and dok_dat_feld_3 = '" + newDoc.field[ 3 ] + "' and dok_dat_feld_4 = '" + newDoc.field[ 4 ] + "'";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery_pruef );
|
|
|
|
if ( resultRows.size() == 0 )
|
|
{
|
|
|
|
try
|
|
{
|
|
newDoc = d3.archive.importDocument( newDoc );
|
|
}
|
|
catch ( D3Exception e )
|
|
{
|
|
xlog( d3, 2, "Dokument konnte nicht erzeugt werden: " + e.message );
|
|
|
|
return -175;
|
|
}
|
|
|
|
xlog( d3, 4, "Mandatenakte " + doc.id + ": Akte vom Typ " + newDoc.type + " / Register [" + newDoc.field[ 3 ] + "][" + newDoc.field[ 4 ] + "]: erzeugte Doku-Id: " + newDoc.id );
|
|
|
|
}
|
|
else
|
|
{
|
|
xlog( d3, 3, "Mandatenakte " + doc.id + ": Akte vom Typ " + newDoc.type + " / Register [" + newDoc.field[ 3 ] + "][" + newDoc.field[ 4 ] + "] existiert bereits: " + resultRows[ 0 ].doku_id );
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////
|
|
// 3. Ebene unterhalb der Dauerakte anlegen
|
|
// Dokumentart: Daueraktenunterregister, darin alle in den Stammdaten angelegten Unterregister
|
|
|
|
sqlQuery = "select distinct dok_dat_feld_2, dok_dat_feld_3, dok_dat_feld_4 from firmen_spezifisch where kue_dokuart = 'AVMNT' and dok_dat_feld_1 = 'Dauerakte' and dok_dat_feld_3 != '' and dok_dat_feld_4 != ''";
|
|
|
|
resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
resultRows.each
|
|
{
|
|
d3.log.info( " erstelle Daueraktenregister-Akte: " + it.dok_dat_feld_2 + " / " + it.dok_dat_feld_2 + " / " + it.dok_dat_feld_4 );
|
|
|
|
Document newDoc = d3.archive.newDocument();
|
|
|
|
newDoc.type = "AUREG";
|
|
|
|
newDoc.status = Document.DocStatus.DOC_STAT_PROCESSING;
|
|
newDoc.editor = "dvelop";
|
|
|
|
newDoc.field[ 1 ] = doc.field[ 1 ]; // Mandantnummer
|
|
newDoc.field[ 2 ] = doc.field[ 2 ]; // Mandantname
|
|
newDoc.field[ 13 ] = doc.field[ 13 ]; // Mandantgruppennummer
|
|
newDoc.field[ 10 ] = daueraktennr; // Daueraktennummer
|
|
newDoc.field[ 21 ] = daueraktenname; // Daueraktenname
|
|
newDoc.field[ 3 ] = it.dok_dat_feld_2; // Oberregister
|
|
newDoc.field[ 4 ] = it.dok_dat_feld_3; // Register
|
|
newDoc.field[ 23 ] = it.dok_dat_feld_4; // Unterregister
|
|
newDoc.field[ 25 ] = doc.field[ 25 ]; // Geschäftsführer
|
|
newDoc.field[ 37 ] = doc.field[ 37 ]; // Mandatsverantwortlicher
|
|
|
|
if ( splitted_str_array_69.size() > 0 )
|
|
{
|
|
for ( int i = 0; i < splitted_str_array_69.size(); i++ )
|
|
{
|
|
//xlog( d3, 4, "Mandatenakte " + doc.id + " / UR " + newDoc.field[ 23 ] + ":Setze DDF69 / " + i + ": " + splitted_str_array_69[ i ] );
|
|
newDoc.field[ 69 ][ i + 1 ] = splitted_str_array_69[ i ];
|
|
}
|
|
}
|
|
|
|
def ergebnis = d3.archive.importDocument( newDoc );
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Erstellen des Aktenbaums bei Anlage einer Mandantenakte ENDE
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Wenn ein Dokument in der Mandantenakte abgelegt wird (d.h. in die bekannten Dokumentarten importiert wird), sollen die "Postempfänger", d.h. die Personen, die im entsprechenden Eigenschaftsfeld der zugehörigen
|
|
// Akte (Dauerakte, Beratungsakte, ...) hinterlegt sind, eine Benachrichtigung in ihren Postkorb (Kachel "Aufgaben") bekommen. START
|
|
//////////////////////////////////////
|
|
|
|
|
|
if ( true )
|
|
{
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "DDAUE":
|
|
case "DABSC":
|
|
case "DBERA":
|
|
case "DSTEU":
|
|
case "DBETR":
|
|
case "DFIBU":
|
|
case "DLOHN":
|
|
case "DDEBD":
|
|
case "DLSTD":
|
|
case "DKRED":
|
|
|
|
// Die Benachrichtigung soll nur erfolgen, wenn im Feld "Benachrichtigung Postempfänger" (DDF 38) der Wert "Ja" steht:
|
|
if ( doc.field[ 38 ] == "Ja" )
|
|
{
|
|
// Welche Akte gehört zum aktuellen Dokument?
|
|
// Die Akte wird herausgefunden, indem mit der Aktennummer gesucht wird
|
|
|
|
def sqlQuery = "select doku_id from firmen_spezifisch where dok_dat_feld_10 = '" + doc.field[ 10 ] + "' and kue_dokuart in ( 'ADAUR', 'AAURE', 'ABERB', 'ABETR', 'AFIBA', 'AJAAA', 'ALOJA', 'ALBSA', 'ASTEU' )";
|
|
|
|
def resultRows = d3.sql.executeAndGet( (String) sqlQuery );
|
|
|
|
d3.log.info( "instert_exit_20: Ermittlung doku_id für Aktennummer: "+ doc.field[ 10 ]); //JFEL: 09.12.22 Erweiterung Loging aufgrund von nicht erstellten Tasks
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
def doku_id = resultRows[0][ "doku_id" ];
|
|
|
|
//d3.log.error( "gefundene Akten-ID " + doku_id );
|
|
|
|
def akte = d3.archive.getDocument( doku_id );
|
|
|
|
def username;
|
|
|
|
ArrayList<String> empfaenger = new ArrayList<>();
|
|
empfaenger = [];
|
|
|
|
def server_kuerzel = d3.config.value( "d3fc_server_id" );
|
|
def repo_id, baseUri, authUsr;
|
|
|
|
|
|
switch ( server_kuerzel )
|
|
{
|
|
case "T":
|
|
repo_id = "b3be8a21-9cc1-5079-8dac-1c719ac7f80f";
|
|
baseUri = "https://d3one-test.kleeberg.kleeberg.de/";
|
|
authUsr = "t4HPtO8zLfxYVu0LylFG9dVvxc6b5sBV+P1YMt6GtKx7IxoKPQO0UWsh8ch6+MPGiCfUIn4MVwhvj6SSAiKDe83vl0MbtbG4xB/Igl6ilLg=&_z_A0V5ayCQyduqJQXU6c1T8QPL7tAJUPapw4J4uxsq_6e6a8timZXZmTwaqCcqcIoecor7zzqzpY0tCUhlW1L9b3Hsxgtdw";
|
|
break;
|
|
case "P":
|
|
repo_id = "7b813cf7-9909-54ba-a333-f62d302fdfdc";
|
|
baseUri = "https://d3one.kleeberg.kleeberg.de/";
|
|
authUsr = "XEnvA6iv1JlaMuWBut1oiG1sGb88zZVtlgclIzrfPnD9haZ6s+NzZEMIUPc5W4tMQarJ0N4BI1WLlCWeHvrfp8JXbflWNZMDq12iXux2lxM=&_z_A0V5ayCQKwVv9K-Z0eIw5kCzeLaJAoOxpj1fw6px159gyZQadH2d8uhawpnegUH6CDD0pisvF_lyf3Ks9qINLrPd_K263";
|
|
break;
|
|
}
|
|
|
|
//JFEL 06.05.2022: Anpassung zum Test der Performance
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
//for ( int i = 1 ; i < 10; i++ )
|
|
{
|
|
// Iterieren über die gefundenen Benutzer:
|
|
|
|
if ( akte.field[ 60 ][ i ] )
|
|
{
|
|
|
|
username = getUserIdpId( d3, akte.field[ 60 ][ i ].substring( akte.field[ 60 ][ i ].indexOf ( "(" ) + 1, akte.field[ 60 ][ i ].indexOf( ")" ) ), repo_id, baseUri, authUsr );
|
|
|
|
empfaenger.push( username );
|
|
|
|
//d3.log.error( "insert_exit_20: Task für Username "+ username); //JFEL: 09.12.22 Erweiterung Loging aufgrund von nicht erstellten Tasks
|
|
|
|
def e = createTask( d3, user, docTypeShort, doc, "ND " + doc.field[ 10 ] + " / " + doc.field[ 6 ], "Zur Kenntnisnahme: Es wurde ein neues Dokument in die Akte " + doc.field[ 10 ] + " des Mandanten " + doc.field[ 2 ] + "/" + doc.field[ 1 ] + " importiert.", empfaenger, baseUri, authUsr, repo_id );
|
|
|
|
empfaenger.remove( username );
|
|
}
|
|
else
|
|
{
|
|
//break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Wenn ein Dokument in der Mandantenakte abgelegt wird (d.h. in die bekannten Dokumentarten importiert wird), sollen die "Postempfänger", d.h. die Personen, die im entsprechenden Eigenschaftsfeld der zugehörigen
|
|
// Akte (Dauerakte, Beratungsakte, ...) hinterlegt sind, eine Benachrichtigung in ihren Postkorb (Kachel "Aufgaben") bekommen. ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Wenn ein Dokument in der Mandantenakte abgelegt wird (d.h. in die bekannten Dokumentarten importiert wird), soll geprüft werden, ob das Dokument noch an weitere Stellen verknüpft werden soll - diese
|
|
// Verknüpfungen sollen dann erzeugt werden START
|
|
//////////////////////////////////////
|
|
|
|
|
|
if ( true )
|
|
{
|
|
switch ( docTypeShort.id )
|
|
{
|
|
case "DDAUE":
|
|
case "DABSC":
|
|
case "DBERA":
|
|
case "DSTEU":
|
|
case "DBETR":
|
|
case "DFIBU":
|
|
case "DLOHN":
|
|
case "DDEBD":
|
|
case "DLSTD":
|
|
case "DKRED":
|
|
if ( doc.field[ 48 ] )
|
|
{
|
|
// Unique-ID ist gesetzt => prüfe, ob das Dokument verknüpft werden soll:
|
|
|
|
//def STATEMENT = "select doku_id_target_fol from mig_link_docs where Unique_ID_DOC = '" + doc.field[ 48 ] + "'";
|
|
|
|
def STATEMENT = "select firmen_spezifisch.doku_id doku_id_target_fol from mig_link_docs_2 left join firmen_spezifisch on firmen_spezifisch.dok_dat_feld_10 = mig_link_docs_2.ddf10 \
|
|
where mig_link_docs_2.Unique_ID_Doc = '" + doc.field[ 48 ] + "' \
|
|
and mig_link_docs_2.ddf10 = firmen_spezifisch.dok_dat_feld_10 \
|
|
and mig_link_docs_2.DDF3 = firmen_spezifisch.dok_dat_feld_3 \
|
|
and (mig_link_docs_2.DDF4 = firmen_spezifisch.dok_dat_feld_4 or (mig_link_docs_2.DDF4 is null and firmen_spezifisch.dok_dat_feld_4 is null)) \
|
|
and (mig_link_docs_2.DDF23 = firmen_spezifisch.dok_dat_feld_23 or (mig_link_docs_2.DDF23 is null and firmen_spezifisch.dok_dat_feld_23 is null)) \
|
|
and (mig_link_docs_2.DDF17 = firmen_spezifisch.dok_dat_feld_17 or (mig_link_docs_2.DDF17 is null and firmen_spezifisch.dok_dat_feld_17 is null)) \
|
|
and (mig_link_docs_2.DDF32 = firmen_spezifisch.dok_dat_feld_32 or (mig_link_docs_2.DDF32 is null and firmen_spezifisch.dok_dat_feld_32 is null)) \
|
|
and ( firmen_spezifisch.doku_id != '" + doc.id + "') \
|
|
and (firmen_spezifisch.kue_dokuart like 'A%') \
|
|
order by doku_id";
|
|
|
|
//d3.log.error( STATEMENT );
|
|
|
|
def verknuepf_akten = d3.sql.executeAndGet( (String) STATEMENT );
|
|
|
|
if ( verknuepf_akten.size() > 0 )
|
|
{
|
|
verknuepf_akten.each
|
|
{
|
|
//def ergebnis = d3.call.link_documents( it.doku_id_target_fol, doc.id, "Master", false, false );
|
|
|
|
def insSTATEMENT = "insert into mig_multi_link_work (doku_id_father, doku_id_child) values ('" + it.doku_id_target_fol + "', '" + doc.id + "');";
|
|
|
|
def insERG = d3.sql.execute( (String) insSTATEMENT );
|
|
|
|
//xlog( d3, 2, insERG );
|
|
|
|
if ( insERG != 1 )
|
|
{
|
|
xlog( d3, 2, "Es gab ein Problem beim Vorbereiten der Aktenverknuepfung zwischen [" + it.doku_id_target_fol + "] (Vater) und [" + doc.id + "] (Kind)." );
|
|
}
|
|
|
|
//if ( ergebnis != 0 )
|
|
//{
|
|
// xlog( d3, 2, "Herstellen der zusaetzlichen Aktenverknuepfung zwischen Parent-Dok-ID [" + it.doku_id_target_fol + "] und Child-Dok-ID [" + doc.id + "] ist gescheitert: RC [" + ergebnis + "]" );
|
|
//}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Wenn ein Dokument in der Mandantenakte abgelegt wird (d.h. in die bekannten Dokumentarten importiert wird), soll geprüft werden, ob das Dokument noch an weitere Stellen verknüpft werden soll - diese
|
|
// Verknüpfungen sollen dann erzeugt werden ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Festhalten des Importzeitpunktes für Dokumente / Akten START
|
|
//////////////////////////////////////
|
|
|
|
doclog( d3, 4, "Import Dokument [" + doc.id + "] Dokumentart [" + docTypeShort.id + "] " );
|
|
|
|
//////////////////////////////////////
|
|
// Festhalten des Importzeitpunktes für Dokumente / Akten ENDE
|
|
//////////////////////////////////////
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
@Entrypoint( entrypoint = "hook_validate_import_entry_10" )
|
|
public int hookValidateImportEntry10( D3Interface d3, User user, DocumentType docType, Document doc, String nextcall )
|
|
{
|
|
d3.log.info("START | hookValidateImportEntry10 ");
|
|
d3.log.info("ENDE | hookValidateImportEntry10 ");
|
|
return 0;
|
|
}
|
|
|
|
|
|
@Entrypoint(entrypoint="hook_link_entry_30")
|
|
public int linkEntry30 ( D3Interface d3, Document docFather, Document docChild )
|
|
{
|
|
//d3.log.info("START | linkEntry30 ");
|
|
// Unterhalb der angegebenen Akten sollen keine Dokumente verknüpft werden können:
|
|
|
|
// Die Prüfung wird nur durchgeführt, wenn das Dokument noch nicht verknüpft ist - nach der ersten Verknüpfung, die zwingend in der korrekten Akte erfolgen muss,
|
|
// sind weitere Verknüpfungen wohin auch immer erlaubt.
|
|
|
|
def ergebnis = d3.call.link_get_parents( docChild.id, "Master" );
|
|
|
|
//d3.log.info("linkEntry30 Anzahl Elternelemente: " + ergebnis.length );
|
|
|
|
if ( ( ergebnis.length == 0 ) && ( ! docChild.field[ 48 ] ) )
|
|
{
|
|
|
|
switch ( docChild.getType().getId() )
|
|
{
|
|
case "DBERA":
|
|
case "DBETR":
|
|
case "DDAUE":
|
|
case "DDEBD":
|
|
case "DFIBU":
|
|
case "DABSC":
|
|
case "DLOHN":
|
|
case "DLSTD":
|
|
case "DSTEU":
|
|
|
|
switch ( docFather.getType().getId() )
|
|
{
|
|
case "AMAND": // Mandantenakte
|
|
case "ADAUR": // Dauerakte
|
|
case "ASTSA": // Steuer-Sammelakte
|
|
case "ALOSA": // Lohnbuchhaltungs-Sammelakte
|
|
case "AJASA": // Jahresabschluss-Sammelakte
|
|
case "AFBSA": // Finanzbuchhaltungs-Sammelakte
|
|
case "ABPSA": // Betriebsprüfungs-Sammelakte
|
|
case "ABESA": // Beratungs-Sammelakte
|
|
case "ABERB": // Beratungsakte
|
|
case "ABETR": // Betriebspruefungsakte
|
|
case "AFIBA": // Finanzbuchhaltungsakte
|
|
case "AJAAA": // Jahresabschlussakte
|
|
case "ALOJA": // Lohnbuchhaltungs-Jahresakte
|
|
case "ALBSA": // Lohnbuchhaltungsstammdatenakte
|
|
case "ASTEU": // Steuerakte
|
|
|
|
return -1;
|
|
}
|
|
|
|
// Prüfen, ob das Kind-Dokument im richtigen Register abgelegt wurde
|
|
// Jedes beim Kind gefüllte Register (gleich welcher Ebene) muss auch bei der Vaterakte mit dem gleichen Wert gefüllt sein
|
|
|
|
//d3.log.info( docChild.id + " / " + docFather.id + ": Unterschied in DDF 3: " + docChild.field[ 3 ] + "/" + docFather.field[ 3 ] );
|
|
//d3.log.info( docChild.id + " / " + docFather.id + ": Unterschied in DDF 4: " + docChild.field[ 4 ] + "/" + docFather.field[ 4 ] );
|
|
//d3.log.info( docChild.id + " / " + docFather.id + ": Unterschied in DDF 23: " + docChild.field[ 23 ] + "/" + docFather.field[ 23 ] );
|
|
//d3.log.info( docChild.id + " / " + docFather.id + ": Unterschied in DDF 17: " + docChild.field[ 17 ] + "/" + docFather.field[ 17 ] );
|
|
//d3.log.info( docChild.id + " / " + docFather.id + ": Unterschied in DDF 32: " + docChild.field[ 32 ] + "/" + docFather.field[ 32 ] );
|
|
|
|
// Oberregister
|
|
if ( ! ( docChild.field[ 3 ] == docFather.field[ 3 ] ) )
|
|
{
|
|
return -192;
|
|
}
|
|
|
|
// Register
|
|
if ( ! ( docChild.field[ 4 ] == docFather.field[ 4 ] ) )
|
|
{
|
|
return -192;
|
|
}
|
|
|
|
// Unterregister
|
|
if ( ! ( docChild.field[ 23 ] == docFather.field[ 23 ] ) )
|
|
{
|
|
return -192;
|
|
}
|
|
|
|
// 2. Unterregister
|
|
if ( ! ( docChild.field[ 17 ] == docFather.field[ 17 ] ) )
|
|
{
|
|
return -192;
|
|
}
|
|
|
|
// 3. Unterregister
|
|
if ( ! ( docChild.field[ 32 ] == docFather.field[ 32 ] ) )
|
|
{
|
|
return -192;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
@Entrypoint(entrypoint="hook_upd_attrib_entry_20")
|
|
public int upd_attrib_entry_20( D3Interface d3, Document doc, User user, DocumentType docType, DocumentType docTypeNew )
|
|
{
|
|
|
|
|
|
//////////////////////////////////////
|
|
// Prüfen, ob in einem der Benutzerfelder eine E-Mail-Adresse angegeben wurde. Ist das der Fall, so wird der entsprechende Benutzer in der Benutzer-Tabelle gesucht und mit seinem Kürzel eingetragen. START
|
|
//////////////////////////////////////
|
|
|
|
if ( docType.id == "AMAND" )
|
|
{
|
|
|
|
// Hier wird für die Eigenschaft Geschäftsführer aus der Tribus-Schnittstelle das DDF45 gefüllt. Benutzt wird in der Akte das Feld 25. Gemacht wird diese Brücke, damit sich Änderungen
|
|
// an der Akte im DATEV nicht direkt in Aktenaktualisierungsjobs im d.3 manifestieren. Das gleiche Verfahren wird für den Mandatsverantwortlichen verwendet.
|
|
|
|
|
|
|
|
///////////////////////////////////////////
|
|
// DDF 25 / Geschäftsführer
|
|
///////////////////////////////////////////
|
|
def benutzername = "nicht ermittelbar";
|
|
if ( doc.field[ 45 ] )
|
|
{
|
|
if ( doc.field[ 45 ].indexOf( "@" ) > 0 )
|
|
{
|
|
def sql_STATEMENT = "select realname + ' (' + benutzername + ')' as realbenutzername from benutzer where email = '" + doc.field[ 45 ] + "'";
|
|
|
|
def sql_resultRows = d3.sql.executeAndGet( (String) sql_STATEMENT );
|
|
|
|
if ( sql_resultRows.size() > 0 )
|
|
{
|
|
benutzername = sql_resultRows[ 0 ].realbenutzername;
|
|
}
|
|
}
|
|
}
|
|
doc.field[ 25 ] = benutzername;
|
|
|
|
|
|
///////////////////////////////////////////
|
|
// DDF 37 / Mandatsverantwortlicher
|
|
///////////////////////////////////////////
|
|
benutzername = "nicht ermittelbar";
|
|
if ( doc.field[ 44 ] )
|
|
{
|
|
if ( doc.field[ 44 ].indexOf( "@" ) > 0 )
|
|
{
|
|
def sql_STATEMENT = "select realname + ' (' + benutzername + ')' as realbenutzername from benutzer where email = '" + doc.field[ 44 ] + "'";
|
|
|
|
def sql_resultRows = d3.sql.executeAndGet( (String) sql_STATEMENT );
|
|
|
|
if ( sql_resultRows.size() > 0 )
|
|
{
|
|
benutzername = sql_resultRows[ 0 ].realbenutzername;
|
|
}
|
|
}
|
|
}
|
|
doc.field[ 37 ] = benutzername;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
//////////////////////////////////////
|
|
// Prüfen, ob in einem der Benutzerfelder eine E-Mail-Adresse angegeben wurde. Ist das der Fall, so wird der entsprechende Benutzer in der Benutzer-Tabelle gesucht und mit seinem Kürzel eingetragen. ENDE
|
|
//////////////////////////////////////
|
|
|
|
////////////////////////////
|
|
// Grundstücke sollen nur bei Dauerregisterakten angelegt werden können, wenn das Register "04.01 Grundstücke" ist START
|
|
////////////////////////////
|
|
|
|
|
|
|
|
if ( docType.id == "AREGS" )
|
|
{
|
|
// Prüfen, ob die Eigenschaft Grundstücke Werte enthält
|
|
def gefunden = false;
|
|
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
{
|
|
if ( doc.field[ 68 ][ i ] )
|
|
{
|
|
gefunden = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if ( ( gefunden ) && ( doc.field[ 4 ].substring( 0, 13 ) != "04.01 Grundst" ) )
|
|
{
|
|
d3.log.info( "Grundstücke sind nur bei Daueraktenregisterakten mit dem Register '04.01 Grundstücke' anlegbar!" );
|
|
return -177;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////
|
|
// Grundstücke sollen nur bei Dauerregisterakten angelegt werden können, wenn das Register "04.01 Grundstücke" ist ENDE
|
|
////////////////////////////
|
|
|
|
|
|
////////////////////////////
|
|
// Vererben von Berechtigungen von einer Hauptakte (Dauerakte, Beratungsakte etc.) auf untergeordnete Akten + Dokumente START
|
|
////////////////////////////
|
|
|
|
if ( false ) // Logik ist ausgeschaltet
|
|
{
|
|
|
|
switch ( docTypeNew.id )
|
|
{
|
|
// Ausgangsrechnungsakte:
|
|
case "AAURE":
|
|
case "AAURR":
|
|
case "AAURA":
|
|
case "AAURU":
|
|
case "AAUR2":
|
|
// Beratungsakte:
|
|
case "ABERB":
|
|
case "ABERO":
|
|
case "ABERA":
|
|
case "ABEUR":
|
|
case "ABEU2":
|
|
// Betriebsprüfungsakte:
|
|
case "ABETR":
|
|
case "ABEOR":
|
|
case "ABEPA":
|
|
case "ABPUR":
|
|
case "ABPU2":
|
|
// Dauerakte:
|
|
case "ADAUR":
|
|
case "AOREG":
|
|
case "AREGS":
|
|
case "AUREG":
|
|
case "AURG2":
|
|
// Finanzbuchhaltungsakte:
|
|
case "AFIBA":
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
case "AFIUR":
|
|
case "AFIU2":
|
|
// Jahresabschlussakte:
|
|
case "AJAAA":
|
|
case "AJAOB":
|
|
case "AJAAB":
|
|
case "AJAUR":
|
|
case "AJAU2":
|
|
// Lohnbuchhaltungjahresakte:
|
|
case "ALOJA":
|
|
case "ALBOR":
|
|
case "ALBRE":
|
|
case "ALJUR":
|
|
case "ALJR2":
|
|
// Lohnbuchhaltungsstammdate:
|
|
case "ALBSA":
|
|
case "ALBSO":
|
|
case "ALORE":
|
|
case "ALOUR":
|
|
case "ALBU2":
|
|
// Steuerakte:
|
|
case "ASTEU":
|
|
case "ASTOR":
|
|
case "ASTRA":
|
|
case "ASTUR":
|
|
case "ASTU2":
|
|
|
|
// Kreditorakte:
|
|
case "AKRED":
|
|
case "AKROR":
|
|
case "AKRER":
|
|
case "AKREU":
|
|
case "AKRU2":
|
|
|
|
// Eigenverwaltungsakte:
|
|
case "AEVAK":
|
|
case "AEVOR":
|
|
case "AEVRE":
|
|
|
|
|
|
// Untergeordnete Akten/Dokumente ermitteln
|
|
def unterdoks = d3.call.link_get_children( doc.id, "Master" );
|
|
|
|
unterdoks.each
|
|
{
|
|
|
|
def currentDoc = d3.archive.getDocument( it );
|
|
|
|
if ( currentDoc.field[ 10 ] == doc.field[ 10 ] )
|
|
{
|
|
//xlog( d3, 1, "Dokument: " + it );
|
|
|
|
// Übernahme des Briefkopfs, falls beim Kind leer. Sollte eigentlich nicht notwendig sein, da Pflichtfeld. Im Testsystem gibt es aber auch
|
|
// Akten, bei denen nachträglich als Pflichtfeld definierte Felder leer sind - das Feld Briefkopf ist so ein Fall.
|
|
if ( ! currentDoc.field[ 42 ] )
|
|
{
|
|
//currentDoc.field[ 42 ] = doc.field[ 42 ];
|
|
}
|
|
|
|
if ( ! currentDoc.field[ 42 ] )
|
|
{
|
|
//currentDoc.field[ 42 ] = "Kleeberg";
|
|
}
|
|
|
|
//JFEL 06.05.2022: Test der Performance mit weniger Werten beim Schleifendurchlauf
|
|
//for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
//xlog( d3, 3, "(hook_upd_attrib_entry_20) Berechtigungen aktualisieren bei Dokument " + it + " Beginn" );
|
|
//for ( int i = 1 ; i < 10 ; i++ )
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
{
|
|
if ( ! doc.field[ 69 ][ i ] )
|
|
{
|
|
//break;
|
|
}
|
|
|
|
currentDoc.field[ 69 ][ i ] = doc.field[ 69 ][ i ];
|
|
}
|
|
//xlog( d3, 3, "(hook_upd_attrib_entry_20) Berechtigungen aktualisieren bei Dokument " + it + " Ende" );
|
|
|
|
// Diese Felder müssen ebenfalls gesetzt werden, damit die Aktualisierung der untergeordneten Dokumente/Akten in jedem Fall funktioniert:
|
|
//currentDoc.field[ 2 ] = doc.field[ 2 ]; // Mandantname
|
|
//currentDoc.field[ 13 ] = doc.field[ 13 ]; // Mandantgruppennummer
|
|
//currentDoc.field[ 21 ] = doc.field[ 21 ]; // Aktenname
|
|
|
|
currentDoc.updateAttributes( "Master" );
|
|
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
////////////////////////////
|
|
// Vererben von Berechtigungen von einer Hauptakte (Dauerakte, Beratungsakte etc.) auf untergeordnete Akten + Dokumente ENDE
|
|
////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
@Entrypoint( entrypoint = "hook_link_exit_10" )
|
|
public int hook_link_exit_10 ( D3Interface d3, Document docFather, Document docChild, Integer errorCode )
|
|
{
|
|
//xlog( d3, 3, "(hook_link_exit_10) Berechtigungen aktualisieren bei Dokument " + docChild.id );
|
|
|
|
////////////////////////////
|
|
// Vererben von Berechtigungen von einer Hauptakte (Dauerakte, Beratungsakte etc.) auf untergeordnete Akten + Dokumente START
|
|
////////////////////////////
|
|
|
|
// Ist der Vater eine Akte aus der Mandantenakte/Kreditorenakte, dann vererbe der Vater die Berechtigungen (DDF69) an das Kind (neue Dokument/Akte).
|
|
|
|
if ( false )
|
|
{
|
|
switch ( docFather.getType().id )
|
|
{
|
|
// Ausgangsrechnungsakte:
|
|
case "AAURE":
|
|
case "AAURR":
|
|
case "AAURA":
|
|
case "AAURU":
|
|
case "AAUR2":
|
|
// Beratungsakte:
|
|
case "ABERB":
|
|
case "ABERO":
|
|
case "ABERA":
|
|
case "ABEUR":
|
|
case "ABEU2":
|
|
// Betriebsprüfungsakte:
|
|
case "ABETR":
|
|
case "ABEOR":
|
|
case "ABEPA":
|
|
case "ABPUR":
|
|
case "ABPU2":
|
|
// Dauerakte:
|
|
case "ADAUR":
|
|
case "AOREG":
|
|
case "AREGS":
|
|
case "AUREG":
|
|
case "AURG2":
|
|
// Finanzbuchhaltungsakte:
|
|
case "AFIBA":
|
|
case "AFIOR":
|
|
case "AFIRA":
|
|
case "AFIUR":
|
|
case "AFIU2":
|
|
// Jahresabschlussakte:
|
|
case "AJAAA":
|
|
case "AJAOB":
|
|
case "AJAAB":
|
|
case "AJAUR":
|
|
case "AJAU2":
|
|
// Lohnbuchhaltungjahresakte:
|
|
case "ALOJA":
|
|
case "ALBOR":
|
|
case "ALBRE":
|
|
case "ALJUR":
|
|
case "ALJR2":
|
|
// Lohnbuchhaltungsstammdate:
|
|
case "ALBSA":
|
|
case "ALBSO":
|
|
case "ALORE":
|
|
case "ALOUR":
|
|
case "ALBU2":
|
|
// Steuerakte:
|
|
case "ASTEU":
|
|
case "ASTOR":
|
|
case "ASTRA":
|
|
case "ASTUR":
|
|
case "ASTU2":
|
|
// Kreditorenakte:
|
|
case "AKRED":
|
|
case "AKROR":
|
|
case "AKRER":
|
|
case "AKREU":
|
|
case "AKRU2":
|
|
// Eigenverwaltungsakte:
|
|
case "AEVAK":
|
|
case "AEVOR":
|
|
case "AEVRE":
|
|
|
|
if ( docChild.field[ 10 ] == docFather.field[ 10 ] )
|
|
{
|
|
//JFEL 06.05.2022 Anpassung zum Test der Performance
|
|
//for ( int i = 1 ; i < 10 ; i++ )
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
{
|
|
if ( ! docFather.field[ 69 ][ i ] )
|
|
{
|
|
break;
|
|
}
|
|
|
|
docChild.field[ 69 ][ i ] = docFather.field[ 69 ][ i ];
|
|
}
|
|
|
|
docChild.updateAttributes( "Master" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
////////////////////////////
|
|
// Vererben von Berechtigungen auf Hauptakte (Dauerakte, Beratungsakte etc.) auf untergeordnete Akten + Dokumente ENDE
|
|
////////////////////////////
|
|
|
|
|
|
////////////////////////////
|
|
// Feststellen, wo das Dokument überall verknüpft ist und Eintragen dieser Verknüpfungen in verschiedene 60er-Felder START
|
|
////////////////////////////
|
|
|
|
switch ( docChild.getType().id )
|
|
{
|
|
case "DBERA":
|
|
case "DBETR":
|
|
case "DDAUE":
|
|
case "DDEBD":
|
|
case "DFIBU":
|
|
case "DABSC":
|
|
case "DLOHN":
|
|
case "DLSTD":
|
|
case "DSTEU":
|
|
def ueberdoks = d3.call.link_get_parents( docChild.id, "Master" );
|
|
|
|
def ziel_dok_ids = "";
|
|
|
|
ueberdoks.each
|
|
{
|
|
xlog( d3, 4, " Kind: " + docChild.id + " Elternelement: " + it );
|
|
|
|
ziel_dok_ids = ziel_dok_ids + "'" + it + "',";
|
|
}
|
|
ziel_dok_ids = ziel_dok_ids.substring( 0, ziel_dok_ids.length( ) - 1 );
|
|
|
|
xlog( d3, 2, "Ziel-Dok_IDs: " + ziel_dok_ids );
|
|
|
|
def STATEMENT = "select dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_10, dok_dat_feld_13, dok_dat_feld_21 from firmen_spezifisch where doku_id in ( " + ziel_dok_ids + " ) ";
|
|
|
|
def resultRows = d3.sql.executeAndGet( STATEMENT );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
// Schreiben der Verknüpfungen an das Dokument:
|
|
|
|
def currentDoc = d3.archive.getDocument( docChild.id );
|
|
|
|
// Die Felder werden vor dem Füllen geleert, damit - für den Fall, dass weniger neue Werte reingeschrieben werden als vorher drin waren - keine
|
|
// deplazierten Restwerte in den Feldern stehen bleiben. (Könnte man vielleicht auch eleganter lösen.)
|
|
// Felder leeren:
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
{
|
|
currentDoc.field[ 60 ][ i ] = ""; // Mandantennamen
|
|
currentDoc.field[ 61 ][ i ] = ""; // Mandantennummern
|
|
currentDoc.field[ 62 ][ i ] = ""; // Mandantengruppennummern
|
|
currentDoc.field[ 63 ][ i ] = ""; // Aktennamen
|
|
currentDoc.field[ 64 ][ i ] = ""; // Aktennummern
|
|
}
|
|
|
|
// Jetzt Felder füllen mit den gefundenen Werten:
|
|
for ( int j = 1 ; j <= resultRows.size(); j++ )
|
|
{
|
|
currentDoc.field[ 60 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_2; // Mandantennamen
|
|
currentDoc.field[ 61 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_1; // Mandantennummern
|
|
currentDoc.field[ 62 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_13; // Mandantengruppennummern
|
|
currentDoc.field[ 63 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_21; // Aktennamen
|
|
currentDoc.field[ 64 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_10; // Aktennummern
|
|
}
|
|
|
|
currentDoc.updateAttributes( "Master" );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
////////////////////////////
|
|
// Feststellen, wo das Dokument überall verknüpft ist und Eintragen dieser Verknüpfungen in verschiedene 60er-Felder ENDE
|
|
////////////////////////////
|
|
|
|
|
|
|
|
//xlog( d3, 4, "1 *********************************************************" );
|
|
//xlog( d3, 4, "hook_link_exit_10: " + docFather.id + " / " + docFather.getType().id + " => " + docChild.id + " / " + docChild.getType().id + " ENDE " );
|
|
//xlog( d3, 4, "Mandatenakte " + docChild.field[ 1 ] + " / " + docChild.field[ 2 ] );
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
@Entrypoint( entrypoint = "hook_unlink_exit_10" )
|
|
public int hookUnlinkExit10(D3Interface d3, Document docFather, Document docChild, Integer unlinkErrorCode, Integer errorCode) {
|
|
d3.log.error("START | hookUnlinkExit10 ");
|
|
|
|
////////////////////////////
|
|
// Löschen von Berechtigungseinträgen bei Dokumenten, wenn diese aus Akten entfernt werden START
|
|
////////////////////////////
|
|
|
|
|
|
switch ( docChild.getType().id )
|
|
{
|
|
case "DBERA":
|
|
case "DBETR":
|
|
case "DDAUE":
|
|
case "DDEBD":
|
|
case "DFIBU":
|
|
case "DABSC":
|
|
case "DLOHN":
|
|
case "DLSTD":
|
|
case "DSTEU":
|
|
def ueberdoks = d3.call.link_get_parents( docChild.id, "Master" );
|
|
|
|
def ziel_dok_ids = "";
|
|
|
|
ueberdoks.each
|
|
{
|
|
xlog( d3, 4, " Kind: " + docChild.id + " Elternelement: " + it );
|
|
|
|
ziel_dok_ids = ziel_dok_ids + "'" + it + "',";
|
|
}
|
|
ziel_dok_ids = ziel_dok_ids.substring( 0, ziel_dok_ids.length( ) - 1 );
|
|
|
|
xlog( d3, 4, "Ziel-Dok_IDs: " + ziel_dok_ids );
|
|
|
|
def STATEMENT = "select dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_10, dok_dat_feld_13, dok_dat_feld_21 from firmen_spezifisch where doku_id in ( " + ziel_dok_ids + " ) ";
|
|
|
|
def resultRows = d3.sql.executeAndGet( STATEMENT );
|
|
|
|
if ( resultRows.size() > 0 )
|
|
{
|
|
// Schreiben der Verknüpfungen an das Dokument:
|
|
|
|
def currentDoc = d3.archive.getDocument( docChild.id );
|
|
|
|
// Die Felder werden vor dem Füllen geleert, damit - für den Fall, dass weniger neue Werte reingeschrieben werden als vorher drin waren - keine
|
|
// deplazierten Restwerte in den Feldern stehen bleiben. (Könnte man vielleicht auch eleganter lösen.)
|
|
// Felder leeren:
|
|
for ( int i = 1 ; i <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); i++ )
|
|
{
|
|
currentDoc.field[ 60 ][ i ] = ""; // Mandantennamen
|
|
currentDoc.field[ 61 ][ i ] = ""; // Mandantennummern
|
|
currentDoc.field[ 62 ][ i ] = ""; // Mandantengruppennummern
|
|
currentDoc.field[ 63 ][ i ] = ""; // Aktennamen
|
|
currentDoc.field[ 64 ][ i ] = ""; // Aktennummern
|
|
}
|
|
|
|
// Jetzt Felder füllen mit den gefundenen Werten:
|
|
for ( int j = 1 ; j <= resultRows.size(); j++ )
|
|
{
|
|
currentDoc.field[ 60 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_2; // Mandantennamen
|
|
currentDoc.field[ 61 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_1; // Mandantennummern
|
|
currentDoc.field[ 62 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_13; // Mandantengruppennummern
|
|
currentDoc.field[ 63 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_21; // Aktennamen
|
|
currentDoc.field[ 64 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_10; // Aktennummern
|
|
}
|
|
|
|
currentDoc.updateAttributes( "Master" );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
////////////////////////////
|
|
// Löschen von Berechtigungseinträgen bei Dokumenten, wenn diese aus Akten entfernt werden ENDE
|
|
////////////////////////////
|
|
|
|
|
|
|
|
|
|
d3.log.error("ENDE | hookUnlinkExit10 ");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static int createTask( D3Interface d3, User user, DocumentType docType, Document doc, String subject, String description, ArrayList<String> assignees, String baseUri, String authUsr, String repo_id )
|
|
{
|
|
//d3.log.info( "createTask !" );
|
|
String assigneesString = "";
|
|
|
|
assignees.each
|
|
{
|
|
assigneesString = assigneesString + "\"${it}\",";
|
|
}
|
|
|
|
if ( assigneesString.length() > 0 )
|
|
{
|
|
assigneesString = assigneesString.substring(0, assigneesString.length()-1);
|
|
}
|
|
|
|
CloseableHttpClient client = HttpClientBuilder.create( ).build( );
|
|
|
|
try
|
|
{
|
|
|
|
UUID uuid = UUID.randomUUID();
|
|
String randomUUIDString = uuid.toString();
|
|
|
|
//Post Task
|
|
HttpPost post = new HttpPost( baseUri + "/task/tasks" );
|
|
|
|
def ddf4;
|
|
if ( doc.field[ 4 ] == null )
|
|
{
|
|
ddf4 = "";
|
|
}
|
|
else
|
|
{
|
|
ddf4 = doc.field[ 4 ];
|
|
}
|
|
|
|
def ddf23;
|
|
if ( doc.field[ 23 ] == null )
|
|
{
|
|
ddf23 = "";
|
|
}
|
|
else
|
|
{
|
|
ddf23 = doc.field[ 23 ];
|
|
}
|
|
|
|
def ddf17;
|
|
if ( doc.field[ 17 ] == null )
|
|
{
|
|
ddf17 = "";
|
|
}
|
|
else
|
|
{
|
|
ddf17 = doc.field[ 17 ];
|
|
}
|
|
|
|
def ddf32;
|
|
if ( doc.field[ 32 ] == null )
|
|
{
|
|
ddf32 = "";
|
|
}
|
|
else
|
|
{
|
|
ddf32 = doc.field[ 32 ];
|
|
}
|
|
|
|
//JSON Inhalt
|
|
|
|
def lJsonString = """{
|
|
"subject" : "${subject}",
|
|
"description" : "${description}",
|
|
"assignees" : [${assigneesString}],
|
|
"correlationKey" : "${randomUUIDString}",
|
|
"context" : {
|
|
"key" : "returnProcess",
|
|
"type" : "process",
|
|
"name" : "Import in Akte"
|
|
},
|
|
"metadata" : [
|
|
{
|
|
"key" : "mandantname",
|
|
"caption" : "__Mandantname",
|
|
"values" : ["${doc.field[2]}"]
|
|
},
|
|
{
|
|
"key" : "aktennummer",
|
|
"caption": "__Aktennummer",
|
|
"values" : ["${doc.field[10]}"]
|
|
},
|
|
{
|
|
"key" : "oberregister",
|
|
"caption" : "_Oberregister",
|
|
"values" : ["${doc.field[3]}"]
|
|
},
|
|
{
|
|
"key" : "register",
|
|
"caption" : "_Register",
|
|
"values" : ["${ddf4}"]
|
|
},
|
|
{
|
|
"key" : "unterregister",
|
|
"caption" : "_Unterregister",
|
|
"values" : ["${ddf23}"]
|
|
},
|
|
{
|
|
"key" : "unterregister2",
|
|
"caption" : "2. Unterregister",
|
|
"values" : ["${ddf17}"]
|
|
},
|
|
{
|
|
"key" : "unterregister3",
|
|
"caption" : "3. Unterregister",
|
|
"values" : ["${ddf32}"]
|
|
}
|
|
],
|
|
"_links" : {
|
|
"attachment" : { "href": "/dms/r/${repo_id}/o2/${doc.id()}"}
|
|
}
|
|
}""";
|
|
|
|
StringEntity params = new StringEntity( lJsonString, StandardCharsets.UTF_8 );
|
|
params.setContentType("application/json");
|
|
|
|
post.addHeader("authorization", "Bearer ${authUsr}");
|
|
post.addHeader("content-type", "application/json");
|
|
post.addHeader("origin", baseUri );
|
|
post.setEntity( params );
|
|
CloseableHttpResponse response = client.execute( post );
|
|
|
|
try
|
|
{
|
|
def statusCode = response.getStatusLine( ).getStatusCode( );
|
|
|
|
if( statusCode != 200 && statusCode != "200" && statusCode != 201 && statusCode != "201" )
|
|
{
|
|
HttpEntity re = response.getEntity();
|
|
def lErrMsg = "createOfficeTaskFinished - Error while trying to create Task! Status Code: " + statusCode + " / Response: " + re.getContent().text;
|
|
d3.log.info( "createOfficeTaskFinished" + "" + lErrMsg + " -> " + lJsonString);
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
response.close();
|
|
}
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
d3.log.error( "createOfficeTaskFinished" + "" + e.getMessage() );
|
|
}
|
|
finally
|
|
{
|
|
client.close();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getUserIdpId( D3Interface d3, String UserName, String repo_id, String baseUri, String authUserApiKey )
|
|
{
|
|
|
|
CloseableHttpClient client = HttpClientBuilder.create( ).build( );
|
|
String userId;
|
|
|
|
try
|
|
{
|
|
//https://d3one-test.kleeberg.kleeberg.de/identityprovider/scim/users?filter=userName%20eq%20kleeberg%5Cdvelop
|
|
HttpGet get = new HttpGet( baseUri + "/identityprovider/scim/users?filter=userName%20eq%20kleeberg%5C" + UserName );
|
|
|
|
//JSON Inhalt
|
|
get.addHeader( "authorization", "Bearer " + authUserApiKey );
|
|
get.addHeader( "origin", baseUri );
|
|
get.addHeader( "Accept", "application/json" );
|
|
|
|
CloseableHttpResponse response = client.execute( get );
|
|
|
|
|
|
|
|
try
|
|
{
|
|
def statusCode = response.getStatusLine( ).getStatusCode( );
|
|
|
|
if( statusCode != 200 && statusCode != 201 ){
|
|
d3.log.error("getUserIdpId -> Error while trying to read user " + UserName + " status code: " + statusCode );
|
|
|
|
HttpEntity re = response.getEntity();
|
|
InputStream errStream = re.getContent();
|
|
String errContent = "";
|
|
|
|
if( errStream != null && errStream.available() > 0 ){
|
|
errContent = IOUtils.toString(errStream, StandardCharsets.UTF_8);
|
|
}
|
|
|
|
d3.log.error("getUserIdpId -> Error while trying to read user " + UserName + " response line: " + errContent);
|
|
|
|
return "";
|
|
}
|
|
|
|
HttpEntity entity = response.getEntity( );
|
|
|
|
String json = EntityUtils.toString( entity, StandardCharsets.UTF_8 );
|
|
|
|
def jsonSlurper = new JsonSlurper();
|
|
|
|
def returnwert = jsonSlurper.parseText( json );
|
|
|
|
userId = returnwert.resources.id[ 0 ];
|
|
|
|
|
|
}
|
|
finally
|
|
{
|
|
response.close();
|
|
}
|
|
}
|
|
catch ( IOException e )
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
finally
|
|
{
|
|
try
|
|
{
|
|
client.close();
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
return userId;
|
|
|
|
}
|
|
|
|
|
|
public int xlog( D3Interface d3, int loglevel, String logtext )
|
|
{
|
|
def logdatei = "d:\\d3\\apps\\d3log.txt";
|
|
def g_loglevel = 5;
|
|
def g_logdirect = "BEIDE"; // BEIDE oder D3LOG oder DATEI
|
|
def date = new Date();
|
|
def zeitstempel = date.format( "yyyy.MM.dd HH:mm:ss", TimeZone.getTimeZone('CET') );
|
|
def loglevel_lang = "[INFO ]";
|
|
|
|
|
|
|
|
|
|
|
|
if ( loglevel <= g_loglevel )
|
|
{
|
|
switch ( loglevel )
|
|
{
|
|
case 1:
|
|
loglevel_lang = "[FATAL]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.critical( logtext );
|
|
}
|
|
break;
|
|
case 2:
|
|
loglevel_lang = "[ERROR]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.error( logtext );
|
|
}
|
|
break;
|
|
case 3:
|
|
loglevel_lang = "[WARN ]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.warn( logtext );
|
|
}
|
|
break;
|
|
case 4:
|
|
loglevel_lang = "[INFO ]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.info( logtext );
|
|
}
|
|
break;
|
|
case 5:
|
|
loglevel_lang = "[DEBUG]";
|
|
// Da die d.3 Server i.d.R. nicht im Debug-Modus laufen, erscheinen DEBUG-Meldungen nicht im Log.
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.debug( logtext );
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if ( ( g_logdirect == "DATEI" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
new File( logdatei ).append( zeitstempel + " " + loglevel_lang + " " + logtext + "\n", "UTF8" );
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
public int doclog( D3Interface d3, int loglevel, String logtext )
|
|
{
|
|
def logdatei = "d:\\d3\\apps\\doc_import_zeitpunkte.txt";
|
|
def g_loglevel = 5;
|
|
def g_logdirect = "BEIDE"; // BEIDE oder D3LOG oder DATEI
|
|
def date = new Date();
|
|
def zeitstempel = date.format( "yyyy.MM.dd HH:mm:ss", TimeZone.getTimeZone('CET') );
|
|
def loglevel_lang = "[INFO ]";
|
|
|
|
|
|
|
|
|
|
|
|
if ( loglevel <= g_loglevel )
|
|
{
|
|
switch ( loglevel )
|
|
{
|
|
case 1:
|
|
loglevel_lang = "[FATAL]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.critical( logtext );
|
|
}
|
|
break;
|
|
case 2:
|
|
loglevel_lang = "[ERROR]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.error( logtext );
|
|
}
|
|
break;
|
|
case 3:
|
|
loglevel_lang = "[WARN ]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.warn( logtext );
|
|
}
|
|
break;
|
|
case 4:
|
|
loglevel_lang = "[INFO ]";
|
|
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.info( logtext );
|
|
}
|
|
break;
|
|
case 5:
|
|
loglevel_lang = "[DEBUG]";
|
|
// Da die d.3 Server i.d.R. nicht im Debug-Modus laufen, erscheinen DEBUG-Meldungen nicht im Log.
|
|
if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
d3.log.debug( logtext );
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if ( ( g_logdirect == "DATEI" ) || ( g_logdirect == "BEIDE" ) )
|
|
{
|
|
new File( logdatei ).append( zeitstempel + " " + loglevel_lang + " " + logtext + "\n", "UTF8" );
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |