| 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); | 
|             } | 
|         } | 
|     } | 
| } |