trigger OpportunityHpDeptUpd on Opportunity (before insert, before update) {
|
// SWAG-CE55BX 预测优化 start
|
if (StaticParameter.EscapeOppandStaTrigger) {
|
return;
|
}
|
// SWAG-CE55BX 预测优化 end
|
/*
|
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);
|
}
|
}
|
}
|
}
|