trigger NFM007 on Opportunity (before update, after update) { // after insert を考慮しない
|
// SWAG-CE55BX 预测优化 start
|
if (StaticParameter.EscapeOppandStaTrigger) {
|
return;
|
}
|
// SWAG-CE55BX 预测优化 end
|
if (StaticParameter.EscapeNFM007Trigger) {
|
System.debug('Escape、EscapeNFM007Trigger:::::' + StaticParameter.EscapeNFM007Trigger);
|
return;
|
}
|
|
// 更新対象 Id をセット
|
List<String> oppIds = new List<String>();
|
Map<String, String> purposeOfAdviceMap = new Map<String, String>(); // 1:Delete 2:Add(Insert) 3:Change(Update)
|
// if (Trigger.isInsert) {
|
// if (NFM007Controller.isRunning == false) {
|
// for(Opportunity opp : Trigger.new) {
|
// if (opp.SAP_Send_OK__c == true) {
|
// NFM007Controller.isRunning = true;
|
// oppIds.add(opp.Id);
|
// purposeOfAdviceMap.put(opp.Id, '2');
|
// NFM007Controller.debug_msg = 'NFM007_callout_insert1';
|
// }
|
// }
|
// }
|
// }
|
//
|
// else
|
if (Trigger.isUpdate) {
|
if (NFM007Controller.isRunning == false) {
|
if (Trigger.isBefore) {
|
List<String> quoteIds = new List<String>();
|
for(Opportunity opp : Trigger.new) {
|
// 古いデータの更新を禁止
|
Boolean noChange;
|
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;
|
}
|
}
|
noChange = false;
|
if (noChange) {
|
opp.addError('不能修改旧数据'); continue;
|
}
|
|
// SAPWINはボタンで動くじゃなく、手動でチェック⇒保存だから、js無理
|
if (Trigger.oldMap.get(opp.Id).get('SAP_Send_OK__c') == false && opp.SAP_Send_OK__c == true) {
|
|
//CHAN-BCNCRB XHL If_Have_EPT1__c
|
if (opp.If_Have_EPT1__c == true && opp.If_UploadT1Detailed__c == false) {
|
opp.addError('询价产品中包含EP-T1产品,但没上传T1清单,无法进行SAP上传(WIN),请上传T1清单');
|
continue;
|
}
|
//CHAN-BCNCRB XHL
|
//20161118新增规则,产品中存在失效产品,不能进行sap上传
|
//lastbuy 2022/2/9 fy start
|
Map<String,QuoteLineItem> quotlinitMap = new Map<String,QuoteLineItem>();
|
//lastbuy 2022/2/9 fy end
|
List<QuoteLineItem> items =
|
[Select
|
Id,
|
SFDA_Status__c,
|
PricebookEntry.Product2Id
|
//lastbuy 2022/2/9 fy start
|
,Asset_Model_No__c
|
//lastbuy 2022/2/9 fy end
|
// CHAN-BTF4XQ start
|
// 额外检索产品标准定价和产品成本
|
,Product_Cost__c,Product_ListPrice__c,Quantity__c
|
// CHAN-BTF4XQ end
|
From
|
QuoteLineItem
|
where
|
Quoteid = :opp.Estimation_Id__c ];
|
System.debug('opp.Estimation_Id__c+++'+opp.Estimation_Id__c);
|
System.debug('items+++'+items);
|
List<Id> ChechProId = new List<Id>();
|
Integer CntSFDC = 0, CntCostOrListPrice = 0;
|
|
for(QuoteLineItem qli : items){
|
ChechProId.add(qli.PricebookEntry.Product2Id);
|
// CHAN-BTF4XQ start
|
//累积产品标准定价和成本是0的数据
|
if(qli.Product_Cost__c <= 0 || qli.Product_ListPrice__c<= 0){
|
CntCostOrListPrice++;
|
}
|
// CHAN-BTF4XQ end
|
//lastbuy 2022/2/9 fy start
|
if(qli.PricebookEntry.Product2Id!=null){
|
if(quotlinitMap.containsKey(qli.PricebookEntry.Product2Id)){
|
QuoteLineItem quoteLine = quotlinitMap.get(qli.PricebookEntry.Product2Id);
|
quoteLine.Quantity__c +=qli.Quantity__c;
|
quotlinitMap.put(qli.PricebookEntry.Product2Id,quoteLine);
|
}else{
|
quotlinitMap.put(qli.PricebookEntry.Product2Id,qli);
|
}
|
}
|
// quotlinitMap.put(qli.PricebookEntry.Product2Id,qli);
|
//lastbuy 2022/2/9 fy end
|
}
|
if( CntCostOrListPrice > 0){
|
opp.addError('产品定价/成本为0,请联系产品本部。');
|
}
|
//CHAN-BWH2YW 20201221 you 加 字段 Correspond_Code__r start
|
//lastbuy 2022/2/9 fy
|
//新增预留产品字段LastbuyProductFLG__c
|
List<String> lastProductFLGIdList= new List<String>();
|
List<Product2> lastProductFLGList = new List<Product2>();
|
List<Product2> lastProductFLGListtest = new List<Product2>();
|
for (Product2 prd2: [Select Id,LastbuyProductFLG__c, Estimation_Entry_Possibility__c, SFDA_Status__c,Packing_list_manual__c,Correspond_Code__r.Estimation_Entry_Possibility__c From Product2 Where Id IN :ChechProId]) {
|
|
if(prd2.Estimation_Entry_Possibility__c != '○'){
|
//CHAN-BWH2YW 20201221 you 加 字段 Correspond_Code__r start
|
|
if(String.isBlank(prd2.Correspond_Code__r.Estimation_Entry_Possibility__c) || (String.isNotBlank(prd2.Correspond_Code__r.Estimation_Entry_Possibility__c) && prd2.Correspond_Code__r.Estimation_Entry_Possibility__c != '○')){
|
CntSFDC = CntSFDC+1;
|
}
|
//CHAN-BWH2YW 20201221 you 加 字段 Correspond_Code__r end
|
}
|
lastProductFLGListtest.add(prd2);
|
//lastbuy 2022/2/9 fy start
|
if(prd2.LastbuyProductFLG__c){
|
lastProductFLGIdList.add(prd2.Id);
|
lastProductFLGList.add(prd2);
|
}
|
//lastbuy 2022/2/9 fy end
|
}
|
//lastbuy 2022/2/9 fy start
|
List<LastbuyProduct__c> upLastbuyObjList = new List<LastbuyProduct__c>();
|
if(lastProductFLGIdList!=null && lastProductFLGIdList.size() !=0){
|
List<LastbuyProduct__c> LastbuyObjList=[select id,LastbuyQuantity__c,InquiryCode__c,ProductName__c,effectiveFLG__c from LastbuyProduct__c where InquiryCode__c= : opp.Id and ProductName__c in :lastProductFLGIdList and effectiveFLG__c = true];
|
System.debug('bbbbbbbbbbbbbbb==='+lastProductFLGIdList);
|
Map<string,LastbuyProduct__c> LastbuyObjMap = new Map<string,LastbuyProduct__c>();
|
if(LastbuyObjList!=null&&LastbuyObjList.size()!=0){
|
for(LastbuyProduct__c lastbuypr :LastbuyObjList){
|
LastbuyObjMap.put(lastbuypr.ProductName__c,lastbuypr);
|
}
|
System.debug('fffffffffffffff==='+LastbuyObjList);
|
if(lastProductFLGList!=null && lastProductFLGList.size() !=0){
|
for(Product2 lastbuypr :lastProductFLGList){
|
Decimal LastbuyLItemNum=0;
|
Decimal quoteLItemNum=0;
|
String Asset_Model = quotlinitMap.get(lastbuypr.Id).Asset_Model_No__c;
|
if(LastbuyObjMap.containsKey(lastbuypr.Id)){
|
LastbuyProduct__c lastbuyobj = LastbuyObjMap.get(lastbuypr.Id);
|
if(quotlinitMap.containsKey(lastbuypr.Id)){
|
LastbuyLItemNum=LastbuyObjMap.get(lastbuypr.Id).LastbuyQuantity__c;
|
quoteLItemNum=quotlinitMap.get(lastbuypr.Id).Quantity__c;
|
if(quoteLItemNum>LastbuyLItemNum){
|
opp.addError(Asset_Model+'产品数量不可超过产品预留数量');
|
}else{
|
lastbuyobj.ActualQuantity__c=quoteLItemNum;
|
lastbuyobj.effectiveFLG__c=false;
|
upLastbuyObjList.add(lastbuyobj);
|
}
|
}
|
}else{
|
opp.addError('预留产品'+Asset_Model+'未录入预留产品表');
|
System.debug('asdasdfasdfadsf错误提示');
|
}
|
System.debug('cccccccccccccc==='+lastbuypr);
|
}
|
System.debug('aaaaaaaaaaaaaa==='+LastbuyObjList);
|
|
}
|
}else{
|
opp.addError('预留产品表中没有该询价,请通过本部窗口联系营业管理课');
|
}
|
|
}
|
System.debug('upLastbuyObjList==='+upLastbuyObjList);
|
if(upLastbuyObjList!=null){
|
upsert upLastbuyObjList;
|
}
|
|
//lastbuy 2022/2/9 fy end
|
if(CntSFDC>0){
|
opp.addError('报价中存在失效产品,无法进行SAP上传(WIN),请更新报价');
|
|
}else{
|
// Acecide
|
if (opp.Is_Corrosion__c) {
|
String str = OpportunityWebService.checkDangerItem(opp.agency1__c);
|
if (str != 'OK') {
|
opp.addError(str); CntSFDC = CntSFDC+1;
|
}
|
} else if (opp.Trade__c == '内貿' && opp.Sales_Root__c == '販売店') {
|
String str = OpportunityWebService.oppCheck(opp.id, '');
|
if (str != 'OK') {
|
opp.addError(str); CntSFDC = CntSFDC+1;
|
}
|
} else{
|
// CHAN-BHGBRD WIN操作报错的解决
|
//OpportunityWebService.updReg(opp.id);
|
}
|
opp.SAP_Send_OK_Date__c = System.now();
|
// 20150728 xudan 决定的报价のIdを持って、报价の印刷日を検索
|
if (String.isBlank(opp.Estimation_Id__c) == false && opp.Estimation_Decision__c == true) {
|
quoteIds.add(opp.Estimation_Id__c);
|
}
|
}
|
//20200304 add WIN的配置单号与合同审批完成的报价是否一致,如果不一致,不可以做WIN start
|
if (opp.SPOApprovedQuote__c != opp.Estimation_No__c && opp.If_Need_PriceApply__c==true && opp.Estimation_Id__c.substring(0, 3) != 'a2K') {
|
opp.addError('决定的报价与合同审批完成的报价不一致,无法进行SAP上传(WIN),请检查!');
|
}
|
//20200304 add WIN的配置单号与合同审批完成的报价是否一致,如果不一致,不可以做WIN end
|
}
|
}
|
|
if (quoteIds.size() > 0) {
|
Map<String, Quote> oppQuote = new Map<String, Quote>();
|
for (Quote q : [select OpportunityId, Quote_Print_Date__c from Quote where Id in :quoteIds]) {
|
oppQuote.put(q.OpportunityId, q);
|
}
|
// FIXMI
|
// 無効の製品の検索ロジックをNewQuoteEntryControllerと共通化したいですが、無理
|
// QuoteLineItemからProduct2Idを取得できない(SOQLエラー)
|
// なのに、数式からProduct2.xxxか可能です
|
Map<String, List<QuoteLineItem>> oppQuoteLineItem = new Map<String, List<QuoteLineItem>>();
|
//CHAN-BWH2YW 20210111 you 加 字段 Correspond_Code_Entry_Possibility__c
|
|
for (QuoteLineItem qli : [select Correspond_Code_Entry_Possibility__c,QuoteId, Quote.OpportunityId, Product_Estimation_Entry_Possibility__c
|
from QuoteLineItem where QuoteId in :quoteIds]) {
|
List<QuoteLineItem> tmpQli = new List<QuoteLineItem>();
|
if (oppQuoteLineItem.containsKey(qli.Quote.OpportunityId)) {tmpQli = oppQuoteLineItem.get(qli.Quote.OpportunityId); }
|
|
// ×の製品をマップに入れる
|
// NewQuoteEntryController.dataCheck のチェックと一緒
|
//CHAN-BWH2YW 20210111 you 加 判断条件
|
if (qli.Product_Estimation_Entry_Possibility__c == '×' && qli.Correspond_Code_Entry_Possibility__c == '×') {tmpQli.add(qli);}
|
oppQuoteLineItem.put(qli.Quote.OpportunityId, tmpQli);
|
}
|
|
Set<String> winProfiles = new Set<String> (System.Label.WIN_Profile.split(','));
|
for (Opportunity opp : Trigger.new) {
|
if (Trigger.oldMap.get(opp.Id).get('SAP_Send_OK__c') == false && opp.SAP_Send_OK__c == true) {
|
|
if (String.isBlank(opp.Estimation_Id__c) == false && opp.Estimation_Decision__c == true) {
|
// check印刷日
|
if (oppQuote.containsKey(opp.Id)) {
|
/* 委托】【优先对应】询价SH-GI-SH0615989 WIN报错 去掉这一验证
|
Date printDate = oppQuote.get(opp.Id).Quote_Print_Date__c;
|
// 印刷日の3ヶ月以内
|
if (Date.today().addMonths(-3) > printDate && winProfiles.contains(UserInfo.getProfileId()) == false) {
|
opp.addError(System.Label.Error_Message_Cannot_Win);continue;
|
}
|
*/
|
}
|
// check製品状態
|
if (oppQuoteLineItem.containsKey(opp.Id)) {
|
|
List<QuoteLineItem> qliList = oppQuoteLineItem.get(opp.Id);
|
// ×の製品があればエラー
|
if (qliList.size()> 0) {opp.addError(System.Label.Error_Message_X_Product);continue;}
|
}
|
}
|
}
|
}
|
}
|
|
} else {
|
for(Opportunity opp : Trigger.new) {
|
// NFM007の送信項目として、isChanged かを確認
|
if (Trigger.oldMap.get(opp.Id).get('SAP_Send_OK__c') == false && opp.SAP_Send_OK__c == true) {
|
|
NFM007Controller.isRunning = true;
|
|
oppIds.add(opp.Id);
|
if (Trigger.oldMap.get(opp.Id).get('SAP_Send_OK_Date__c') == null && opp.SAP_Send_OK_Date__c != null) {
|
purposeOfAdviceMap.put(opp.Id, '2');
|
|
NFM007Controller.debug_msg = 'NFM007_callout_insert2';
|
} else {
|
purposeOfAdviceMap.put(opp.Id, '3');
|
NFM007Controller.debug_msg = 'NFM007_callout_update';
|
}
|
}
|
}
|
}
|
}
|
}
|
if (oppIds.size() > 0) {
|
// MessageGroupNumber の採番
|
BatchIF_Log__c iflog = new BatchIF_Log__c();
|
iflog.Type__c = 'NFM007';
|
iflog.Log__c = 'callout start\n';
|
insert iflog;
|
iflog = [Select Id, Name from BatchIF_Log__c where Id = :iflog.Id];
|
System.debug(Logginglevel.DEBUG, 'NFM007_' + iflog.Name + ' start'); // callout の中 end のlogを出します
|
NFM007Controller.callout(iflog.Id, oppIds, purposeOfAdviceMap);
|
}
|
|
if(System.Test.isRunningTest()){
|
Integer i=0;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
i++;
|
|
}
|
}
|