use of edu.cornell.kfs.fp.businessobject.ProcurementCardTransactionExtendedAttribute in project cu-kfs by CU-CommunityApps.
the class ProcurementCardCreateDocumentServiceImpl method createProcurementCardTransactionDetailExtension.
protected void createProcurementCardTransactionDetailExtension(ProcurementCardTransaction transaction, ProcurementCardTransactionDetail transactionDetail) {
ProcurementCardTransactionDetailExtendedAttribute detailExtension = buildTransactionDetailExtensionObject(transactionDetail);
if (ObjectUtils.isNotNull(transaction.getExtension())) {
ProcurementCardTransactionExtendedAttribute extension = (ProcurementCardTransactionExtendedAttribute) transaction.getExtension();
detailExtension.setDocumentNumber(transactionDetail.getDocumentNumber());
detailExtension.setFinancialDocumentTransactionLineNumber(transactionDetail.getFinancialDocumentTransactionLineNumber());
createPurchasingDataDetails(extension, detailExtension);
}
transactionDetail.setExtension(detailExtension);
}
use of edu.cornell.kfs.fp.businessobject.ProcurementCardTransactionExtendedAttribute in project cu-kfs by CU-CommunityApps.
the class ProcurementCardCreateDocumentServiceImpl method createProcurementCardDocument.
/**
* Creates a ProcurementCardDocument from the List of transactions given.
*
* @param transactions List of ProcurementCardTransaction objects to be used for creating the document.
* @return A ProcurementCardDocument populated with the transactions provided.
*/
@SuppressWarnings({ "rawtypes", "deprecation" })
@Override
public ProcurementCardDocument createProcurementCardDocument(List transactions) {
ProcurementCardDocument pcardDocument = null;
dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
try {
// get new document from doc service
pcardDocument = buildNewProcurementCardDocument();
List<CapitalAssetInformation> capitalAssets = pcardDocument.getCapitalAssetInformation();
for (CapitalAssetInformation capitalAsset : capitalAssets) {
if (ObjectUtils.isNotNull(capitalAsset) && ObjectUtils.isNotNull(capitalAsset.getCapitalAssetInformationDetails())) {
capitalAsset.setDocumentNumber(pcardDocument.getDocumentNumber());
}
}
ProcurementCardTransaction trans = (ProcurementCardTransaction) transactions.get(0);
String errorText = validateTransaction(trans);
createCardHolderRecord(pcardDocument, trans);
// for each transaction, create transaction detail object and then acct lines for the detail
int transactionLineNumber = 1;
KualiDecimal documentTotalAmount = KualiDecimal.ZERO;
ProcurementCardTransaction transaction = null;
for (Iterator iter = transactions.iterator(); iter.hasNext(); ) {
/*ProcurementCardTransaction*/
transaction = (ProcurementCardTransaction) iter.next();
// create transaction detail record with accounting lines
errorText += createTransactionDetailRecord(pcardDocument, transaction, transactionLineNumber);
// update document total
documentTotalAmount = documentTotalAmount.add(transaction.getFinancialDocumentTotalAmount());
transactionLineNumber++;
}
pcardDocument.getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(documentTotalAmount);
// pcardDocument.getDocumentHeader().setDocumentDescription("SYSTEM Generated");
transaction = (ProcurementCardTransaction) transactions.get(0);
String cardHolderName = transaction.getCardHolderName();
String vendorName = transaction.getVendorName();
String transactionType = ((ProcurementCardTransactionExtendedAttribute) transaction.getExtension()).getTransactionType();
if (transactionType != null && StringUtils.isNotBlank(transactionType)) {
VENDOR_NAME_MAX_LENGTH = 16;
} else {
VENDOR_NAME_MAX_LENGTH = 19;
}
if (cardHolderName.length() > CARD_HOLDER_MAX_LENGTH && vendorName.length() > VENDOR_NAME_MAX_LENGTH) {
cardHolderName = cardHolderName.substring(0, CARD_HOLDER_MAX_LENGTH);
vendorName = vendorName.substring(0, VENDOR_NAME_MAX_LENGTH);
}
if (cardHolderName.length() > CARD_HOLDER_MAX_LENGTH && vendorName.length() <= VENDOR_NAME_MAX_LENGTH) {
Integer endIndice = 0;
if ((CARD_HOLDER_MAX_LENGTH + (VENDOR_NAME_MAX_LENGTH - vendorName.length())) > cardHolderName.length()) {
endIndice = cardHolderName.length();
} else {
endIndice = CARD_HOLDER_MAX_LENGTH + (VENDOR_NAME_MAX_LENGTH - vendorName.length());
}
cardHolderName = cardHolderName.substring(0, endIndice);
}
if (vendorName.length() > VENDOR_NAME_MAX_LENGTH && cardHolderName.length() <= CARD_HOLDER_MAX_LENGTH) {
Integer endIndice = 0;
if ((VENDOR_NAME_MAX_LENGTH + (CARD_HOLDER_MAX_LENGTH - cardHolderName.length())) > vendorName.length()) {
endIndice = vendorName.length();
} else {
endIndice = VENDOR_NAME_MAX_LENGTH + (CARD_HOLDER_MAX_LENGTH - cardHolderName.length());
}
vendorName = vendorName.substring(0, endIndice);
}
String creditCardNumber = transaction.getTransactionCreditCardNumber();
String lastFour = "";
if (creditCardNumber.length() > CC_LAST_FOUR) {
lastFour = creditCardNumber.substring(creditCardNumber.length() - CC_LAST_FOUR);
}
String docDesc = cardHolderName + "/" + vendorName + "/" + lastFour;
if (transactionType != null && StringUtils.isNotBlank(transactionType)) {
docDesc = transactionType + "/" + cardHolderName + "/" + vendorName + "/" + lastFour;
}
if (docDesc.length() > MAX_DOC_DESC_LENGTH) {
docDesc = docDesc.substring(0, MAX_DOC_DESC_LENGTH);
}
pcardDocument.getDocumentHeader().setDocumentDescription(docDesc);
// Remove duplicate messages from errorText
String[] messages = StringUtils.split(errorText, ".");
for (int i = 0; i < messages.length; i++) {
int countMatches = StringUtils.countMatches(errorText, messages[i]) - 1;
errorText = StringUtils.replace(errorText, messages[i] + ".", "", countMatches);
}
// In case errorText is still too long, truncate it and indicate so.
Integer documentExplanationMaxLength = dataDictionaryService.getAttributeMaxLength(DocumentHeader.class.getName(), KFSPropertyConstants.EXPLANATION);
if (documentExplanationMaxLength != null && errorText.length() > documentExplanationMaxLength.intValue()) {
String truncatedMessage = " ... TRUNCATED.";
errorText = errorText.substring(0, documentExplanationMaxLength - truncatedMessage.length()) + truncatedMessage;
}
pcardDocument.getDocumentHeader().setExplanation(errorText);
} catch (WorkflowException e) {
LOG.error("Error creating pcdo documents: " + e.getMessage(), e);
throw new RuntimeException("Error creating pcdo documents: " + e.getMessage(), e);
}
return pcardDocument;
}
use of edu.cornell.kfs.fp.businessobject.ProcurementCardTransactionExtendedAttribute in project cu-kfs by CU-CommunityApps.
the class ProcurementCardFlatInputFileType method generateProcurementCardTransaction.
/**
* Parses a line into a ProcurementCardTransaction.
*
* The data in the ProcurementCardTransaction comes from USBank record types 02 and 05.
* Other USBank record types (01, 95, 98) are either skipped or used for validation.
*
* @param line The current line
* @return A completed transaction or null if there are additional lines in the transaction
* @throws Exception
*/
private ProcurementCardTransaction generateProcurementCardTransaction(String line) throws Exception {
String recordId = USBankRecordFieldUtils.extractNormalizedString(line, 0, 2);
if (recordId == null) {
throw new Exception("Unable to determine record Id necessary in order to parse line " + lineCount);
}
if (recordId.equals(FILE_HEADER_RECORD_ID)) {
// file header record
headerTransactionCount = Integer.parseInt(USBankRecordFieldUtils.extractNormalizedString(line, 67, 75));
}
if (recordId.equals(FILE_TRAILER_RECORD_ID)) {
// file footer record
footerTransactionCount = Integer.parseInt(USBankRecordFieldUtils.extractNormalizedString(line, 21, 29));
fileFooterCredits = fileFooterCredits.add(new KualiDecimal(USBankRecordFieldUtils.extractNormalizedString(line, 44, 59)));
fileFooterDebits = fileFooterDebits.add(new KualiDecimal(USBankRecordFieldUtils.extractNormalizedString(line, 29, 44)));
if (totalDebits.compareTo(fileFooterDebits.abs()) != 0) {
StringBuffer sb = new StringBuffer();
sb.append("Debits in file footer do not match the sum of debits in transaction.");
sb.append(USBankRecordFieldUtils.lineCountMessage(lineCount));
sb.append(" Debit value given in file footer: ");
sb.append(fileFooterDebits.abs());
sb.append(" Debit value generated by summing transactions: ");
sb.append(totalDebits);
throw new Exception(sb.toString());
}
if (totalCredits.compareTo(fileFooterCredits.abs()) != 0) {
StringBuffer sb = new StringBuffer();
sb.append("Credits in file footer do not match the sum of credits in transaction.");
sb.append(USBankRecordFieldUtils.lineCountMessage(lineCount));
sb.append(" Credit value given in file footer: ");
sb.append(fileFooterCredits.abs());
sb.append(" Credit value generated by summing transactions: ");
sb.append(totalCredits);
throw new Exception(sb.toString());
}
}
if (recordId.equals(CARDHOLDER_DATA_HEADER_RECORD_ID)) {
// cardholder header
parent = buildProcurementCardTransactionObject();
// req
parent.setTransactionCreditCardNumber(USBankRecordFieldUtils.extractNormalizedString(line, 2, 18, true, lineCount));
// req
parent.setChartOfAccountsCode(defaultChart);
parent.setTransactionCycleEndDate(USBankRecordFieldUtils.extractCycleDate(line, 294, 296, lineCount));
// parent.setTransactionCycleStartDate(transactionCycleStartDate); //may not be able to have
parent.setCardHolderName(USBankRecordFieldUtils.extractNormalizedString(line, 43, 68));
parent.setCardHolderLine1Address(USBankRecordFieldUtils.extractNormalizedString(line, 68, 104));
parent.setCardHolderLine2Address(USBankRecordFieldUtils.extractNormalizedString(line, 104, 140));
parent.setCardHolderCityName(USBankRecordFieldUtils.extractNormalizedString(line, 140, 165));
parent.setCardHolderStateCode(USBankRecordFieldUtils.extractNormalizedString(line, 165, 167));
// KITI-2203 : Removing last four characters from zip+4 so validation performs properly.
parent.setCardHolderZipCode(USBankRecordFieldUtils.extractNormalizedString(line, 167, 172));
// parent.setCardHolderZipCode(extractNormalizedString(line, 167, 176));
parent.setCardHolderAlternateName(USBankRecordFieldUtils.extractNormalizedString(line, 191, 206));
parent.setCardHolderWorkPhoneNumber(USBankRecordFieldUtils.extractNormalizedString(line, 206, 216));
// parent.setCardLimit(extractDecimal(line, 352, 363));
parent.setCardStatusCode(USBankRecordFieldUtils.extractNormalizedString(line, 267, 268));
String companyCode = USBankRecordFieldUtils.extractNormalizedString(line, 252, 257);
if (companyCode.equals("99998")) {
duplicateTransactions = true;
} else {
duplicateTransactions = false;
}
}
if (recordId.equals(TRANSACTION_INFORMATION_RECORD_ID) && !duplicateTransactions) {
ProcurementCardTransaction child = buildProcurementCardTransactionObject();
// Pull everything in from the preceding '05' record
child.setTransactionCreditCardNumber(parent.getTransactionCreditCardNumber());
child.setTransactionCycleEndDate(parent.getTransactionCycleEndDate());
child.setCardHolderName(parent.getCardHolderName());
child.setCardHolderLine1Address(parent.getCardHolderLine1Address());
child.setCardHolderLine2Address(parent.getCardHolderLine2Address());
child.setCardHolderCityName(parent.getCardHolderCityName());
child.setCardHolderStateCode(parent.getCardHolderStateCode());
child.setCardHolderZipCode(parent.getCardHolderZipCode());
child.setCardHolderWorkPhoneNumber(parent.getCardHolderWorkPhoneNumber());
child.setCardHolderAlternateName(parent.getCardHolderAlternateName());
// child.setCardLimit(parent.getCardLimit());
child.setCardStatusCode(parent.getCardStatusCode());
parseAccountingInformation(line, child);
child.setProjectCode(USBankRecordFieldUtils.extractNormalizedString(line, 336, 346));
// req
child.setFinancialDocumentTotalAmount(USBankRecordFieldUtils.extractDecimal(line, 79, 91, lineCount));
// req
child.setTransactionDebitCreditCode(USBankRecordFieldUtils.convertDebitCreditCode(line.substring(64, 65)));
// req
child.setTransactionDate(USBankRecordFieldUtils.extractDate(line, 45, 53, lineCount));
child.setTransactionOriginalCurrencyCode(USBankRecordFieldUtils.extractNormalizedString(line, 61, 64));
child.setTransactionBillingCurrencyCode(USBankRecordFieldUtils.extractNormalizedString(line, 76, 79));
child.setVendorName(USBankRecordFieldUtils.extractNormalizedString(line, 95, 120));
child.setTransactionReferenceNumber(USBankRecordFieldUtils.extractNormalizedString(line, 18, 41));
child.setTransactionMerchantCategoryCode(USBankRecordFieldUtils.extractNormalizedString(line, 91, 95));
child.setTransactionPostingDate(USBankRecordFieldUtils.extractDate(line, 53, 61, lineCount));
child.setTransactionOriginalCurrencyAmount(USBankRecordFieldUtils.extractDecimalWithCents(line, 64, 76, lineCount));
child.setTransactionCurrencyExchangeRate(USBankRecordFieldUtils.extractDecimal(line, 304, 317, lineCount).bigDecimalValue());
child.setTransactionSettlementAmount(USBankRecordFieldUtils.extractDecimal(line, 79, 91, lineCount));
// child.setTransactionTaxExemptIndicator(USBankAddendumRecordFieldUtils.extractNormalizedString(line, 234, 235));
child.setTransactionPurchaseIdentifierIndicator(USBankRecordFieldUtils.extractNormalizedString(line, 272, 273));
child.setTransactionPurchaseIdentifierDescription(USBankRecordFieldUtils.extractNormalizedString(line, 273, 298));
child.setVendorCityName(USBankRecordFieldUtils.extractNormalizedString(line, 120, 146));
child.setVendorStateCode(USBankRecordFieldUtils.extractNormalizedString(line, 146, 148));
// child.setVendorZipCode(USBankAddendumRecordFieldUtils.extractNormalizedString(line, 152, 161));
//
// Fix to handle zip codes provided by US Bank
//
String vendorZipCode = USBankRecordFieldUtils.extractNormalizedString(line, 152, 161);
if (vendorZipCode.startsWith("0000")) {
vendorZipCode = USBankRecordFieldUtils.extractNormalizedString(line, 156, 161);
}
child.setVendorZipCode(vendorZipCode);
child.setVisaVendorIdentifier(USBankRecordFieldUtils.extractNormalizedString(line, 176, 192));
if (child.getTransactionDebitCreditCode().equals("D")) {
accumulatedDebits = accumulatedDebits.add(child.getTransactionSettlementAmount());
} else {
accumulatedCredits = accumulatedCredits.add(child.getTransactionSettlementAmount());
}
ProcurementCardTransactionExtendedAttribute extension = buildProcurementCardTransactionExtendedAttributeObject();
extension.setTransactionType(USBankRecordFieldUtils.extractNormalizedString(line, 346, 348));
if (child.getTransactionSequenceRowNumber() == null) {
Integer generatedTransactionSequenceRowNumber = SpringContext.getBean(SequenceAccessorService.class).getNextAvailableSequenceNumber(FP_PRCRMNT_CARD_TRN_MT_SEQ).intValue();
child.setTransactionSequenceRowNumber(generatedTransactionSequenceRowNumber);
extension.setTransactionSequenceRowNumber(child.getTransactionSequenceRowNumber());
}
child.setExtension(extension);
transactionCount++;
return child;
}
// Still need to update totals and transaction count so validation works properly, but don't want transactions to be loaded
if (recordId.equals(TRANSACTION_INFORMATION_RECORD_ID) && duplicateTransactions) {
if (USBankRecordFieldUtils.convertDebitCreditCode(line.substring(64, 65)).equals("D")) {
accumulatedDebits = accumulatedDebits.add(USBankRecordFieldUtils.extractDecimal(line, 79, 91, lineCount));
} else {
accumulatedCredits = accumulatedCredits.add(USBankRecordFieldUtils.extractDecimal(line, 79, 91, lineCount));
}
transactionCount++;
}
if (recordId.equals(CARDHOLDER_TRAILER_RECORD_ID)) {
// cardholder footer
KualiDecimal recordDebits = new KualiDecimal(USBankRecordFieldUtils.extractNormalizedString(line, 24, 36));
KualiDecimal recordCredits = new KualiDecimal(USBankRecordFieldUtils.extractNormalizedString(line, 36, 48));
if (accumulatedCredits.compareTo(recordCredits.abs()) != 0) {
StringBuffer sb = new StringBuffer();
sb.append("Total credits given in cardholder footer do not sum to same value as transactions.");
sb.append(USBankRecordFieldUtils.lineCountMessage(lineCount));
sb.append(" Credit value given in cardholder footer: ");
sb.append(recordCredits.abs());
sb.append(" Credit value generated by summing transactions: ");
sb.append(accumulatedCredits);
throw new Exception(sb.toString());
}
if (accumulatedDebits.compareTo(recordDebits.abs()) != 0) {
StringBuffer sb = new StringBuffer();
sb.append("Total debits given in cardholder footer do not sum to same value as transactions.");
sb.append(USBankRecordFieldUtils.lineCountMessage(lineCount));
sb.append(" Debit value given in cardholder footer: ");
sb.append(recordDebits.abs());
sb.append(" Debit value generated by summing transactions: ");
sb.append(accumulatedDebits);
throw new Exception(sb.toString());
}
totalCredits = totalCredits.add(accumulatedCredits);
totalDebits = totalDebits.add(accumulatedDebits);
accumulatedCredits = new KualiDecimal(0);
accumulatedDebits = new KualiDecimal(0);
}
return null;
}
Aggregations