private List<MontoTotalPorFuente> procesarTotalesPorFuente(
      List<MontoPorDerecho> montosSACM,
      List<MontoPorDerecho> montosOtros,
      List<Fuente> fuentes,
      Session session) {

    List<MontoTotalPorFuente> resultado = new LinkedList<>();

    for (Fuente fuente : fuentes) {

      MontoTotalPorFuente montoTotalPorFuente = new MontoTotalPorFuente();
      montoTotalPorFuente.setFuente(fuente);
      resultado.add(montoTotalPorFuente);

      List<DerechoExterno> derechos = getDerechosPorFuente(fuente, session);
      for (DerechoExterno derecho : derechos) {

        MontoTotalPorDerecho montoTotalPorDerecho = new MontoTotalPorDerecho();
        montoTotalPorDerecho.setDerecho(derecho);
        montoTotalPorFuente.agregarMontoPorDerecho(montoTotalPorDerecho);

        for (int trimestre = 1; trimestre <= 4; trimestre++) {

          MontoPorDerecho montoSACM =
              buscarPorFuenteDerechoYTrimestre(montosSACM, fuente, derecho, trimestre);

          if (montoSACM != null) {
            montoTotalPorDerecho.setMontoSACM(montoSACM.getMonto(), trimestre);
          }

          MontoPorDerecho montoOtros =
              buscarPorFuenteDerechoYTrimestre(montosOtros, fuente, derecho, trimestre);

          if (montoOtros != null) {
            montoTotalPorDerecho.setMontoOtros(montoOtros.getMonto(), trimestre);
          }
        }
      }
    }

    return resultado;
  }
  private MontoPorDerecho buscarPorFuenteDerechoYTrimestre(
      List<MontoPorDerecho> montos, Fuente fuente, Derecho derecho, int trimestre) {

    MontoPorDerecho resultado = null;
    Iterator<MontoPorDerecho> it = montos.iterator();

    while (it.hasNext() && resultado == null) {

      MontoPorDerecho encontrado = it.next();
      if (encontrado.getDerecho().equals(derecho)
          && encontrado.getFuente().equals(fuente)
          && encontrado.getTrimestre().equals(Integer.valueOf(trimestre))) {

        resultado = encontrado;
        it.remove();
      }
    }

    return resultado;
  }