/*
 * 为了代码写起来简单，设置为一次最多只能执行一条数据
 * 这个batch是用作更新历史数据使用：
 * 找出来有延期任务的源任务;
 * 找一个源任务是当前源任务的最新延期任务，
 * 把这个延期任务的日报一览和报告一览信息带过来
 * ' and id != \'a3V10000001LYO6\''
' and id != \'a3V10000001Kp2S\''
' and id != \'a3V10000001L7vt\''
' and id != \'a3V10000001KUUb\''
' and id != \'a3V10000000dgSW\''
' and id != \'a3V10000000dXyV\''
' and id != \'a3V10000000dXya\''
 *
 * 
 */
global class modifyInitTaskBatch implements Database.Batchable<sObject> {
    public string taskID;
    global modifyInitTaskBatch(string taskID){
        this.taskID = taskID;
    }
    global modifyInitTaskBatch() {
    }
    // 检索有延期任务的任务，不包括已经因为离职，所以已经关闭的任务
    global Database.QueryLocator start(Database.BatchableContext bc) {
        String query = 'SELECT Id,Name,delayTask__c, Daily_Report__c , Event__c FROM task__c '
            +'where delayTask__c !=null and delayTaskP__c = null '
            + ' and taskStatus__c != \'06 关闭\'';
        if(string.isNotBlank(taskID)){
            query += ' and ID = \'' + taskID + '\'';
        }
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<task__c> tasklist) {
        main(tasklist);
    }
    @TestVisible
    private void main(List<task__c> tasklist){
        // 因为每次只有一个初始任务赋值，所以这里取第一个；
        task__c tempTask = tasklist[0];
        // 预计要更新的任务List
        List<task__c> updateTaskList = new List<task__c>();
        //找所有源任务是当前源任务的延期任务，最新的排在前面
        list<task__c> delayTaskList =
            [select id , Daily_Report__c , Event__c , Daily_Report_Status__c,
             event_Status__c from task__c
             where Initial_Task__c = :tempTask.id
             order by Activity_Date__c desc
             NULLS last];
        if(delayTaskList.size() > 0){
            //找一个源任务是当前源任务的最新延期任务，
            //把它的日报一览和报告一览赋值给当前源任务
            task__c lastTask = delayTaskList[0];
            tempTask.Daily_Report__c =  lastTask.Daily_Report__c;
            tempTask.Event__c =  lastTask.Event__c;
            //如果这个最新的延期任务的报告已经提交申请或者已经被批准
            //那么就照这个这个更新源任务的状态2，
            //如果报告一览的状态没值，那么就更新为完成，
            //如果报告一览的状态有值并且是取消，那么就更新为取消；
            if(lastTask.Daily_Report__c != null &&
               (lastTask.Daily_Report_Status__c.equals('申請中')
                || lastTask.Daily_Report_Status__c.equals('承認'))){
                    if(lastTask.event_Status__c == null){
                        tempTask.taskStatus__c = '03 完成';
                    }else if(lastTask.event_Status__c.equals('取消')){
                        tempTask.taskStatus__c = '04 取消';
                    }
                }
            // 更新这个任务
            update tempTask;
        }
    }
    global void finish(Database.BatchableContext BC) {
    }
}