import com.dvelop.d3.server.Document
import com.dvelop.d3.server.DocumentType
import com.dvelop.d3.server.User
import com.dvelop.d3.server.ValueSet
import com.dvelop.d3.server.Validation
import com.dvelop.d3.server.core.D3
import com.dvelop.d3.server.core.D3Interface
import com.dvelop.d3.server.exceptions.SQLException
import com.dvelop.d3.server.exceptions.D3Exception
import java.lang.annotation.*
import java.sql.SQLWarning;
import java.sql.Timestamp
 
 
/*
Script for updating documents
*/
 
// #################################################################################
// Configuration
// #################################################################################
def documentTypes   = "('DDRA2', 'XXXXX')" // Document types, syntax like sql "where in "
def oldValue        = "AVEVA"           // Existing value in the defined categories
def newValue        = "AVEVA"           // Value to update
int dbPos           = 33                // DB Position, TODO: Extend for mutli value fields, currently only for DB-Position 1 - 49
def updateCount     = "1000"            // Limit the number of documents to be updated - for testing
 
def LogFilePath          = "D:\\d3logs\\updateDocuments.log"
def ErrorLogFilePath     = "D:\\d3logs\\updateDocumentsError.log"
 
def logOnly         = "0"                  // 1 = Only write document ids to logfile
def apiUser         = "d3_hook"            // User for api calls
boolean noHooks     = true                 // Enable / disable update hooks
 
// #################################################################################
// End Configuration
// #################################################################################
 
d3.log.info("Start to update documents " + documentTypes)
d3.log.info("Old Value: " + oldValue)
d3.log.info("New Value: " + newValue)
 
def LogFile      = new File(LogFilePath)
def ErrorLogFile = new File(ErrorLogFilePath)
LogFile.append("\n\rStart Update documents.")
 
int countUpdated = 0
int countUpdateError = 0
 
// Define SQL Query
def sqlQuery = "select top ${updateCount} doku_id from firmen_spezifisch where kue_dokuart in" + documentTypes + " and dok_dat_feld_$dbPos = '${oldValue}'"
 
def resultset = d3.sql.executeAndGet(sqlQuery)
if (resultset.size() > 0)
{
    d3.log.info (resultset.size() + " documents found to update.")
    LogFile.append("\n\r" + resultset.size() + " documents found to update.")
     
    // Iterate through results
    resultset.each
    {
        if (logOnly == "1")
        {
           LogFile.append("\n" + it.get("doku_id"))
           countUpdated++
        }
        else
        {
           try
           {
              Document currentDoc = d3.archive.getDocument(it.get("doku_id"), apiUser)
              currentDoc.field[dbPos] = newValue
              currentDoc.updateAttributes(apiUser, noHooks)
              LogFile.append("\n" + it.get("doku_id"))
              countUpdated++
           }
           catch (Exception e)
           {
              d3.log.error ("Update documents: Error " + e + " in script!")
              ErrorLogFile.append("\n" + e)
              countUpdateError++
           }
        }
         
        if (countUpdated % 100 == 0)
        {
            d3.log.info(countUpdated + " documents updated")
        }
    }
     
    d3.log.info(countUpdated + " documents updated")
    LogFile.append("\n\r" + countUpdated + " documents updated")
    d3.log.info(countUpdateError + " documents with error")
    LogFile.append("\n\r" + countUpdateError + " documents with error")
}