/** 
 | 
 * 前提、Eventには、Event__cへの参照Idがあります。 
 | 
 * ここはEvent__cを更新することを禁止 
 | 
 * ①.Event__cを新規更新時、 ==> Eventに 
 | 
 * ②.Event__cにはもしEventへの参照Idがある場合(日報一覧のinit時mappingしたしかない、init時Event__cデータをinsertする) 
 | 
 */ 
 | 
trigger XinEventC2Event on Event__c (after delete, after insert, after update, before insert, before update) { 
 | 
    if (Trigger.isBefore) { 
 | 
        // isSchedule絡みの項目を設定 
 | 
        for (Event__c ec : Trigger.new) { 
 | 
            // isScheduleフラグ設定 
 | 
            if (Trigger.isInsert) { 
 | 
                Date compareDate = null; 
 | 
                if (ec.SyncCreatedDate__c != null && ec.SyncCreatedDate__c < System.now()) { 
 | 
                    compareDate = Date.valueOf(ec.SyncCreatedDate__c); 
 | 
                } else { 
 | 
                    compareDate = Date.valueOf(System.now()); 
 | 
                } 
 | 
                if (ec.ActivityDate__c > compareDate) { 
 | 
                    ec.IsScheduled__c = true; 
 | 
                } 
 | 
            } 
 | 
             
 | 
            if (ec.IsScheduled__c) { 
 | 
                if (Trigger.isInsert) { 
 | 
                    ec.IsScheduled_StartDateTime__c = ec.StartDateTime__c; 
 | 
                    ec.IsScheduled_EndDateTime__c = ec.EndDateTime__c; 
 | 
                    ec.IsScheduled_Location__c = ec.Location__c; 
 | 
                    ec.IsScheduled_Subject__c = ec.Subject__c; 
 | 
                } 
 | 
            } else { 
 | 
                ec.IsScheduled_StartDateTime__c = null; 
 | 
                ec.IsScheduled_EndDateTime__c = null; 
 | 
                ec.IsScheduled_Location__c = null; 
 | 
                ec.IsScheduled_Subject__c = null; 
 | 
            } 
 | 
            if(ec.Subject__c == null || ec.Subject__c == ''){ 
 | 
                ec.Subject__c = ec.Activity_Purpose__c; 
 | 
            } 
 | 
        } 
 | 
    /* 
 | 
    // Account_ID__cとCampaign_ID__cをセット 
 | 
        List<String> accList = new List<String>(); 
 | 
        List<String> campList = new List<String>(); 
 | 
        for (Event__c ec : Trigger.new) { 
 | 
            // 想定:whatidがあれば必ずLocationもある 
 | 
            if (!String.isBlank(ec.whatid__c)) { 
 | 
                if (ec.whatid__c.startsWith('001')) { 
 | 
                    accList.add(ec.Location__c); 
 | 
                } 
 | 
                if (ec.whatid__c.startsWith('701')) { 
 | 
                    campList.add(ec.Location__c); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        // 逆引き 
 | 
        Map<String, List<String>> accMap = new Map<String, List<String>>(); 
 | 
        Map<String, List<String>> campMap = new Map<String, List<String>>(); 
 | 
        if (accList.size() > 0) accMap = ControllerUtil.getAccsByName(accList); 
 | 
        if (campList.size() > 0) campMap = ControllerUtil.getCampsByName(campList); 
 | 
         
 | 
        for (Event__c ec : Trigger.new) { 
 | 
            if (ec.Free_Input__c) { 
 | 
                ec.whatid__c = null; 
 | 
                ec.Account_ID__c = null; 
 | 
                ec.Campaign_ID__c = null; 
 | 
            } else { 
 | 
                if (!String.isBlank(ec.whatid__c)) { 
 | 
                    if (ec.whatid__c.startsWith('001')) { 
 | 
                        // 逆引きの結果は一件のみ、且つその結果はwhatidと同じの場合、対応するIDをセット 
 | 
                        if (accMap.get(ec.Location__c) != null && accMap.get(ec.Location__c).size() == 1 && accMap.get(ec.Location__c).get(0) == ec.whatid__c) { 
 | 
                            ec.Account_ID__c = ec.whatid__c; 
 | 
                            ec.Campaign_ID__c = null; 
 | 
                        } else { 
 | 
                            // add error 
 | 
                        } 
 | 
                    } 
 | 
                    if (ec.whatid__c.startsWith('701')) { 
 | 
                        // 逆引きの結果は一件のみ、且つその結果はwhatidと同じの場合、対応するIDをセット 
 | 
                        if (campMap.get(ec.Location__c) != null && campMap.get(ec.Location__c).size() == 1 && campMap.get(ec.Location__c).get(0) == ec.whatid__c) { 
 | 
                            ec.Account_ID__c = null; 
 | 
                            ec.Campaign_ID__c = ec.whatid__c; 
 | 
                        } else { 
 | 
                            // add error 
 | 
                        } 
 | 
                    } 
 | 
                } else { 
 | 
                    ec.Account_ID__c = null; 
 | 
                    ec.Campaign_ID__c = null; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
         
 | 
        // メアド設定 
 | 
        List<String> accIds = new List<String>(); 
 | 
        for (Event__c ec : Trigger.new) { 
 | 
            if (Trigger.isInsert 
 | 
                    || Trigger.isUpdate && Trigger.oldMap.get(ec.Id).get('Account_ID__c') != ec.Account_ID__c) { 
 | 
                if (!String.isBlank(ec.Account_ID__c)) accIds.add(ec.Account_ID__c); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        Map<String, Account> BMap = new Map<String, Account>(); 
 | 
        Map<String, Account> SBMap = new Map<String, Account>(); 
 | 
        if (accIds.size() > 0) { 
 | 
            List<Account> accs = ControllerUtil.selectBossMailAddr(accIds); 
 | 
            for (Account acc : accs) { 
 | 
                BMap.put(acc.Id, acc); 
 | 
                SBMap.put(acc.Id, acc); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        for (Event__c ec : Trigger.new) { 
 | 
            if (String.isBlank(ec.Account_ID__c)) { 
 | 
                ec.Boss_Mail__c = null; 
 | 
                ec.Sub_Boss_Mail__c = null; 
 | 
                ec.Boss_Name__c = null; 
 | 
                ec.Sub_Boss_Name__c = null; 
 | 
            } else { 
 | 
                if (BMap.containsKey(ec.Account_ID__c)) { 
 | 
                    Account a = BMap.get(ec.Account_ID__c); 
 | 
                    ec.Boss_Mail__c = Parent.Boss__r.Email; 
 | 
                    ec.Boss_Name__c = Parent.Boss__r.Name; 
 | 
                } 
 | 
                if (SBMap.containsKey(ec.Account_ID__c)) { 
 | 
                    Account a = SBMap.get(ec.Account_ID__c); 
 | 
                    ec.Sub_Boss_Mail__c = Parent.Sub_Boss__r.Email; 
 | 
                    ec.Sub_Boss_Name__c = Parent.Sub_Boss__r.Name; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        */ 
 | 
    // after 
 | 
    } else { 
 | 
         
 | 
        // ------------------------nextEvent処理------------------------ 
 | 
         
 | 
        if (!Trigger.isDelete) { 
 | 
            List<String> nextIds = new List<String>(); 
 | 
             
 | 
            for (Event__c ec : Trigger.new) { 
 | 
                // nextEvent ids 作成 
 | 
                if (Trigger.isInsert && ec.nextPlanDate__c != null) { 
 | 
                    nextIds.add(ec.Id); 
 | 
                } 
 | 
                if (Trigger.isUpdate) { 
 | 
                    Event__c oldec = new Event__c(); 
 | 
                    oldec = Trigger.oldMap.get(ec.Id); 
 | 
                    if (ec.nextPlanDate__c != null 
 | 
                        && (ec.nextPlanTimePurpose__c != oldec.get('nextPlanTimePurpose__c') 
 | 
                        || ec.nextPlanDate__c != oldec.get('nextPlanDate__c'))) { 
 | 
                        nextIds.add(ec.Id); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
             
 | 
            if (nextIds.size() > 0) { 
 | 
                Map<ID, Event> nextEventUpsertMap = new Map<ID, Event>(); 
 | 
                for (Event ne : [select Id, NextEventC_ID__c, EventC_ID__c from Event where NextEventC_ID__c in :nextIds]){ 
 | 
                    nextEventUpsertMap.put(ne.NextEventC_ID__c, ne); 
 | 
                } 
 | 
                 
 | 
                Map<String, String> checkEventCMap = new Map<String, String>(); 
 | 
                for (Event__c nec : [select Id from Event__c where Id in :nextIds and Daily_Report__r.Status__c != '承認' and Daily_Report__r.Status__c != '非承認']){ 
 | 
                    checkEventCMap.put(nec.Id, nec.Id); 
 | 
                } 
 | 
                 
 | 
                List<Event> save_eventsPla = new List<Event>(); 
 | 
                 
 | 
                for (Event__c ec : Trigger.new) { 
 | 
                    // 承認、非承認の時、nextEvent処理なし 
 | 
                    if (!checkEventCMap.containsKey(ec.Id)) continue; 
 | 
                     
 | 
                    Event nextEvent = new Event(); 
 | 
                    if (nextEventUpsertMap.containskey(ec.id)) { 
 | 
                        nextEvent = nextEventUpsertMap.get(ec.id); 
 | 
                    } 
 | 
                     
 | 
                    // EventC_ID__c がある場合、upsert対象外にする 
 | 
                    if (!String.isBlank(nextEvent.EventC_ID__c)) continue; 
 | 
                     
 | 
                    // nextPlanTimePurpose__cの分割 
 | 
                    List<String> nextTimePurpose = ec.nextPlanTimePurpose__c.split(','); 
 | 
                    String planStartHourText = ''; 
 | 
                    String planStartMinuteText = ''; 
 | 
                    String planEndHourText = ''; 
 | 
                    String planEndMinuteText = ''; 
 | 
                    String planPurposeText = ''; 
 | 
                    if(nextTimePurpose.size() >= 5){ 
 | 
                        planStartHourText = nextTimePurpose[0]; 
 | 
                        planStartMinuteText = zeroFill(nextTimePurpose[1]); 
 | 
                        planEndHourText = nextTimePurpose[2]; 
 | 
                        planEndMinuteText = zeroFill(nextTimePurpose[3]); 
 | 
                        planPurposeText = ''; 
 | 
                        for (Integer i = 4; i < nextTimePurpose.size() - 1; i++) { 
 | 
                            planPurposeText += nextTimePurpose[i] + ','; 
 | 
                        } 
 | 
                        planPurposeText += nextTimePurpose[nextTimePurpose.size() - 1]; 
 | 
                    } 
 | 
                     
 | 
                    nextEvent.Subject = planPurposeText; 
 | 
                    nextEvent.StartDateTime = Datetime.newInstance(ec.nextPlanDate__c.year(), ec.nextPlanDate__c.month(), ec.nextPlanDate__c.day(), Integer.valueOf(planStartHourText), Integer.valueOf(planStartMinuteText), 0); 
 | 
                    nextEvent.EndDateTime = Datetime.newInstance(ec.nextPlanDate__c.year(), ec.nextPlanDate__c.month(), ec.nextPlanDate__c.day(), Integer.valueOf(planEndHourText), Integer.valueOf(planEndMinuteText), 0); 
 | 
                    nextEvent.ActivityDateTime = nextEvent.StartDateTime; 
 | 
                    nextEvent.ActivityDate = ec.nextPlanDate__c; 
 | 
                    nextEvent.BeforeActivityDate__c = ec.nextPlanDate__c; 
 | 
                    nextEvent.Activity_Type2__c = ec.Activity_Type2__c; 
 | 
                    nextEvent.Purpose_Type__c = ec.Purpose_Type__c; 
 | 
                    nextEvent.Related_Opportunity1__c = ec.Related_Opportunity1__c; 
 | 
                    nextEvent.Related_Opportunity1_ID__c = ec.Related_Opportunity1_ID__c; 
 | 
                    nextEvent.Related_Service1__c = ec.Related_Service1__c; 
 | 
                    nextEvent.Related_Service1_ID__c = ec.Related_Service1_ID__c; 
 | 
                    nextEvent.Location = ec.Location__c; 
 | 
                    nextEvent.Main_Visit_Location__c = ec.Main_Visit_Location__c; 
 | 
                    nextEvent.NextEventC_ID__c = ec.Id; 
 | 
                    nextEvent.whatid__c = ec.whatid__c; 
 | 
                     
 | 
                    save_eventsPla.add(nextEvent); 
 | 
                } 
 | 
                // システム管理者権限で更新 
 | 
                ControllerUtil.upsEvent(save_eventsPla); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        // ------------------------同期処理------------------------ 
 | 
         
 | 
        // 更新対象 Id をセット 
 | 
        Map<Id, Event__c> eventCMap = new Map<Id, Event__c>();     // ①のデータ、同期対象 
 | 
        Set<String> eventCIdSet = new Set<String>();               // ①のデータ、削除対象 
 | 
        Map<Id, Event__c> eventC_eventMap = new Map<Id, Event__c>();          // ②のデータ 
 | 
        String strAcache = ''; 
 | 
        if (Trigger.isDelete) { 
 | 
            for (Event__c ec : Trigger.old) { 
 | 
                eventCIdSet.add(ec.Id); 
 | 
                if (ec.Event_ID__c != null && ec.Event_ID__c != '') eventC_eventMap.put(ec.Event_ID__c, ec); 
 | 
            } 
 | 
            // 削除対象のEvent 
 | 
            ControllerUtil.delEvent(eventCIdSet, eventC_eventMap); 
 | 
        } else { 
 | 
            for (Event__c ec : Trigger.new) { 
 | 
                Event__c oldec = new Event__c(); 
 | 
                if (Trigger.isUpdate) { 
 | 
                    oldec = Trigger.oldMap.get(ec.Id); 
 | 
                } 
 | 
                 
 | 
                if (Trigger.isInsert 
 | 
                        || (Trigger.isUpdate 
 | 
                            && (ec.DataLoader__c == null || ec.DataLoader__c == oldec.DataLoader__c) 
 | 
                            && (ec.Subject__c != oldec.get('Subject__c') 
 | 
                            || ec.StartDateTime__c != oldec.get('StartDateTime__c') 
 | 
                            || ec.EndDateTime__c != oldec.get('EndDateTime__c') 
 | 
                            || ec.Main_Visit_Location__c != oldec.get('Main_Visit_Location__c') 
 | 
                            || ec.Activity_Type2__c != oldec.get('Activity_Type2__c') 
 | 
                            || ec.Purpose_Type__c != oldec.get('Purpose_Type__c') 
 | 
                            || ec.Location__c != oldec.get('Location__c') 
 | 
                            || ec.Related_Opportunity1__c != oldec.get('Related_Opportunity1__c') 
 | 
                            || ec.Related_Opportunity1_ID__c != oldec.get('Related_Opportunity1_ID__c') 
 | 
                            || ec.Related_Service1__c != oldec.get('Related_Service1__c') 
 | 
                            || ec.Related_Service1_ID__c != oldec.get('Related_Service1_ID__c') 
 | 
                            || ec.whatid__c != oldec.get('whatid__c') 
 | 
                            || ec.Purpose_TypeFSE__c != oldec.get('Purpose_TypeFSE__c') 
 | 
                            || ec.Purpose_TypeEscFSE__c != oldec.get('Purpose_TypeEscFSE__c') 
 | 
                            || ec.Activity_Purpose__c != oldec.get('Activity_Purpose__c') 
 | 
                            || ec.Activity_PurposeFSE__c != oldec.get('Activity_PurposeFSE__c') 
 | 
                            || ec.Activity_PurposeEscFSE__c != oldec.get('Activity_PurposeEscFSE__c') 
 | 
                            || ec.AppCdId__c != oldec.get('AppCdId__c')))) { 
 | 
                    eventCMap.put(ec.Id, ec); 
 | 
                    if (ec.Event_ID__c != null && ec.Event_ID__c != ''){ 
 | 
                            eventC_eventMap.put(ec.Event_ID__c, ec); 
 | 
                        }  
 | 
                } 
 | 
            } 
 | 
            // 同期対象のEvent 
 | 
            ControllerUtil.upsEventC2Event(eventCMap, eventC_eventMap); 
 | 
        } 
 | 
    } 
 | 
     
 | 
    /** 0埋め処理  */ 
 | 
    private String zeroFill(String str){ 
 | 
        if(str.length() == 2){ 
 | 
            return str; 
 | 
        } 
 | 
        else{ 
 | 
            return '0' + str; 
 | 
        }     
 | 
    } 
 | 
} 
 |