/** * 产品试用评价表PDFのコントローラです。 */ public class BeforeOPDPDFExtensionController { /** 処理対象の見積オブジェクトのIDです。 */ private Id targetId; private String pdfNo; /** 処理対象の見積オブジェクトです。 */ private QuoteIrai__c irai; private Opportunity opp; private ConsumableSample__c cs; /** 1ページに表示する明細の数です。 */ private Integer rowSize = 36; /** 最終ページに表示する明細の数です。 */ private Integer lastRowSize = 24; /** 製品名を開業する文字数です。 */ private Integer nameMax = 23; /** 印刷するページ数です。 */ public Integer maxPageNumber { get; private set; } /** 印刷対象の見積の配下にある見積品目データです。 */ public List printRecords { get; private set; } /** * 印刷するデータを格納するオブジェクを定義する、インナークラスです。 */ public class LineItemBean { public OpportunityLineItem oli { get; private set; } public QuoteIraiLineItem__c qli { get; private set; } public ConsumableSampleLineItem__c csli { get; private set; } public String productCode { get; private set; } public String productname { get; private set; } public Decimal quantity { get; private set; } public Decimal Packing_list_manual { get; private set; } public LineItemBean(OpportunityLineItem oli) { this.oli = oli; this.qli = null; this.csli = null; this.productCode = oli.ProductCode__c; this.productname = oli.Name__c; this.quantity = oli.Quantity; } public LineItemBean(QuoteIraiLineItem__c qli) { this.oli = null; this.qli = qli; this.csli = null; this.productCode = qli.ProductCode__c; this.productname = qli.Name__c; this.quantity = qli.Quantity__c; } public LineItemBean(ConsumableSampleLineItem__c csli) { this.oli = null; this.qli = null; this.csli = csli; this.productCode = csli.ProductCode__c; this.productname = csli.Name__c; this.quantity = csli.Quantity__c; this.Packing_list_manual = csli.Product2__r.Packing_list_manual__c; if (this.Packing_list_manual == null || this.Packing_list_manual <= 0) { this.Packing_list_manual = 1; } } } /** * 印刷するデータを格納するオブジェクトです。 * ページ側は、このオブジェクト経由で印刷するデータにアクセスします。 */ public Parameters params { get; set; } /** * 印刷するデータを格納するオブジェクを定義する、インナークラスです。 */ public class Parameters { public String lineType { get; set; } public String sysNo { get; set; } public String hpName { get; set; } public String department { get; set; } } /** * コンストラクタです。 * テスト用に作成しました。本来は不要です。 */ public BeforeOPDPDFExtensionController() { } /** * Visualforceページがアクセスするコンストラクタです。 * 印刷するデータを収集し、インスタンス変数にセットします。 * @param controller スタンダードコントローラーのインスタンス */ public BeforeOPDPDFExtensionController(ApexPages.StandardController controller) { } /** * 契約内訳で、actionから呼ばれます。 */ public void startContract() { this.params = new Parameters(); this.rowSize = 37; this.lastRowSize = 37; this.nameMax = 35; // 見積依頼 if (String.isBlank(ApexPages.currentPage().getParameters().get('qid')) == false) { this.targetId = ApexPages.currentPage().getParameters().get('qid'); this.params.lineType = 'quo'; } // 引合ボタン else if (String.isBlank(ApexPages.currentPage().getParameters().get('oid')) == false) { this.targetId = ApexPages.currentPage().getParameters().get('oid'); this.params.lineType = 'opp'; } // 消耗品 else if (String.isBlank(ApexPages.currentPage().getParameters().get('csid')) == false) { this.targetId = ApexPages.currentPage().getParameters().get('csid'); this.params.lineType = 'cs'; } if (String.isBlank(ApexPages.currentPage().getParameters().get('pdfNo')) == false) { this.pdfNo = ApexPages.currentPage().getParameters().get('pdfNo'); } this.mainProc(this.targetId); } /** * 主処理です。 * @param quoteId 見積番号 */ private void mainProc(String id) { if (this.params.lineType == 'quo') { List irais = [SELECT Id, Account__r.Name, IraiSubject__c FROM QuoteIrai__c WHERE Id = :id]; if (irais.size() > 0) { irai = irais[0]; } else { return; } } else if (this.params.lineType == 'opp') { List opps = [SELECT Id, Hospital__r.Name, Department_Name__c FROM Opportunity WHERE Id = :id]; if (opps.size() > 0) { opp = opps[0]; } else { return; } } else if (this.params.lineType == 'cs') { List css = [SELECT Id, Contact__r.Hospital_name__c, Contact__r.Department__c FROM ConsumableSample__c WHERE Id = :id]; if (css.size() > 0) { cs = css[0]; } else { return; } } this.setQueryStringData(); this.bindQuoteData(id); this.bindQuoteLineData(); } /** * URLパラメータを取得して、インスタンス変数にセットします。 */ private void setQueryStringData() { try { String rawRowSize = ApexPages.currentPage().getParameters().get('rowSize'); this.rowSize = rawRowSize != null ? Integer.valueOf(rawRowSize) : this.rowSize; } catch (Exception e) { } } /** * 見積データを、インスタンス変数にセットします。 * @param quoteId 見積ID */ private void bindQuoteData(String quoteId) { if (String.isBlank(this.pdfNo) == false) { this.params.sysNo = this.pdfNo; } else { this.params.sysNo = ControllerUtil.selectCommonSequence('EvaluationPDF_NextValue__c','EvaluationPDF_Format__c'); } if (this.params.lineType == 'quo') { this.params.hpName = this.irai.Account__r.Name; this.params.department = this.irai.IraiSubject__c; } else if (this.params.lineType == 'opp') { this.params.hpName = this.opp.Hospital__r.Name; this.params.department = this.opp.Department_Name__c; } else if (this.params.lineType == 'cs') { this.params.hpName = this.cs.Contact__r.Hospital_name__c; this.params.department = this.cs.Contact__r.Department__c; } } /** * 見積品目データを取得して、インスタンス変数にセットします。 */ private void bindQuoteLineData(){ this.maxPageNumber = 0; // 見積依頼 if (this.params.lineType == 'quo') { String nowId = this.irai.Id; Integer repeatCount = null; String nowName = null, nowRightAsstModelNo = null; List nameStringArray = null; QuoteIraiLineItem__c work = null; QuoteIraiLineItem__c[] itemsOrg = [SELECT id, ProductCode__c, Name__c, Quantity__c FROM QuoteIraiLineItem__c WHERE QuoteIrai__c = :nowId ORDER BY Item_Order__c ASC]; QuoteIraiLineItem__c[] items = new List(); for (Integer i = 0; i < itemsOrg.size(); i++) { nowName = itemsOrg[i].Name__c == null ? '' : itemsOrg[i].Name__c; nowRightAsstModelNo = ''; nameStringArray = new List(); repeatCount = (nowName.length() / nameMax) + (Math.mod(nowName.length(), nameMax) > 0 ? 1 : 0); for (Integer j = 0; j < repeatCount; j++) { if ((j + 1) == repeatCount) { nameStringArray.add(nowName.substring(j * nameMax)); } else { nameStringArray.add(nowName.substring(j * nameMax, (j+1) * nameMax)); } } for (Integer k = 0; k < nameStringArray.size(); k++) { if (k == 0) { work = itemsOrg[i]; } else { work = new QuoteIraiLineItem__c(); } work.Name__c = nameStringArray[k]; items.add(work); } } printRecords = new List(); LineItemBean[] pageItems = new LineItemBean[]{}; Integer counter = 0; for (QuoteIraiLineItem__c c : items) { if (counter <= rowSize) { pageItems.add(new LineItemBean(c)); counter++; } if (counter == rowSize) { counter = 0; printRecords.add(pageItems); pageItems = new LineItemBean[]{}; this.maxPageNumber += 1; } } if (!pageItems.isEmpty()) { printRecords.add(pageItems); this.maxPageNumber += 1; } if (printRecords.size() > 0) { List lastList = printRecords[printRecords.size()-1]; if (lastList.size() > lastRowSize) { printRecords.add(new List()); this.maxPageNumber += 1; } } } // 引合ボタン else if (this.params.lineType == 'opp') { String nowId = this.opp.Id; Integer repeatCount = null; String nowName = null, nowRightAsstModelNo = null; List nameStringArray = null; OpportunityLineItem work = null; OpportunityLineItem[] itemsOrg = [SELECT id, ProductCode__c, Name__c, Quantity FROM OpportunityLineItem WHERE OpportunityId = :nowId ORDER BY Item_Order__c ASC]; OpportunityLineItem[] items = new List(); for (Integer i = 0; i < itemsOrg.size(); i++) { nowName = itemsOrg[i].Name__c == null ? '' : itemsOrg[i].Name__c; nowRightAsstModelNo = ''; nameStringArray = new List(); repeatCount = (nowName.length() / nameMax) + (Math.mod(nowName.length(), nameMax) > 0 ? 1 : 0); for (Integer j = 0; j < repeatCount; j++) { if ((j + 1) == repeatCount) { nameStringArray.add(nowName.substring(j * nameMax)); } else { nameStringArray.add(nowName.substring(j * nameMax, (j+1) * nameMax)); } } for (Integer k = 0; k < nameStringArray.size(); k++) { if (k == 0) { work = itemsOrg[i]; } else { work = new OpportunityLineItem(); } work.Name__c = nameStringArray[k]; items.add(work); } } printRecords = new List(); LineItemBean[] pageItems = new LineItemBean[]{}; Integer counter = 0; for (OpportunityLineItem c : items) { if (counter <= rowSize) { pageItems.add(new LineItemBean(c)); counter++; } if (counter == rowSize) { counter = 0; printRecords.add(pageItems); pageItems = new LineItemBean[]{}; this.maxPageNumber += 1; } } if (!pageItems.isEmpty()) { printRecords.add(pageItems); this.maxPageNumber += 1; } if (printRecords.size() > 0) { List lastList = printRecords[printRecords.size()-1]; if (lastList.size() > lastRowSize) { printRecords.add(new List()); this.maxPageNumber += 1; } } } // 消耗品 else if (this.params.lineType == 'cs') { String nowId = this.cs.Id; Integer repeatCount = null; String nowName = null, nowRightAsstModelNo = null; List nameStringArray = null; ConsumableSampleLineItem__c work = null; ConsumableSampleLineItem__c[] itemsOrg = [SELECT id, ProductCode__c, Name__c, Quantity__c, Product2__r.Packing_list_manual__c FROM ConsumableSampleLineItem__c WHERE ConsumableSample__c = :nowId ORDER BY Item_Order__c ASC]; ConsumableSampleLineItem__c[] items = new List(); for (Integer i = 0; i < itemsOrg.size(); i++) { nowName = itemsOrg[i].Name__c == null ? '' : itemsOrg[i].Name__c; nowRightAsstModelNo = ''; nameStringArray = new List(); repeatCount = (nowName.length() / nameMax) + (Math.mod(nowName.length(), nameMax) > 0 ? 1 : 0); for (Integer j = 0; j < repeatCount; j++) { if ((j + 1) == repeatCount) { nameStringArray.add(nowName.substring(j * nameMax)); } else { nameStringArray.add(nowName.substring(j * nameMax, (j+1) * nameMax)); } } for (Integer k = 0; k < nameStringArray.size(); k++) { if (k == 0) { work = itemsOrg[i]; } else { work = new ConsumableSampleLineItem__c(); } work.Name__c = nameStringArray[k]; items.add(work); } } printRecords = new List(); LineItemBean[] pageItems = new LineItemBean[]{}; Integer counter = 0; for (ConsumableSampleLineItem__c c : items) { if (counter <= rowSize) { pageItems.add(new LineItemBean(c)); counter++; } if (counter == rowSize) { counter = 0; printRecords.add(pageItems); pageItems = new LineItemBean[]{}; this.maxPageNumber += 1; } } if (!pageItems.isEmpty()) { printRecords.add(pageItems); this.maxPageNumber += 1; } if (printRecords.size() > 0) { List lastList = printRecords[printRecords.size()-1]; if (lastList.size() > lastRowSize) { printRecords.add(new List()); this.maxPageNumber += 1; } } } } }