From 9baa1a6233265eb02c82ee5d603aaf78f62dd09c Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 6 Aug 2021 15:28:57 +0200 Subject: [PATCH] IQ Reisebausteine bis Gruppe --- app/Http/Controllers/HomeController.php | 6 +- app/Http/Controllers/IQ/ItemController.php | 31 ++++ .../Controllers/IQ/TravelGroupController.php | 126 +++++++++++++ .../Controllers/IQ/TravelItemController.php | 136 ++++++++++++++ .../IQ/TravelProgrammController.php | 126 +++++++++++++ app/Http/Controllers/ModalController.php | 31 +++- .../Settings/TravelPlaceController.php | 58 ++++++ app/Models/Booking.php | 2 +- app/Models/IQTravelGroup.php | 107 +++++++++++ app/Models/IQTravelGroupItem.php | 55 ++++++ app/Models/IQTravelItem.php | 131 +++++++++++++ app/Models/IQTravelItemPlace.php | 54 ++++++ app/Models/Lead.php | 2 +- app/Models/TravelCountry.php | 2 +- app/Models/TravelPlace.php | 54 ++++++ app/Models/TravelUserBookingFewo.php | 2 +- app/Repositories/IQ/ContentSiteRepository.php | 4 +- app/Repositories/IQ/TravelRepository.php | 89 +++++++++ app/Services/HTMLHelper.php | 37 +++- app/Services/Model.php | 6 + config/permissions.php | 14 +- ..._10_19_114521_create_draft_items_table.php | 1 + ...7_22_121942_create_travel_places_table.php | 45 +++++ ..._160933_create_i_q_travel_blocks_table.php | 65 +++++++ ...3_160933_create_i_q_travel_items_table.php | 58 ++++++ ...13_create_i_q_travel_item_places_table.php | 49 +++++ ..._162759_create_i_q_travel_groups_table.php | 48 +++++ ...56_create_i_q_travel_group_items_table.php | 47 +++++ .../modal/iq_travel_group-item.blade.php | 37 ++++ .../modal/iq_travel_item-group.blade.php | 38 ++++ .../modal/iq_travel_item-place.blade.php | 38 ++++ resources/views/customer/index.blade.php | 1 - resources/views/drafts/detail.blade.php | 4 +- .../views/iq/travel/group/detail.blade.php | 175 ++++++++++++++++++ .../views/iq/travel/group/index.blade.php | 55 ++++++ .../views/iq/travel/item/detail.blade.php | 175 ++++++++++++++++++ .../views/iq/travel/item/index.blade.php | 60 ++++++ .../views/iq/travel/programm/index.blade.php | 56 ++++++ .../layouts/includes/layout-sidenav.blade.php | 32 ++++ .../views/settings/place/index.blade.php | 143 ++++++++++++++ routes/web.php | 30 +++ .../Einreisebestimmungen_de_AT-SY.pdf | Bin 0 -> 29857 bytes .../Einreisebestimmungen_de_DE-SY.pdf | Bin 0 -> 29858 bytes 43 files changed, 2206 insertions(+), 24 deletions(-) create mode 100644 app/Http/Controllers/IQ/ItemController.php create mode 100644 app/Http/Controllers/IQ/TravelGroupController.php create mode 100644 app/Http/Controllers/IQ/TravelItemController.php create mode 100644 app/Http/Controllers/IQ/TravelProgrammController.php create mode 100644 app/Http/Controllers/Settings/TravelPlaceController.php create mode 100644 app/Models/IQTravelGroup.php create mode 100644 app/Models/IQTravelGroupItem.php create mode 100644 app/Models/IQTravelItem.php create mode 100644 app/Models/IQTravelItemPlace.php create mode 100644 app/Models/TravelPlace.php create mode 100644 app/Repositories/IQ/TravelRepository.php create mode 100644 database/migrations/2021_07_22_121942_create_travel_places_table.php create mode 100644 database/migrations/2021_08_03_160933_create_i_q_travel_blocks_table.php create mode 100644 database/migrations/2021_08_03_160933_create_i_q_travel_items_table.php create mode 100644 database/migrations/2021_08_03_162513_create_i_q_travel_item_places_table.php create mode 100644 database/migrations/2021_08_03_162759_create_i_q_travel_groups_table.php create mode 100644 database/migrations/2021_08_03_163156_create_i_q_travel_group_items_table.php create mode 100644 resources/views/admin/modal/iq_travel_group-item.blade.php create mode 100644 resources/views/admin/modal/iq_travel_item-group.blade.php create mode 100644 resources/views/admin/modal/iq_travel_item-place.blade.php create mode 100644 resources/views/iq/travel/group/detail.blade.php create mode 100644 resources/views/iq/travel/group/index.blade.php create mode 100644 resources/views/iq/travel/item/detail.blade.php create mode 100644 resources/views/iq/travel/item/index.blade.php create mode 100644 resources/views/iq/travel/programm/index.blade.php create mode 100644 resources/views/settings/place/index.blade.php create mode 100644 storage/app/public/pdf/passolution/Einreisebestimmungen_de_AT-SY.pdf create mode 100644 storage/app/public/pdf/passolution/Einreisebestimmungen_de_DE-SY.pdf diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 73e6d19..766704e 100755 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -44,9 +44,9 @@ class HomeController extends Controller return redirect('login'); } - $last_booking_notices = BookingNotice::orderBy('edit_at', 'DESC')->orderBy('created_at', 'DESC')->limit(10)->get(); - $last_booking_fewo_notices = TravelUserBookingFewoNotice::orderBy('edit_at', 'DESC')->orderBy('created_at', 'DESC')->limit(10)->get(); - $last_lead_notices = LeadNotice::orderBy('edit_at', 'DESC')->orderBy('created_at', 'DESC')->limit(10)->get(); + $last_booking_notices = BookingNotice::orderBy('updated_at', 'DESC')->limit(10)->get(); + $last_booking_fewo_notices = TravelUserBookingFewoNotice::orderBy('updated_at', 'DESC')->limit(10)->get(); + $last_lead_notices = LeadNotice::orderBy('updated_at', 'DESC')->limit(10)->get(); $data = [ diff --git a/app/Http/Controllers/IQ/ItemController.php b/app/Http/Controllers/IQ/ItemController.php new file mode 100644 index 0000000..9beaf2c --- /dev/null +++ b/app/Http/Controllers/IQ/ItemController.php @@ -0,0 +1,31 @@ + [], + 'lfm_helper' => $this->helper, + 'modal' => false, + ]; + return view('iq.content.assets.index', $data); + } + + public function modal(){ + $data = [ + 'models' => [], + 'lfm_helper' => $this->helper, + 'modal' => true, + ]; + return view('iq.content.assets.body', $data); + } +} diff --git a/app/Http/Controllers/IQ/TravelGroupController.php b/app/Http/Controllers/IQ/TravelGroupController.php new file mode 100644 index 0000000..38c33e3 --- /dev/null +++ b/app/Http/Controllers/IQ/TravelGroupController.php @@ -0,0 +1,126 @@ +middleware('admin'); + $this->tavelRepo = $tavelRepo; + } + + public function index() + { + $data = [ + + ]; + return view('iq.travel.group.index', $data); + } + + + public function detail($id, $step = false) + { + if($id === "new") { + $model = new IQTravelGroup(); + $id = 'new'; + $model->active = 1; + }else{ + $model = IQTravelGroup::findOrFail($id); + $id = $model->id; + } + + $data = [ + 'model' => $model, + 'id' => $id, + + ]; + return view('iq.travel.group.detail', $data); + } + + + public function store($id) + { + $data = Request::all(); + if(isset($data['action'])){ + if($data['action'] === 'saveAll'){ + $travel_group = $this->tavelRepo->updateTravelGroup($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_group_detail', [$travel_group->id])); + + } + if($data['action'] === 'save-iq_travel_item_group'){ + $travel_group_item = $this->tavelRepo->updateTravelGroupItem($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_group_detail', [$id])); + + } + } + return redirect()->back(); + } + + public function delete($id, $del=false){ + + if($del === 'i_q_travel_group_item'){ + $IQTravelGroupItem = IQTravelGroupItem::findOrFail($id); + $r_id = $IQTravelGroupItem->i_q_travel_group_id; + //TODO check need ??? + $IQTravelGroupItem->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_group_detail', [$r_id])); + } + if($del === 'iq_travel_group'){ + $IQTravelGroup = IQTravelGroup::findOrFail($id); + //TODO check need ??? + $IQTravelGroup->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_groups')); + } + + return back(); + } + + public function getTravelGroups() + { + $query = IQTravelGroup::with('i_q_travel_group_items')->with('i_q_travel_group_items.i_q_travel_item')->select('i_q_travel_groups.*'); + + return \DataTables::eloquent($query) + ->addColumn('action_edit', function (IQTravelGroup $iq_travel_group) { + return ''; + }) + ->addColumn('trave_items', function (IQTravelGroup $iq_travel_group) { + $ret = ""; + if($iq_travel_group->i_q_travel_group_items->count()){ + foreach($iq_travel_group->i_q_travel_group_items as $i_q_travel_group_item){ + $ret .= $i_q_travel_group_item->i_q_travel_item->name; + $ret .= $i_q_travel_group_item->i_q_travel_item->draft_type_id ? '   |  '.$i_q_travel_group_item->i_q_travel_item->draft_type->name.'' : ''; + + + $ret .= "
"; + } + $ret = rtrim($ret, '
'); + } + return $ret; + }) + ->addColumn('active', function (IQTravelGroup $iq_travel_group) { + return get_active_badge($iq_travel_group->active); + }) + ->addColumn('action_delete', function (IQTravelGroup $iq_travel_group) { + return ''; + }) + ->orderColumn('id', 'id $1') + ->rawColumns(['action_edit', 'id', 'active', 'trave_items', 'action_delete']) + ->make(true); + } +} diff --git a/app/Http/Controllers/IQ/TravelItemController.php b/app/Http/Controllers/IQ/TravelItemController.php new file mode 100644 index 0000000..3739a4e --- /dev/null +++ b/app/Http/Controllers/IQ/TravelItemController.php @@ -0,0 +1,136 @@ +middleware('admin'); + $this->tavelRepo = $tavelRepo; + } + + public function index() + { + $data = [ + + ]; + return view('iq.travel.item.index', $data); + } + + + public function detail($id, $step = false) + { + if($id === "new") { + $model = new IQTravelItem(); + $id = 'new'; + $model->active = 1; + }else{ + $model = IQTravelItem::findOrFail($id); + $id = $model->id; + } + + $data = [ + 'model' => $model, + 'id' => $id, + + ]; + return view('iq.travel.item.detail', $data); + } + + + public function store($id) + { + $data = Request::all(); + if(isset($data['action'])){ + if($data['action'] === 'saveAll'){ + $travel_item = $this->tavelRepo->updateTravelItem($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_item_detail', [$travel_item->id])); + + } + if($data['action'] === 'save-iq_travel_item_place'){ + $travel_item_place = $this->tavelRepo->updateTravelItemPlace($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_item_detail', [$id])); + + } + } + return redirect()->back(); + } + + public function delete($id, $del=false){ + if($del === 'i_q_travel_item_place'){ + $IQTravelItemPlace = IQTravelItemPlace::findOrFail($id); + $r_id = $IQTravelItemPlace->i_q_travel_item_id; + //TODO check need ??? + $IQTravelItemPlace->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_item_detail', [$r_id])); + } + if($del === 'iq_travel_item'){ + $IQTravelItem = IQTravelItem::findOrFail($id); + //TODO check need ??? + $IQTravelItem->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_items')); + } + + + return back(); + } + + public function getTravelItems() + { + $query = IQTravelItem::with('draft_type')->with('i_q_travel_item_places')->select('i_q_travel_items.*'); + + return \DataTables::eloquent($query) + ->addColumn('action_edit', function (IQTravelItem $iq_travel_item) { + return ''; + }) + ->addColumn('draft_type', function (IQTravelItem $iq_travel_item) { + return $iq_travel_item->draft_type ? ''.$iq_travel_item->draft_type->name.'' : ''; + }) + ->addColumn('country', function (IQTravelItem $iq_travel_item) { + return $iq_travel_item->travel_country ? $iq_travel_item->travel_country->name : ''; + }) + ->addColumn('trave_places', function (IQTravelItem $iq_travel_item) { + $ret = ""; + if($iq_travel_item->i_q_travel_item_places->count()){ + foreach($iq_travel_item->i_q_travel_item_places as $i_q_travel_item_place){ + $ret .= $i_q_travel_item_place->travel_place->name."
"; + } + $ret = rtrim($ret, '
'); + } + return $ret; + }) + ->addColumn('active', function (IQTravelItem $iq_travel_item) { + return get_active_badge($iq_travel_item->active); + }) + /* + ->filterColumn('draft_type', function ($query, $keyword) { + if ($keyword != "") { + $query->whereHas('draft_type', function ($q) use ($keyword) { + $q->where("name", 'LIKE', '%' . $keyword . '%'); + }); + } + }) + */ + ->addColumn('action_delete', function (IQTravelItem $iq_travel_item) { + return ''; + }) + ->orderColumn('id', 'id $1') + ->rawColumns(['action_edit', 'id', 'active', 'draft_type', 'trave_places', 'action_delete']) + ->make(true); + } +} diff --git a/app/Http/Controllers/IQ/TravelProgrammController.php b/app/Http/Controllers/IQ/TravelProgrammController.php new file mode 100644 index 0000000..f952ef0 --- /dev/null +++ b/app/Http/Controllers/IQ/TravelProgrammController.php @@ -0,0 +1,126 @@ +middleware('admin'); + $this->tavelRepo = $tavelRepo; + } + + public function index() + { + $data = [ + + ]; + return view('iq.travel.programm.index', $data); + } + + + public function detail($id, $step = false) + { + if($id === "new") { + $model = new IQTravelGroup(); + $id = 'new'; + $model->active = 1; + }else{ + $model = IQTravelGroup::findOrFail($id); + $id = $model->id; + } + + $data = [ + 'model' => $model, + 'id' => $id, + + ]; + return view('iq.travel.group.detail', $data); + } + + + public function store($id) + { + $data = Request::all(); + if(isset($data['action'])){ + if($data['action'] === 'saveAll'){ + $travel_group = $this->tavelRepo->updateTravelGroup($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_group_detail', [$travel_group->id])); + + } + if($data['action'] === 'save-iq_travel_item_group'){ + $travel_group_item = $this->tavelRepo->updateTravelGroupItem($id, $data); + \Session()->flash('alert-save', '1'); + return redirect(route('iq_travel_group_detail', [$id])); + + } + } + return redirect()->back(); + } + + public function delete($id, $del=false){ + + if($del === 'i_q_travel_group_item'){ + $IQTravelGroupItem = IQTravelGroupItem::findOrFail($id); + $r_id = $IQTravelGroupItem->i_q_travel_group_id; + //TODO check need ??? + $IQTravelGroupItem->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_group_detail', [$r_id])); + } + if($del === 'iq_travel_group'){ + $IQTravelGroup = IQTravelGroup::findOrFail($id); + //TODO check need ??? + $IQTravelGroup->delete(); + \Session()->flash('alert-success', __('Eintrag gelöscht')); + return redirect(route('iq_travel_groups')); + } + + return back(); + } + + public function getTravelGroups() + { + $query = IQTravelGroup::with('i_q_travel_group_items')->with('i_q_travel_group_items.i_q_travel_item')->select('i_q_travel_groups.*'); + + return \DataTables::eloquent($query) + ->addColumn('action_edit', function (IQTravelGroup $iq_travel_group) { + return ''; + }) + ->addColumn('trave_items', function (IQTravelGroup $iq_travel_group) { + $ret = ""; + if($iq_travel_group->i_q_travel_group_items->count()){ + foreach($iq_travel_group->i_q_travel_group_items as $i_q_travel_group_item){ + $ret .= $i_q_travel_group_item->i_q_travel_item->name; + $ret .= $i_q_travel_group_item->i_q_travel_item->draft_type_id ? '   |  '.$i_q_travel_group_item->i_q_travel_item->draft_type->name.'' : ''; + + + $ret .= "
"; + } + $ret = rtrim($ret, '
'); + } + return $ret; + }) + ->addColumn('active', function (IQTravelGroup $iq_travel_group) { + return get_active_badge($iq_travel_group->active); + }) + ->addColumn('action_delete', function (IQTravelGroup $iq_travel_group) { + return ''; + }) + ->orderColumn('id', 'id $1') + ->rawColumns(['action_edit', 'id', 'active', 'trave_items', 'action_delete']) + ->make(true); + } +} diff --git a/app/Http/Controllers/ModalController.php b/app/Http/Controllers/ModalController.php index c19ad2f..7165eb7 100644 --- a/app/Http/Controllers/ModalController.php +++ b/app/Http/Controllers/ModalController.php @@ -2,14 +2,16 @@ namespace App\Http\Controllers; +use Request; use App\Models\GeneralFile; use App\Models\IQContentSite; -use App\Models\ServiceProviderService; -use App\Models\TravelCompanyService; use App\Models\TravelCountry; +use App\Models\IQTravelGroupItem; +use App\Models\IQTravelItemPlace; +use App\Models\TravelCompanyService; use App\Models\TravelCountryService; +use App\Models\ServiceProviderService; use App\Repositories\GeneralFileRepository; -use Request; class ModalController extends Controller { @@ -70,6 +72,29 @@ class ModalController extends Controller } $ret = view("admin.modal.provider-service", compact('data', 'value'))->render(); } + + if($data['action'] === 'modal-iq_travel_item-place'){ + if($data['id'] === 'new'){ + $value = new IQTravelItemPlace(); + $value->pos = 0; + }else{ + $value = IQTravelItemPlace::find($data['id']); + } + $ret = view("admin.modal.iq_travel_item-place", compact('data', 'value'))->render(); + } + + if($data['action'] === 'modal-iq_travel_item-group'){ + if($data['id'] === 'new'){ + $value = new IQTravelGroupItem(); + $value->pos = 0; + }else{ + $value = IQTravelGroupItem::find($data['id']); + } + $ret = view("admin.modal.iq_travel_group-item", compact('data', 'value'))->render(); + } + + + } return response()->json(['response' => $data, 'html'=>$ret, 'status'=>$status]); } diff --git a/app/Http/Controllers/Settings/TravelPlaceController.php b/app/Http/Controllers/Settings/TravelPlaceController.php new file mode 100644 index 0000000..aa7de21 --- /dev/null +++ b/app/Http/Controllers/Settings/TravelPlaceController.php @@ -0,0 +1,58 @@ +middleware('admin'); + } + + public function index($step = false) + { + $data = [ + 'travel_places' => TravelPlace::all(), + ]; + return view('settings.place.index', $data); + } + + + public function update(){ + + $data = Request::all(); + + + $data['active'] = isset($data['active']) ? true : false; + + if($data['id'] === "new"){ + $model = TravelPlace::create($data); + }else{ + $model = TravelPlace::find($data['id']); + $model->fill($data); + $model->save(); + } + + \Session()->flash('alert-save', '1'); + return redirect(route('admin_settings_travel_places')); + } + + public function delete($id){ + //TODO check ist linked + + $model = TravelPlace::findOrFail($id); + $model->delete(); + \Session()->flash('alert-success', 'Eintrag gelöscht'); + return redirect()->back(); + } + +} + + diff --git a/app/Models/Booking.php b/app/Models/Booking.php index dbb1068..8c33dd0 100644 --- a/app/Models/Booking.php +++ b/app/Models/Booking.php @@ -533,7 +533,7 @@ class Booking extends Model public function booking_notices() { - return $this->hasMany(BookingNotice::class, 'booking_id')->orderBy('created_at', 'DESC'); + return $this->hasMany(BookingNotice::class, 'booking_id')->orderBy('updated_at', 'DESC'); } public function booking_strono() diff --git a/app/Models/IQTravelGroup.php b/app/Models/IQTravelGroup.php new file mode 100644 index 0000000..df9fab7 --- /dev/null +++ b/app/Models/IQTravelGroup.php @@ -0,0 +1,107 @@ + 'int', + 'days_duration' => 'int', + 'min_persons' => 'int', + 'price_adult' => 'float', + 'price_children' => 'float', + 'pos' => 'int', + 'active' => 'bool' + ]; + + protected $fillable = [ + 'name', + 'description', + 'highlights', + 'days_start', + 'days_duration', + 'min_persons', + 'price_adult', + 'price_children', + 'pos', + 'active' + ]; + + public function i_q_travel_group_items() + { + return $this->hasMany(IQTravelGroupItem::class)->orderBy('pos', 'DESC'); + } + + + //price_adult + public function getPriceAdultAttribute() + { + return isset($this->attributes['price_adult']) ? Util::_number_format($this->attributes['price_adult']) : null; + } + public function setPriceAdultAttribute($value) + { + $this->attributes['price_adult'] = $value ? Util::_clean_float($value) : null; + } + public function getPriceAdultRaw() + { + + return isset($this->attributes['price_adult']) ? $this->attributes['price_adult'] : 0; + } + public function setPriceAdultRaw($value) + { + return $this->attributes['price_adult'] = $value; + } + + + //price_children + public function getPriceChildrenAttribute() + { + return isset($this->attributes['price_children']) ? Util::_number_format($this->attributes['price_children']) : null; + } + public function setPriceChildrenAttribute($value) + { + $this->attributes['price_children'] = $value ? Util::_clean_float($value) : null; + } + public function getPriceChildrenRaw() + { + return isset($this->attributes['price_children']) ? $this->attributes['price_children'] : 0; + } + public function setPriceChildrenRaw($value) + { + return $this->attributes['price_children'] = $value; + } +} diff --git a/app/Models/IQTravelGroupItem.php b/app/Models/IQTravelGroupItem.php new file mode 100644 index 0000000..d5cc52d --- /dev/null +++ b/app/Models/IQTravelGroupItem.php @@ -0,0 +1,55 @@ + 'int', + 'i_q_travel_item_id' => 'int', + 'pos' => 'int', + + ]; + + protected $fillable = [ + 'i_q_travel_group_id', + 'i_q_travel_item_id', + 'pos', + ]; + + public function i_q_travel_group() + { + return $this->belongsTo(IQTravelGroup::class); + } + + public function i_q_travel_item() + { + return $this->belongsTo(IQTravelItem::class); + } +} diff --git a/app/Models/IQTravelItem.php b/app/Models/IQTravelItem.php new file mode 100644 index 0000000..d55e7f5 --- /dev/null +++ b/app/Models/IQTravelItem.php @@ -0,0 +1,131 @@ + 'int', + 'travel_country_id' => 'int', + 'days_start' => 'int', + 'days_duration' => 'int', + 'min_persons' => 'int', + 'price_adult' => 'float', + 'price_children' => 'float', + 'pos' => 'int', + 'active' => 'bool' + ]; + + protected $fillable = [ + 'name', + 'description', + 'highlights', + 'draft_type_id', + 'travel_country_id', + 'days_start', + 'days_duration', + 'min_persons', + 'price_adult', + 'price_children', + 'pos', + 'active' + ]; + + public function travel_country() + { + return $this->belongsTo(TravelCountry::class); + } + + public function i_q_travel_group_items() + { + return $this->hasMany(IQTravelGroupItem::class); + } + + public function i_q_travel_item_places() + { + return $this->hasMany(IQTravelItemPlace::class)->orderBy('pos', 'DESC'); + } + + public function draft_type() + { + return $this->belongsTo(DraftType::class, 'draft_type_id'); + } + + + + //price_adult + public function getPriceAdultAttribute() + { + return isset($this->attributes['price_adult']) ? Util::_number_format($this->attributes['price_adult']) : null; + } + public function setPriceAdultAttribute($value) + { + $this->attributes['price_adult'] = $value ? Util::_clean_float($value) : null; + } + public function getPriceAdultRaw() + { + + return isset($this->attributes['price_adult']) ? $this->attributes['price_adult'] : 0; + } + public function setPriceAdultRaw($value) + { + return $this->attributes['price_adult'] = $value; + } + + + //price_children + public function getPriceChildrenAttribute() + { + return isset($this->attributes['price_children']) ? Util::_number_format($this->attributes['price_children']) : null; + } + public function setPriceChildrenAttribute($value) + { + $this->attributes['price_children'] = $value ? Util::_clean_float($value) : null; + } + public function getPriceChildrenRaw() + { + return isset($this->attributes['price_children']) ? $this->attributes['price_children'] : 0; + } + public function setPriceChildrenRaw($value) + { + return $this->attributes['price_children'] = $value; + } +} diff --git a/app/Models/IQTravelItemPlace.php b/app/Models/IQTravelItemPlace.php new file mode 100644 index 0000000..79b55f5 --- /dev/null +++ b/app/Models/IQTravelItemPlace.php @@ -0,0 +1,54 @@ + 'int', + 'travel_place_id' => 'int', + 'pos' => 'int', + ]; + + protected $fillable = [ + 'i_q_travel_item_id', + 'travel_place_id', + 'pos', + ]; + + public function i_q_travel_item() + { + return $this->belongsTo(IQTravelItem::class); + } + + public function travel_place() + { + return $this->belongsTo(TravelPlace::class); + } +} diff --git a/app/Models/Lead.php b/app/Models/Lead.php index 77cfd99..32770fd 100644 --- a/app/Models/Lead.php +++ b/app/Models/Lead.php @@ -277,7 +277,7 @@ class Lead extends Model public function lead_notices() { - return $this->hasMany(LeadNotice::class, 'lead_id')->orderBy('created_at', 'DESC'); + return $this->hasMany(LeadNotice::class, 'lead_id')->orderBy('updated_at', 'DESC'); } diff --git a/app/Models/TravelCountry.php b/app/Models/TravelCountry.php index 047f0c3..fcb1537 100644 --- a/app/Models/TravelCountry.php +++ b/app/Models/TravelCountry.php @@ -166,7 +166,7 @@ class TravelCountry extends Model public function getContactLandsModels(){ $ret = []; if($this->contact_lands){ - foreach ($this->contact_lands as $travel_country_id){ + foreach ($this->contact_lands as $contact_land_id){ if($travel_country = TravelCountry::where('crm_id', $contact_land_id)->first()){ $ret[$travel_country->id] = $travel_country; } diff --git a/app/Models/TravelPlace.php b/app/Models/TravelPlace.php new file mode 100644 index 0000000..356c932 --- /dev/null +++ b/app/Models/TravelPlace.php @@ -0,0 +1,54 @@ + 'int', + 'latitude' => 'float', + 'longitude' => 'float', + 'active' => 'bool' + ]; + + protected $fillable = [ + 'name', + 'description', + 'travel_country_id', + 'latitude', + 'longitude', + 'active' + ]; + + public function travel_country() + { + return $this->belongsTo(TravelCountry::class); + } +} diff --git a/app/Models/TravelUserBookingFewo.php b/app/Models/TravelUserBookingFewo.php index 2c10eac..93ad8c1 100644 --- a/app/Models/TravelUserBookingFewo.php +++ b/app/Models/TravelUserBookingFewo.php @@ -253,7 +253,7 @@ class TravelUserBookingFewo extends Model public function booking_fewo_notices() { - return $this->hasMany(TravelUserBookingFewoNotice::class, 'travel_user_booking_fewo_id')->orderBy('created_at', 'DESC'); + return $this->hasMany(TravelUserBookingFewoNotice::class, 'travel_user_booking_fewo_id')->orderBy('updated_at', 'DESC'); } public function getStatuesName(){ diff --git a/app/Repositories/IQ/ContentSiteRepository.php b/app/Repositories/IQ/ContentSiteRepository.php index f9b3447..1d7b168 100644 --- a/app/Repositories/IQ/ContentSiteRepository.php +++ b/app/Repositories/IQ/ContentSiteRepository.php @@ -46,7 +46,7 @@ class ContentSiteRepository extends BaseRepository { $site_field = false; // $site_field = IQContentSiteField::getSiteFieldOrNew($contentSite->id, $model_field->id); //new - if(!$site_field->id){ + /*if(!$site_field->id){ $site_field->site_id = $contentSite->id; $site_field->model_field_id = $model_field->id; $site_field->field = $model_field->field; @@ -57,7 +57,7 @@ class ContentSiteRepository extends BaseRepository { }else{ - } + }*/ $ret[] = $site_field; } diff --git a/app/Repositories/IQ/TravelRepository.php b/app/Repositories/IQ/TravelRepository.php new file mode 100644 index 0000000..cd2700d --- /dev/null +++ b/app/Repositories/IQ/TravelRepository.php @@ -0,0 +1,89 @@ +model = null; + } + + + + + + public function updateTravelGroup($id, $data) + { + + if($id == "new"){ + $this->model = IQTravelGroup::create($data); + } + else{ + $this->model = IQTravelGroup::findOrFail($id); + $this->model->fill($data); + $this->model->save(); + } + + return $this->model; + } + + public function updateTravelGroupItem($id, $data) + { + $data['pos'] = $data['pos'] ? intval($data['pos']) : 0; + $data['i_q_travel_group_id'] = $data['iq_travel_group_id']; + + if($data['iq_travel_group_item_id'] == "new"){ + $this->model = IQTravelGroupItem::create($data); + } + else{ + $this->model = IQTravelGroupItem::findOrFail($data['iq_travel_group_item_id']); + $this->model->fill($data); + $this->model->save(); + } + return $this->model; + } + + + + public function updateTravelItem($id, $data) + { + $data['draft_type_id'] = $data['draft_type_id'] ? $data['draft_type_id'] : null; + $data['travel_country_id'] = $data['travel_country_id'] ? $data['travel_country_id'] : null; + + if($id == "new"){ + $this->model = IQTravelItem::create($data); + } + else{ + $this->model = IQTravelItem::findOrFail($id); + $this->model->fill($data); + $this->model->save(); + } + + return $this->model; + } + + public function updateTravelItemPlace($id, $data) + { + $data['pos'] = $data['pos'] ? intval($data['pos']) : 0; + $data['i_q_travel_item_id'] = $data['iq_travel_item_id']; + if($data['iq_travel_item_place_id'] == "new"){ + $this->model = IQTravelItemPlace::create($data); + } + else{ + $this->model = IQTravelItemPlace::findOrFail($data['iq_travel_item_place_id']); + $this->model->fill($data); + $this->model->save(); + } + + return $this->model; + } + +} \ No newline at end of file diff --git a/app/Services/HTMLHelper.php b/app/Services/HTMLHelper.php index 2462ae4..bcd0863 100644 --- a/app/Services/HTMLHelper.php +++ b/app/Services/HTMLHelper.php @@ -9,12 +9,14 @@ use App\Models\Draft; use App\Models\DraftType; use App\Models\FewoLodging; use App\Models\Insurance; +use App\Models\IQTravelItem; use App\Models\TravelBookingFewoChannel; use App\Models\TravelClass; use App\Models\TravelCompany; use App\Models\TravelCountry; use App\Models\TravelGuide; use App\Models\TravelNationality; +use App\Models\TravelPlace; use App\Models\TravelProgram; use App\Models\TravelUser; use Form; @@ -238,7 +240,7 @@ class HTMLHelper return $ret; } - public static function getTravelCountriesOptions($countryId = false){ + public static function getTravelCountriesOptions($countryId = false, $crm = true){ $checked = []; if($countryId){ !is_array($countryId) ? $checked = array($countryId) : $checked = $countryId; @@ -246,15 +248,15 @@ class HTMLHelper $options = TravelCountry::where('active_backend',1)->get(); $ret = ''; foreach ($options as $option){ - $attr = (in_array($option->crm_id, $checked)) ? 'selected="selected"' : ''; - $ret .= '\n'; + $id = $crm ? $option->crm_id : $option->id; + $attr = (in_array($id, $checked)) ? 'selected="selected"' : ''; + $ret .= '\n'; } return $ret; } public static function getTravelUserOptions($id = false, $order = "ASC", $empty=false){ $options = TravelUser::orderBy('id', $order)->get(); - $ret = ''; if($empty){ $ret = '\n'; @@ -267,6 +269,33 @@ class HTMLHelper return $ret; } + public static function getTravelPlaceOptions($id = false, $order = "ASC", $empty=false){ + $options = TravelPlace::where('active',1)->orderBy('id', $order)->get(); + $ret = ''; + if($empty){ + $ret = '\n'; + } + + foreach ($options as $option){ + $attr = ($option->id === $id) ? 'selected="selected"' : ''; + $ret .= '\n'; + } + return $ret; + } + + public static function getIQTravelItemsOptions($id = false, $order = "ASC", $empty=false){ + $options = IQTravelItem::where('active',1)->orderBy('id', $order)->get(); + $ret = ''; + if($empty){ + $ret = '\n'; + } + foreach ($options as $option){ + $attr = ($option->id === $id) ? 'selected="selected"' : ''; + $ret .= '\n'; + } + return $ret; + } + public static function getCustomerMailDirsOptions(CMSContent $customer_mail_dir, $checked = []){ //$checked = []; $model = $customer_mail_dir->getArrayContent('model'); diff --git a/app/Services/Model.php b/app/Services/Model.php index cc973a1..10d64a1 100644 --- a/app/Services/Model.php +++ b/app/Services/Model.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Models\Branch; use App\Models\Status; +use App\Models\DraftType; use App\Models\Salutation; use App\Models\SfGuardUser; use App\Models\TravelAgenda; @@ -75,6 +76,11 @@ class Model $TravelNationality = TravelNationality::where('active', true)->orderBy('name')->get()->pluck('name', 'id'); return $emtpy ? $TravelNationality->prepend('-', 0) : $TravelNationality; } + + public static function getDraftTypeArray($emtpy = false){ + $DraftType = DraftType::where('active', true)->orderByDesc('pos')->get()->pluck('name', 'id'); + return $emtpy ? $DraftType->prepend('-', 0) : $DraftType; + } diff --git a/config/permissions.php b/config/permissions.php index ef63242..642a676 100755 --- a/config/permissions.php +++ b/config/permissions.php @@ -18,10 +18,14 @@ return [ 'crm-cm' => ['name' => 'ADMIN CRM > Kundenverwaltung' , 'color' => 'admin'], 'crm-cm-cf' => ['name' => 'ADMIN CRM > Kundenverwaltung > Kunden (FeWo)' , 'color' => 'admin'], 'crm-cm-bf' => ['name' => 'ADMIN CRM > Kundenverwaltung > Buchungen (FeWo)' , 'color' => 'admin'], - 'crm-mail' => ['name' => 'ADMIN CRM > E-Mails' , 'color' => 'admin'], + 'crm-mail' => ['name' => 'ADMIN CRM > E-Mails' , 'color' => 'admin'], 'crm-mail-le' => ['name' => 'ADMIN CRM > E-Mails > Anfragen' , 'color' => 'admin'], 'crm-mail-bo' => ['name' => 'ADMIN CRM > E-Mails > Buchungen' , 'color' => 'admin'], 'crm-mail-bf' => ['name' => 'ADMIN CRM > E-Mails > Buchungen (Fewo)' , 'color' => 'admin'], + 'crm-iq-tl' => ['name' => 'ADMIN CRM > Reisebausteine' , 'color' => 'admin'], + 'crm-iq-tl-pro' => ['name' => 'ADMIN CRM > Reisebausteine > Programm' , 'color' => 'admin'], + 'crm-iq-tl-gp' => ['name' => 'ADMIN CRM > Reisebausteine > Gruppe' , 'color' => 'admin'], + 'crm-iq-tl-it' => ['name' => 'ADMIN CRM > Reisebausteine > Baustein' , 'color' => 'admin'], 'crm-old-cm' => ['name' => 'ADMIN CRM altes System > Kundenverwaltung' , 'color' => 'info'], 'cms' => ['name' => 'ADMIN CMS' , 'color' => 'secondary'], 'cms-iq-assets' => ['name' => 'ADMIN CMS > Medien' , 'color' => 'secondary'], @@ -36,8 +40,8 @@ return [ 'cms-cn-au' => ['name' => 'ADMIN CMS > Inhalte > Autor' , 'color' => 'secondary'], ], 2 => [ - 'sua-bo-n-edit' => ['name' => 'SUPERADMIN > Buchungen > Notizen > bearbeiten' , 'color' => 'secondary'], - 'sua-fewo-n-edit' => ['name' => 'SUPERADMIN > FeWo > Notizen > bearbeiten' , 'color' => 'secondary'], + 'sua-bo-n-edit' => ['name' => 'SUPERADMIN > Buchungen > Notizen > bearbeiten' , 'color' => 'secondary'], + 'sua-fewo-n-edit' => ['name' => 'SUPERADMIN > FeWo > Notizen > bearbeiten' , 'color' => 'secondary'], 'sua-st' => ['name' => 'SUPERADMIN > Einstellungen' , 'color' => 'superadmin'], 'sua-st-al' => ['name' => 'SUPERADMIN > Einstellungen > Airline' , 'color' => 'superadmin'], 'sua-st-em' => ['name' => 'SUPERADMIN > Einstellungen > E-Mails' , 'color' => 'superadmin'], @@ -45,7 +49,8 @@ return [ 'sua-st-sp' => ['name' => 'SUPERADMIN > Einstellungen > Leistungsträger' , 'color' => 'superadmin'], 'sua-st-tn' => ['name' => 'SUPERADMIN > Einstellungen > Nationalitäten' , 'color' => 'superadmin'], 'sua-st-co' => ['name' => 'SUPERADMIN > Einstellungen > Reiseländer' , 'color' => 'superadmin'], - 'sua-st-tp' => ['name' => 'SUPERADMIN > Einstellungen > Reisprogramme' , 'color' => 'superadmin'], + 'sua-st-tp' => ['name' => 'SUPERADMIN > Einstellungen > Reiseprogramme' , 'color' => 'superadmin'], + 'sua-st-tpl' => ['name' => 'SUPERADMIN > Einstellungen > Reiseorte' , 'color' => 'superadmin'], 'sua-st-bs' => ['name' => 'SUPERADMIN > Einstellungen > Reisestatus' , 'color' => 'superadmin'], 'sua-st-tc' => ['name' => 'SUPERADMIN > Einstellungen > Veranstalter' , 'color' => 'superadmin'], 'sua-st-in' => ['name' => 'SUPERADMIN > Einstellungen > Versicherungen' , 'color' => 'superadmin'], @@ -55,7 +60,6 @@ return [ 'sua-re-pp' => ['name' => 'SUPERADMIN > Export > Leistungsträger' , 'color' => 'superadmin'], 'sua-ur-rt' => ['name' => 'SUPERADMIN > User Rechte' , 'color' => 'danger'], 'cms-cn-co' => ['name' => 'ADMIN CMS > Inhalte > Länder' , 'color' => 'secondary'], - ], ], 'roles' => [ diff --git a/database/migrations/2018_10_19_114521_create_draft_items_table.php b/database/migrations/2018_10_19_114521_create_draft_items_table.php index 4bc0011..017312b 100644 --- a/database/migrations/2018_10_19_114521_create_draft_items_table.php +++ b/database/migrations/2018_10_19_114521_create_draft_items_table.php @@ -42,6 +42,7 @@ class CreateDraftItemsTable extends Migration $table->foreign('draft_type_id') ->references('id') ->on('draft_types'); + }); } diff --git a/database/migrations/2021_07_22_121942_create_travel_places_table.php b/database/migrations/2021_07_22_121942_create_travel_places_table.php new file mode 100644 index 0000000..1b4ce73 --- /dev/null +++ b/database/migrations/2021_07_22_121942_create_travel_places_table.php @@ -0,0 +1,45 @@ +create('travel_places', function (Blueprint $table) { + $table->increments('id'); + + $table->string('name')->nullable(); + $table->text('description')->nullable(); + + $table->integer('travel_country_id')->nullable(); + $table->decimal('latitude', 10, 6)->nullable(); + $table->decimal('longitude', 10, 6)->nullable(); + + $table->boolean('active')->default(true); + + $table->timestamps(); + + $table->foreign('travel_country_id') + ->references('id') + ->on('travel_country'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('travel_places'); + } +} \ No newline at end of file diff --git a/database/migrations/2021_08_03_160933_create_i_q_travel_blocks_table.php b/database/migrations/2021_08_03_160933_create_i_q_travel_blocks_table.php new file mode 100644 index 0000000..af0fa65 --- /dev/null +++ b/database/migrations/2021_08_03_160933_create_i_q_travel_blocks_table.php @@ -0,0 +1,65 @@ +create('i_q_travel_blocks', function (Blueprint $table) { + $table->increments('id'); + + $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->text('highlights')->nullable(); + + + $table->unsignedInteger('draft_type_id')->nullable()->index(); + $table->unsignedInteger('travel_place_id')->nullable()->index(); + $table->integer('travel_country_id')->nullable(); + + + $table->tinyInteger('days_start')->unsigned()->nullable(); + $table->tinyInteger('days_duration')->unsigned()->nullable(); + + $table->tinyInteger('min_persons')->unsigned()->nullable(); + + $table->decimal('price_adult', 8, 2)->nullable(); + $table->decimal('price_children', 8, 2)->nullable(); + + $table->tinyInteger('pos')->unsigned()->nullable(); + $table->boolean('active')->default(true); + + $table->timestamps(); + + $table->foreign('draft_type_id') + ->references('id') + ->on('draft_types'); + + $table->foreign('travel_place_id') + ->references('id') + ->on('travel_places'); + + $table->foreign('travel_country_id') + ->references('id') + ->on('travel_country'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('i_q_travel_blocks'); + } +} diff --git a/database/migrations/2021_08_03_160933_create_i_q_travel_items_table.php b/database/migrations/2021_08_03_160933_create_i_q_travel_items_table.php new file mode 100644 index 0000000..41c4f34 --- /dev/null +++ b/database/migrations/2021_08_03_160933_create_i_q_travel_items_table.php @@ -0,0 +1,58 @@ +create('i_q_travel_items', function (Blueprint $table) { + $table->increments('id'); + + $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->text('highlights')->nullable(); + + $table->unsignedInteger('draft_type_id')->nullable()->index(); + $table->integer('travel_country_id')->nullable(); + + $table->tinyInteger('days_start')->unsigned()->nullable(); + $table->tinyInteger('days_duration')->unsigned()->nullable(); + + $table->tinyInteger('min_persons')->unsigned()->nullable(); + + $table->decimal('price_adult', 8, 2)->nullable(); + $table->decimal('price_children', 8, 2)->nullable(); + + $table->tinyInteger('pos')->unsigned()->nullable(); + $table->boolean('active')->default(true); + + $table->timestamps(); + + /*$table->foreign('draft_type_id') + ->references('id') + ->on('draft_types');*/ + + $table->foreign('travel_country_id') + ->references('id') + ->on('travel_country'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('i_q_travel_items'); + } +} diff --git a/database/migrations/2021_08_03_162513_create_i_q_travel_item_places_table.php b/database/migrations/2021_08_03_162513_create_i_q_travel_item_places_table.php new file mode 100644 index 0000000..952ae34 --- /dev/null +++ b/database/migrations/2021_08_03_162513_create_i_q_travel_item_places_table.php @@ -0,0 +1,49 @@ +create('i_q_travel_item_places', function (Blueprint $table) { + + $table->bigIncrements('id'); + + $table->unsignedInteger('i_q_travel_item_id')->index(); + $table->unsignedInteger('travel_place_id')->index(); + $table->tinyInteger('pos')->unsigned()->nullable(); + + + $table->timestamps(); + + $table->foreign('i_q_travel_item_id') + ->references('id') + ->on('i_q_travel_items') + ->onDelete('cascade'); + + $table->foreign('travel_place_id') + ->references('id') + ->on('travel_places') + ->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('i_q_travel_item_places'); + } +} diff --git a/database/migrations/2021_08_03_162759_create_i_q_travel_groups_table.php b/database/migrations/2021_08_03_162759_create_i_q_travel_groups_table.php new file mode 100644 index 0000000..e853912 --- /dev/null +++ b/database/migrations/2021_08_03_162759_create_i_q_travel_groups_table.php @@ -0,0 +1,48 @@ +create('i_q_travel_groups', function (Blueprint $table) { + + $table->increments('id'); + + $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->text('highlights')->nullable(); + + $table->tinyInteger('days_start')->unsigned()->nullable(); + $table->tinyInteger('days_duration')->unsigned()->nullable(); + + $table->tinyInteger('min_persons')->unsigned()->nullable(); + + $table->decimal('price_adult', 8, 2)->nullable(); + $table->decimal('price_children', 8, 2)->nullable(); + + $table->tinyInteger('pos')->unsigned()->nullable(); + $table->boolean('active')->default(true); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('i_q_travel_groups'); + } +} diff --git a/database/migrations/2021_08_03_163156_create_i_q_travel_group_items_table.php b/database/migrations/2021_08_03_163156_create_i_q_travel_group_items_table.php new file mode 100644 index 0000000..bb2d79e --- /dev/null +++ b/database/migrations/2021_08_03_163156_create_i_q_travel_group_items_table.php @@ -0,0 +1,47 @@ +create('i_q_travel_group_items', function (Blueprint $table) { + $table->bigIncrements('id'); + + $table->unsignedInteger('i_q_travel_group_id')->index(); + $table->unsignedInteger('i_q_travel_item_id')->index(); + $table->tinyInteger('pos')->unsigned()->nullable(); + + + $table->timestamps(); + + $table->foreign('i_q_travel_group_id') + ->references('id') + ->on('i_q_travel_groups') + ->onDelete('cascade'); + + $table->foreign('i_q_travel_item_id') + ->references('id') + ->on('i_q_travel_items') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection('mysql_stern')->dropIfExists('i_q_travel_group_items'); + } +} diff --git a/resources/views/admin/modal/iq_travel_group-item.blade.php b/resources/views/admin/modal/iq_travel_group-item.blade.php new file mode 100644 index 0000000..964efea --- /dev/null +++ b/resources/views/admin/modal/iq_travel_group-item.blade.php @@ -0,0 +1,37 @@ + + + diff --git a/resources/views/admin/modal/iq_travel_item-group.blade.php b/resources/views/admin/modal/iq_travel_item-group.blade.php new file mode 100644 index 0000000..d5d3fc6 --- /dev/null +++ b/resources/views/admin/modal/iq_travel_item-group.blade.php @@ -0,0 +1,38 @@ + + + diff --git a/resources/views/admin/modal/iq_travel_item-place.blade.php b/resources/views/admin/modal/iq_travel_item-place.blade.php new file mode 100644 index 0000000..a968ebd --- /dev/null +++ b/resources/views/admin/modal/iq_travel_item-place.blade.php @@ -0,0 +1,38 @@ + + + diff --git a/resources/views/customer/index.blade.php b/resources/views/customer/index.blade.php index 3a94ea3..8b269f5 100755 --- a/resources/views/customer/index.blade.php +++ b/resources/views/customer/index.blade.php @@ -17,7 +17,6 @@ {{__('Vorname')}} {{__('Nachname')}} {{__('E-Mail')}} - diff --git a/resources/views/drafts/detail.blade.php b/resources/views/drafts/detail.blade.php index a9ef6df..1a04245 100755 --- a/resources/views/drafts/detail.blade.php +++ b/resources/views/drafts/detail.blade.php @@ -168,13 +168,13 @@ diff --git a/resources/views/iq/travel/group/detail.blade.php b/resources/views/iq/travel/group/detail.blade.php new file mode 100644 index 0000000..377db8c --- /dev/null +++ b/resources/views/iq/travel/group/detail.blade.php @@ -0,0 +1,175 @@ +@extends('layouts.layout-2') + +@section('content') + + {!! Form::open(['url' => route('iq_travel_group_detail', [$id]), 'class' => 'form-horizontal']) !!} + +

+ Gruppenbaustein +
+   + {{ __('back') }} +
+

+ +
+
+

Allgemein

+
+
+ + {{ Form::text('name', $model->name, array('placeholder'=>__('Name'), 'class'=>'form-control', 'id'=>'name', 'required'=>true)) }} +
+
+
+
+ + +
+
+ +
+
+ +
+ {{ Form::text('price_adult', $model->price_adult, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'price_adult',)) }} +
+
+
+ +
+
+ +
+ {{ Form::text('price_children', $model->price_children, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'price_children',)) }} +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+
+
+
+ + {{ Form::textarea('description', $model->description, array('class'=>'form-control autoExpand', 'rows'=>2)) }} +
+ +
+ + {{ Form::textarea('highlights', $model->highlights, array('class'=>'form-control autoExpand', 'rows'=>2)) }} +
+
+
+
+
+ +

Reisebausteine für diese Gruppe

+ + @if($model->id) + +
+ + + + + + + + + + + + + @if($model->i_q_travel_group_items) + @foreach($model->i_q_travel_group_items as $i_q_travel_group_item) + + + + + + + + + + @endforeach + @endif + +
 {{__('POS')}}{{__('Name')}}{{__('Typ')}}{{__('Land')}}{{__('Ort(e)')}}
+ + {{ $i_q_travel_group_item->pos }}{{ $i_q_travel_group_item->i_q_travel_item->name }}@if($i_q_travel_group_item->i_q_travel_item->draft_type) {{ $i_q_travel_group_item->i_q_travel_item->draft_type->name }} @endif@if($i_q_travel_group_item->i_q_travel_item->travel_country){{ $i_q_travel_group_item->i_q_travel_item->travel_country->name }} @endif + @if($i_q_travel_group_item->i_q_travel_item->i_q_travel_item_places->count()) + @foreach($i_q_travel_group_item->i_q_travel_item->i_q_travel_item_places as $i_q_travel_item_place) + {{ $i_q_travel_item_place->travel_place->name }}
+ @endforeach + @endif + +
+ +
+
+ + + +
+ +
+ @else +

Der Gruppenbaustein muss erst mit einem Name gespeichert werden.

+ @endif +
+
+ +
+   + {{ __('back') }}
+ {!! Form::close() !!} + + + + +@endsection \ No newline at end of file diff --git a/resources/views/iq/travel/group/index.blade.php b/resources/views/iq/travel/group/index.blade.php new file mode 100644 index 0000000..684b11f --- /dev/null +++ b/resources/views/iq/travel/group/index.blade.php @@ -0,0 +1,55 @@ +@extends('layouts.layout-2') + +@section('content') + +

+ Reisebausteine / Gruppen +

+ +
+
+ + + + + + + + + + + +
 {{__('Name')}}{{__('Bausteine')}}{{__('sichbar')}} 
+
+ + +
+ + + + + +@endsection \ No newline at end of file diff --git a/resources/views/iq/travel/item/detail.blade.php b/resources/views/iq/travel/item/detail.blade.php new file mode 100644 index 0000000..1ce74de --- /dev/null +++ b/resources/views/iq/travel/item/detail.blade.php @@ -0,0 +1,175 @@ +@extends('layouts.layout-2') + +@section('content') + + {!! Form::open(['url' => route('iq_travel_item_detail', [$id]), 'class' => 'form-horizontal']) !!} + +

+ Reisebaustein +
+   + {{ __('back') }} +
+

+ +
+
+

Allgemein

+
+
+ + {{ Form::text('name', $model->name, array('placeholder'=>__('Name'), 'class'=>'form-control', 'id'=>'name', 'required'=>true)) }} +
+
+ + {{ Form::select('draft_type_id', \App\Services\Model::getDraftTypeArray(true) , $model->draft_type_id, array('class'=>'custom-select', 'id'=>'draft_type_id')) }} +
+
+ + {{ Form::select('travel_country_id', \App\Services\Model::getTravelCountryArray(true) , $model->travel_country_id, array('class'=>'custom-select', 'id'=>'travel_country_id')) }} +
+
+
+
+ + +
+
+ +
+
+ +
+ {{ Form::text('price_adult', $model->price_adult, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'price_adult',)) }} +
+
+
+ +
+
+ +
+ {{ Form::text('price_children', $model->price_children, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'price_children',)) }} +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+
+
+
+ + {{ Form::textarea('description', $model->description, array('class'=>'form-control autoExpand', 'rows'=>2)) }} +
+ +
+ + {{ Form::textarea('highlights', $model->highlights, array('class'=>'form-control autoExpand', 'rows'=>2)) }} +
+
+
+
+
+ +

Reiseorte für diesen Baustein

+ + @if($model->id) + +
+ + + + + + + + + + + + + @if($model->i_q_travel_item_places) + @foreach($model->i_q_travel_item_places as $i_q_travel_item_place) + + + + + + + + + @endforeach + @endif + +
 {{__('POS')}}NameBeschreibungLand 
+ + {{ $i_q_travel_item_place->pos }}{{ $i_q_travel_item_place->travel_place->name }}{{ $i_q_travel_item_place->travel_place->description }}@if($i_q_travel_item_place->travel_place->travel_country){{ $i_q_travel_item_place->travel_place->travel_country->name }} @endif + +
+
+ +
+ +
+ @else +

Der Baustein muss erst mit einem Name gespeichert werden.

+ @endif +
Reiseorte bearbeiten / anlegen: Einstellungen -> Reiseorte +
+
+
+ +
+   + {{ __('back') }}
+ {!! Form::close() !!} + + + + +@endsection \ No newline at end of file diff --git a/resources/views/iq/travel/item/index.blade.php b/resources/views/iq/travel/item/index.blade.php new file mode 100644 index 0000000..862d32d --- /dev/null +++ b/resources/views/iq/travel/item/index.blade.php @@ -0,0 +1,60 @@ +@extends('layouts.layout-2') + +@section('content') + +

+ Reisebausteine / Bausteine +

+ +
+
+ + + + + + + + + + + + + + +
 {{__('Name')}}{{__('Typ')}}{{__('Land')}}{{__('Ort(e)')}}{{__('sichbar')}} 
+
+ + +
+ + + + + +@endsection \ No newline at end of file diff --git a/resources/views/iq/travel/programm/index.blade.php b/resources/views/iq/travel/programm/index.blade.php new file mode 100644 index 0000000..c671fa0 --- /dev/null +++ b/resources/views/iq/travel/programm/index.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.layout-2') + +@section('content') + +

+ Reisebausteine / Programme +

+ +
+
+ + + + + + + + + + + +
 {{__('Name')}}{{__('')}}{{__('sichbar')}} 
+ In Umsetzung … +
+ +
+ +
+
+ + + + + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/includes/layout-sidenav.blade.php b/resources/views/layouts/includes/layout-sidenav.blade.php index a782ca4..aa87bc3 100755 --- a/resources/views/layouts/includes/layout-sidenav.blade.php +++ b/resources/views/layouts/includes/layout-sidenav.blade.php @@ -120,6 +120,33 @@ @endif + + @if(Auth::user()->isPermission('crm-iq-tl')) +
  • + + +
    Reisebausteine
    +
    + +
  • + @endif + @endif @if(Auth::user()->isPermission('crm-old-cm'))
  • @@ -283,6 +310,11 @@
    {{ __('Reiseländer') }}
    @endif + @if(Auth::user()->isPermission('sua-st-tpl')) +
  • +
    {{ __('Reiseorte') }}
    +
  • + @endif @if(Auth::user()->isPermission('sua-st-tp'))
  • {{ __('Reiseprogramme') }}
    diff --git a/resources/views/settings/place/index.blade.php b/resources/views/settings/place/index.blade.php new file mode 100644 index 0000000..7ff6655 --- /dev/null +++ b/resources/views/settings/place/index.blade.php @@ -0,0 +1,143 @@ +@extends('layouts.layout-2') + +@section('content') +

    + Reiseorte +

    +
    +
    + + + + + + + + + + + + + + + @foreach($travel_places as $value) + + + + + + + + + + + @endforeach + +
     {{__('Name')}}{{__('Beschreibung')}}{{__('Land')}}{{__('Latitude')}}{{__('Longitude')}}{{__('sichtbar')}}
    + + {{ $value->name }}{{ $value->description }}{{ $value->travel_country->name }}{{ $value->latitude }}{{ $value->longitude }}{!! get_active_badge($value->active) !!}
    +
    + +
    +
    +
    + + + + +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index d73d532..afe2b25 100755 --- a/routes/web.php +++ b/routes/web.php @@ -248,6 +248,29 @@ Route::group(['middleware' => ['admin']], function() Route::post('travel_user_booking_fewo/ajax/requests', 'TravelUserBookingFewoController@getAjaxRequests')->name('travel_user_booking_fewo_ajax_requests'); }); + + Route::group(['middleware' => ['auth.permission:crm-iq-tl']], function() { + //Reisebausteine + Route::get('/iq/travel/programms', 'IQ\TravelProgrammController@index')->name('iq_travel_programms'); + Route::get('/iq/travel/programm/detail/{id}', 'IQ\TravelProgrammController@detail')->name('iq_travel_programm_detail'); + + Route::get('/iq/travel/groups', 'IQ\TravelGroupController@index')->name('iq_travel_groups'); + Route::get('/iq/travel/group/detail/{id?}', 'IQ\TravelGroupController@detail')->name('iq_travel_group_detail'); + Route::post('/iq/travel/group/detail/{id?}', 'IQ\TravelGroupController@store')->name('iq_travel_group_detail'); + Route::get('/iq/travel/group/delete/{id?}/{del?}', 'IQ\TravelGroupController@delete')->name('iq_travel_group_delete'); + + + Route::get('/iq/travel/items', 'IQ\TravelItemController@index')->name('iq_travel_items'); + Route::get('/iq/travel/item/detail/{id?}', 'IQ\TravelItemController@detail')->name('iq_travel_item_detail'); + Route::post('/iq/travel/item/detail/{id?}', 'IQ\TravelItemController@store')->name('iq_travel_item_detail'); + Route::get('/iq/travel/item/delete/{id?}/{del?}', 'IQ\TravelItemController@delete')->name('iq_travel_item_delete'); + + Route::get('/iq/travel/programm/data_table', 'IQ\TravelProgrammController@data_table')->name('data_table_travel_programms'); + Route::get('/iq/travel/group/data_table', 'IQ\TravelGroupController@getTravelGroups')->name('data_table_travel_groups'); + Route::get('/iq/travel/items/data_table', 'IQ\TravelItemController@getTravelItems')->name('data_table_travel_items'); + + }); + Route::group(['middleware' => ['auth.permission:cms-cn-in']], function() { //CMS Infos Route::get('/cms/content/infos', 'CMS\CMSContentInfoController@index')->name('cms_content_infos'); @@ -370,6 +393,13 @@ Route::group(['middleware' => ['superadmin']], function() { Route::post('/admin/settings/travel_program/update', 'Settings\TravelAgendaController@update')->name('admin_settings_travel_program_update'); Route::get('/admin/settings/travel_program/delete/{id}', 'Settings\TravelAgendaController@delete')->name('admin_settings_travel_program_delete'); }); + Route::group(['middleware' => ['auth.permission:sua-st-tpl']], function() { + //SUPERADMIN > Einstellungen > Reiseorte + Route::get('/admin/settings/travel_places', 'Settings\TravelPlaceController@index')->name('admin_settings_travel_places'); + Route::post('/admin/settings/travel_place/update', 'Settings\TravelPlaceController@update')->name('admin_settings_travel_place_update'); + Route::get('/admin/settings/travel_place/delete/{id}', 'Settings\TravelPlaceController@delete')->name('admin_settings_travel_place_delete'); + }); + Route::group(['middleware' => ['auth.permission:sua-st-bs']], function() { //SUPERADMIN > Einstellungen > Reisestatus Route::get('/admin/settings/booking_status', 'Settings\BookingStatusController@index')->name('admin_settings_booking_status'); diff --git a/storage/app/public/pdf/passolution/Einreisebestimmungen_de_AT-SY.pdf b/storage/app/public/pdf/passolution/Einreisebestimmungen_de_AT-SY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7136b8947f2a3a855198079259127f31e26dab2b GIT binary patch literal 29857 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 literal 0 HcmV?d00001 diff --git a/storage/app/public/pdf/passolution/Einreisebestimmungen_de_DE-SY.pdf b/storage/app/public/pdf/passolution/Einreisebestimmungen_de_DE-SY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59ba1b4d5c0bd91db9a8f0b2be754dec7176c110 GIT binary patch literal 29858 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 asxxPVu@mC_ZvhAj