public without sharing class SSOpportunityBatch implements Database.Batchable<SObject>, Database.Stateful {
|
public static Integer FIELDMAX = 30;
|
private final List<Id> TEST_ID = null;
|
private BatchIF_Log__c iflog;
|
|
/**
|
* コンスタント、パラメータを受け取る
|
*/
|
public SSOpportunityBatch(List<Id> testId) {
|
TEST_ID = testId;
|
System.debug('TEST_ID=' + TEST_ID);
|
iflog = new BatchIF_Log__c();
|
iflog.Type__c = 'PushNotification';
|
iflog.Log__c = 'SSOpportunityBatch start\n';
|
iflog.ErrorLog__c = '';
|
insert iflog;
|
}
|
|
public static String makeSql(SS_Batch_Column_Mapping__c setting, Set<String> apiTempSet) {
|
apiTempSet.add('Id');
|
for (Integer i = 1; i <= FIELDMAX; i++) {
|
String fromColumn = 'From_Column_' + ('00' + i).right(3) + '__c';
|
String apiStr = String.valueOf(setting.get(fromColumn));
|
if (String.isBlank(apiStr) == false && apiTempSet.contains(apiStr) == false) {
|
apiTempSet.add(apiStr);
|
}
|
}
|
String soql = 'Select ' + String.join(new List<String>(apiTempSet), ',') + ' from ' + setting.Name;
|
return soql;
|
}
|
|
public static Object getValue(SObject sobj, String field) {
|
List<String> fieldPathList = field.split('\\.');
|
Object rtn = null;
|
for (Integer i = 0; i < fieldPathList.size(); i++) {
|
String fieldPath = fieldPathList[i];
|
if (i == fieldPathList.size() - 1) {
|
rtn = sobj.get(fieldPath);
|
System.debug(rtn + '=*** sobj.get(' + fieldPath + ')');
|
} else {
|
sobj = sobj.getSObject(fieldPath);
|
if (sobj == null) {
|
break;
|
}
|
System.debug(sobj + '=### sobj.getSObject(' + fieldPath + ')');
|
}
|
}
|
return rtn;
|
}
|
|
/**
|
* startには、queryを実行、引合全件
|
*/
|
public Database.QueryLocator start(Database.BatchableContext BC) {
|
// select項目を oppMapping より生成
|
SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Opportunity');
|
Set<String> apiTempSet = new Set<String>();
|
apiTempSet.add('StageName');
|
for (Integer i = 1; i <= FIELDMAX; i++) {
|
String lpadI = ('00' + i).right(3);
|
String fromColumn = 'From_Column_' + lpadI + '__c';
|
String apiStr = String.valueOf(oppMapping.get(fromColumn));
|
if (String.isBlank(apiStr) == false) {
|
String ssColumn = 'SS_Column_' + lpadI + '__c';
|
String ssApiStr = String.valueOf(oppMapping.get(ssColumn));
|
if (ssApiStr.toLowerCase().startsWith('opportunity.')) {
|
// 商談の項目を更新、変更があるかどうか判断するため、元データも取得
|
System.debug('ssApiStr=' + ssApiStr + ', substring(12)=' + ssApiStr.substring(12));
|
apiTempSet.add(ssApiStr.substring(12));
|
}
|
}
|
}
|
String soql = makeSql(oppMapping, apiTempSet);
|
if (TEST_ID <> null) {
|
soql += ' where Id IN: TEST_ID';
|
} else {
|
// SS_Prospect_5days_list__c の対象かどうか、loopの中単独判断
|
// soql += ' where StageName = \'引合\'';
|
}
|
System.debug('soql=' + soql);
|
return Database.getQueryLocator(soql);
|
}
|
|
public void execute(Database.BatchableContext BC, List<Opportunity> oppList) {
|
List<Opportunity> updSelfList = new List<Opportunity>();
|
List<SObject> insSSOppList = new List<SObject>();
|
List<Id> insSSOppId = new List<Id>();
|
List<SObject> insSSOliList = new List<SObject>();
|
//20161205Add
|
Map<id,id> SSBDreportToSSodp = new Map<id,id>();
|
// 商談
|
system.debug('===================111111111');
|
SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Opportunity');
|
Schema.SObjectType ssOppType = Schema.getGlobalDescribe().get(String.valueOf(oppMapping.get('SS_TableName__c')));
|
for (Opportunity opp : oppList) {
|
Boolean updSelfFlg = false;
|
SObject insSSOpp = ssOppType.newSObject();
|
for (Integer i = 1; i <= FIELDMAX; i++) {
|
String lpadI = ('00' + i).right(3);
|
String fromColumn = 'From_Column_' + lpadI + '__c';
|
String apiStr = String.valueOf(oppMapping.get(fromColumn));
|
system.debug('======8888'+String.isBlank(apiStr));
|
if (String.isBlank(apiStr) == false) {
|
String ssColumn = 'SS_Column_' + lpadI + '__c';
|
String ssApiStr = String.valueOf(oppMapping.get(ssColumn));
|
system.debug('===================77777'+ssApiStr.toLowerCase().startsWith('opportunity.')+ssApiStr.toLowerCase());
|
if (ssApiStr.toLowerCase().startsWith('opportunity.')) {
|
// 商談の項目を更新、変更があるかどうか判断する
|
system.debug('===================5555'+opp.get(ssApiStr.substring(12)) +'^^^^^^'+ opp.get(apiStr));
|
if (opp.get(ssApiStr.substring(12)) != opp.get(apiStr)) {
|
try {
|
opp.put(ssApiStr.substring(12), opp.get(apiStr));
|
updSelfFlg = true;
|
} catch (Exception e) {
|
iflog.ErrorLog__c = 'ERROR [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n';
|
}
|
}
|
} else {
|
try {
|
insSSOpp.put(ssApiStr, getValue(opp, apiStr));
|
} catch (Exception e) {
|
iflog.ErrorLog__c = 'ERROR ' + String.valueOf(oppMapping.get('SS_TableName__c')) + ' [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n';
|
}
|
}
|
}
|
}
|
system.debug('===================222222222'+insSSOpp);
|
if (updSelfFlg) {
|
updSelfList.add(opp);
|
}
|
system.debug(updSelfList);
|
// SS_Prospect_5days_list__c の対象かどうか、loopの中単独判断
|
//if (opp.StageName == '引合') {
|
insSSOppList.add(insSSOpp);
|
insSSOppId.add(opp.Id);
|
|
//}
|
}
|
insert insSSOppList;
|
system.debug('===================888888888'+insSSOppList[0].id);
|
for(integer i = 0; i< insSSOppList.size();i++){
|
SSBDreportToSSodp.put(insSSOppId[i],insSSOppList[i].id);
|
}
|
// 商談商品
|
SS_Batch_Column_Mapping__c oliMapping = SS_Batch_Column_Mapping__c.getValues('OpportunityLineItem');
|
// select項目を oliMapping より生成
|
Set<String> apiTempSet = new Set<String>();
|
String oliSql = makeSql(oliMapping, apiTempSet);
|
oliSql += ' where OpportunityId IN :insSSOppId';
|
Schema.SObjectType ssOliType = Schema.getGlobalDescribe().get(String.valueOf(oliMapping.get('SS_TableName__c')));
|
for (OpportunityLineItem oli : Database.query(oliSql)) {
|
SObject insSSOli = ssOliType.newSObject();
|
insSSOliList.add(insSSOli);
|
for (Integer i = 1; i <= FIELDMAX; i++) {
|
String lpadI = ('00' + i).right(3);
|
String fromColumn = 'From_Column_' + lpadI + '__c';
|
String apiStr = String.valueOf(oliMapping.get(fromColumn));
|
if (String.isBlank(apiStr) == false) {
|
String ssColumn = 'SS_Column_' + lpadI + '__c';
|
String ssApiStr = String.valueOf(oliMapping.get(ssColumn));
|
try {
|
insSSOli.put(ssApiStr, getValue(oli, apiStr));
|
} catch (Exception e) {
|
iflog.ErrorLog__c = 'ERROR ' + String.valueOf(oppMapping.get('SS_TableName__c')) + ' [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n';
|
}
|
}
|
}
|
insSSOli.put('SSBD_All_Report_ID__c', SSBDreportToSSodp.get(oli.ID_test1__c));
|
System.debug('insSSOli:' + insSSOli);
|
}
|
|
|
// エラーをlogに書き出す
|
if (updSelfList.size() > 0) {
|
System.debug('updSelfList:' + updSelfList);
|
Database.SaveResult[] lsr = Database.update(updSelfList, false);
|
for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) {
|
Database.SaveResult sr = lsr[tIdx];
|
System.debug('sr.isSuccess:' + sr.isSuccess());
|
if (!sr.isSuccess()) {
|
Database.Error emsg = sr.getErrors()[0];
|
iflog.ErrorLog__c += 'ERROR Opportunity:' + emsg + '\n';
|
}
|
}
|
}
|
|
|
insert insSSOliList;
|
//SSBD_ALL_Report to
|
//**************************************************************************************************************
|
//
|
//**************************************************************************************************************
|
//**************************************************************************************************************
|
//
|
//**************************************************************************************************************
|
|
}
|
|
public void finish(Database.BatchableContext BC) {
|
|
if (Test.isRunningTest() == false && TEST_ID == null) {
|
// Database.executeBatch(new SSOpporToSSBDallRepBatch(), 100);
|
}
|
|
iflog.Log__c += '\nSSOpportunityBatch end';
|
String tmp = iflog.ErrorLog__c;
|
if (tmp.length() > 65000) {
|
tmp = tmp.substring(0, 65000);
|
tmp += ' ...have more lines...';
|
iflog.ErrorLog__c = tmp;
|
}
|
update iflog;
|
}
|
}
|