package gov.loc.syminii.utilities; import gov.loc.syminii.dao.IagTableDAO; import gov.loc.syminii.dao.MemberTableDAO; import gov.loc.syminii.dao.ServiceDirDAO; import gov.loc.syminii.dao.VendorTableDAO; import gov.loc.syminii.dao.hibernate.IagTable; import gov.loc.syminii.dao.hibernate.MemberTable; import gov.loc.syminii.dao.hibernate.ServiceTransactionTable; import gov.loc.syminii.services.GenericLookupService; import gov.loc.syminii.services.IAGServices; import gov.loc.syminii.services.impl.IagServiceImpl; import java.math.BigDecimal; import java.math.BigInteger; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; /** * * @author dunnke * @version $Revision$ $Date$ $Author$ * @history Jun 4, 2010 dunnke - created file IagDataCleanser.java * @example on or more examples of how to use a given class/function/field */ public class IagDataCleanser implements DataCleanser { @Override public Object cleans(Object obj) throws CleansingException { IagTable iag = (IagTable) obj; //Clean Iag Totals for O total totalIag(iag); //Dup Checks if (dupCheck(iag)) { logger.debug("Dup error is true"); return obj; } //Existence checks if (existanceCheck(iag)) { logger.debug("exsistance error is true"); return obj; } //IAG Action Checks (7 in srs) if (iagActionCodeCheck(iag)) { logger.debug("Action code error true"); return obj; } //General Checks (8 in srs) //Check General Checks if (iagGeneralCheck(iag)) { logger.debug("General error is true"); return obj; } //Action Code S checks (9 in srs) if (iagActionSChecks(iag)) { logger.debug("Action S error is true"); return obj; } return obj; } private void totalIag(IagTable iag) { if(iag!=null && (iag.getTotalAmount()==null || iag.getTotalAmount().intValue()==0)){ if((iag.getTotalTransferAmount()==null || iag.getTotalTransferAmount().intValue()==0) && (iag.getTotalDirectAmount()==null || iag.getTotalDirectAmount().intValue()==0)){ logger.debug("Correcting IAG Zero Dollar amount."); double totalTransServ = 0.0; double totalTranFees = 0.0; double totalDirServ = 0.0; double totalDirFees = 0.0; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getPaymentTermsLktable() == null || (service.getPaymentTermsLktable()!=null && service.getPaymentTermsLktable().getName().equalsIgnoreCase("D"))) { //Total Direct Service totalDirServ = service.getTransactionAmount().doubleValue()+totalDirServ; //Total Direct totalDirFees = service.getAdminFeeAmount().doubleValue()+totalDirFees; }else{ //Total Transfer Service totalTransServ = service.getTransactionAmount().doubleValue()+totalTransServ; //Total Transfer Fee totalTranFees = service.getAdminFeeAmount().doubleValue()+totalTranFees; } } //Total_amount = Total_Transfer_service + Total_Transfer_feel + Total_direct_service + total_direct_Fee iag.setTotalAmount(new BigDecimal(totalDirServ+totalTransServ+totalDirFees+totalTranFees)); iag.setTotalDirectAmount(new BigDecimal(totalDirServ)); iag.setTotalTransferAmount(new BigDecimal(totalTransServ)); iag.setTotalDirectFee(new BigDecimal(totalDirFees)); iag.setTotalTransferFee(new BigDecimal(totalTranFees)); } } } //Check for Iag Dups already in symin. //search by FEDLINK_ID, FY, IAG_NUM and IAGMOD //if one is found do not import IAG send notification to admin private boolean dupCheck(IagTable iag) throws CleansingException { boolean errors = false; if (iagDao.iagDupExsists(iag.getIagId(), iag.getFedlinkId(), iag.getCurrentIagNum(), iag.getIagYear(), iag.getIagModNum())) { errors = true; throw new CleansingException("Duplicate IAG Exists for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear()); } return errors; } //Check for Fedlink Id //if doesn't exsist add. //I'm not sure if this is possible. //It may have to be an alert to the admin //check for base IAG record (mod 00) and active. //if not then notifiy admin //check for iag num (seems redundant) private boolean existanceCheck(IagTable iag) throws CleansingException { boolean errors = false; //The requirement says to add the member but I don't think that makes sense. I've confirmed that a notification is sufficient. if (memberTableDAO.getByFedlinkId(iag.getFedlinkId()) == null) { errors = true; throw new CleansingException("Member Doesn't Exists for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } //check if this is a mod 00 if not then if (iag.getIagModNum().intValue() != 0 && !iagDao.iagExsists(iag.getCurrentIagNum(), BigDecimal.ZERO, iag.getIagYear())) { errors = true; throw new CleansingException("Base Iag doesn't exist for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return errors; } //Check Iag Action codes. //Check requirements table. private boolean iagActionCodeCheck(IagTable iag) throws CleansingException { boolean errors = false; switch (iag.getIagActionLktable().getId().intValue()) { case 1: /*A*/ errors = checkforNegativeServiceDollars(iag); errors = checkforService(iag); errors = checkforWrongPaymentTerms(iag); errors = checkforABRV(iag); break; case 2: /*P*/ break; case 3: /*B*/ errors = checkforNegativeServiceDollars(iag); errors = checkforBaseAction(iag); break; case 4: /*S*/ errors = checkforFees(iag); errors = checkforNegativeAmounts(iag); errors = checkforPositiveAmounts(iag); errors = checkAssiciatedIagNetZero(iag); break; case 5: /*W*/ errors = checkforFees(iag); errors = checkforOneMor4(iag); errors = checkAssiciatedIagNetZero(iag); break; case 6: /*U*/ errors = !setRforFees(iag); errors = checkAssiciatedIagNetZero(iag); break; case 7: /*K*/ errors = !setRforFees(iag); errors = checkAssiciatedIagNetZero(iag); break; case 9: /*Y*/ errors = setRforFees(iag); errors = checkforNegativeAmounts(iag); errors = checkforPositiveAmounts(iag); //errors = checkforNegativeServiceDollars(iag); Based on conversation with Reggie 04/24/2012 errors = checkforFeesMNF4(iag); errors = checkforOneMor4(iag); errors = checkforOne4(iag); errors = checkforWrongPaymentTerms(iag); errors = checkforDirectPayAccount(iag); errors = checkfor45BRV(iag); errors = checkAssiciatedIagNetZero(iag); break; case 10: /*X*/ errors = checkforFees(iag); errors = checkforNegativeAmounts(iag); errors = checkforPositiveAmounts(iag); //errors = checkforNegativeServiceDollars(iag); Based on conversation with Reggie 04/24/2012 errors = checkforFeesMNF4(iag); errors = checkforOneMor4(iag); errors = checkforOne4(iag); errors = checkforWrongPaymentTerms(iag); errors = checkforDirectPayAccount(iag); errors = checkfor45BRV(iag); errors = checkfor5BRVOrNegative(iag); errors = checkforNot4OrPositive(iag); errors = checkAssiciatedIagNetZero(iag); break; case 11: /*R*/ break; case 12: /*E*/ errors = checkforNegativeServiceDollars(iag); errors = checkforFeesMNF4(iag); break; case 13: /*J*/ break; case 14: /*T*/ break; case 8: /*M*/ errors = checkforNegativeAmounts(iag); errors = checkforPositiveAmounts(iag); //needs to be zero balance for M errors = checkforZeroBalance(iag); //errors = checkforNegativeServiceDollars(iag); Based on conversation with Reggie 04/24/2012 errors = checkforFeesMNF4(iag); errors = checkforOneMor4(iag); errors = checkforService(iag); errors = checkforWrongPaymentTerms(iag); errors = checkforDirectPayAccount(iag); errors = checkforMNBRV(iag); break; case 15: /*F*/ errors = checkforNegativeAmounts(iag); errors = checkforPositiveAmounts(iag); errors = checkforZeroBalance(iag); errors = checkforOneMor4(iag); errors = checkforService(iag); errors = checkforWrongPaymentTerms(iag); errors = checkforZRandNotM(iag); errors = checkforZROnlyBRVN(iag); errors = checkforDirectPayAccount(iag); errors = checkforF(iag); errors = checkforMNBRV(iag); break; } return errors; } private boolean iagGeneralCheck(IagTable iag) throws CleansingException { boolean errors = false; errors = checkforOCLCCategoryCode(iag); errors = checkforServiceActionCode(iag); //either Direct or Transfer errors = checkforServiceDollars(iag); errors = checkforCorTNoServiceDollars(iag); errors = checkforOCLCandServiceCat(iag); return errors; } private boolean iagActionSChecks(IagTable iag) throws CleansingException { boolean errors = false; if(iag.getIagActionLktable().getName().equalsIgnoreCase("S")){ //errors = !checkforOCLCCategoryCode(iag); //redundant check if (memberTableDAO.getByFedlinkId(iag.getFedlinkId()) == null) { errors = true; throw new CleansingException("Member Doesn't Exists for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } errors = !checkFyRange(iag); errors = !checkFyNotCurrent(iag); //TODO: not needed //errors = !checkBaseIagCheck(iag); /*mfer : commented this out : 22 april 2015 * data library indicates that this value "not imported into symin" * so I have commented this method out * I have also checked that this call is * only made here on a member table object */ //errors = !checkIagType(iag); errors = !checkPrevIagIsBase(iag); //Redundant errors = !checkPrevIag(iag); //TODO: I think this is already done //errors = !checkActionCode(iag); } return errors; } private boolean checkforFees(IagTable iag) throws CleansingException { //Set Null for this year and set feeStatus R for all prior years. iag.setFeeStatusLktable(null); iagService.setPriorYearsFeeStatus(iag.getCurrentIagNum(),iag.getIagYear(),"R"); return false; } private boolean setRforFees(IagTable iag) throws CleansingException { //Set set feeStatus R for this year and all prior years. iag.setFeeStatusLktable(genService.getFeeStatusTypelkTypeService().getByName("R")); iagService.setPriorYearsFeeStatus(iag.getCurrentIagNum(),iag.getIagYear(),"R"); return false; } private boolean checkforNegativeAmounts(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceActionLktable().getName().equalsIgnoreCase("M")) { if (service.getTransactionAmount().doubleValue() > 0) { error = true; break; } } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("F")) { if (service.getTransactionAmount().doubleValue() > 0) { error = true; break; } } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("5")) { if (service.getTransactionAmount().doubleValue() > 0) { error = true; break; } } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and none negative value for M, F, and 5 for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforPositiveAmounts(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceActionLktable().getName().equalsIgnoreCase("N")) { if (service.getTransactionAmount().doubleValue() < 0) { error = true; break; } } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("R")) { if (service.getTransactionAmount().doubleValue() < 0) { error = true; break; } } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("B")) { if (service.getTransactionAmount().doubleValue() < 0) { error = true; break; } } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("4")) { if (service.getTransactionAmount().doubleValue() < 0) { error = true; break; } } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and none positive value for N, R, B and 4 for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforNegativeServiceDollars(IagTable iag) throws CleansingException { boolean error = false; double serviceSum = 0.0; // Based on Reggies conversation this isn't needed or needs to corralated net zero. Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { serviceSum = serviceSum + service.getTransactionAmount().doubleValue(); } if (serviceSum < 0) { error = true; } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and have a negative service dollar value for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforZeroBalance(IagTable iag) throws CleansingException { boolean error = false; double serviceSum = 0.0; Set services = iag.getServiceTransactionTables(); //***check to see if transaction sum is balance 0 (If not a M based on conversation with Reggie 4/24/2012) for (ServiceTransactionTable service : services) { serviceSum = serviceSum + service.getTransactionAmount().doubleValue(); } if (Math.abs(serviceSum) >.01 ) { error = true; } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and balance doesn't equal 0 for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforFeesMNF4(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceActionLktable().getName().equalsIgnoreCase("M")) { //if (service.getAdminFeeAmount().doubleValue() != 0) { // error = true; // break; // } iag.setFeeStatusLktable(genService.getFeeStatusTypelkTypeService().getByName("R")); } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("N")) { // if (service.getAdminFeeAmount().doubleValue() != 0) { // error = true; // break; // } iag.setFeeStatusLktable(genService.getFeeStatusTypelkTypeService().getByName("R")); } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("F")) { // if (service.getAdminFeeAmount().doubleValue() != 0) { // error = true; // break; // } iag.setFeeStatusLktable(genService.getFeeStatusTypelkTypeService().getByName("R")); } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("4")) { //if (service.getAdminFeeAmount().doubleValue() != 0) { // error = true; // break; // } iag.setFeeStatusLktable(genService.getFeeStatusTypelkTypeService().getByName("R")); } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and must suppress fees on M,N,F and 4 for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforOneMor4(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("M")) { error = false; break; } else if (service.getServiceActionLktable().getName().equalsIgnoreCase("4")) { error = false; break; }else if (service.getServiceActionLktable().getName().equalsIgnoreCase("5")) { //Based on Reggie conversation 04/23/2012 error = false; break; }else if (service.getServiceActionLktable().getName().equalsIgnoreCase("N")) { //Based on Reggie conversation 04/23/2012 error = false; break; }else if (service.getServiceActionLktable().getName().equalsIgnoreCase("R")) { //Based on Reggie conversation 04/23/2012 error = false; break; }else if (service.getServiceActionLktable().getName().equalsIgnoreCase("B")) { //Based on Reggie conversation 04/23/2012 error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and must have a M, 4, 5, N, R, B record for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforService(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (!serviceDirDAO.exsists(service.getServiceId())) { error = true; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and no service record found for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } /* private boolean checkforOne4(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("4")) { error = false; break; } if (service.getServiceActionLktable().getName().equalsIgnoreCase("5")) { //based on conversation with Reggie 04/23/2012 error = false; break; } if (service.getServiceActionLktable().getName().equalsIgnoreCase("R")) { //based on conversation with Reggie 04/23/2012 error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and no record 4, 5 or R found for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; }*/ private boolean checkforOne4(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("4")) { error = false; break; } if (service.getServiceActionLktable().getName().equalsIgnoreCase("5")) { //based on conversation with Reggie 04/23/2012 error = false; break; } if (service.getServiceActionLktable().getName().equalsIgnoreCase("R")) { //based on conversation with Reggie 04/23/2012 error = false; break; } } if (error) { throw new CleansingException( "Iag action code " + iag.getIagActionLktable().getName() + " and no record 4, 5 or R found for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId() ); } return error; } private boolean checkforWrongPaymentTerms(IagTable iag) throws CleansingException { boolean error = false; //cannot be direct pay has to be a transfer pay service. Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = false; if (service.getPaymentTermsLktable() == null || (service.getPaymentTermsLktable()!=null && service.getPaymentTermsLktable().getName().equalsIgnoreCase("D"))) { error = true; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + " and wrong payment terms iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforZRandNotM(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceId().equalsIgnoreCase("ZR") && !service.getServiceActionLktable().getName().equalsIgnoreCase("M")) { error = true; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and ZR service id can't have a M action for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforZROnlyBRVN(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceId().equalsIgnoreCase("ZR") && !(service.getServiceActionLktable().getName().equalsIgnoreCase("B") || service.getServiceActionLktable().getName().equalsIgnoreCase("R") || service.getServiceActionLktable().getName().equalsIgnoreCase("V") || service.getServiceActionLktable().getName().equalsIgnoreCase("N"))) { error = true; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and ZR action can only be BRVN for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforABRV(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("A") || service.getServiceActionLktable().getName().equalsIgnoreCase("B") || service.getServiceActionLktable().getName().equalsIgnoreCase("R") || service.getServiceActionLktable().getName().equalsIgnoreCase("V")) { error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have action A,B,R or V for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforBaseAction(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); //TODO: ***** this is not right. what service actions are valid or invalid. for (ServiceTransactionTable service : services) { if (service.getServiceActionLktable() == null) { error = true; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have base action for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforDirectPayAccount(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getPaymentTermsLktable().getName().equalsIgnoreCase("D")) { error = true; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and can't have direct pay service type iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforF(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("F")) { error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have service action F iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforMNBRV(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("M") || service.getServiceActionLktable().getName().equalsIgnoreCase("N") || service.getServiceActionLktable().getName().equalsIgnoreCase("B") || service.getServiceActionLktable().getName().equalsIgnoreCase("R") || service.getServiceActionLktable().getName().equalsIgnoreCase("V")) { error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have service action M,N,B,R,or V iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkfor45BRV(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (service.getServiceActionLktable().getName().equalsIgnoreCase("4") || service.getServiceActionLktable().getName().equalsIgnoreCase("5") || service.getServiceActionLktable().getName().equalsIgnoreCase("B") || service.getServiceActionLktable().getName().equalsIgnoreCase("R") || service.getServiceActionLktable().getName().equalsIgnoreCase("V")) { error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have service action 4,5,B,R,or V iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkfor5BRVOrNegative(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { error = true; if (!(service.getServiceActionLktable().getName().equalsIgnoreCase("5") || service.getServiceActionLktable().getName().equalsIgnoreCase("B") || service.getServiceActionLktable().getName().equalsIgnoreCase("R") || service.getServiceActionLktable().getName().equalsIgnoreCase("V")) || service.getTransactionAmount().doubleValue() < 0) { error = false; break; } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have service action 5,B,R,or V for current year Or must be negative service dollars iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforNot4OrPositive(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); IagTable oldIag = null; if(iag.getPrevIagNum()!=null && iag.getPrevIagNum().compareTo(BigDecimal.ZERO)>0){ oldIag = iagDao.getPrevYears(iag.getPrevIagNum(), iag.getIagYear()); }else{ oldIag = iagDao.getPrevYears(iag.getCurrentIagNum(), iag.getIagYear()); } if(oldIag!=null){ Set servicesOld = oldIag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { for (ServiceTransactionTable serviceOld : servicesOld) { if (serviceOld.getServiceActionLktable().getName().equalsIgnoreCase("4") && service.getTransactionAmount().doubleValue() < 0) { error = true; break; } } } } if (error) { throw new CleansingException("Iag action code " + iag.getIagActionLktable().getName() + "and must have service action 4 in prior year Or must be positive service dollars iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforOCLCCategoryCode(IagTable iag) throws CleansingException { boolean error = false; if (iag.getFedlinkId().equalsIgnoreCase("OCLC")) { Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceId().equalsIgnoreCase("OC") && !service.getServiceCategoryLktable().getName().equalsIgnoreCase("G")) { error = true; break; } } if (error) { throw new CleansingException("OCLC Iag service catagory G and for service OC on iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } } return error; } private boolean checkforServiceActionCode(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if (service.getServiceActionLktable()==null) { error = true; break; } } if (error) { throw new CleansingException("Missing Service Action Code for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforServiceDollars(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if ( !(service.getServiceActionLktable().getName().equalsIgnoreCase("T") || service.getServiceActionLktable().getName().equalsIgnoreCase("C")) && (service.getTransactionAmount()==null || service.getTransactionAmount().doubleValue()==0.0)) { error = true; break; } } if (error) { throw new CleansingException("Service transaction amount zero for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforCorTNoServiceDollars(IagTable iag) throws CleansingException { boolean error = false; Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { if ( (service.getServiceActionLktable().getName().equalsIgnoreCase("T") || service.getServiceActionLktable().getName().equalsIgnoreCase("C")) && (service.getTransactionAmount()!=null || service.getTransactionAmount().doubleValue()!=0.0)) { error = true; break; } } if (error) { throw new CleansingException("Service Action T or C and transaction amount non zero for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkforOCLCandServiceCat(IagTable iag) throws CleansingException { boolean error = false; if (!iag.getFedlinkId().equalsIgnoreCase("OCLC") && iag.getCategoryCode()!=null) { } if (error) { throw new CleansingException("Service Catagory is set for non OCLC iag for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkFyRange(IagTable iag) throws CleansingException { boolean error = false; int curYear = iag.getIagYear().intValue(); int priorYear=iagDao.getPriorFy(iag.getCurrentIagNum(),iag.getIagYear()); //Changed based on conversation with Reggie 04/24/2012 if(curYear-priorYear>5){ error = true; } if (error) { throw new CleansingException("Fiscal Year is out of range for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkFyNotCurrent(IagTable iag) throws CleansingException { boolean error = false; int curYear = iag.getIagYear().intValue(); int minYear=iagDao.getMinFy(iag.getCurrentIagNum()); if(minYear==curYear){ error = true; } if (error) { throw new CleansingException("Current Fiscal Year equals Min Fiscal Year iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } /*mfer : commented this out : 22 april 2015 * data library indicates that this value "not imported into symin" * so I have commented this method out * I have also checked that this call is * only made here on a member table object */ private boolean checkIagType(IagTable iag) throws CleansingException { boolean error = false; /* MemberTable mem=memberTableDAO.getByFedlinkId(iag.getFedlinkId()); if(!mem.getLibraryTypeLktable().getName().equalsIgnoreCase("F")){ error = true; } if (error) { throw new CleansingException("Iag is not type F (contractor) iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); }*/ return error; } private boolean checkPrevIagIsBase(IagTable iag)throws CleansingException { boolean error = false; BigDecimal baseMode = new BigDecimal("00"); BigDecimal lastFY = new BigDecimal(iag.getIagYear().intValue()-1); IagTable iagOld = iagDao.findByIagAndModnumAndFy(iag.getCurrentIagNum(),baseMode, lastFY); if(iagOld==null){ error = true; } if (error) { throw new CleansingException("Previous Fiscal Year is not a base iag for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkPrevIag(IagTable iag)throws CleansingException { boolean error = false; List iagOlds =null; BigDecimal lastFY = new BigDecimal(iag.getIagYear().intValue()-1); if(iag.getPrevIagNum()!=null && iag.getPrevIagNum().compareTo(BigDecimal.ZERO)>0){ iagOlds = iagDao.findByIagAndFy(iag.getPrevIagNum(), lastFY); }else{ iagOlds = iagDao.findByIagAndFy(iag.getCurrentIagNum(), lastFY); } if(iagOlds==null || iagOlds.size()<=0){ error = true; } if (error) { throw new CleansingException("Previous Fiscal Year does not have an iag for iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } private boolean checkAssiciatedIagNetZero(IagTable iag) throws CleansingException { boolean error = false; IagTable iagOld =null; //iag.getAssociationKeyNum(); iagOld = iagDao.findIagByAssociationKeyAndNotId(iag.getAssociationKeyNum(), iag.getIagId()); double amount1 = 0; double amount2 = 0; //Based on Reggies conversation needs to check a net 0 for prior years Set services = iag.getServiceTransactionTables(); for (ServiceTransactionTable service : services) { amount1 = amount1 + service.getTransactionAmount().doubleValue(); } if(iagOld!=null){ Set services2 = iagOld.getServiceTransactionTables(); for (ServiceTransactionTable service2 : services2) { amount2 = amount2 + service2.getTransactionAmount().doubleValue(); } } if (Math.abs(amount1+amount2) >.01){ error = true; } if (error) { throw new CleansingException("Associated iag doesn't net to zero iagId=" + iag.getIagId() + " IagNum=" + iag.getCurrentIagNum() + " IagMod=" + iag.getIagModNum() + " FiscalYear=" + iag.getIagYear() + " FedLinkId=" + iag.getFedlinkId()); } return error; } @Autowired @Qualifier("memberDao") private MemberTableDAO memberTableDAO; @Autowired @Qualifier("iagDao") private IagTableDAO iagDao; @Autowired @Qualifier("serviceDao") private ServiceDirDAO serviceDirDAO; @Autowired @Qualifier("iagService") private IAGServices iagService; @Autowired @Qualifier("genericLookupService") private GenericLookupService genService; private static final Log logger = LogFactory.getLog(IagServiceImpl.class); }