This commit is contained in:
Torsten 2023-01-17 14:53:40 +01:00
commit fe284c2aa6
18 changed files with 1961 additions and 825 deletions

View file

@ -2,3 +2,8 @@
laravel new motorradig laravel new motorradig
cd motorradig cd motorradig
composer require laravel/ui --dev composer require laravel/ui --dev
mysql -ud0304938 -phubbabubba -h motorrad-ig.de d0304938

View file

@ -3,7 +3,7 @@ APP_ENV=local
APP_KEY=base64:7Md2wHHNq04ldtpdsz4B2LDAMEOB+4fSfxMJGfDU2zY= APP_KEY=base64:7Md2wHHNq04ldtpdsz4B2LDAMEOB+4fSfxMJGfDU2zY=
APP_DEBUG=true APP_DEBUG=true
APP_URL=http://test.motorrad-ig.de APP_URL=http://test.motorrad-ig.de
LOG_CHANNEL=stack LOG_CHANNEL=daily
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=127.0.0.1 DB_HOST=127.0.0.1

View file

@ -52,6 +52,7 @@ class RegisterController extends Controller
return Validator::make($data, [ return Validator::make($data, [
'name' => ['required', 'string', 'max:255'], 'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'mobile' => ['required', 'string', 'max:255'],
'password' => ['required', 'string', 'min:8', 'confirmed'], 'password' => ['required', 'string', 'min:8', 'confirmed'],
]); ]);
} }
@ -67,6 +68,7 @@ class RegisterController extends Controller
return User::create([ return User::create([
'name' => $data['name'], 'name' => $data['name'],
'email' => $data['email'], 'email' => $data['email'],
'mobile' => $data['mobile'],
'password' => Hash::make($data['password']), 'password' => Hash::make($data['password']),
]); ]);
} }

View file

@ -1,12 +1,14 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Page; use App\Page;
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class PageController extends Controller class PageController extends Controller
{ {
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
@ -84,20 +86,26 @@ class PageController extends Controller
} }
public function page_home() { public function page_home()
$page=Page::where('name','home')->first(); {
$content=$page->content; $page = Page::where('name', 'home')->first();
$content = $page->content;
$content = rtrim(ltrim($content,'"'),'"'); $content = rtrim(ltrim($content, '"'), '"');
$user = Auth::user();
return view('home')->with('content',$content); if ($user) {
Log::info("Home page display for user " . $user->name . "[" . $user->id . "]");
} }
public function page_activities() { return view('home')->with('content', $content);
$page=Page::where('name','activities')->first();
$content=$page->content;
return view('activities')->with('content',$content);
} }
} public function page_activities()
{
$page = Page::where('name', 'activities')->first();
$content = $page->content;
return view('activities')->with('content', $content);
}
}

View file

@ -1,21 +1,21 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Tour; use App\Tour;
use App\Booking; use App\Booking;
use App\User; use App\User;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\File; use Illuminate\Http\File;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image; use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class TourController extends Controller class TourController extends Controller
{ {
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
@ -24,33 +24,33 @@ class TourController extends Controller
public function index() public function index()
{ {
error_log("Tour:index"); error_log("Tour:index");
$tours=Tour::where('start','>',Carbon::now())->orderBy('start')->get(); $tours = Tour::where('start', '>', Carbon::now())->orderBy('start')->get();
$participantCount=array(); $participantCount = array();
foreach($tours as $key => $tour) { foreach ($tours as $key => $tour) {
$result = DB::select('select count(*) as cnt from bookings where tour_id=?', [$tour->id]); $result = DB::select('select count(*) as cnt from bookings where tour_id=?', [$tour->id]);
$participantCount[$tour->id] = $result[0]->cnt; $participantCount[$tour->id] = $result[0]->cnt;
$tours[$key]->start=Tour::toGermanDate($tour->start); $tours[$key]->start = Tour::toGermanDate($tour->start);
$tours[$key]->deadline=Tour::toGermanDate($tour->deadline); $tours[$key]->deadline = Tour::toGermanDate($tour->deadline);
} }
return view('tour.index')->with('tours',$tours)->with('participantCount',$participantCount); return view('tour.index')->with('tours', $tours)->with('participantCount', $participantCount);
} }
public function index_old() public function index_old()
{ {
error_log("Tour:index_old"); error_log("Tour:index_old");
$tours=Tour::where('start','<',Carbon::now())->orderBy('start')->get(); $tours = Tour::where('start', '<', Carbon::now())->orderBy('start')->get();
$participantCount=array(); $participantCount = array();
foreach($tours as $key => $tour) { foreach ($tours as $key => $tour) {
$result = DB::select('select count(*) as cnt from bookings where tour_id=?', [$tour->id]); $result = DB::select('select count(*) as cnt from bookings where tour_id=?', [$tour->id]);
$participantCount[$tour->id] = $result[0]->cnt; $participantCount[$tour->id] = $result[0]->cnt;
$tours[$key]->start=Tour::toGermanDate($tour->start); $tours[$key]->start = Tour::toGermanDate($tour->start);
$tours[$key]->deadline=Tour::toGermanDate($tour->deadline); $tours[$key]->deadline = Tour::toGermanDate($tour->deadline);
} }
return view('tour.index_old')->with('tours',$tours)->with('participantCount',$participantCount); return view('tour.index_old')->with('tours', $tours)->with('participantCount', $participantCount);
} }
/* /*
/** /**
@ -62,10 +62,10 @@ class TourController extends Controller
{ {
error_log("Tour:create"); error_log("Tour:create");
$tour = new Tour; $tour = new Tour;
$tour->name="neue Tour"; $tour->name = "neue Tour";
$tour->beschreibung="Tour Beschreibung"; $tour->beschreibung = "Tour Beschreibung";
$tour->user_id=Auth::user()->id; $tour->user_id = Auth::user()->id;
return view('tour.create')->with('tour',$tour); return view('tour.create')->with('tour', $tour);
} }
/** /**
@ -80,26 +80,26 @@ class TourController extends Controller
$request->validate( $request->validate(
[ [
'name'=>'required|min:3', 'name' => 'required|min:3',
'beschreibung'=>'required', 'beschreibung' => 'required',
'start'=>'required', 'start' => 'required',
'deadline'=>'required', 'deadline' => 'required',
'user_id'=>'required', 'user_id' => 'required',
'bild'=>'mimes:jpg,jpeg,bmp,png,gif' 'bild' => 'mimes:jpg,jpeg,bmp,png,gif'
] ]
); );
$tour=new Tour; $tour = new Tour;
$tour->name=$request->input('name'); $tour->name = $request->input('name');
$tour->user_id=$request->input('user_id'); $tour->user_id = $request->input('user_id');
$tour->beschreibung=$request->input('beschreibung'); $tour->beschreibung = $request->input('beschreibung');
$tour->start=Tour::toDBDate($request->input('start')); $tour->start = Tour::toDBDate($request->input('start'));
$tour->deadline=Tour::toDBDate($request->input('deadline')); $tour->deadline = Tour::toDBDate($request->input('deadline'));
$tour->max_participants=$request->input('max_participants'); $tour->max_participants = $request->input('max_participants');
$tour->is_cancelled=$request->input('is_cancelled',false); $tour->is_cancelled = $request->input('is_cancelled', false);
$tour->save(); $tour->save();
error_log("Stored deadline:".$tour->deadline); error_log("Stored deadline:" . $tour->deadline);
return redirect('/tour'); return redirect('/tour');
} }
@ -113,15 +113,15 @@ class TourController extends Controller
public function show(Tour $tour) public function show(Tour $tour)
{ {
$creator = User::find($tour->user_id); $creator = User::find($tour->user_id);
$bookings = Booking::where('tour_id',$tour->id)->get(); $bookings = Booking::where('tour_id', $tour->id)->get();
$users = array(); $users = array();
foreach($bookings as $booking) { foreach ($bookings as $booking) {
$user=User::find($booking->user_id); $user = User::find($booking->user_id);
array_push($users, $user); array_push($users, $user);
} }
// Vergangene Tour anzeigen // Vergangene Tour anzeigen
if($tour->start < Carbon::now()) { if ($tour->start < Carbon::now()) {
$tour->start = Tour::toGermanDate($tour->start); $tour->start = Tour::toGermanDate($tour->start);
$tour->deadline = Tour::toGermanDate($tour->deadline); $tour->deadline = Tour::toGermanDate($tour->deadline);
return view('tour.show_old') return view('tour.show_old')
@ -131,7 +131,7 @@ class TourController extends Controller
} }
// Zukünftige Tour anzeigen // Zukünftige Tour anzeigen
$rooms=$this->fetch_rooms($tour->id); $rooms = $this->fetch_rooms($tour->id);
$tour->start = Tour::toGermanDate($tour->start); $tour->start = Tour::toGermanDate($tour->start);
$tour->deadline = Tour::toGermanDate($tour->deadline); $tour->deadline = Tour::toGermanDate($tour->deadline);
@ -149,10 +149,11 @@ class TourController extends Controller
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
private function fetch_rooms($tour_id) { private function fetch_rooms($tour_id)
{
// - all existing rooms with booked users (if any) // - all existing rooms with booked users (if any)
// - all users without room // - all users without room
$sql=" $sql = "
SELECT SELECT
qry.tour_id, qry.tour_id,
qry.room_id, qry.room_id,
@ -162,7 +163,7 @@ class TourController extends Controller
qry.free_slots, qry.free_slots,
COALESCE(qry.room_name,'Ungebucht') as room_name, COALESCE(qry.room_name,'Ungebucht') as room_name,
COALESCE(qry.room_name,'ZZZZZZZZZ') as room_sort_order COALESCE(qry.room_id,'ZZZZZZZZZ') as room_sort_order
FROM FROM
( (
SELECT SELECT
@ -173,15 +174,16 @@ class TourController extends Controller
b.user_id, b.user_id,
(SELECT tr.capacity - count(*) from bookings where tour_id=tr.tour_id and room_id=tr.id) as free_slots (SELECT tr.capacity - count(*) from bookings where tour_id=tr.tour_id and room_id=tr.id) as free_slots
FROM FROM
tour_rooms tr tour_rooms tr LEFT JOIN bookings as b
LEFT JOIN bookings as b
ON b.tour_id = tr.tour_id AND b.room_id = tr.id ON b.tour_id = tr.tour_id AND b.room_id = tr.id
WHERE WHERE
tr.tour_id= ".$tour_id." tr.tour_id= " . $tour_id . "
) qry ) qry
LEFT JOIN users as u LEFT JOIN users as u
ON qry.user_id = u.id ON qry.user_id = u.id
UNION UNION
-- unbooked tour users -- unbooked tour users
@ -200,27 +202,30 @@ class TourController extends Controller
LEFT JOIN tour_rooms as tr LEFT JOIN tour_rooms as tr
ON b.room_id = tr.id ON b.room_id = tr.id
WHERE WHERE
b.tour_id= ".$tour_id." b.tour_id= " . $tour_id . "
AND AND
b.user_id = u.id b.user_id = u.id
AND AND
capacity is null capacity is null
ORDER BY room_name, user_name ORDER BY room_sort_order, user_name
; ;
"; ";
$rooms=DB::select($sql); $rooms = DB::select($sql);
Log::info("TourController.fetch_rooms, returning rooms result:"); //Log::info("TourController.fetch_rooms, returning rooms result:");
Log::info($rooms); //Log::info($rooms);
return($rooms); return ($rooms);
} }
public function edit(Tour $tour) public function edit(Tour $tour)
{ {
if (Auth::user()->role != 'ADMIN') {
return redirect('/tour');
}
error_log("Tour:edit"); error_log("Tour:edit");
if ($tour->start<Carbon::now()) { if ($tour->start < Carbon::now()) {
return view('tour.edit_old')->with('tour', $tour); return view('tour.edit_old')->with('tour', $tour);
} }
@ -229,6 +234,7 @@ class TourController extends Controller
$rooms = $this->fetch_rooms($tour->id); $rooms = $this->fetch_rooms($tour->id);
return view('tour.edit') return view('tour.edit')
->with('tour', $tour) ->with('tour', $tour)
->with('rooms', $rooms); ->with('rooms', $rooms);
@ -245,61 +251,62 @@ class TourController extends Controller
{ {
error_log("Tour:update"); error_log("Tour:update");
$tour=Tour::find($request->input('tour_id')); $tour = Tour::find($request->input('tour_id'));
$request->validate( $request->validate(
[ [
'tour_id' => 'required', 'tour_id' => 'required',
'name'=>'required|min:3', 'name' => 'required|min:3',
'user_id'=>'required', 'user_id' => 'required',
'bild'=>'mimes:jpg,jpeg,bmp,png,gif' 'bild' => 'mimes:jpg,jpeg,bmp,png,gif'
] ]
); );
if ($request->bild){ if ($request->bild) {
$bild = Image::make($request->bild); $bild = Image::make($request->bild);
$breite = $bild->width(); $breite = $bild->width();
$hoehe = $bild->height(); $hoehe = $bild->height();
if ($breite>$hoehe) { if ($breite > $hoehe) {
Image::make($request->bild) Image::make($request->bild)
->widen(1200) ->widen(1200)
->save(public_path().'/img/tour/'.$tour->id.'_gross.jpg'); ->save(public_path() . '/img/tour/' . $tour->id . '_gross.jpg');
Image::make($request->bild) Image::make($request->bild)
->widen(64) ->widen(64)
->save(public_path().'/img/tour/'.$tour->id.'.jpg'); ->save(public_path() . '/img/tour/' . $tour->id . '.jpg');
}else { } else {
Image::make($request->bild) Image::make($request->bild)
->heighten(900) ->heighten(900)
->save(public_path().'/img/tour/'.$tour->id.'_gross.jpg'); ->save(public_path() . '/img/tour/' . $tour->id . '_gross.jpg');
Image::make($request->bild) Image::make($request->bild)
->widen(96) ->widen(96)
->save(public_path().'/img/tour/'.$tour->id.'.jpg'); ->save(public_path() . '/img/tour/' . $tour->id . '.jpg');
} }
} }
$tour->name=$request->input('name'); $tour->name = $request->input('name');
if ($request->beschreibung) $tour->beschreibung=$request->input('beschreibung'); if ($request->beschreibung) $tour->beschreibung = $request->input('beschreibung');
if ($request->start) $tour->start=Tour::toDBDate($request->input('start')); if ($request->start) $tour->start = Tour::toDBDate($request->input('start'));
if ($request->deadline) $tour->deadline=Tour::toDBDate($request->input('deadline')); if ($request->deadline) $tour->deadline = Tour::toDBDate($request->input('deadline'));
if ($request->max_participants) $tour->max_participants=$request->input('max_participants'); if ($request->max_participants) $tour->max_participants = $request->input('max_participants');
$tour->is_cancelled= ($request->has('is_cancelled')); $tour->is_cancelled = ($request->has('is_cancelled'));
if ($request->bericht) $tour->bericht=$request->bericht; if ($request->bericht) $tour->bericht = $request->bericht;
$tour->save(); $tour->save();
error_log("Is cancelled:". $tour->is_cancelled); error_log("Is cancelled:" . $tour->is_cancelled);
return redirect('/tour'); return redirect('/tour');
} }
/* /*
public function create_room($tour_id, $capacity) { public function create_room($tour_id, $capacity) {
DB::delete("INSERT INTO booking_rooms") DB::delete("INSERT INTO booking_rooms")
} }
*/ */
public function upload_gallery(Request $request, Tour $tour){ public function upload_gallery(Request $request, Tour $tour)
{
dd($request); dd($request);
} }
@ -315,39 +322,63 @@ class TourController extends Controller
// //
} }
public function join_room($tour_id,$room_id) { public function join_room($tour_id, $room_id)
{
Log::info("TourController::join_room"); Log::info("TourController::join_room");
$user=Auth::user(); $user_id = Auth::user()->id;
Tour::join_room($tour_id,$user->id, $room_id); Tour::join_room($tour_id, $user_id, $room_id);
return redirect('/tour/'.$tour_id); return redirect('/tour/' . $tour_id);
} }
public function cancelBooking($tour_id) { public function join_room4user($tour_id, $room_id, $user_id)
$user=Auth::user(); {
Log::info("TourController::join_room");
Tour::join_room($tour_id, $user_id, $room_id);
$tour = Tour::find($tour_id);
$tour->start = Tour::toGermanDate($tour->start);
$tour->deadline = Tour::toGermanDate($tour->deadline);
$rooms = $this->fetch_rooms($tour->id);
return view('tour.edit')
->with('tour', $tour)
->with('rooms', $rooms);
return redirect('/tour/' . $tour_id);
}
public function cancelBooking($tour_id)
{
$user = Auth::user();
Booking::where('tour_id', $tour_id)->where('user_id', $user->id)->delete(); Booking::where('tour_id', $tour_id)->where('user_id', $user->id)->delete();
return redirect('/tour'); return redirect('/tour');
} }
public function cancelBookingAdmin($tour_id, $user_id) { public function cancelBookingAdmin($tour_id, $user_id)
$user=Auth::user(); {
$user = Auth::user();
if (Auth::user()->role == "ADMIN") { if (Auth::user()->role == "ADMIN") {
Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->delete(); Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->delete();
} }
return redirect('/tour/'.$tour_id); return redirect('/tour/' . $tour_id);
} }
public function create_room($tour_id,$capacity) { public function create_room($tour_id, $capacity)
{
Log::info("create_room Controller started"); Log::info("create_room Controller started");
$user=Auth::user(); $user = Auth::user();
Tour::create_room($tour_id,$capacity); Tour::create_room($tour_id, $capacity);
return redirect('tour/'.$tour_id.'/edit'); return redirect('tour/' . $tour_id . '/edit');
} }
public function delete_room($tour_id,$room_id) {
Log::info("create_room Controller started");
$user=Auth::user();
Booking::where('tour_id', $tour_id)->where('room_id', $room_id)->delete(); public function delete_room($tour_id, $room_id)
DB::delete("DELETE FROM tour_rooms WHERE tour_id = ? AND id = ?",[$tour_id, $room_id]); {
return redirect('tour/'.$tour_id.'/edit'); Log::info("create_room Controller started");
$user = Auth::user();
DB::update("UPDATE bookings SET room_id=0 WHERE room_id=" . $room_id);
DB::delete("DELETE FROM tour_rooms WHERE tour_id = ? AND id = ?", [$tour_id, $room_id]);
return redirect('tour/' . $tour_id . '/edit');
}
} }
}

View file

@ -1,14 +1,16 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\User; use App\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log; use Illuminate\Support\Facades\Auth;
use Intervention\Image\Facades\Image; use Illuminate\Support\Facades\DB;
use Log;
use Intervention\Image\Facades\Image;
class UserController extends Controller class UserController extends Controller
{ {
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
@ -16,8 +18,8 @@ class UserController extends Controller
*/ */
public function index() public function index()
{ {
$users=User::all(); $users = User::all();
return view('users.index')->with('users',$users); return view('users.index')->with('users', $users);
} }
/** /**
@ -34,28 +36,28 @@ class UserController extends Controller
* Store a newly created resource in storage. * Store a newly created resource in storage.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param \App\User $user
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
* / * /
public function store(Request $request) * public function store(Request $request)
{ * {
*
} * }
*
/** * /**
* Display the specified resource. * Display the specified resource.
* *
* @param \App\User $user
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function show($id) public function show($id)
{ {
//Log("show user id=".$id); //Log("show user id=".$id);
error_log("(show)=>".$id); error_log("(show)=>" . $id);
$user=User::find($id); $user = User::find($id);
return view('users.show')->with('user',$user); return view('users.show')->with('user', $user);
} }
@ -67,11 +69,17 @@ class UserController extends Controller
*/ */
public function edit($id) public function edit($id)
{ {
error_log("Edit:".$id);
$user=User::find($id); error_log("Edit:" . $id);
$user = User::find($id);
if (Auth::user()->role != 'ADMIN' && $user->id != Auth::user()->id) {
return redirect('/users');
}
error_log($user); error_log($user);
return view('users.edit')->with('user',$user); return view('users.edit')->with('user', $user);
} }
/** /**
@ -83,46 +91,46 @@ class UserController extends Controller
*/ */
public function update(Request $request, User $user) public function update(Request $request, User $user)
{ {
$user=User::find($request->input('id')); $user = User::find($request->input('id'));
$request->validate( $request->validate(
[ [
'name'=>'required|min:3', 'name' => 'required|min:3',
'email'=>'required|email', 'email' => 'required|email',
'role'=>'required', 'role' => 'required',
'mobile'=>'required', 'mobile' => 'required',
'bild'=>'mimes:jpg,jpeg,bmp,png,gif' 'bild' => 'mimes:jpg,jpeg,bmp,png,gif'
] ]
); );
if ($request->bild){ if ($request->bild) {
$bild = Image::make($request->bild); $bild = Image::make($request->bild);
$breite = $bild->width(); $breite = $bild->width();
$hoehe = $bild->height(); $hoehe = $bild->height();
if ($breite>$hoehe) { if ($breite > $hoehe) {
Image::make($request->bild) Image::make($request->bild)
->widen(1200) ->widen(1200)
->save(storage_path().'/img_storage/user/'.$user->id.'_gross.jpg'); ->save(storage_path() . '/img_storage/user/' . $user->id . '_gross.jpg');
Image::make($request->bild) Image::make($request->bild)
->widen(64) ->widen(64)
->save(storage_path().'/img_storage/user/'.$user->id.'.jpg'); ->save(storage_path() . '/img_storage/user/' . $user->id . '.jpg');
}else { } else {
Image::make($request->bild) Image::make($request->bild)
->heighten(900) ->heighten(900)
->save(storage_path().'/img_storage/user/'.$user->id.'_gross.jpg'); ->save(storage_path() . '/img_storage/user/' . $user->id . '_gross.jpg');
Image::make($request->bild) Image::make($request->bild)
->widen(96) ->widen(96)
->save(storage_path().'/img_storage/user/'.$user->id.'.jpg'); ->save(storage_path() . '/img_storage/user/' . $user->id . '.jpg');
} }
} }
$user->name=$request->input('name'); $user->name = $request->input('name');
$user->email=$request->input('email'); $user->email = $request->input('email');
$user->role=$request->input('role'); $user->role = $request->input('role');
$user->mobile=$request->input('mobile'); $user->mobile = $request->input('mobile');
$user->save(); $user->save();
error_log("User role: ".$user->role); error_log("User role: " . $user->role);
return redirect('/member/'); return redirect('/member/');
@ -134,11 +142,23 @@ class UserController extends Controller
* @param \App\User $user * @param \App\User $user
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function destroy(User $user) public function destroy($user_id)
{ {
// $user = User::find($user_id);
Log::info("UserController::destroy for user_id " . $user->id);
Log::info("Preparing to destroy user [" . $user->id . "]" . $user->name);
Log::info("#DESTROY_USER [users]" . $user);
$tours = DB::select("SELECT id FROM tours WHERE user_id=" . $user_id);
Log::info('#DESTROY_USER [affected tour ids]', $tours);
$bookings = DB::select("SELECT id FROM bookings WHERE user_id=" . $user_id);
Log::info("#DESTROY_USER [affected booking ids]", $bookings);
DB::delete('DELETE FROM users WHERE id=' . $user->id);
return redirect('/member/');
} }
}
}

View file

@ -1,60 +1,79 @@
<?php <?php
namespace App; namespace App;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Log; use Log;
class Tour extends Model class Tour extends Model
{ {
protected $fillable = [ protected $fillable = [
'id', 'name', 'beschreibung','user_id','start','deadline','is_cancelled', 'status' 'id', 'name', 'beschreibung', 'user_id', 'start', 'deadline', 'is_cancelled', 'status', 'bericht', 'max_participants'
]; ];
public static function getBookings($tour_id) { public static function getBookings($tour_id)
error_log("getBookings for tour_id: ".$tour_id); {
$bookings=Booking::where('tour_id',$tour_id)->get(); error_log("getBookings for tour_id: " . $tour_id);
$bookings = Booking::where('tour_id', $tour_id)->get();
return $bookings; return $bookings;
} }
public static function has_participant($tour_id, $user_id) { public static function has_participant($tour_id, $user_id)
$booking=Booking::where('tour_id', $tour_id)->where('user_id',$user_id)->first(); {
$booking = Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->first();
if($booking) return true; if ($booking) return true;
return false; return false;
} }
public static function has_space($tour_id)
{
//$tour = Tour::where("id", $tour_id)->get();
//Log::info($tour[0]);
$tour = Tour::find($tour_id);
//Log::info($tour);
$bookings = Booking::where('tour_id', $tour_id)->get();
if (count($bookings) >= $tour->max_participants) return false;
return true;
}
// new join with room parameter // new join with room parameter
public static function join_room($tour_id, $user_id, $room_id) { public static function join_room($tour_id, $user_id, $room_id)
Log::info("Tour::join_room, tour_id=".$tour_id.", user_id=".$user_id.", room_id=".$room_id); {
Log::info("Tour::join_room, tour_id=" . $tour_id . ", user_id=" . $user_id . ", room_id=" . $room_id);
$booking = Booking::firstOrCreate( $booking = Booking::firstOrCreate(
['tour_id' => $tour_id, 'user_id' => $user_id], // Retrieve if existing ['tour_id' => $tour_id, 'user_id' => $user_id], // Retrieve if existing
['tour_id' => $tour_id, 'user_id' => $user_id, 'room_id' => $room_id, ['tour_id' => $tour_id, 'user_id' => $user_id, 'room_id' => $room_id,
'created_at' => Carbon::now(), 'updated_at' => Carbon::now() ] // or create new 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()] // or create new
); );
$booking->room_id=$room_id; $booking->room_id = $room_id;
$booking->save(); $booking->save();
//Log::info($booking); //Log::info($booking);
} }
public static function cancel($tour_id, $user_id) { public static function cancel($tour_id, $user_id)
Booking::where('tour_id',$tour_id)->where('user_id',$user_id)->delete(); {
Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->delete();
} }
public static function is_over($tour_id) { public static function is_over($tour_id)
{
$tour = Tour::find($tour_id); $tour = Tour::find($tour_id);
if ($tour->start < Carbon::now()) return true; if ($tour->start < Carbon::now()) return true;
return false; return false;
} }
public static function create_room($tour_id,$capacity) { public static function create_room($tour_id, $capacity)
{
$tour = Tour::find($tour_id); $tour = Tour::find($tour_id);
$name="Einzelzimmer"; $name = "Einzelzimmer";
if ($capacity!=1) { $name="Doppelzimmer";} if ($capacity != 1) {
$sql="INSERT INTO tour_rooms (name,tour_id,capacity,created_at,updated_at) VALUES ('".$name."',".$tour_id.",".$capacity.",now(),now());"; $name = "Doppelzimmer";
}
$sql = "INSERT INTO tour_rooms (name,tour_id,capacity,created_at,updated_at) VALUES ('" . $name . "'," . $tour_id . "," . $capacity . ",now(),now());";
DB::insert($sql); DB::insert($sql);
} }
@ -67,7 +86,7 @@ class Tour extends Model
$month = $values[1]; $month = $values[1];
$day = $values[2]; $day = $values[2];
return $day.".".$month.".".$year; return $day . "." . $month . "." . $year;
} }
public static function toDBDate($deDate) public static function toDBDate($deDate)
@ -76,13 +95,13 @@ class Tour extends Model
$values = explode(" ", $deDate); $values = explode(" ", $deDate);
$year = explode(".",$values[0])[2]; $year = explode(".", $values[0])[2];
$month = explode(".",$values[0])[1]; $month = explode(".", $values[0])[1];
$day = explode(".", $values[0])[0]; $day = explode(".", $values[0])[0];
$dbDate=$year . "-" . $month . "-" . $day; $dbDate = $year . "-" . $month . "-" . $day;
//Log::info("deDate=".$deDate." converted to:".$dbDate); //Log::info("deDate=".$deDate." converted to:".$dbDate);
return $dbDate; return $dbDate;
} }
} }

View file

@ -1,13 +1,13 @@
<?php <?php
namespace App; namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
class User extends Authenticatable class User extends Authenticatable
{ {
use Notifiable; use Notifiable;
/** /**
@ -16,7 +16,7 @@ class User extends Authenticatable
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password', 'name', 'email', 'password','mobile'
]; ];
/** /**
@ -37,11 +37,12 @@ class User extends Authenticatable
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
]; ];
public static function has_tour($tour_id, $user_id) { public static function has_tour($tour_id, $user_id)
$tour=Tour::find($tour_id); {
$user=User::first($user_id); // $tour=Tour::find($tour_id);
$booking=Booking::where('tour_id', $tour_id)->where('user_id', $user_id); // $user=User::first($user_id);
$booking = Booking::where('tour_id', $tour_id)->where('user_id', $user_id);
if ($booking) return true; if ($booking) return true;
return false; return false;
} }
} }

View file

@ -39,6 +39,21 @@
</div> </div>
</div> </div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">Telefonnummer</label>
<div class="col-md-6">
<input id="mobile" type="text" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" required autocomplete="mobile">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row"> <div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">Passwort</label> <label for="password" class="col-md-4 col-form-label text-md-right">Passwort</label>

View file

@ -13,8 +13,8 @@
<div class="card-body"> <div class="card-body">
<form style="background-color: #fff;" class="text-dark" method="post"
<form style="background-color: #fff;" class="text-dark" method="post" action="/tour/{{$tour->id}}" enctype="multipart/form-data"> action="/tour/{{$tour->id}}" enctype="multipart/form-data">
@csrf @csrf
@ -24,45 +24,59 @@
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> --> <!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> -->
<label class="ml-2 mt-3 col-form-label col-form-label-sm" style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label> <label class="ml-2 mt-3 col-form-label col-form-label-sm"
<input class="mt-3 mr-2 form-control input-sm" type="text" id="name" name="name" value="{{ old('name') ?? $tour->name }}" required > style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="name" name="name"
value="{{ old('name') ?? $tour->name }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-3" style="width:180px; text-align:left;font-size:18px;" for="name">Start:</label> <label class="ml-2 mt-3" style="width:180px; text-align:left;font-size:18px;"
<input class="mt-3 mr-2 form-control input-sm" type="text" id="start" name="start" value="{{ $tour->start }}" required > for="name">Start:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="start" name="start"
value="{{ $tour->start }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;" for="deadline">Anmeldeschluss:</label> <label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;"
<input class="mt-3 mr-2 form-control" type="text" id="deadline" style="font-size:16px;" name="deadline" value="{{ old('deadline') ?? $tour->deadline }}" required > for="deadline">Anmeldeschluss:</label>
<input class="mt-3 mr-2 form-control" type="text" id="deadline" style="font-size:16px;"
name="deadline" value="{{ old('deadline') ?? $tour->deadline }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;" for="name">Max Teilnehmer:</label> <label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;"
<input class="mt-3 mr-2 form-control" type="text" id="max_participants" style="font-size:16px;" name="max_participants" value="{{ old('max_participants') ?? $tour->max_participants }}" required > for="name">Max Teilnehmer:</label>
<input class="mt-3 mr-2 form-control" type="text" id="max_participants"
style="font-size:16px;" name="max_participants" type="number" min="1" max="99"
value="{{ old('max_participants') ?? $tour->max_participants }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild" ><h4>Bild:</h4></label> <label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild"><h4>Bild:</h4>
</label>
@if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg'))) @if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg')))
<!--File exists --> <!--File exists -->
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg" data-title="{{ $tour->name }}"> <a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg"
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3" > data-title="{{ $tour->name }}">
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3">
</a> </a>
@else @else
<img src="/img/placeholder/tour128x100.jpg" class="mt-3 ml-3" > <img src="/img/placeholder/tour128x100.jpg" class="mt-3 ml-3">
@endif @endif
<input type="file" class="mt-3 mr-2 form-control" id="bild" style="font-size:20px;" name="bild" value="" > <input type="file" class="mt-3 mr-2 form-control" id="bild" style="font-size:20px;"
name="bild" value="">
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-3" style="width:140px; text-align:left;font-size:18px;" for="is_cancelled">Storniert:</label> <label class="ml-2 mt-3" style="width:140px; text-align:left;font-size:18px;"
<input class="mt-3 mr-2 form-control" type="checkbox" id="is_cancelled" style="font-size:10px;width:20px;" name="is_cancelled" for="is_cancelled">Storniert:</label>
<input class="mt-3 mr-2 form-control" type="checkbox" id="is_cancelled"
style="font-size:10px;width:20px;" name="is_cancelled"
@if($tour->is_cancelled) @if($tour->is_cancelled)
checked checked
@endif @endif
@ -71,15 +85,66 @@
<div class="form-group"> <div class="form-group">
<textarea class="col-12" name="beschreibung" rows="10" cols="50" >{{ $tour->beschreibung }} <textarea class="col-12" name="beschreibung" rows="10" cols="50">{{ $tour->beschreibung }}
</textarea> </textarea>
</div> </div>
<a href="/tour/{{$tour->id}}"><div type="submit" class="btn btn-success col-2 mb-2 float-right mr-2">Abbrechen</div></a> <a href="/tour/{{$tour->id}}">
<div type="submit" class="btn btn-success col-2 mb-2 float-right mr-2">Abbrechen</div>
</a>
<button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button> <button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button>
</form> </form>
<!-- Modal Anzeige start -->
<!-- The Modal -->
<div id="myModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="close">&times;</span>
<h2>Bitte Zimmer auswählen</h2>
<!-- Teilnehmer+Raum Anzeige/Auswahl: Nur buchbare -->
<div class="card-body">
<ul>
<!-- Intentional Assignment ! -->
@if ($room_id="") @endif
@foreach($rooms as $room)
@if( $room->room_id != 0 and $room->free_slots >0)
<!-- Dont show "Ungebucht", room_id=0 and only with available slots -->
@if ($room_id != $room->room_id)
@if(strlen($room_id))
<hr/>
@endif
<p style="list-style-type: none;">[{{$room->room_id}}]
<span>{{$room->room_name}}
</span><b><a id="booking_link"
href="/tour/{{$tour->id}}/join4user/{{$room->room_id}}/#USER_ID">
==> Buchen</a></b>
</p>
<!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif
@endif
@if(strlen($room->user_name))
<li> {{ $room->user_name}}
</li>
@endif
@endif
@endforeach
</ul>
</div>
</div>
</div>
<!--Modal Anzeige end -->
</div> </div>
</div> </div>
</div> </div>
@ -88,47 +153,72 @@
<div class="card mt-4"> <div class="card mt-4">
<div class="card-header"><h5>Teilnehmer</h5></div> <div class="card-header"><h5>Teilnehmer</h5></div>
<div class="card-body"> <div class="card-body" >
<p>
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@if ($room_id="") @endif @if ($room_id="") @endif
@foreach($rooms as $room) @foreach($rooms as $room)
@if ($room_id != $room->room_id) @if ($room_id != $room->room_id)
@if(strlen($room_id)) @if($room_id!="")
<hr/> @if($room->room_name=="Ungebucht")
</div> <div style="height:30px;"></div>
@else
</div> <div style="height:2px;"></div>
@endif @endif
<p><b>[{{$room->room_id}}] {{$room->room_name}}</b> @endif
@if($room->room_id>0) <!-- Delete link only for real room ids -->
<a class="text-primary ts_tooltip" href="/tour/{{$tour->id}}/delete_room/{{$room->room_id}}"> <div style="border:solid;border-width:1px;">
<div><b>{{$room->room_name}}
@if( $room->room_name != "Ungebucht" )
<!-- Delete link only for real room ids -->
<a id="room_booking_link" class="text-primary ts_tooltip"
href="/tour/{{$tour->id}}/delete_room/{{$room->room_id}}">
(X) <span class="ts_tooltiptext">Raum Löschen</span> (X) <span class="ts_tooltiptext">Raum Löschen</span>
</a> </a>
@endif @endif
</p> </div>
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif @if ($room_id=$room->room_id) @endif
@endif @endif
@if(strlen($room->user_name)) @if(strlen($room->user_name))
<li style="list-style:none"> {{ $room->user_name}} <div> &nbsp; {{ $room->user_name}}
@if(Auth::user()->role=="ADMIN") @if( $room->room_name == "Ungebucht" )
<a href="/tour/{{$tour->id}}/cancelBookingAdmin/{{$room->user_id}}" class="text-primary ts_tooltip"> <a href="#" data-user_id="{{$room->user_id}}" id="myBtn"
<span class="ts_tooltiptext">Stornieren</span> class="float-left ts_tooltip">
(+)
<span class="ts_tooltiptext">Zimmer zuweisen</span>
</a>
@else
<a href="/tour/{{$tour->id}}/join4user/0/{{$room->user_id}}"
class="float-left ts_tooltip">
(-)
<span class="ts_tooltiptext">Zimmer-Zuweisung löschen</span>
</a> </a>
@endif @endif
</li>
</div>
@endif @endif
@endforeach @endforeach
</ul>
</div> <div style="height:2px;"></div>
<div class="card-header"> <div class="card-header">
<a href="/tour/{{$tour->id}}/create_room/1" class="text-primary">+ Einzelzimmer</a> <p>
<a href="/tour/{{$tour->id}}/create_room/1" class="text-primary">+ Einzelzimmer
erstellen</a>
<!-- <button type="submit" class="btn">+ Einzelzimmer</button> --> <!-- <button type="submit" class="btn">+ Einzelzimmer</button> -->
</div> </p>
&nbsp;
<div class="card-header"> <p>
<a href="/tour/{{$tour->id}}/create_room/2" class="text-primary">+ Doppelzimmer</a> <a href="/tour/{{$tour->id}}/create_room/2" class="text-primary">+ Doppelzimmer
erstellen</a>
<!-- <button type="submit" class="btn">+ Doppelzimmer</button> --> <!-- <button type="submit" class="btn">+ Doppelzimmer</button> -->
</p>
</div> </div>
</div> </div>
</div> </div>
@ -141,17 +231,77 @@
<script> <script>
const elem = document.querySelector('input[name="start"]'); const elem = document.querySelector('input[name="start"]');
const datepicker_start = new Datepicker(elem, { const datepicker_start = new Datepicker(elem, {
'autohide':true, 'autohide': true,
'format':'dd.mm.yyyy', 'format': 'dd.mm.yyyy',
'language': 'de' 'language': 'de'
}); });
const elem2 = document.querySelector('input[name="deadline"]'); const elem2 = document.querySelector('input[name="deadline"]');
const datepicker_deadline = new Datepicker(elem2, { const datepicker_deadline = new Datepicker(elem2, {
'autohide':true, 'autohide': true,
'format':'dd.mm.yyyy', 'format': 'dd.mm.yyyy',
'language':'de' 'language': 'de'
}); });
//////////////////////////////////////////////////
// Get the modal
var modal = document.getElementById("myModal");
// Get the button that opens the modal
//var btn = document.getElementById("myBtn");
var btns = document.querySelectorAll("#myBtn");
for (let i = 0; i < btns.length; ++i) {
//btns[i].user_id=
btns[i].onclick = function (e) {
console.log("** CLICK **")
console.log(this)
let user_id = this.dataset.user_id
// Jetzt die Links
var elems = document.querySelectorAll("#booking_link")
for (var i = 0; i < elems.length; i++) {
console.log("Before: ")
console.log(elems[i].href)
elems[i].href = elems[i].href.replace("#USER_ID", user_id)
console.log("After:")
console.log(elems[i].href)
}
// When the user clicks on the button, open the modal
e.preventDefault();
modal.style.display = "block";
}
}
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks on <span> (x), close the modal, restore the links
span.onclick = function (e) {
e.preventDefault();
modal.style.display = "none";
// Jetzt die Links
var elems = document.querySelectorAll("#booking_link")
for (var i = 0; i < elems.length; i++) {
arr = elems[i].href.split("/")
arr.pop()
str = arr.join("/") + "/#USER_ID"
elems[i].href = str
}
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function (event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
</script> </script>
@endsection @endsection

View file

@ -2,13 +2,7 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8 mt-2"> <div class="col-md-8 mt-2">
<div class="card mt-4"> <div class="card mt-4">
@ -18,33 +12,41 @@
<div class="card-body"> <div class="card-body">
<form style="background-color: #fff;" class="text-dark" method="post" action="" enctype="multipart/form-data"> <form style="background-color: #fff;" class="text-dark" method="post" action=""
enctype="multipart/form-data">
@csrf @csrf
<div class="" style="display:flex;"> <div class="" style="display:flex;">
<!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> --> <!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> -->
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label> <label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label>
<input class="mr-1 form-control" type="text" id="name" name="name" value="{{ old('name') ?? $tour->name }}" readonly > <input class="mr-1 form-control" type="text" id="name" name="name"
value="{{ old('name') ?? $tour->name }}" readonly>
</div> </div>
<div class="mt-1" style="display:flex;"> <div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Start:</label> <label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Start:</label>
<input class="mr-1 form-control" type="text" id="start" name="start" value="{{ old('start') ?? $tour->start }}" readonly > <input class="mr-1 form-control" type="text" id="start" name="start"
value="{{ old('start') ?? $tour->start }}" readonly>
</div> </div>
<div class="mt-1" style="display:flex;"> <div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="creator">Ansprechpartner:</label> <label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="creator">Ansprechpartner:</label>
<input class="mr-1 form-control" type="text" id="creator" name="creator" value="{{ old('creator') ?? $creator->name }}" readonly > <input class="mr-1 form-control" type="text" id="creator" name="creator"
value="{{ old('creator') ?? $creator->name }}" readonly>
</div> </div>
<div class="mt-1" style="display:flex;"> <div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Anmeldeschluss:</label> <label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Anmeldeschluss:</label>
<input class="mr-1 form-control" type="text" id="anmeldeschluss" style="font-size:16px;" name="deadline" value="{{ old('anmeldeschluss') ?? $tour->deadline }}" readonly > <input class="mr-1 form-control" type="text" id="anmeldeschluss" style="font-size:16px;"
name="deadline" value="{{ old('anmeldeschluss') ?? $tour->deadline }}" readonly>
</div> </div>
<div class="mt-1" style="display:flex;"> <div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Max Teilnehmer:</label> <label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Max
<input class="mr-1 form-control" type="text" id="max_participants" style="font-size:16px;" name="max_participants" value="{{ old('max_participants') ?? $tour->max_participants }}" required > Teilnehmer:</label>
<input class="mr-1 form-control" type="text" id="max_participants"
style="font-size:16px;" name="max_participants"
value="{{ old('max_participants') ?? $tour->max_participants }}" required>
</div> </div>
@if(App\Tour::has_participant($tour->id, Auth::user()->id)) @if(App\Tour::has_participant($tour->id, Auth::user()->id))
@ -56,16 +58,19 @@
@if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg'))) @if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg')))
<!--File exists --> <!--File exists -->
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg" data-title="{{ $tour->name }}"> <a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg"
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3" > data-title="{{ $tour->name }}">
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3">
</a> </a>
@else @else
<img src="/img/placeholder/tour128x100.jpg" class="mt-3 ml-3" > <img src="/img/placeholder/tour128x100.jpg" class="mt-3 ml-3">
@endif @endif
<div class="mt-1" style="display:flex;"> <div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:140px; text-align:left;font-size:18px;" for="is_cancelled">Storniert:</label> <label class="ml-2" style="width:140px; text-align:left;font-size:18px;"
<input class="mr-1 form-control" type="checkbox" id="is_cancelled" style="font-size:10px;width:20px;" name="is_cancelled" for="is_cancelled">Storniert:</label>
<input class="mr-1 form-control" type="checkbox" id="is_cancelled"
style="font-size:10px;width:20px;" name="is_cancelled"
@if($tour->is_cancelled) @if($tour->is_cancelled)
checked checked
@endif @endif
@ -79,25 +84,27 @@
</div> </div>
<!-- TODO: Only if owner or admin --> <!-- TODO: Only if owner or admin -->
<a href="/tour/{{$tour->id}}/edit"><div type="submit" class="btn btn-danger col-3 mb-2 float-left mr-2">Bearbeiten</div></a> @if(Auth::user()->role=="ADMIN")
<a href="/tour/{{$tour->id}}/edit">
<div type="submit" class="btn btn-danger col-3 mb-2 float-left mr-2">Bearbeiten
</div>
</a>
@endif
<a href="/tour" type="submit" class="btn btn-success col-3 mb-2 float-right mr-2">Ok</a> <a href="/tour" type="submit" class="btn btn-success col-3 mb-2 float-right mr-2">Ok</a>
@if(!App\Tour::has_participant($tour->id, Auth::user()->id)) @if(!App\Tour::has_participant($tour->id, Auth::user()->id) && App\Tour::has_space($tour->id))
<!-- Connected to Modal --> <!-- Connected to Modal -->
<button id="myBtn" class="btn btn-danger float-left">Teilnehmen</button> <button id="myBtn" class="btn btn-danger float-left">Teilnehmen</button>
@else @endif
<a href="/tour/{{$tour->id}}/cancelBooking" type="submit" class="btn btn-danger col-3 mb-2 float-right mr-2">Absagen</a> @if(App\Tour::has_participant($tour->id, Auth::user()->id))
<a href="/tour/{{$tour->id}}/cancelBooking" type="submit"
class="btn btn-danger col-3 mb-2 float-right mr-2">Absagen</a>
@endif @endif
</form> </form>
<!-- Modal Anzeige start --> <!-- Modal Anzeige start -->
<!-- The Modal --> <!-- The Modal -->
<div id="myModal" class="modal"> <div id="myModal" class="modal">
@ -111,14 +118,16 @@
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@if ($room_id="") @endif @if ($room_id="") @endif
@foreach($rooms as $room) @foreach($rooms as $room)
@if( $room->room_id != 0 and $room->free_slots >0) <!-- Dont show "Ungebucht", room_id=0 and only with available slots --> @if( $room->room_id != 0 and $room->free_slots >0)
<!-- Dont show "Ungebucht", room_id=0 and only with available slots -->
@if ($room_id != $room->room_id) @if ($room_id != $room->room_id)
@if(strlen($room_id)) @if(strlen($room_id))
<hr/> <hr/>
@endif @endif
<p style="list-style-type: none;">[{{$room->room_id}}] <p style="list-style-type: none;">[{{$room->room_id}}]
<span>{{$room->room_name}} <span>{{$room->room_name}}
</span><b><a href="/tour/{{$tour->id}}/join/{{$room->room_id}}"> ==> Buchen</a></b> </span><b><a href="/tour/{{$tour->id}}/join/{{$room->room_id}}">
==> Buchen</a></b>
</p> </p>
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@ -138,8 +147,8 @@
</div> </div>
</div> </div>
<!--Modal Anzeige end --> <!--Modal Anzeige end -->
</div> </div>
</div> </div>
</div> </div>
@ -150,32 +159,42 @@
<!-- Teilnehmer+Raum Anzeige --> <!-- Teilnehmer+Raum Anzeige -->
<div class="card-body"> <div class="card-body">
<ul>
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@if ($room_id="") @endif @if ($room_id="") @endif
@foreach($rooms as $room) @foreach($rooms as $room)
@if ($room_id != $room->room_id) @if ($room_id != $room->room_id)
@if(strlen($room_id)) @if($room_id!="")
<p>-------------------------</p> @if($room->room_name=="Ungebucht")
</div>
<div style="height:30px;"></div>
@else
</div>
<div style="height:2px;"></div>
@endif
@endif
<div style="border:solid;border-width:1px;">
<div style="text-align:center;"><b>{{$room->room_name}}
@if( $room->room_name != "Ungebucht" )
_{{$room->room_id}}</b></div>
@endif @endif
<p><b>[{{$room->room_id}}] {{$room->room_name}}</b></p>
<!-- Intentional Assignment ! --> <!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif @if ($room_id=$room->room_id) @endif
@endif @endif
@if(strlen($room->user_name)) @if(strlen($room->user_name))
<li style="list-style:none"> {{ $room->user_name}} <div style="list-style:none"> &nbsp; {{ $room->user_name}}
@if(Auth::user()->role=="ADMIN")
<a href="/tour/{{$tour->id}}/cancelBookingAdmin/{{$room->user_id}}" class="text-primary ts_tooltip">(X) </div>
<span class="ts_tooltiptext">Stornieren</span>
</a>
@endif
</li>
@endif @endif
@endforeach @endforeach
</ul> </div>
<div style="height:2px;"></div>
</div> </div>
</div> </div>
@ -205,19 +224,19 @@
var span = document.getElementsByClassName("close")[0]; var span = document.getElementsByClassName("close")[0];
// When the user clicks on the button, open the modal // When the user clicks on the button, open the modal
btn.onclick = function(e) { btn.onclick = function (e) {
e.preventDefault(); e.preventDefault();
modal.style.display = "block"; modal.style.display = "block";
} }
// When the user clicks on <span> (x), close the modal // When the user clicks on <span> (x), close the modal
span.onclick = function(e) { span.onclick = function (e) {
e.preventDefault(); e.preventDefault();
modal.style.display = "none"; modal.style.display = "none";
} }
// When the user clicks anywhere outside of the modal, close it // When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) { window.onclick = function (event) {
if (event.target == modal) { if (event.target == modal) {
modal.style.display = "none"; modal.style.display = "none";
} }

View file

@ -4,63 +4,82 @@
<div class="container text-center text-light mt-5"> <div class="container text-center text-light mt-5">
<h1 class="text-center">{{$user->name}}</h1> <h1 class="text-center">{{$user->name}}</h1>
<form style="background-color: #fff;" class="text-dark" method="post" action="/member/{{$user->name}}" enctype="multipart/form-data"> <form style="background-color: #fff;" class="text-dark" method="post" action="/member/{{$user->name}}"
enctype="multipart/form-data">
@csrf @csrf
@method('PUT') @method('PUT')
<input type="hidden" name="id" value="{{ $user->id }}"> <input type="hidden" name="id" value="{{ $user->id }}">
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> <label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label>
<input class="mt-3 mr-2 form-control" type="text" id="name" style="font-size:20px;" name="name" value="{{ old('name') ?? $user->name }}" required > <input class="mt-3 mr-2 form-control" type="text" id="name" style="font-size:20px;" name="name"
value="{{ old('name') ?? $user->name }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="mobile" ><h4>Telefonnummer:</h4></label> <label class="ml-2 mt-4" style="width:150px; text-align:left;" for="mobile"><h4>Telefonnummer:</h4>
<input type="text" class="mt-3 mr-2 form-control" id="mobile" style="font-size:20px;" name="mobile" value="{{ old('mobile') ?? $user->mobile }}" required > </label>
<input type="text" class="mt-3 mr-2 form-control" id="mobile" style="font-size:20px;" name="mobile"
value="{{ old('mobile') ?? $user->mobile }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name" ><h4>EMail:</h4></label> <label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name"><h4>EMail:</h4></label>
<input type="text" class="mt-3 mr-2 form-control" id="lastname" style="font-size:20px;" name="email" value="{{ old('email') ?? $user->email }}" required > <input type="text" class="mt-3 mr-2 form-control" id="lastname" style="font-size:20px;" name="email"
value="{{ old('email') ?? $user->email }}" required>
</div> </div>
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild" ><h4>Bild:</h4></label> <label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild"><h4>Bild:</h4></label>
@if(file_exists (storage_path().'/img_storage/user/'.$user->id.'.jpg')) @if(file_exists (storage_path().'/img_storage/user/'.$user->id.'.jpg'))
<!--File exists --> <!--File exists -->
<a href="/img_storage/user/{{$user->id}}_gross.jpg" data-lightbox="{{$user->id}}_gross.jpg" data-title="{{ $user->name }}"> <a href="/img_storage/user/{{$user->id}}_gross.jpg" data-lightbox="{{$user->id}}_gross.jpg"
<img src="/img_storage/user/{{$user->id}}.jpg" id="bild" class="mt-3 ml-3" style="width:256px;height:256px"> data-title="{{ $user->name }}">
<img src="/img_storage/user/{{$user->id}}.jpg" id="bild" class="mt-3 ml-3"
style="width:256px;height:256px">
</a> </a>
@else @else
<img src="/img/placeholder/user64x96.jpg" id="bild" class="mt-3 ml-3" > <img src="/img/placeholder/user64x96.jpg" id="bild" class="mt-3 ml-3">
@endif @endif
<input type="file" class="mt-3 mr-2 form-control" style="font-size:20px;" name="bild" value="" accept="image/*" onchange="preview_image(event)"> <input type="file" class="mt-3 mr-2 form-control" style="font-size:20px;" name="bild" value=""
accept="image/*" onchange="preview_image(event)">
</div> </div>
@if(Auth::user()->role=="ADMIN") @if(Auth::user()->role=="ADMIN")
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:130px; text-align:left;" for="name" ><h4>Rolle:</h4></label> <label class="ml-2 mt-4" style="width:130px; text-align:left;" for="name"><h4>Rolle:</h4></label>
<select name="role" class="dropdown-item ml-3 border form-control mt-3 mr-2" style="font-size:18px;" selected="{{ old('role') ?? $user->role }}"> <select name="role" class="dropdown-item ml-3 border form-control mt-3 mr-2" style="font-size:18px;"
<option value="GUEST" style="font-size:18px;" class="dropdown-item bg-light form-control" {{ $user->role=="GUEST" ? "selected" : "" }} >GUEST</option> selected="{{ old('role') ?? $user->role }}">
<option value="MEMBER" style="font-size:18px;" class="dropdown-item bg-light" {{ $user->role=="MEMBER" ? "selected" : "" }} >MEMBER</option> <option value="GUEST" style="font-size:18px;"
<option value="ADMIN" style="font-size:18px;" class="dropdown-item bg-light" {{ $user->role=="ADMIN" ? "selected" : "" }} >ADMIN</option> class="dropdown-item bg-light form-control" {{ $user->role=="GUEST" ? "selected" : "" }} >
GUEST
</option>
<option value="MEMBER" style="font-size:18px;"
class="dropdown-item bg-light" {{ $user->role=="MEMBER" ? "selected" : "" }} >MEMBER
</option>
<option value="ADMIN" style="font-size:18px;"
class="dropdown-item bg-light" {{ $user->role=="ADMIN" ? "selected" : "" }} >ADMIN
</option>
</select> </select>
</div> </div>
@else @else
<div class="form-group" style="display:flex;"> <div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:130px; text-align:left;" for="name" ><h4>Rolle:</h4></label> <label class="ml-2 mt-4" style="width:130px; text-align:left;" for="name"><h4>Rolle:</h4></label>
<h4 class="mt-4">{{$user->role}}</h4> <h4 class="mt-4">{{$user->role}}</h4>
</div> </div>
@endif @endif
<a href="/member" class="btn btn-primary col-2 mb-2 float-left" style="margin-right:20px;">Zurück</a>
@if(Auth::user()->role=="ADMIN" || Auth::user()->id==$user->id) @if(Auth::user()->role=="ADMIN" || Auth::user()->id==$user->id)
<button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button> <button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button>
<a href="/admin/destroy_user/{{$user->id}}" class="btn btn-primary col-2 mb-2 float-left"
style="margin-right:20px;">Löschen</a>
@endif @endif
<a href="/member" class="btn btn-primary col-2 mb-2 float-left">Zurück</a>
</form> </form>
@ -69,12 +88,10 @@
<!-------------------------------- -----------------------------> <!-------------------------------- ----------------------------->
<script> <script>
function preview_image(event) function preview_image(event) {
{
console.log("Preview triggered.") console.log("Preview triggered.")
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function() reader.onload = function () {
{
console.log("onload") console.log("onload")
var output = document.getElementById('bild'); var output = document.getElementById('bild');
console.log(output); console.log(output);

View file

@ -1,63 +1,74 @@
<?php <?php
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Web Routes | Web Routes
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Here is where you can register web routes for your application. These | Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which | routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great! | contains the "web" middleware group. Now create something great!
| |
*/ */
/* /*
Route::get('/', function () { Route::get('/', function () {
return view('home'); return view('home');
}); });
Route::get('/test', 'PageController@page_home'); Route::get('/test', 'PageController@page_home');
* */ * */
Route::get('/', 'PageController@page_home'); Route::get('/', 'PageController@page_home');
Route::get('/home', 'PageController@page_home')->name('home'); Route::get('/home', 'PageController@page_home')->name('home');
Route::post('/admin/store_home','AdminController@store_home')->middleware('auth'); Route::post('/admin/store_home', 'AdminController@store_home')->middleware('auth');
Route::get('/activities', 'PageController@page_activities'); Route::get('/activities', 'PageController@page_activities');
Route::get('/become_member', function () { return view('users.become_member'); }); Route::get('/become_member', function () {
Route::get('/meetings', function () { return view('meetings'); })->middleware('auth'); return view('users.become_member');
});
Route::get('/meetings', function () {
return view('meetings');
})->middleware('auth');
Route::resource('/member',UserController::class); Route::resource('/member', UserController::class);
Route::get('/admin/upload_tourplan', 'AdminController@upload_tourplan')->middleware('auth'); Route::get('/admin/destroy_user/{user_id}', 'UserController@destroy')->middleware('auth');
Route::post('/admin/store_tourplan','AdminController@store_tourplan')->middleware('auth'); Route::get('/admin/upload_tourplan', 'AdminController@upload_tourplan')->middleware('auth');
Route::post('/admin/store_tourplan', 'AdminController@store_tourplan')->middleware('auth');
Route::get('/admin/upload_mitgliedsantrag', 'AdminController@upload_mitgliedsantrag')->middleware('auth'); Route::get('/admin/upload_mitgliedsantrag', 'AdminController@upload_mitgliedsantrag')->middleware('auth');
Route::post('/admin/store_mitgliedsantrag','AdminController@store_mitgliedsantrag')->middleware('auth'); Route::post('/admin/store_mitgliedsantrag', 'AdminController@store_mitgliedsantrag')->middleware('auth');
Route::get('/admin/edit_home', 'AdminController@edit_home')->middleware('auth'); Route::get('/admin/edit_home', 'AdminController@edit_home')->middleware('auth');
Route::get('/admin/edit_activities', 'AdminController@edit_activities')->middleware('auth'); Route::get('/admin/edit_activities', 'AdminController@edit_activities')->middleware('auth');
Route::post('/admin/store_activities', 'AdminController@store_activities')->middleware('auth'); Route::post('/admin/store_activities', 'AdminController@store_activities')->middleware('auth');
Route::get('/tour/index_old', 'TourController@index_old')->middleware('auth'); Route::get('/tour/index_old', 'TourController@index_old')->middleware('auth');
Route::post('/tour/store', 'TourController@store')->middleware('auth'); Route::post('/tour/store', 'TourController@store')->middleware('auth');
Route::post('/tour/update', 'TourController@store')->middleware('auth'); Route::post('/tour/update', 'TourController@store')->middleware('auth');
Route::post('/tour/upload_gallery/{tour_id}', 'TourController@upload_gallery'); Route::post('/tour/upload_gallery/{tour_id}', 'TourController@upload_gallery');
Route::resource('/tour', TourController::class)->middleware('auth'); Route::resource('/tour', TourController::class)->middleware('auth');
Route::get('/tour/{tour_id}/join/{room_id}', 'TourController@join_room')->middleware('auth'); Route::get('/tour/{tour_id}/join/{room_id}', 'TourController@join_room')->middleware('auth');
Route::get('/tour/{tour_id}/cancelBooking', 'TourController@cancelBooking')->middleware('auth'); Route::get('/tour/{tour_id}/join4user/{room_id}/{user_id}', 'TourController@join_room4user')->middleware('auth');
Route::get('/tour/{tour_id}/cancelBookingAdmin/{user_id}', 'TourController@cancelBookingAdmin')->middleware('auth'); Route::get('/tour/{tour_id}/cancelBooking', 'TourController@cancelBooking')->middleware('auth');
Route::get('/tour/{tour_id}/create_room/{capacity}', 'TourController@create_room')->middleware('auth'); Route::get('/tour/{tour_id}/cancelBookingAdmin/{user_id}', 'TourController@cancelBookingAdmin')->middleware('auth');
Route::get('/tour/{tour_id}/delete_room/{room_id}', 'TourController@delete_room')->middleware('auth'); Route::get('/tour/{tour_id}/create_room/{capacity}', 'TourController@create_room')->middleware('auth');
Route::get('/tour/{tour_id}/delete_room/{room_id}', 'TourController@delete_room')->middleware('auth');
Route::get('/tour/{tour_id}/assign_room_for_user/{user_id}', 'TourController@delete_room')->middleware('auth');
Route::get('/img_storage/{category}/{imageName}','ImageController@getImage'); // no middleware auth needed, its checked in Controller Route::get('/img_storage/{category}/{imageName}', 'ImageController@getImage'); // no middleware auth needed, its checked in Controller
Auth::routes(); Auth::routes();
/* Cache clearing on remote server */ /* Cache clearing on remote server */
Route::get('/clear-cache', function() { Artisan::call('cache:clear');Artisan::call('config:clear'); return "Cache cleared, Config reloaded"; }); Route::get('/clear-cache', function () {
//Route::get('/home', 'HomeController@index')->name('home'); Artisan::call('cache:clear');
Artisan::call('config:clear');
return "Cache cleared, Config reloaded";
});
//Route::get('/home', 'HomeController@index')->name('home');

4
motorradig/setenv.sh Normal file → Executable file
View file

@ -1,3 +1,3 @@
alias phpunit="docker-compose exec app vendor/bin/phpunit" alias phpunit="docker-compose exec app vendor/bin/phpunit"
alias artisan="docker-compose exec app php artisan" alias artisan="sudo docker-compose exec app php artisan"
alias composer="docker-compose exec app composer" alias composer="sudo docker-compose exec app composer"

1
tools/dump_motorradig.py Normal file → Executable file
View file

@ -1,3 +1,4 @@
#!/usr/bin/python3
# This script needs mysqldump to be installed # This script needs mysqldump to be installed
# apt install mysql-client # apt install mysql-client

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long