public with sharing class QuotePDFController { public QuoteInfo quoteInfo {get; private set;} public List printRecords {get; private set;} public Integer pageCnt {get; private set;} public String isPrintPrice {get; private set;} public String currencyIsoCode {get; private set;} public boolean is_hidden_user { get; set; } public boolean is_dealer_user { get; set; } private String targetId; private Integer maxLine = 10; private static Map paymentTermsMap = new Map { 'Z001' => '预收款/预付款', 'Z002' => '立即付款', 'Z003' => '月结30天内付款', 'Z004' => '月结60天内付款', 'Z005' => '月结90天内付款', 'Z006' => '月结120天内付款', 'Z007' => '月结25天内付款', 'Z008' => '月结55天内付款', 'Z009' => '月结85天内付款', 'Z010' => '月结115天内付款', 'Z011' => '月结175天内付款', 'Z012' => '月结205天内付款', 'Z013' => '半月结,15日之前发货,当月15日到期', 'Z014' => '月结30天内付款', 'Z015' => '验收后15天电汇', 'Z020' => '100%发货后30天内支付', 'Z021' => '100%发货后60天内电汇支付', 'Z030' => '收到发票后30天内电汇', 'Z045' => '月结45天内付款', 'Z060' => '收到发票后60天内电汇', 'Z075' => '收到发票后75天内电汇', 'Z090' => '收到发票后90天内电汇', 'Z0LC' => '100% L/C (90/10)', 'Z120' => '收到发票后120天内电汇', 'Z1LC' => '100% L/C (80/20)', 'Z1TT' => '90%TT ADV,10%TT AFTER', 'Z2LC' => '100% L/C (70/30)', 'Z2TT' => '80%TT ADV,20%TT AFTER', 'Z30E' => '下月末', 'Z3LC' => '100% L/C 90 days', 'Z3TT' => '70%TT ADV,30%TT AFTER', 'Z4LC' => '90%L/CTransfer 10%TT AFTER', 'Z4TT' => '100% TT AFTER', 'Z5LC' => '100%L/C at sight Transfer', 'Z5TT' => '30% TT ADV,50% TT AT SIGHT,20% TT AFTER', 'Z60E' => '下2个月末', 'Z6LC' => '100%L/C (85/15)', 'Z6TT' => '30% TT ADV,60% TT AT SIGHT,10% TT AFTER', 'Z7LC' => '100% L/C (60/40)', 'Z7TT' => '100%TT AFTER(80/20)', 'Z8TT' => '100% TT AFTER(70/30)', 'Z9TT' => '100%TT发货后20天内支付', 'ZCOD' => 'C.O.D.', 'ZD60' => '立即应付的 到期净值', 'ZFR1' => '半月结,15日之前发货,当月15日到期', 'ZL6T' => '90% LC 60 days,10% TT AFTER', 'ZL95' => '95% L/C AFTER,5% L/C AFTER 6M FROM ACCEPTANCE DATE', 'ZLC1' => '100% L/C (90/10) Transfer', 'ZLC2' => '100% L/C AT SIGHT (95/5)', 'ZLT1' => '90%LC,10%TT', 'ZLT2' => '80%LC,20%TT', 'ZLT3' => '70%LC,30%TT', 'ZLT4' => '95%LC,5%TT', 'ZLT5' => '50%L/C,50%TT after', 'ZT20' => '20% T/T ADV,80% T/T AFTER', 'ZT30' => '30% T/T ADV, 70%T/T AFTER', 'ZT35' => '35% TT ADV,65% TT AFTER', 'ZT40' => '40% TT ADV,60% TT AFTER', 'ZT50' => '50% TT ADV,50% TT AFTER', 'ZT55' => '95%TT ADV,5%TT AFTER', 'ZT90' => '验收合格后T/T支付90%,设备正常运行三个月T/T支付10%', 'ZTT1' => 'TT AFTER DELIVERY 45 DAY', 'ZTT2' => 'TT AFTER DELIVERY 120 DAY', 'ZTT3' => '100%TT发货后15个工作日内支付', 'ZTT4' => '验收合格后T/T支付80%,设备正常运行三个月T/T支付20%', 'ZZ60' => '60 DAYS AFTER ISSUING INVOICE', 'ZZ95' => '95% L/C AFTER,5% T/T AFTER 6M FROM ACCEPTANCE DATE', 'ZZLC' => '100% L/C AT SIGHT', 'ZZTT' => '100% TT IN ADVANCE' }; public String staticResourceOpportunity{get; private set; }// 20220221 PI改造 by Bright public String staticResourceContact{get; private set; }// 20220221 PI改造 by Bright public String staticResourceFile{get; private set; }// 20220221 PI改造 by Bright public QuotePDFController() { targetId = ApexPages.currentPage().getParameters().get('Id'); isPrintPrice = ApexPages.currentPage().getParameters().get('printprice'); staticResourceOpportunity = JSON.serialize(PIHelper.getPIIntegrationInfo('Opportunity'));// 20220221 PI改造 by Bright staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));// 20220221 PI改造 by Bright staticResourceFile = JSON.serialize(PIHelper.getPIIntegrationInfo('Document'));// 20220221 PI改造 by Bright } // 画面初始化 public PageReference init() { if (targetId == null || targetId.length() == 0) { return null; } is_hidden_user = false; // String profileId = UserInfo.getProfileId(); //新的获取简档ID calendarUtil.getMemberProfileID 这里用到的人员ID 和获取到的简档ID都是15位的 String new_profileId = calendarUtil.getMemberProfileID(UserInfo.getUserId().subString(0,15)); // profileId = profileId.substring(0, 15); if (new_profileId.substring(0, 15) == System.Label.RT_BS_No_Price) { is_hidden_user = true; } is_dealer_user = false; if (UserInfo.getUserType() == 'PowerPartner') { is_dealer_user = true; } // 报价信息 List quoList = [select Id, Name, CreatedDate, OpportunityId, Opportunity.Dealer__c, Opportunity.DealerSalesStaffName__c, AccountId, PrintPrice__c, TotalPrice, DeliveryLeadTime__c, PaymentTerms__c, ExpirationDate, Warranty__c, Opportunity.TradeType__c, Opportunity.CurrencyIsoCode, Comment__c, SetName1__c, SetQty1__c, SetName2__c, SetQty2__c, SetName3__c, SetQty3__c, SetName4__c, SetQty4__c, SetName5__c, SetQty5__c, SetName6__c, SetQty6__c, SetName7__c, SetQty7__c, SetName8__c, SetQty8__c, SetName9__c, SetQty9__c, SetName10__c, SetQty10__c, SetName11__c, SetQty11__c, SetName12__c, SetQty12__c, SetName13__c, SetQty13__c, SetName14__c, SetQty14__c, SetName15__c, SetQty15__c, SetName16__c, SetQty16__c, SetName17__c, SetQty17__c, SetName18__c, SetQty18__c, SetName19__c, SetQty19__c, SetName20__c, SetQty20__c, SetName21__c, SetQty21__c, SetName22__c, SetQty22__c, SetName23__c, SetQty23__c, SetName24__c, SetQty24__c, SetName25__c, SetQty25__c, SetName26__c, SetQty26__c, SetName27__c, SetQty27__c, SetName28__c, SetQty28__c, SetName29__c, SetQty29__c, SetName30__c, SetQty30__c, Opportunity.AWS_Data_Id__c,// 20220221 PI改造 by Bright Custom_Price_Total__c, Custom_Price_Total_Text__c, Shipment_Term__c from Quote where Id = :targetId]; Quote quo = new Quote(); if (quoList.size() > 0) { quo = quoList[0]; } else { return null; } // 币种 currencyIsoCode = quo.Opportunity.CurrencyIsoCode; // 代理商信息 List dealerList = [select Id, Name, Address1__c, Phone, Fax from Account where Id = :quo.Opportunity.Dealer__c]; Account dealer = new Account(); if (dealerList.size() > 0) { dealer = dealerList[0]; } // 询价联系人信息 List ocrList = [select Id, OpportunityId, IsPrimary, ContactId from OpportunityContactRole where OpportunityId = :quo.OpportunityId order by IsPrimary]; String conid = null; if (ocrList.size() > 0) { conid = ocrList[0].ContactId; } for (OpportunityContactRole ocr : ocrList) { if (ocr.IsPrimary == true) { conid = ocr.ContactId; break; } } Contact con = new Contact(); if (conid != null && conid.length() > 0) { con = [select Id, Name, Phone, Email, AWS_Data_Id__c,// 20220221 PI改造 by Bright Account.Name from Contact where Id = :conid]; } // PDF报价信息 quoteInfo = new QuoteInfo(quo, dealer, con); // 报价产品信息 List qliList = [select Id, QuoteId, Quantity, UnitPrice, Subtotal, Description, Set__c, TotalPrice, Product2Id, Product2.ProductCode, Product2.Description, Custom_Price__c, PricebookEntry.Hidden_flag__c, Product2.Product_ECCode__c from QuoteLineItem where QuoteId = :targetId order by Set__c, LineNumber]; pageCnt = 1; printRecords = new List(); String strSetCnt = System.Label.QuoteEntryMaxSet; Integer intSetCnt = Integer.valueOf(strSetCnt); Integer cnt = 1; for (Integer i = 1; i <= intSetCnt; i++) { String sName = (String) quo.get('SetName' + i + '__c'); if (sName != null && sName.length() > 0) { String setName = 'set' + (i < 10 ? '0' : '') + i; SetInfo si = new SetInfo(cnt, setName, quo, qliList, isPrintPrice, is_hidden_user, is_dealer_user); printRecords.add(si); pageCnt += si.pCnt; cnt += 1; } } system.debug('=====pageCnt:' + pageCnt); return null; } // PDF主信息 public class QuoteInfo { public boolean printPrice {get; private set;} public String quoteDate {get; private set;} public String quoteNo {get; private set;} public String dealerName {get; private set;} public String dealerContactName {get; private set;} public String dealerContactPhone {get; private set;} public String dealerAddress {get; private set;} public String dealerPhone {get; private set;} public String dealerFax {get; private set;} public String dealerEmail {get; private set;} public String accountName {get; private set;} public String accountContactName {get; private set;} public String accountContactPhone {get; private set;} public String accountContactEmail {get; private set;} public String comment {get; private set;} public String note1 {get; private set;} public String note2 {get; private set;} public String note3 {get; private set;} public String note4 {get; private set;} public String note5 {get; private set;} public String note6 {get; private set;} public String note7 {get; private set;} public String conAwsDataId {get; private set;} public String oppAwsDataId {get; private set;} public QuoteInfo(Quote quo, Account acc, Contact con) { printPrice = quo.PrintPrice__c; Datetime cDate = quo.CreatedDate; quoteDate = cDate.format('yyyy-MM-dd'); quoteNo = quo.Name; dealerName = acc.Name; dealerContactName = quo.Opportunity.DealerSalesStaffName__c; dealerContactPhone = ''; dealerAddress = acc.Address1__c; dealerPhone = acc.Phone; dealerFax = acc.Fax; dealerEmail = ''; accountName = con.Account.Name; accountContactName = con.Name; accountContactPhone = con.Phone; accountContactEmail = con.Email; String temp = quo.Comment__c; if (temp != null) { temp = temp.replace('\n', '
'); } comment = temp; note1 = paymentTermsMap.get(quo.PaymentTerms__c); note2 = paymentTermsMap.get(quo.PaymentTerms__c); Date n3 = quo.ExpirationDate; note3 = n3 == null ? '-' : DateTime.newInstance(n3, Time.newInstance(0, 0, 0, 0)).format('MMMM,dd,yyyy'); Decimal n4 = quo.Warranty__c; note4 = n4 == null ? '0' : n4.format(); note5 = quo.Shipment_Term__c; note6 = quo.Opportunity.TradeType__c == 'Taxation' ? 'tax included' : 'tax exempted'; note7 = quo.Opportunity.TradeType__c == 'Taxation' ? '含税' : '免税'; conAwsDataId = con.aws_data_id__c; // 20220222 PI改造 by Bright oppAwsDataId = quo.Opportunity.aws_data_id__c;// 20220222 PI改造 by Bright } } public class SetInfo { private Integer maxLine = 36; public String units {get; private set;} public String description {get; private set;} public Integer qty {get; private set;} public Decimal total {get; private set;} public List> setPage {get; private set;} public Integer pCnt {get; private set;} public SetInfo(Integer no, String setName, Quote info, List qliList, String isPrintPrice, boolean is_hidden_user, boolean is_dealer_user) { units = String.valueOf(no); String fieldName = setName.substring(3); fieldName = fieldName.indexOf('0') == 0 ? fieldName.substring(1) : fieldName; description = (String) info.get('SetName' + fieldName + '__c'); Decimal d_qty = (Decimal) info.get('SetQty' + fieldName + '__c'); qty = d_qty == null ? 1 : d_qty.intValue(); total = 0; setPage = new List>(); pCnt = 0; Integer i = 0; Integer tmp = 0; List sPage = new List(); for (QuoteLineItem qli : qliList) { if (qli.Set__c == setName) { i += 1; LineInfo line = new LineInfo(i, qli, qty, info.PrintPrice__c); //LineInfo line = new LineInfo(i, qli, 1, isPrintPrice=='true'); if (tmp + line.lineCost <= maxLine && i > 1) { sPage.add(line); tmp += line.lineCost; } else { system.debug('====set new page,tmp:' + tmp + '_cost:' + line.lineCost); sPage = new List(); setPage.add(sPage); sPage.add(line); tmp = line.lineCost; pCnt += 1; } total += line.totalPrice * qty; if (is_hidden_user == true || is_dealer_user == true && qli.PricebookEntry.Hidden_flag__c == true) { line.price = 0; line.subTotal = 0; line.totalPrice = 0; } } } system.debug('=====pCnt:' + pCnt); } } // PDF明细行信息 public class LineInfo { private Integer codeBreak = 10; private Integer descriptionBreak = 9; private Integer commentBreak = 9; public Integer lineCost {get; private set;} public QuoteLineItem qli {get; private set;} public Integer lineNo {get; private set;} public String productCode {get; private set;} public String productEC {get; private set;} public String description {get; private set;} public String comment {get; private set;} public Integer quantity {get; private set;} public Decimal price {get; private set;} public Decimal subTotal {get; private set;} public Decimal totalPrice {get; private set;} public Integer pageqty {get; private set;} public LineInfo(Integer i, QuoteLineItem info, Integer qty, boolean printPrice) { // 不显示价格时,每行可显示字符增加 if (printPrice == false) { descriptionBreak = 15; commentBreak = 15; } // 计算数据所占行数 lineCost = 1; productCode = info.Product2.ProductCode; if (productCode.startsWith('00000000000')) { productCode = productCode.substring(11); } productEC = info.Product2.Product_ECCode__c; Integer cost1 = productCode == null ? 1 : Math.mod(productCode.length(), codeBreak) == 0 ? productCode.length() / codeBreak : productCode.length() / codeBreak + 1; if (lineCost < cost1) { lineCost = cost1; } description = info.product2.Description; Integer cost2 = description == null ? 1 : Math.mod(description.length(), descriptionBreak) == 0 ? description.length() / descriptionBreak : description.length() / descriptionBreak + 1; if (lineCost < cost2) { lineCost = cost2; } comment = info.Description; Integer cost3 = comment == null ? 1 : Math.mod(comment.length(), commentBreak) == 0 ? comment.length() / commentBreak : comment.length() / commentBreak + 1; if (lineCost < cost3) { lineCost = cost3; } // 项目赋值 qli = info; lineNo = i; //productCode = setBr(productCode, codeBreak); description = setBr(description, descriptionBreak); comment = setBr(comment, commentBreak); Decimal d_quantity = info.Quantity / qty; quantity = d_quantity.intValue(); price = info.Custom_Price__c == null ? 0 : info.Custom_Price__c / qty / quantity; price = price.setScale(2, System.RoundingMode.HALF_UP); subTotal = info.Custom_Price__c == null ? 0 : info.Custom_Price__c / qty; subTotal = subTotal.setScale(2, System.RoundingMode.HALF_UP); totalPrice = info.Custom_Price__c == null ? 0 : info.Custom_Price__c / qty; totalPrice = totalPrice.setScale(2, System.RoundingMode.HALF_UP); pageqty = qty; } // 手动换行 private String setBr(String orgstr, Integer breakcnt) { String tmp = ''; if (orgstr == null) { orgstr = ''; } for (Integer i = 0; i < orgstr.length() / breakcnt + 1; i++) { if (i == orgstr.length() / breakcnt) { tmp += orgstr.substring(i * breakcnt); } else { tmp += orgstr.substring(i * breakcnt, (i + 1) * breakcnt) + '
'; } } return tmp; } } }