/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.pdp.batch.service.impl;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.pdp.PdpConstants.PayeeIdTypeCodes;
import org.kuali.kfs.pdp.batch.service.InactivatePayeeAchAccountsService;
import org.kuali.kfs.pdp.businessobject.PayeeACHAccount;
import org.kuali.kfs.pdp.service.AchService;
import org.kuali.kfs.sys.service.ReportWriterService;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.kfs.vnd.document.service.VendorService;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.kim.api.identity.entity.Entity;
import org.kuali.rice.kim.api.identity.entity.EntityDefault;
import org.kuali.rice.kim.api.services.IdentityManagementService;
import org.kuali.rice.kim.api.services.KimApiServiceLocator;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* Implementation for InactivatePayeeAchAccountsService interface.
*/
public class InactivatePayeeAchAccountsServiceImpl implements InactivatePayeeAchAccountsService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InactivatePayeeAchAccountsServiceImpl.class);
private BusinessObjectService businessObjectService;
private DateTimeService dateTimeService;
private IdentityManagementService identityManagementService;
private PersonService personService;
private VendorService vendorService;
private AchService achService;
private ReportWriterService reportWriterService;
/**
* @see rg.kuali.kfs.pdp.batch.service.#inactivatePayeeAchAccounts()
*/
@Override
public boolean inactivatePayeeAchAccounts() {
LOG.info("Retrieving currently active Payee ACH Accounts ...");
List<PayeeACHAccount> accounts = achService.getActiveAchAccounts();
LOG.info("Inactivating ACH Accounts for inactive Payees and writing to the report ...");
reportWriterService.writeTableHeader(PayeeACHAccount.class);
int countEmployee = 0;
int countEntity = 0;
int countVendor = 0;
Date currentDate = dateTimeService.getCurrentDate();
for (PayeeACHAccount account : accounts) {
String idType = account.getPayeeIdentifierTypeCode();
String idNumber = account.getPayeeIdNumber();
// for Employee, retrieve from Person table by employee ID
if (StringUtils.equalsIgnoreCase(idType, PayeeIdTypeCodes.EMPLOYEE)) {
Entity entity = KimApiServiceLocator.getIdentityService().getEntityByEmployeeId(idNumber);
// inactivate the account if the person doesn't exist anymore or is inactive
if (ObjectUtils.isNull(entity) || !entity.isActive()) {
LOG.info("Inactivating Payee ACH account for employee with ID # " + idNumber);
account.setActive(false);
// set autoInactivationIndicator, and lastUpdate will be set by TimestampsBusinessObjectBase#prePersist called by OJB
account.setAutoInactivationIndicator(true);
businessObjectService.save(account);
countEmployee++;
reportWriterService.writeTableRow(account);
}
}
// for Entity, retrieve from Entity table by entity ID
else if (StringUtils.equalsIgnoreCase(idType, PayeeIdTypeCodes.ENTITY)) {
EntityDefault entity = identityManagementService.getEntityDefaultInfo(idNumber);
// inactivate the account if the entity doesn't exist anymore or is inactive
if (ObjectUtils.isNull(entity) || !entity.isActive()) {
LOG.info("Inactivating Payee ACH account for entity with ID # " + idNumber);
account.setActive(false);
// set autoInactivationIndicator, and lastUpdate will be set by TimestampsBusinessObjectBase#prePersist called by OJB
account.setAutoInactivationIndicator(true);
businessObjectService.save(account);
countEntity++;
reportWriterService.writeTableRow(account);
}
}
// for Vendor, retrieve from Vendor table by vendor number
else if (StringUtils.equalsIgnoreCase(idType, PayeeIdTypeCodes.VENDOR_ID)) {
/*
// in PayeeACHAccount table, in case the vendor number only refers to the headerId,
// with default detailId being 0, we need to add the default detailId to the vendor number
String vendorNumber = idNumber;
if (!StringUtils.contains(idNumber, VendorConstants.DASH)) {
vendorNumber += VendorConstants.DASH + VendorConstants.DEFAULT_VENDOR_DETAIL_ID;
}
VendorDetail vendor = vendorService.getVendorDetail(vendorNumber);
*/
VendorDetail vendor = vendorService.getVendorDetail(idNumber);
// inactivate the account if the vendor doesn't exist anymore or is inactive
if (ObjectUtils.isNull(vendor) || !vendor.isActiveIndicator()) {
LOG.info("Inactivating Payee ACH account for vendor with vendor # " + idNumber);
account.setActive(false);
// set autoInactivationIndicator, and lastUpdate will be set by TimestampsBusinessObjectBase#prePersist called by OJB
account.setAutoInactivationIndicator(true);
businessObjectService.save(account);
countVendor++;
reportWriterService.writeTableRow(account);
}
}
}
LOG.info("Total number of Employee Payee ACH accounts inacticated:" + countEmployee);
LOG.info("Total number of Entity Payee ACH accounts inacticated:" + countEntity);
LOG.info("Total number of Vendor Payee ACH accounts inacticated:" + countVendor);
reportWriterService.writeStatisticLine("%s %s", "TOTAL ACTIVE ACCOUNTS BEFORE RUNNING THE JOB:", accounts.size());
reportWriterService.writeStatisticLine("%s %s", "TOTAL ACCOUNTS INACTIVATED FOR EMPLOYEES: ", countEmployee);
reportWriterService.writeStatisticLine("%s %s", "TOTAL ACCOUNTS INACTIVATED FOR ENTITIES: ", countEntity);
reportWriterService.writeStatisticLine("%s %s", "TOTAL ACCOUNTS INACTIVATED FOR VENDORS: ", countVendor);
reportWriterService.writeStatisticLine("%s %s", "ACCOUNTS INACTIVATION DATE: ", currentDate);
return true;
}
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
public void setIdentityManagementService(IdentityManagementService identityManagementService) {
this.identityManagementService = identityManagementService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
public void setVendorService(VendorService vendorService) {
this.vendorService = vendorService;
}
public void setAchService(AchService achService) {
this.achService = achService;
}
public void setReportWriterService(ReportWriterService reportWriterService) {
this.reportWriterService = reportWriterService;
}
}