trigger OpportunityHpDeptUpd on Opportunity (before insert, before update) { 
 | 
    /* 
 | 
    if (StaticParameter.EscapeOpportunityHpDeptUpdTrigger) { 
 | 
System.debug('Escape、EscapeOpportunityHpDeptUpdTrigger:::::' + StaticParameter.EscapeOpportunityHpDeptUpdTrigger); 
 | 
        return; 
 | 
    } 
 | 
    */ 
 | 
    List<String> accIds = new List<String>(); 
 | 
    Map<Integer, Opportunity> oppForLookUpMap = new Map<Integer, Opportunity>(); 
 | 
    Integer idx = 0; 
 | 
    for(Opportunity opp : Trigger.new) { 
 | 
        // 古いデータの更新を禁止 
 | 
        if (Trigger.isUpdate) { 
 | 
            Boolean noChange = false; 
 | 
            for (String colApiName : ControllerUtil.oppColumnList) { 
 | 
                colApiName = colApiName.trim(); 
 | 
                if (opp.oldData_flg__c &&  
 | 
                        Trigger.oldMap.get(opp.Id).get(colApiName) != Trigger.newMap.get(opp.Id).get(colApiName)) { 
 | 
                    noChange = true; 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            if (noChange) { 
 | 
                opp.addError('不能修改旧数据'); 
 | 
                continue; 
 | 
            } 
 | 
        } 
 | 
         
 | 
        if ((Trigger.isUpdate 
 | 
                && (Trigger.oldMap.get(opp.Id).get('AccountId') != opp.AccountId 
 | 
                    || opp.AccountParentId__c != opp.Department_Class__c 
 | 
                    || opp.AccountParentParentId__c != opp.Hospital__c)) 
 | 
                || Trigger.isInsert) { 
 | 
            if (!String.isBlank(opp.AccountId)) { 
 | 
                accIds.add(opp.AccountId); 
 | 
            } 
 | 
        } 
 | 
        if ((Trigger.isUpdate 
 | 
                && (Trigger.oldMap.get(opp.Id).get('Opportunity_Category__c') != opp.Opportunity_Category__c 
 | 
                    || Trigger.oldMap.get(opp.Id).get('CloseDate') != opp.CloseDate 
 | 
                    || Trigger.oldMap.get(opp.Id).get('Close_Forecasted_Date__c') != opp.Close_Forecasted_Date__c 
 | 
                    || Trigger.oldMap.get(opp.Id).get('Bid_Planned_Date__c') != opp.Bid_Planned_Date__c)) 
 | 
                || Trigger.isInsert) { 
 | 
            oppForLookUpMap.put(idx, opp); 
 | 
        } 
 | 
        idx++; 
 | 
    } 
 | 
  
 | 
    if (accIds.size() > 0) { 
 | 
        // 診療科レコードタイプ 
 | 
        String[] deptTypes = new String[] {'診療科 その他', '診療科 呼吸科', '診療科 婦人科', '診療科 普外科', '診療科 泌尿科', '診療科 消化科', '診療科 耳鼻喉科'}; 
 | 
        List<RecordType> deptRects = [select Id, Name from RecordType where IsActive = true and SobjectType = 'Account' and Name IN :deptTypes]; 
 | 
        Map<String, String> deptRectMap = new Map<String, String>(); 
 | 
        for (RecordType rect : deptRects) { 
 | 
            deptRectMap.put(rect.Id, rect.Name); 
 | 
        } 
 | 
        // TODO 販売店のレコードタイプのMapを生成 
 | 
  
 | 
        Map<Id, Account> accMap = new Map<Id, Account>(); 
 | 
        List<Account> accs = ControllerUtil.selectAccountForTrigger(accIds); 
 | 
        for(Account acc : accs) { 
 | 
            accMap.put(acc.Id, acc); 
 | 
        } 
 | 
         
 | 
        for(Opportunity opp : Trigger.new) { 
 | 
            // 「診療科」に診療科を選択する場合 
 | 
            Account acc = accMap.get(opp.AccountId); 
 | 
            if (acc != null 
 | 
                    && deptRectMap.get(acc.RecordTypeId) != null) { 
 | 
                opp.Department_Class__c = acc.ParentId; 
 | 
                opp.Hospital__c = acc.Parent.ParentId; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // oppForLookUpMap の処理 
 | 
    if (oppForLookUpMap.size() > 0) { 
 | 
        List<String> opportunityCategoryList = new List<String>(); 
 | 
        List<Date> dateList = new List<Date>(); 
 | 
        Date dateToday = Date.today(); 
 | 
        dateList.add(dateToday);         // 新規はこれをつかうため 
 | 
        Map<Date, Id> date2IdMap = new Map<Date, Id>(); 
 | 
        for (Integer jdx : oppForLookUpMap.keyset()) { 
 | 
            Opportunity opp = oppForLookUpMap.get(jdx); 
 | 
            if (String.isBlank(opp.Opportunity_Category__c) == false) { 
 | 
                opportunityCategoryList.add(opp.Opportunity_Category__c); 
 | 
            } 
 | 
            if (opp.CloseDate != null) { 
 | 
                dateList.add(opp.CloseDate); 
 | 
            } 
 | 
            if (opp.Close_Forecasted_Date__c != null) { 
 | 
                dateList.add(opp.Close_Forecasted_Date__c); 
 | 
            } 
 | 
            if (opp.Bid_Planned_Date__c != null) { 
 | 
                dateList.add(opp.Bid_Planned_Date__c); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        for (OlympusCalendar__c cal :[ 
 | 
                Select Id, Date__c 
 | 
                  from OlympusCalendar__c 
 | 
                 Where Date__c IN :dateList] 
 | 
        ) { 
 | 
            date2IdMap.put(cal.Date__c, cal.Id); 
 | 
        } 
 | 
        for (Integer jdx : oppForLookUpMap.keyset()) { 
 | 
            Opportunity opp = oppForLookUpMap.get(jdx); 
 | 
            if (String.isBlank(opp.Id)) { 
 | 
                opp.Calendar_Created_Date_ID__c = date2IdMap.get(dateToday); 
 | 
            } 
 | 
            if (opp.CloseDate != null) { 
 | 
                opp.Calendar_Forecast_Shipping_Date_ID__c = date2IdMap.get(opp.CloseDate); 
 | 
            } 
 | 
            if (opp.Close_Forecasted_Date__c != null) { 
 | 
                opp.Calendar_Forecast_Date_ID__c = date2IdMap.get(opp.Close_Forecasted_Date__c); 
 | 
            } 
 | 
            if (opp.Bid_Planned_Date__c != null) { 
 | 
                opp.Calendar_Forecast_Tender_Date_ID__c = date2IdMap.get(opp.Bid_Planned_Date__c); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |