/**
   * Generates the runs of the scheduled action which have been missed since the file was last
   * opened.
   *
   * @param scheduledAction Scheduled action for transaction
   * @return Number of transaction instances generated
   */
  private int generateMissedScheduledTransactions(ScheduledAction scheduledAction) {
    // if this scheduled action should not be run for any reason, return immediately
    if (scheduledAction.getActionType() != ScheduledAction.ActionType.TRANSACTION
        || !scheduledAction.isEnabled()
        || !scheduledAction.shouldAutoCreate()
        || (scheduledAction.getEndTime() > 0
            && scheduledAction.getEndTime() > System.currentTimeMillis())
        || (scheduledAction.getTotalFrequency() > 0
            && scheduledAction.getExecutionCount() >= scheduledAction.getTotalFrequency())) {
      return 0;
    }

    long lastRuntime = scheduledAction.getStartTime();
    if (scheduledAction.getLastRun() > 0) {
      lastRuntime = scheduledAction.getLastRun();
    }

    int generatedTransactionCount = 0;
    long period = scheduledAction.getPeriod();
    final String actionUID = scheduledAction.getActionUID();
    while ((lastRuntime = lastRuntime + period) <= System.currentTimeMillis()) {
      for (Transaction templateTransaction : mTemplateTransactions) {
        if (templateTransaction.getUID().equals(actionUID)) {
          Transaction transaction = new Transaction(templateTransaction, true);
          transaction.setTime(lastRuntime);
          transaction.setScheduledActionUID(scheduledAction.getUID());
          mTransactionList.add(transaction);
          scheduledAction.setExecutionCount(scheduledAction.getExecutionCount() + 1);
          ++generatedTransactionCount;
          break;
        }
      }
    }
    scheduledAction.setLastRun(lastRuntime);
    return generatedTransactionCount;
  }