// Das Skript prueft die Felder
// - Erinnerungsdatum
// - Erinnerung an
// - Erinnerung verschickt
// und sendet abhaengig hiervon Erinnerungen an die hinterlegten Benutzer
 
// Importe
import groovy.sql.GroovyRowResult
import groovy.json.JsonOutput;
import groovy.json.JsonSlurper;
import com.dvelop.d3.server.exceptions.SQLException
import com.dvelop.d3.server.Document
import com.dvelop.d3.server.DocumentType
import com.dvelop.d3.server.core.D3Interface
 
import javax.net.ssl.HttpsURLConnection;
import java.text.SimpleDateFormat
  
 // #################################################################################
// Konfigurationsbereich
// #################################################################################
String versandModus               = "1"      // 0 = Keine Erinnerungen verschicken, nur Logs ausgeben, 1 = Erinnerungen verschicken
 
int repoIdErinnerungVerschickt    = 97
int repoIdErinnerungAn            = 98
int repoIdErinnerungsdatum        = 99
 
int dbPosErinnerungVerschickt     = 33
int dbPosErinnerungAn             = 34
int dbPosErinnerungsdatum         = 58
 
String apiServiceUser             = "D3APIServi"
 
String baseURi                    = "https://meinHost.meineDomain.de"
String repoId                     = "xxx"
String ServiceAPIKey              = "xxx"
 
// #################################################################################
// Ende Konfigurationsbereich
// #################################################################################
 
try{
     
    d3.log.info("Starte Skript TH_sendReminder");
    d3.log.info("Ermittle Dokumente zur Erinnerung")
     
    // Dokumente suchen, fuer die noch keine Erinnerung verschickt wurde
    // Und dessen Erinnerungsdatum in der Vergangenheit liegt
    def sqlQuery = """select doku_id, dok_dat_feld_$dbPosErinnerungAn as ErinnerungAn
                        from firmen_spezifisch
                        where dok_dat_feld_$dbPosErinnerungAn is not null and dok_dat_feld_$dbPosErinnerungsdatum is not null and dok_dat_feld_$dbPosErinnerungVerschickt is null
                        and kue_dokuart in (
                            select kue_dokuart from fispe_titel_dokuart
                            where repository_id = ${repoIdErinnerungVerschickt}
                            intersect
                            select kue_dokuart from fispe_titel_dokuart
                            where repository_id = ${repoIdErinnerungAn}
                            intersect
                            select kue_dokuart from fispe_titel_dokuart
                            where repository_id = ${repoIdErinnerungsdatum}
                        )
                        and dok_dat_feld_$dbPosErinnerungsdatum < getdate()"""
                         
    def resultSet =  d3.sql.executeAndGet(sqlQuery)
     
    d3.log.info (resultSet.size() + " Dokumente ermittelt.")
     
    if (resultSet.size() > 0)
    {
         
        // Ergebnis durchlaufen und Erinnerungen verschicken
        resultSet.each
        {
            lDokId      = it.get("doku_id")
            lEmpfaenger = it.get("ErinnerungAn")
             
            if (versandModus == "0")
            {
               d3.log.info ("Nur Test: Erinnerung zu " + it.get("doku_id") + " wuerde an " + it.get("ErinnerungAn") + " verschickt werden.")
            }
            else if (versandModus == "1")
            {
                d3.log.info ("Erinnerung zu " + lDokId + " wird an " + lEmpfaenger + " verschickt.")
                
                //Auslesen der IDP Gruppen IDs
                HttpsURLConnection taskAppRequest = new URL(baseURi + "/task/tasks").openConnection();
                taskAppRequest.setRequestMethod("POST");
                taskAppRequest.setRequestProperty("Origin", baseURi);
                taskAppRequest.setRequestProperty("content-type", "application/json");
                taskAppRequest.setRequestProperty("Authorization", "Bearer " + ServiceAPIKey);
                taskAppRequest.setDoOutput(true);
                 
                //correlationKey zusammensetzen
                UUID uuid = UUID.randomUUID();
                String randomUUIDString = uuid.toString();
                 
                String jsonInputString = """{
                                        "subject" : "Erinnerung zum Dokument",
                                        "description" : "Das Erinnerungsdatum für das anliegende Dokument wurde erreicht.",
                                        "assignees" : [${lEmpfaenger}],
                                        "correlationKey" : ${randomUUIDString},
                                        "context" : {
                                                "key"  : "COMMON",
                                                "type" : "task",
                                                "name" : "Allgemeine Erinnerung"
                                        },
                                        "dmsReferences" : [
                                            {
                                                "repoId" : ${repoId},
                                                "objectId" : ${lDokId}
                                            }
                                        ],
                                        "_links" : {
                                            "attachment" : { "href": "/dms/r/${repoId}/o2/${lDokId}"}
                                        }
                                    }""";
 
                def response = taskAppRequest.getOutputStream().write(jsonInputString.getBytes("UTF-8"));
                 
                response = taskAppRequest.getResponseCode()
                 
                if (response == 200 || response == 201)
                {
                    // Wenn erfolgreich, Feld "Erinnerung verschickt" aktualisieren
                    d3.log.info("Aufgabe erfolgreich angelegt")
                     
                    Document currentDoc = d3.archive.getDocument(lDokId, apiServiceUser)
                     
                    def date = new Date()
                    def dateTime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss")
                    currentDoc.field[dbPosErinnerungVerschickt] = "Verschickt am " + dateTime.format(date)
                     
                    currentDoc.updateAttributes(apiServiceUser, true)
                }
                else
                {
                    d3.log.error("Fehlercode " + response + " bei Anlage der Aufgabe")
                }
            }
        }
    }
     
    d3.log.info("Skript TH_sendReminder erfolgreich beendet.");
}
catch (SQLException e)
{
    d3.log.error ("Dokumente loeschen: Fehler in Script aufgetreten!");
}