public void cancelWorkflowForDcCoop(AdDcCoopBean dcCoop) throws ApplicationException { if (dcCoop != null && dcCoop.getWorkFlowPhaseId() > 0) { int tranId = ContractsUtils.getTransactionPhaseCommand() .getTransactionPhaseById(dcCoop.getWorkFlowPhaseId()) .getTransactionId(); if (LOG.isLoggable(Level.FINER)) LOG.log( Level.FINER, "Cancelling transaction [" + tranId + "] for Ad Coop [" + dcCoop.getCoopId() + "]."); ContractsUtils.getTransactionCommand().cancelTransaction(tranId); } }
public void transactionEnteringState(State stateVal, WorkflowTransactionPhase phase) throws WorkflowException { try { // flip the phase to active. phase.setStatus(ContractsUtils.getWorkflowStatusCommand().getActiveStatus().getId()); ContractsUtils.getTransactionPhaseCommand().updateTransactionPhase(phase); } catch (ApplicationException ae) { LOG.log(Level.SEVERE, "An error occurred while updating phase " + phase.getId(), ae); throw new WorkflowException( "The transaction failed while entering state " + stateVal.getId() + ". The root cause is: " + ae.getMessage()); } }
public State getStateByNameAndWorkflowName(String stateName, String workflowName) throws ApplicationException { Workflow wf = ContractsUtils.getWorkflowCommand().getWorkflowByName(workflowName); if (wf == null) { throw new ApplicationException("Specifiec workflow " + workflowName + " does not exist"); } return getStateByNameAndWorkflowId(stateName, wf.getId()); }
public void updateDivisionCoopMonies(int coopId) throws ApplicationException { if (LOG.isLoggable(Level.FINE)) { LOG.entering(this.getClass().getName(), "updateDivisionCoopMonies", String.valueOf(coopId)); } boolean success = false; try { // DBHelper.startTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, false); AdCoopBean coop = AdCoopManager.getCoopById(coopId); if (coop == null) throw new ApplicationException("No coop exists having id: " + coopId); ArrayList<AdDcCoopBean> divisionCoops = AdDcCoopManager.getDivisionCoops(coopId); if (coop.getType() == ContractsUtils.getCoopIdRegional()) { AdDcCoopBean divisionBean = null, lastAccepted = null; double acceptedDollars = 0.0; double runningTotal = 0.0; // Find the total sum for all accepted dollars for (int i = 0; i < divisionCoops.size(); i++) { divisionBean = divisionCoops.get(i); if (divisionBean.getDivisionTaken() == 1 && divisionBean.getAccountRejectReason() <= 0) { acceptedDollars += divisionBean.getInitialAmount(); } } if (LOG.isLoggable(Level.FINER)) { LOG.finer("total amount of accepted coop dollars is: " + acceptedDollars); } for (int i = 0; i < divisionCoops.size(); i++) { divisionBean = (AdDcCoopBean) divisionCoops.get(i); if (divisionBean.getDivisionTaken() == 1 && divisionBean.getAccountRejectReason() <= 0 && acceptedDollars > 0.0) { lastAccepted = divisionBean; // Multiply the accepted amount by a scaling factor in order to reallocate the dollars // that were // not accepted. For example, if only $500 (acceptedDollars) out of $1000 // (coop.getTotal) // dollars were accepted, the amounts that WERE accepted would be multiplied by 2 = // 1000/500 double newAmount = (divisionBean.getInitialAmount() * coop.getTotal()) / acceptedDollars; newAmount = Math.round(newAmount * 100.0D) / 100.0D; // get rid of extra digits runningTotal += newAmount; divisionBean.setBilledAmount(newAmount); } else { divisionBean.setBilledAmount(0.0); } } if (lastAccepted != null && runningTotal != coop.getTotal()) { if (LOG.isLoggable(Level.FINER)) { LOG.finer( "offsetting funds from rounding errors of " + (coop.getTotal() - runningTotal) + " to division " + lastAccepted.getRegionMemberId()); } double newAmount = lastAccepted.getBilledAmount() + coop.getTotal() - runningTotal; lastAccepted.setBilledAmount(Math.round(newAmount * 100.0D) / 100.0D); } } else { boolean isCaseRate = coop.getType() == ContractsUtils.getCoopIdCaseRate(); for (int i = 0; i < divisionCoops.size(); i++) { AdDcCoopBean divisionBean = (AdDcCoopBean) divisionCoops.get(i); if (divisionBean.getDivisionTaken() == 1 && divisionBean.getAccountRejectReason() <= 0) { if (isCaseRate) { int actualCases = divisionBean.getActualCases() <= 0 ? 0 : divisionBean.getActualCases(); divisionBean.setBilledAmount( Math.round(actualCases * divisionBean.getInitialAmount() * 100.0D) / 100.0D); } else { divisionBean.setBilledAmount(divisionBean.getInitialAmount()); } } else { divisionBean.setBilledAmount(0.0); } LOG.finer("billed amount for division : " + divisionBean.getBilledAmount()); } } this.storeAdDcCoops( (AdDcCoopBean[]) ArrayUtils.toTypedArray(divisionCoops, AdDcCoopBean.class)); success = true; } finally { // DBHelper.finalizeActiveTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, success); } if (LOG.isLoggable(Level.FINE)) { LOG.exiting(this.getClass().getName(), "updateDivisionCoopMonies", String.valueOf(coopId)); } }
public AdDcCoopDetailBean[] getAdDcCoopDetailsByWeekAndDivision( Calendar adWeek, int regionMemberId) throws Exception { LOG.log( Level.FINE, "beginning of getAdDcCoopDetailsByWeekAndDivision() on the WAS side of NFCCore"); ArrayList<AdDcCoopBean> coops = AdDcCoopManager.getDivisionCoopsByDateAndRegMbrId(adWeek, regionMemberId); LOG.log(Level.FINE, "coops_________________" + coops); AdDcCoopDetailBean[] results = new AdDcCoopDetailBean[coops.size()]; LOG.log(Level.FINE, "results_________________" + results); LOG.log( Level.FINE, "inside of getAdDcCoopDetailsByWeekAndDivision() on the WAS side of NFCCore"); Workflow coopWorkflow = ContractsUtils.getWorkflowCommand().getWorkflowByName(COOP_WORKFLOW); LOG.log(Level.FINE, "coopWorkflow_____________________________" + coopWorkflow); if (coopWorkflow == null) { LOG.log(Level.FINE, "coopWorkflow_____________________________is null"); throw new ApplicationException("Unable to locate coop workflow configuration."); } LOG.log(Level.FINE, "before divisionStateGroup_____________________________"); State divisionStateGroup = ContractsUtils.getStateCommand() .getStateByNameAndWorkflowId(DIVISION_STATE, coopWorkflow.getId()); LOG.log( Level.FINE, "before divisionStateGroup_____________________________" + divisionStateGroup); State accountingStateGroup = ContractsUtils.getStateCommand() .getStateByNameAndWorkflowId(ACCOUNTING_STATE, coopWorkflow.getId()); if (divisionStateGroup == null) { throw new ApplicationException("Unable to locate division state in workflow configuration."); } if (accountingStateGroup == null) { throw new ApplicationException( "Unable to locate accounting state in workflow configuration."); } for (int i = 0; i < coops.size(); i++) { AdDcCoopBean bean = coops.get(i); AdDcCoopDetailBean current = new AdDcCoopDetailBean(bean); AdCoopBean adCoop = ServiceLocator.getInstance() .getService(AdCoopCommand.class) .getAdCoopById(current.getCoopId()); AdEntryBean adEntry = ServiceLocator.getInstance() .getService(AdEntryCommand.class) .getAdEntryByCoopId(current.getCoopId()); current.setAdEntry(adEntry); current.setAdCoop(adCoop); current.setInDivisionPhase( ContractsUtils.getTransactionPhaseCommand() .isPhaseInState(bean.getWorkFlowPhaseId(), divisionStateGroup.getId())); current.setInAccountingPhase( ContractsUtils.getTransactionPhaseCommand() .isPhaseInState(bean.getWorkFlowPhaseId(), accountingStateGroup.getId())); results[i] = current; } LOG.log(Level.FINE, "end of getAdDcCoopDetailsByWeekAndDivision() on the WAS side of NFCCore"); return results; }
/** * Validate and update the provided list of AdDcCoopBeans in the database in transactional * fashion. If validation on any coop, an ApplicationException is thrown and no data is changed on * any entry in the database. If all entries are validated, their data is updated in the database * and workflow is performed. If <code>divisionUpdate</code> is <code>true</code>, then workflow * is sent a <code>open</code>, <code>reject</code>, or <code>accept</code> depending if the * <code>divisionTaken</code> attribute is -1, 1, or 0, respectively. If <code>divisionUpdate * </code> is <code>false</code> (i.e. an accounting update), then workflow is send <code>billed * </code> (bill date or signature is provided), <code>reject</code> (an accounting reject reason * is provided), or <code>open</code> (otherwise). Also, for all accounting updates, * #updateDivisionCoopMonies(int) is invoked. * * @param dcCoops the list of division coops to process * @param divisionUpdate indicates if this is an update from the division phase * @param username the user submitting the workflow request * @throws ApplicationException if a database, validation, or workflow error occurs */ public void updateCoopsWithWorkflow( AdDcCoopBean[] dcCoops, boolean divisionUpdate, String username) throws ApplicationException { if (dcCoops == null || dcCoops.length == 0) { return; } boolean success = false; try { // DBHelper.startTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, false); for (int i = 0; i < dcCoops.length; i++) { AdDcCoopBean dcCoop = dcCoops[i]; if (dcCoop != null) { validateCoop(dcCoop); String outcome = null; if (divisionUpdate) { AdCoopBean coop = AdCoopManager.getCoopById(dcCoop.getCoopId()); if (coop == null) { throw new ApplicationException( "Unable to locate coop having id: " + dcCoop.getCoopId()); } if (coop.getType() == ContractsUtils.getCoopIdCaseRate()) { int divisionTaken = 0; if (dcCoop.getEstimatedCases() > 0) { divisionTaken = 1; } else if (dcCoop.getEstimatedCases() == 0) { divisionTaken = -1; } dcCoop.setDivisionTaken(divisionTaken); } outcome = dcCoop.getDivisionTaken() == 1 ? "accept" : dcCoop.getDivisionTaken() == -1 ? "reject" : "open"; } else { if (username.equals(AdCoopExportCommand.WF_USERID)) outcome = "export"; else outcome = Utils.hasContent(dcCoop.getBillSign()) || dcCoop.getBillDate() != null ? "billed" : dcCoop.getAccountRejectReason() > 0 ? "reject" : "open"; } WorkflowTransactionPhase newPhase = ContractsUtils.getWorkflowCommand() .processTransition( dcCoop.getWorkFlowPhaseId(), outcome, username, dcCoop.toString()); dcCoop.setWorkFlowPhaseId(newPhase.getId()); this.storeAdDcCoop(dcCoop); if (!divisionUpdate) { this.updateDivisionCoopMonies( dcCoop.getCoopId()); // this is an accounting update, so we will affect the billed // amounts. } } } success = true; } finally { // DBHelper.finalizeActiveTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, success); } }
public ArrayList computeTransitions(State stateVal, String outcome) throws WorkflowException { if (LOG.isLoggable(Level.FINE)) { LOG.entering(State.class.getName(), "computeTransitions", outcome); } ArrayList results = new ArrayList(); Transition[] transitions = null; try { transitions = ContractsUtils.getTransitionCommand().getTransitionsByFromStateId(stateVal.getId()); for (int i = 0; i < transitions.length; i++) { Transition tran = transitions[i]; if (tran.match(outcome)) { results.add(tran); break; } } // look for Workflow global transitions in the PROP_SET for the workflow Workflow wf = ContractsUtils.getWorkflowCommand().getWorkflowById(stateVal.getWorkflowId()); GenericPropertySet gps = wf.getPropertySet(); if (gps != null) { Iterator it = gps.keys(); while (it.hasNext()) { String name = (String) it.next(); if (name.startsWith("global.transition_")) { String tranName = gps.getProperty(name); if (tranName != null) { String tranOutcome = gps.getProperty("transition." + tranName + ".outcome"); if ((tranOutcome == null && outcome == null) || tranOutcome.equals(outcome)) { Transition globalTran = ContractsUtils.getTransitionCommand() .getTransitionObjectByImplId( new Integer(gps.getProperty("transition." + tranName + ".implId")) .intValue()); globalTran.setId(-1); globalTran.setFromStateId(stateVal.getId()); String toState = gps.getProperty("transition." + tranName + ".toState"); if (toState != null) { if (toState.equals("_#fromState")) { globalTran.setToStateId(stateVal.getId()); } else { globalTran.setToStateId( new Integer( ServiceLocator.getInstance() .getLocal(StateCommandLocal.class) .getStateByNameAndWorkflowId(toState, wf.getId()) .getId()) .intValue()); } results.add(globalTran); } else { LOG.log( Level.SEVERE, "Global transition " + tranName + " does not specify a toState"); } } } else { LOG.log( Level.SEVERE, "Global transition key " + name + " does not specify a transition name"); } } } } if (results.size() == 0) { Transition defTran = ContractsUtils.getTransitionCommand() .getTransitionById(stateVal.getDefaultTransitionId()); if (defTran != null) results.add(defTran); else throw new WorkflowException( "No Transitions exist for this State [" + stateVal.getId() + "] for outcome: [" + outcome + "]!"); } } catch (ApplicationException ae) { LOG.log( Level.SEVERE, "An error occurred while processing transitions from state " + stateVal.getId(), ae); throw new WorkflowException( "An unexpected error occurred while processing the workflow transition: " + ae.getMessage()); } catch (Exception e) { LOG.log( Level.SEVERE, "An error occurred while processing transitions from state " + stateVal.getId(), e); throw new WorkflowException( "An unexpected error occurred while processing the workflow transition: " + e.getMessage()); } if (LOG.isLoggable(Level.FINE)) { LOG.exiting(State.class.getName(), "computeTransitions", String.valueOf(results.size())); } return results; }