/**
  * Finds the vendor number from the first historical travel expense associated with the given
  * document
  *
  * @param document a document to find a corporate card vendor for
  * @return the id of the found vendor or null if nothing was found
  */
 protected String findCorporateCardVendorNumber(TEMReimbursementDocument document) {
   final CreditCardAgency creditCardAgency = getCorporateCreditCardAgency(document);
   if (!ObjectUtils.isNull(creditCardAgency)) {
     return creditCardAgency.getVendorNumber();
   }
   return null;
 }
 /**
  * @see
  *     org.kuali.kfs.module.tem.batch.service.CreditCardDataImportService#validateAndSetCreditCardAgency(org.kuali.kfs.module.tem.businessobject.CreditCardStagingData)
  */
 @Override
 public boolean validateAndSetCreditCardAgency(CreditCardStagingData creditCardData) {
   CreditCardAgency ccAgency =
       creditCardAgencyService.getCreditCardAgencyByCode(
           creditCardData.getCreditCardOrAgencyCode());
   if (ObjectUtils.isNull(ccAgency)) {
     LOG.error(
         "Mandatory Field Credit Card Or Agency Code is invalid: "
             + creditCardData.getCreditCardOrAgencyCode());
     creditCardData.setErrorCode(CreditCardStagingDataErrorCodes.CREDIT_CARD_INVALID_CC_AGENCY);
     return false;
   }
   creditCardData.setCreditCardAgency(ccAgency);
   creditCardData.setCreditCardOrAgencyCode(ccAgency.getCreditCardOrAgencyCode());
   return true;
 }
 /**
  * Finds the vendor for the corporate card used on the given document
  *
  * @param document the document to find a corporate card vendor for
  * @return the found vendor or null if a vendor could not be found
  */
 protected VendorDetail getCorporateCardVendor(CreditCardAgency creditCardAgency) {
   if (!ObjectUtils.isNull(creditCardAgency)) {
     final String vendorNumber = creditCardAgency.getVendorNumber();
     if (!StringUtils.isBlank(vendorNumber)) {
       return getVendorService().getByVendorNumber(vendorNumber);
     }
   }
   return null;
 }
  /**
   * @see
   *     org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#createPaymentGroup(org.kuali.kfs.sys.document.PaymentSource,
   *     java.sql.Date)
   */
  @Override
  public PaymentGroup createPaymentGroup(TEMReimbursementDocument document, Date processRunDate) {
    if (LOG.isDebugEnabled()) {
      LOG.debug("createPaymentGroupForReimbursable() started");
    }

    final boolean disburseCorporateCardPayments =
        getParameterService()
            .getParameterValueAsBoolean(
                TemParameterConstants.TEM_DOCUMENT.class,
                TemConstants.TravelParameters.CORPORATE_CARD_PAYMENT_IND);
    if (!disburseCorporateCardPayments) {
      return null; // can't disburse payments? then don't create payment groups
    }

    PaymentGroup pg = new PaymentGroup();
    final CreditCardAgency creditCardAgency = getCorporateCreditCardAgency(document);
    if (creditCardAgency == null) {
      LOG.error(
          "Skipping corporate card payment for "
              + document.getDocumentNumber()
              + " because no credit card agency could be found.");
      return null;
    }
    final VendorDetail vendor = getCorporateCardVendor(creditCardAgency);
    if (vendor == null) {
      LOG.error(
          "Skipping corporate card payment for "
              + document.getDocumentNumber()
              + " because no vendor could be found.");
      return null;
    }
    final VendorAddress vendorAddress =
        getVendorService()
            .getVendorDefaultAddress(
                vendor.getVendorAddresses(),
                vendor
                    .getVendorHeader()
                    .getVendorType()
                    .getAddressType()
                    .getVendorAddressTypeCode(),
                "");

    pg.setCombineGroups(Boolean.TRUE);
    pg.setCampusAddress(Boolean.FALSE);

    pg.setCity(vendorAddress.getVendorCityName());
    pg.setCountry(vendorAddress.getVendorCountryCode());
    pg.setLine1Address(vendorAddress.getVendorLine1Address());
    pg.setLine2Address(vendorAddress.getVendorLine2Address());
    pg.setPayeeName(vendor.getVendorName());
    pg.setState(vendorAddress.getVendorStateCode());
    pg.setZipCd(vendorAddress.getVendorZipCode());
    pg.setPaymentDate(getNextDate(processRunDate));
    pg.setProcessImmediate(false);
    pg.setPymtAttachment(false);
    pg.setPymtSpecialHandling(false);
    pg.setNraPayment(false);
    pg.setBankCode(creditCardAgency.getBankCode());
    pg.setPaymentStatusCode(PdpConstants.PaymentStatusCodes.OPEN);
    if (StringUtils.equals(
        document.getTraveler().getTravelerTypeCode(), TemConstants.EMP_TRAVELER_TYP_CD)) {
      pg.setEmployeeIndicator(true);
    }
    pg.setPayeeId(vendor.getVendorNumber());
    pg.setPayeeIdTypeCd(PdpConstants.PayeeIdTypeCodes.VENDOR_ID);
    pg.setTaxablePayment(Boolean.FALSE);
    pg.setPayeeOwnerCd(vendor.getVendorHeader().getVendorOwnershipCode());

    // now add the payment detail
    final PaymentDetail paymentDetail = buildPaymentDetail(document, processRunDate);
    pg.addPaymentDetails(paymentDetail);
    paymentDetail.setPaymentGroup(pg);

    return pg;
  }