// FIXME 見積もり商品の Asset_Model_No__c ですが、数式になっています。トランザクションデータとして、項目を持つべきかと思います。by katsu 20130216 // 商談商品のId__c を PricebookEntry.Product2Idに変更すべき // 見積もり可否 ですが、保存時みていますが、Sales_Possibilityを見ないですか?いいえ、js側で見ています public class ConsumableSampleApplyController { public Id quoId {get;set;} public Boolean productStatusUpdated {get;set;} // 状態更新、{!$Label.Status_Update} を押下したかどうか public Boolean changedAfterPrint {get;set;} // true の場合、画面に confirm メッセージが表示します。quoIdを新しいinsert。判定はjsにて実施 public String excel_text {get;set;} public Integer select_index {get;set;} // excelImport専用ですが、jsにて制御することになるので、TODO katsu 削除予定 public String Product_text {get;set;} public String setProduct_text {get;set;} public List activities {get;set;} private List activitiesbk; public List tmpactivities {get;set;} public QELine active_activity {get;set;} //画面制御判定用 public Boolean displayCost {get;set;} //ボタン制御用 public Boolean Save_button {get;set;} public Boolean pdf_button {get;set;} //見積 public ConsumableSample__c quo {get;set;} public Decimal total_ListPrice {get;set;} public boolean errorflg {get;set;} public String errorMessage {get;set;} public String baseUrl {get;set;} public boolean Messageflg {get;set;} public String Message {get;set;} public User loginUser {get;set;} private Map prd2LatestValMap; public ConsumableSampleApplyController() { baseUrl = URL.getSalesforceBaseUrl().toExternalForm(); changedAfterPrint = false; productStatusUpdated = false; } public ConsumableSampleApplyController(ApexPages.StandardController controller) { } public PageReference init() { system.debug('============start init=============='); errorflg = false; if (String.isBlank(ApexPages.currentPage().getParameters().get('completion')) == false) { if (ApexPages.currentPage().getParameters().get('completion') == '1') { errorflg = true; errorMessage = System.Label.Message_002; } else if (ApexPages.currentPage().getParameters().get('completion') == '2') { errorflg = true; errorMessage = '审批提交成功。'; } } loginUser = [select Id from User where Id = :Userinfo.getUserId()]; //Quote quo = new ConsumableSample__c(); //quoid if (quoId==null){ quoId = System.currentPageReference().getParameters().get('copyid'); if (quoId==Null){ quoId = System.currentPageReference().getParameters().get('id'); } } //Quote Integer i; if (quoId==null){ quo.CurrencyIsoCode = 'CNY'; quo.Process_Status__c = '草案中'; quo.PIC__c = loginUser.Id; //新規リストコントローラの取得 if (activities==null){ activities = new List(); activitiesbk = new List(); for (i=0;i<150;i++){ QELine active_activity = new QELine(i); activities.add(active_activity); } } }else{ List quoList = [SELECT Id,Name,CurrencyIsoCode,Process_Status__c,Contact__c,Account__c,Expect_Arrive_Date__c,Expect_Use_Date__c,Purpose__c,Reason__c, PIC__c,CreatedDate,Contact__r.Hospital_name__c,Contact__r.AccountId FROM ConsumableSample__c Where Id =:quoId]; List items = [Select Id,Asset_Model_No__c,Serial_Lot__c,SFDA_Status__c,Name__c, Qty_Unit__c,Quantity__c,Product2__r.SFDA_Status__c,ProductCode__c,ListPrice__c, Product2__r.Sales_Possibility__c,Product2__r.Name,Product2__c,Product2__r.Asset_loaner_category__c,Product2__r.Packing_list_manual__c From ConsumableSampleLineItem__c where ConsumableSample__c = :quoId Order by Item_Order__c, Id]; String copyQuoId = System.currentPageReference().getParameters().get('copyid'); if (copyQuoId == null) { } else { // copyの場合、quoIdをnullに戻す quoId = null; } if (quoList.size() > 0){ if (copyQuoId == null) { quo = quoList[0]; } else { quo.CurrencyIsoCode = 'CNY'; quo.Process_Status__c = '草案中'; quo.PIC__c = loginUser.Id; quo.Contact__c = null; quo.Account__c = null; quo.Expect_Arrive_Date__c = null; quo.Expect_Use_Date__c = null; quo.Purpose__c = ''; quo.Reason__c = ''; } } activities = new List(); activitiesbk = new List(); i=0; QELine c = new QELine(i); QELine bk = new QELine(i); if(items.size()>0){ for (ConsumableSampleLineItem__c o:items){ c = new QELine(o,i,copyQuoId); activities.add(c); bk = new QELine(o,i,copyQuoId); activitiesbk.add(bk); i++; } for (integer j=i;j<150;j++){ c = new QELine(j); activities.add(c); } //マスタ最新情報の取得 settingProduct2(); }else{ activities = new List(); for (i=0;i<150;i++){ QELine active_activity = new QELine(i); activities.add(active_activity); } } } //--Savebutton Save_button = true; pdf_button = true; if (quo.Process_Status__c == '草案中' || quo.Process_Status__c == '不批准') { Save_button = false; } if (quo.Process_Status__c == '批准') { pdf_button = false; } return null; } //excelImport public PageReference excelImport() { system.debug('○○○○○○○○○○○○○○○Welcome to excelImport!!'); system.debug('▼▼▼▼▼excel_text:' + excel_text); errorflg = false; errormessage = null; //既存データ数の確認 Integer j = 0; for (QELine s:activities){ //データ判定にAsset_Model_Noを使用 if ((s.Asset_Model==null) || (s.Asset_Model=='')){ break; } j++; } //=======Temporary===== tmpactivities = activities; //=======Initialize========= activities = new List(); Integer i = 0; Integer xlscnt = 0; Integer rightcnt = 0; // 成功した数をカウント string[] xlslists = excel_text.split('\n',-1); List xlslist = New List(); List codelist = New List(); List Quantitylist = New List(); Map mp = new Map(); string xlscode; Integer xlsQuantity; try { for (string xls:xlslists){ if(xls==null || xls==''){ //null }else{ xlscode = null; xlsQuantity = null; xlslist = xls.split('\t',-1); for (String s:xlslist){ //odd number or even number if (math.mod(i, 2) != 0){ //odd number if (s=='' || s==null){ errorflg = true; errormessage = System.Label.Error_Message31; activities = tmpactivities; pageArrange(); return null; }else{ s = s.trim(); xlsQuantity = Integer.valueOf(s); Quantitylist.add(xlsQuantity); } }else{ //even number if (s=='' || s==null){ errorflg = true; errormessage = System.Label.Error_Message31; activities = tmpactivities; pageArrange(); return null; }else{ s = s.trim(); codelist.add(s); xlscode = s; } } i++; } //mp.put(xlscode, xlsQuantity); xlscnt++; } } } catch(Exception ex) { activities = tmpactivities; errorflg = true; errormessage = System.Label.Error_Message31; pageArrange(); return null; } system.debug(j); system.debug('xlscnt:::::' + xlscnt); if (codelist.size()==0 || Quantitylist.size()==0){ activities = tmpactivities; errorflg = true; errormessage = System.Label.Error_Message31; pageArrange(); return null; } xlscnt = j + xlscnt; if (xlscnt>150){ activities = tmpactivities; errorflg = true; errormessage = System.Label.Error_Message32; pageArrange(); return null; } i = 0; boolean lineflg = false; for (QELine t:tmpactivities){ if(i==j){ Map mpProduct2 = new Map(); // keyがProductCodeです。 List items = [select Id,Name,ProductCode, Foreign_Trade_Cost_US__c,Foreign_Trade_List_US__c,Intra_Trade_Cost_RMB__c,Intra_Trade_List_RMB__c, Asset_Model_No__c,Serial_Lot_No__c,Asset_loaner_category__c,Sales_Possibility__c,Estimation_Entry_Possibility__c, SFDA_Status__c,Qty_Unit__c,BSSCategory__c,Packing_list_manual__c FROM Product2 Where ProductCode In :codelist And Manual_Entry__c = false]; for (Product2 prd:items) { system.debug('prd.ProductCode:::::' + prd.ProductCode); mpProduct2.put(prd.ProductCode, prd); } Map entries = new Map(); // keyがProductCodeです。 List pbes = [ select Id, PricebookEntry.Product2.ProductCode FROM PricebookEntry Where PricebookEntry.Product2.ProductCode IN :codelist AND CurrencyIsoCode = :quo.CurrencyIsoCode AND IsActive = true]; for (PricebookEntry pbe:pbes) { system.debug('pbe.Product2.ProductCode:::::' + pbe.Product2.ProductCode); entries.put(pbe.Product2.ProductCode, pbe); } for (Integer l=0;l 0 && prd.Foreign_Trade_Cost_US__c > 0) { c = new QELine(i, pbe.Id, prd.Asset_Model_No__c, prd.Serial_Lot_No__c, prd.Asset_loaner_category__c, prd.ProductCode, prd.Id, prd.SFDA_Status__c, prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c, Quantitylist[l], price, price, prd.Foreign_Trade_Cost_US__c, prd.Packing_list_manual__c); } else { continue; } } else { if (prd.Intra_Trade_List_RMB__c > 0 && prd.Intra_Trade_Cost_RMB__c > 0) { c = new QELine(i, pbe.Id, prd.Asset_Model_No__c, prd.Serial_Lot_No__c, prd.Asset_loaner_category__c, prd.ProductCode, prd.Id, prd.SFDA_Status__c, prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c, Quantitylist[l], price, price, prd.Intra_Trade_Cost_RMB__c, prd.Packing_list_manual__c); } else { continue; } } } else { continue; // c = new QELine(i, pbe.Id, prd.Asset_Model_No__c, prd.Serial_Lot_No__c, prd.Asset_loaner_category__c, prd.ProductCode, prd.Id, prd.SFDA_Status__c, prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c, // Quantitylist[l], 0, 0, 0); // pbe ない時も追加する、setProductEntry() のロジックと違います。 } activities.add(c); i++; rightcnt++; lineflg = true; } } if (lineflg==true){ i--; } }else{ QELine a = New QELine(t, i); activities.add(a); } i++; if (i>149){ break; } } // messageを出す errorflg = true; errormessage = '数据导入结束,导入 ' + codelist.size() + ' 件,成功' + rightcnt + ' 件'; pageArrange(); return null; } //Button Ivents============================================================ //approval button public PageReference approvalBtn(){ system.debug('○○○○○○○○○○○○○○○Welcome to approvalButton!!'); List productidList = new List(); if (activities.size()>0){ for (QELine a:activities){ String productid = a.PageObject.Product2__c; if (productid != null && productid.trim().length() > 0) { productidList.add(productid); } } } if (productidList.size() <= 0) { errorflg = true; errorMessage = '没有选择产品。'; pageArrange(); return null; } Savepoint sp = Database.setSavepoint(); try { //データチェック if (dataCheck() == false){ return null; } if (dataEntry() == false){ return null; } // 承認プロセス Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest(); psr.setObjectId(quoId); Approval.ProcessResult submitResult = Approval.process(psr); //msg errorflg = true; errorMessage = '审批提交成功。'; //return null; PageReference pageRef = new PageReference('/apex/ConsumableSampleApply?id=' + this.quoId + '&completion=2'); pageRef.setRedirect(true); return pageRef; } catch (DmlException de) { Database.rollback(sp); errorflg = true; errormessage = de.getDmlMessage(0); // 1件目のエラーのみ表示 System.debug(Logginglevel.ERROR, de.getMessage()); System.debug(Logginglevel.ERROR, de.getStackTraceString()); } catch (Exception e) { Database.rollback(sp); errorflg = true; errormessage = e.getMessage(); System.debug(Logginglevel.ERROR, e.getMessage()); System.debug(Logginglevel.ERROR, e.getStackTraceString()); } return null; } //Save button public PageReference Save(){ errorflg = false; errormessage = null; Savepoint sp = Database.setSavepoint(); try { //データチェック if (dataCheck() == false){ return null; } if (dataEntry() == false){ return null; }else{ //msg errorflg = true; errorMessage = System.Label.Message_002; //return null; PageReference pageRef = new PageReference('/apex/ConsumableSampleApply?id=' + this.quoId + '&completion=1'); pageRef.setRedirect(true); return pageRef; } } catch (DmlException de) { Database.rollback(sp); errorflg = true; errormessage = de.getDmlMessage(0); // 1件目のエラーのみ表示 System.debug(Logginglevel.ERROR, de.getMessage()); System.debug(Logginglevel.ERROR, de.getStackTraceString()); } catch (Exception e) { Database.rollback(sp); errorflg = true; errormessage = e.getMessage(); System.debug(Logginglevel.ERROR, e.getMessage()); System.debug(Logginglevel.ERROR, e.getStackTraceString()); } return null; } //OppReflection button public PageReference OppReflection(){ Savepoint sp = Database.setSavepoint(); try { errorflg = false; errormessage = null; //データチェック if (dataCheck() ==false){ return null; } PageReference pageRef = new PageReference('/'); if (dataEntry()==false){ return null; }else{ return pageRef; } } catch (DmlException de) { Database.rollback(sp); errorflg = true; errormessage = de.getDmlMessage(0); // 1件目のエラーのみ表示 System.debug(Logginglevel.ERROR, de.getMessage()); System.debug(Logginglevel.ERROR, de.getStackTraceString()); } catch (Exception e) { Database.rollback(sp); errorflg = true; errormessage = e.getMessage(); System.debug(Logginglevel.ERROR, e.getMessage()); System.debug(Logginglevel.ERROR, e.getStackTraceString()); } return null; } //BackButton public PageReference Back(){ return new Pagereference('/'); } // TODO 削除する。商品最新状態は、sqlからすでにproductの最新状態を取得するして、コンストラクタで設定するようにします。このメソッドはいらない private void settingProduct2(){ system.debug('○○○○○○○○○○○○Welcome to settingProduct2 class!!○○○○○○○○○○○○'); pageArrange(); } // 0表示 対策 private void pageArrange(){ if (activities.size()>0){ for (QELine a:activities){ if ((a.Asset_Model==null) || (a.Asset_Model=='')){ system.debug('○○○○○○○○○○○○Welcome to pageArrange Asset_Model is △'); a.ListPrice_Page = null; a.ListPriceTotal_Page = null; } else { system.debug('○○○○○○○○○○○○Welcome to pageArrange Asset_Model=[' + a.Asset_Model + ']'); } } } } public boolean dataCheck(){ system.debug('○○○○○○○○○○○○Welcome to dataCheck class!!○○○○○○○○○○○○'); errorflg = false; errormessage = null; Boolean error = false; List product2Ids = New List(); if (activities.size()>0){ for (QELine a:activities){ if (String.isBlank(a.PageObject.Product2__c) == false) { product2Ids.add(a.PageObject.Product2__c); } } prd2LatestValMap = new Map(); for (Product2 prd2: [Select Id, Estimation_Entry_Possibility__c, SFDA_Status__c From Product2 Where Id IN :product2Ids]) { if (prd2.Estimation_Entry_Possibility__c != '○') { error = true; } prd2LatestValMap.put(prd2.Id, prd2); } if (error == true){ if (quoId != null) { Map itemmap = new Map(); for (ConsumableSampleLineItem__c item : [ Select Id,Product2__r.SFDA_Status__c,Product2__r.Name,Product2__c From ConsumableSampleLineItem__c where ConsumableSample__c = :quoId Order by Item_Order__c, Id]) { itemmap.put(item.Product2__c,item); } for (QELine a:activities){ if (a.PageObject.Product2__c != null) { if (itemmap.containskey(a.PageObject.Product2__c)) { a.pageObject.SFDA_Status__c = itemmap.get(a.PageObject.Product2__c).Product2__r.SFDA_Status__c; a.pageObject.Name__c = itemmap.get(a.PageObject.Product2__c).Product2__r.Name; } } } } } } if (error==true){ PageArrange(); errorflg = true; errorMessage = System.Label.Error_Message37 + System.Label.Error_Message48; return false; } PageArrange(); errorflg = false; errorMessage = null; return true; } public boolean dataEntry(){ system.debug('○○○○○○○○○○○○Welcome to dataEntry class!!○○○○○○○○○○○○'); Boolean error = false; if(quo.Contact__c == null){ quo.Contact__c.addError(System.Label.Error_Message3); error = true; errormessage = System.Label.Error_Message3; } for (QELine a : activities) { if ((a.Asset_Model!=null) && (a.Asset_Model!='')){ if (a.PageObject.Quantity__c==null || a.PageObject.Quantity__c==0){ a.PageObject.Quantity__c.addError(System.Label.Error_Message3); error = true; errormessage = System.Label.Error_Message3; } } } if (error==true){ PageArrange(); errorflg = true; return false; } //Quote------------------------------------------------------------- //商談Id、価格表Id //見積名称、標準定価合計、見積金額合計(積上)、病院の契約金額、原価、 //値引金額計算、値引き金額金額、見積調整金額計算、見積調整金額金額 //第一販売店名称、金額、利益、%、第二販売店名称、金額、利益、% //优惠成交价、优惠折扣、优惠价格、单价、报价金额、Total //契約内訳、印刷病院名称、見積有効期限日、見積表記コメント ConsumableSample__c q = New ConsumableSample__c(); if (changedAfterPrint) { quoId = null; } if (quoId==null){ q = New ConsumableSample__c(); }else{ List qs = New List(); qs = [SELECT Id,Name,CurrencyIsoCode,Contact__c,Account__c,Expect_Arrive_Date__c,Expect_Use_Date__c,Purpose__c,Reason__c, PIC__c,CreatedDate,Contact__r.Hospital_name__c FROM ConsumableSample__c Where Id =:quoId]; if (qs.size()>0){ q = qs[0]; } } List cont = [select Id,AccountId from Contact where Id = :quo.Contact__c]; String accid = null; if (cont.size() > 0) { accid = cont[0].AccountId; } q.CurrencyIsoCode = quo.CurrencyIsoCode; q.PIC__c = quo.PIC__c; if (quoId==null){ q.Contact__c = quo.Contact__c; } q.Account__c = accid; q.Expect_Arrive_Date__c = quo.Expect_Arrive_Date__c; q.Expect_Use_Date__c = quo.Expect_Use_Date__c; q.Purpose__c = quo.Purpose__c; q.Reason__c = quo.Reason__c; if (quoId==null){ insert q; }else{ update q; } system.debug('○○○○○Save1○○○○○'); //QuoteLineItem; List qlist = New List(); qlist=[Select Id From ConsumableSampleLineItem__c Where ConsumableSample__c =:quoId]; if (qlist.size()>0){ //delete delete qlist; } //QuoteLineItem-------------------------------------------- //製品型番、品目コード、SFDAステータス、品目名、ListPrice、数量 //価格、単位、小計、OCM売上予測金額(税抜)、価格表 qlist = New List(); //Sap送信,Printに合わせて1~ Integer i=1; system.debug('○○○○○'+activities.size()+'○○○○○'); activitiesbk = new List(); if (activities.size()>0){ for (QELine s:activities){ if (s.Asset_Model != null && s.Asset_Model != ''){ system.debug('○○○○○'+s.pageObject.Product2__c+'○○○○○'); if (s.pageObject.Product2__c != null){ // TODO katsu なぜclone()しますか?意味不明。 ConsumableSampleLineItem__c ql = s.pageObject.clone(); ql.ConsumableSample__c = q.Id; ql.ListPrice__c = s.ListPrice_Page; ql.SFDA_Status__c = prd2LatestValMap.get(s.pageObject.Product2__c).SFDA_Status__c; //並び順 ql.Item_Order__c = i; qlist.add(ql); activitiesbk.add(new QELine(ql, s.lineNo, null)); } } i++; } insert qlist; } //保存時引合Pageに戻らない処理とした為にQuoteIdをここでセット if (quoId==null){ quoId = q.Id; } return true; } public class QELine { public Integer lineNo { get; set; } // 画面の順序 public String Asset_Model {get;set;} public String Serial_Lot {get;set;} public String Asset_loaner_category {get;set;} public String Sales_Possibility {get;set;} // 販売可否○×判断用、使ってないようです。TODO 削除 public ConsumableSampleLineItem__c pageObject { get; set; } // Id__cは空行判断用、SFDA_Status__c など、翻訳される項目表示するため使う必要があります //public Decimal Cost_c { get; set; } //public Decimal Cost_Subtotal_c { get; set; } public Decimal ListPrice_Page { get; set; } public Decimal ListPriceTotal_Page { get; set; } public Decimal Packing_list_manual { get; set; } // TODO ほんとうはいらない、使うところのロジックを修正しなければいけない、削除するようにしたいです。 public QELine(Integer i) { pageObject = New ConsumableSampleLineItem__c(); this.lineNo = i; } // tmp 直接使う場合のパターン public QELine(QELine tmp, Integer i) { pageObject = tmp.pageObject; this.lineNo = i; this.Asset_Model = tmp.Asset_Model; this.Serial_Lot = tmp.Serial_Lot; this.Asset_loaner_category = tmp.Asset_loaner_category; this.Sales_Possibility = tmp.Sales_Possibility; //this.Cost_Subtotal_c = tmp.Cost_Subtotal_c; //this.Cost_c = tmp.Cost_c; this.ListPrice_Page = tmp.ListPrice_Page; this.ListPriceTotal_Page = tmp.ListPriceTotal_Page; this.Packing_list_manual = tmp.Packing_list_manual; } public QELine(ConsumableSampleLineItem__c qli, Integer i, String copyQuoId) { pageObject = qli.clone(); pageObject.Product2__c = qli.Product2__c; pageObject.Quantity__c = qli.Quantity__c; if(copyQuoId != null) { pageObject.SFDA_Status__c = qli.Product2__r.SFDA_Status__c; pageObject.Name__c = qli.Product2__r.Name; } this.lineNo = i; this.Asset_Model = qli.Asset_Model_No__c; this.Serial_Lot = qli.Serial_Lot__c; this.Asset_loaner_category = qli.Product2__r.Asset_loaner_category__c; this.ListPrice_Page = qli.ListPrice__c; this.ListPriceTotal_Page = qli.Quantity__c * qli.ListPrice__c; this.Packing_list_manual = (qli.Product2__r.Packing_list_manual__c == null || qli.Product2__r.Packing_list_manual__c <= 0) ? 1 : qli.Product2__r.Packing_list_manual__c; } // TODO Subtotal__c、以前のロジックを確認 public QELine(Integer i, String PricebookEntryId, String Asset_Model, String Serial_Lot, String Asset_loaner_category, String ProductCode, String Id_c, String SFDA_Status_c, String Sales_Possibility_c, String Name_c, String BSS_Category_c, Integer Quantity, Decimal ListPrice_c, Decimal UnitPrice_c, Decimal Cost_c, Decimal Packing_list_manual_c) { pageObject = New ConsumableSampleLineItem__c(); pageObject.Quantity__c = Quantity; this.lineNo = i; this.Asset_Model = Asset_Model; this.Serial_Lot = Serial_Lot; this.Asset_loaner_category = Asset_loaner_category; this.Sales_Possibility = Sales_Possibility_c; pageObject.Product2__c = Id_c; pageObject.SFDA_Status__c = SFDA_Status_c; pageObject.Name__c = Name_c; this.ListPrice_Page = ListPrice_c; this.ListPriceTotal_Page = Quantity * ListPrice_c; //this.Cost_c = Cost_c; // TODO katsu なぜここ > 0 の判断はいらない? //this.Cost_Subtotal_c = Cost_c * Quantity; this.Packing_list_manual = (Packing_list_manual_c == null || Packing_list_manual_c <= 0) ? 1 : Packing_list_manual_c; } } }