001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.bc.document.service.impl; 017 018 import java.math.BigDecimal; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.apache.commons.lang.StringUtils; 024 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPayRateHolding; 025 import org.kuali.kfs.module.bc.document.dataaccess.PayrateExportDao; 026 import org.kuali.kfs.module.bc.document.service.PayrateExportService; 027 import org.kuali.kfs.sys.KFSPropertyConstants; 028 import org.kuali.kfs.sys.service.NonTransactional; 029 import org.kuali.rice.kns.service.BusinessObjectService; 030 import org.springframework.transaction.annotation.Propagation; 031 import org.springframework.transaction.annotation.Transactional; 032 033 public class PayrateExportServiceImpl implements PayrateExportService { 034 private BusinessObjectService businessObjectService; 035 private PayrateExportDao payrateExportDao; 036 private int exportCount; 037 038 /** 039 * 040 * @see org.kuali.kfs.module.bc.service.PayrateExportService#buildExportFile() 041 */ 042 @Transactional(propagation=Propagation.REQUIRES_NEW) 043 public StringBuilder buildExportFile(Integer budgetYear, String positionUnionCode, String csfFreezeDate, String principalId) { 044 this.exportCount = 0; 045 Map payRateHoldingPersonUniversalIdentifierKey = new HashMap(); 046 payRateHoldingPersonUniversalIdentifierKey.put(KFSPropertyConstants.PERSON_UNIVERSAL_IDENTIFIER, principalId); 047 048 this.businessObjectService.deleteMatching(BudgetConstructionPayRateHolding.class, payRateHoldingPersonUniversalIdentifierKey); 049 050 StringBuilder results = new StringBuilder(); 051 052 this.payrateExportDao.buildPayRateHoldingRows(budgetYear, positionUnionCode, principalId); 053 List<BudgetConstructionPayRateHolding> holdingRecords = (List<BudgetConstructionPayRateHolding>) this.businessObjectService.findMatching(BudgetConstructionPayRateHolding.class, payRateHoldingPersonUniversalIdentifierKey); 054 for (BudgetConstructionPayRateHolding record : holdingRecords) { 055 results.append(buildExportLine(record, csfFreezeDate)); 056 exportCount++; 057 } 058 results.append("\r\n"); 059 results.append("\r\n"); 060 results.append("Export complete. Export Count: " + exportCount + "\r\n"); 061 return results; 062 } 063 064 /** 065 * 066 * @see org.kuali.kfs.module.bc.document.service.PayrateExportService#isValidPositionUnionCode(java.lang.String) 067 */ 068 @Transactional 069 public boolean isValidPositionUnionCode(String positionUnionCode) { 070 071 return this.payrateExportDao.isValidPositionUnionCode(positionUnionCode); 072 } 073 074 /** 075 * 076 * @param businessObjectService 077 */ 078 @NonTransactional 079 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 080 this.businessObjectService = businessObjectService; 081 } 082 083 /** 084 * 085 * 086 * @param payrateExportDao 087 */ 088 @NonTransactional 089 public void setPayrateExportDao(PayrateExportDao payrateExportDao) { 090 this.payrateExportDao = payrateExportDao; 091 } 092 093 /** 094 * Creates the export line 095 * 096 * @param holdingRecord 097 * @return 098 */ 099 @NonTransactional 100 protected StringBuilder buildExportLine(BudgetConstructionPayRateHolding holdingRecord, String csfFreezeDate) { 101 StringBuilder line = new StringBuilder(); 102 String emplid = padString(holdingRecord.getEmplid(), 11, true); 103 String positionNumber = padString(holdingRecord.getPositionNumber(), 8, true); 104 String name = padString(holdingRecord.getName(), 50, true); 105 String setIdSalary = padString(holdingRecord.getSetidSalary(), 5, true); 106 String salAdminPlan = padString(holdingRecord.getSalaryAdministrationPlan(), 4, true); 107 String grade = padString(holdingRecord.getGrade(), 3, true); 108 String unionCode = padString(holdingRecord.getUnionCode(), 3, true); 109 String payRate = padString(String.valueOf(holdingRecord.getAppointmentRequestedPayRate().multiply(new BigDecimal(100)).intValue()), 10, false); 110 csfFreezeDate = padString(csfFreezeDate, 8, true); 111 112 line.append(emplid); 113 line.append(positionNumber); 114 line.append(name); 115 line.append(setIdSalary); 116 line.append(salAdminPlan); 117 line.append(grade); 118 line.append(unionCode); 119 line.append(payRate); 120 line.append(csfFreezeDate); 121 line.append("\r\n"); 122 123 return line; 124 } 125 126 /** 127 * Returns a field that is the length of fieldSize, to facilitate formatting payrate export file 128 * 129 * @param stringToPad 130 * @param fieldSize 131 * @return 132 */ 133 @NonTransactional 134 protected String padString(String stringToPad, int fieldSize, boolean leftJustifiy) { 135 if (stringToPad.length() < fieldSize) { 136 if (leftJustifiy) return StringUtils.rightPad(stringToPad, fieldSize); 137 else return StringUtils.leftPad(stringToPad, fieldSize); 138 } 139 else if (stringToPad.length() > fieldSize) return stringToPad.substring(0, fieldSize - 1); 140 141 return stringToPad; 142 } 143 } 144