From 730832c8e1da82f99e73cf027b3ba22da4efd8b8 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Mon, 29 Jun 2020 12:23:21 +0200 Subject: [PATCH] Fewo PDF Hinweise, Generator, Anhang Mail --- .idea/mein.sterntours.test.iml | 3 + .idea/workspace.xml | 100 +++--- .../Controllers/CMS/CMSFeWoController.php | 164 +++++++++ .../Controllers/CustomerFileController.php | 17 +- app/Http/Controllers/DraftController.php | 4 +- .../TravelUserBookingFewoController.php | 25 +- app/Models/CMSContent.php | 11 + app/Models/FewoLodging.php | 1 + app/Services/BookingFewo.php | 25 ++ app/Services/CreatePDF.php | 60 ++++ config/fewo.php | 6 + config/permissions.php | 1 + ...03_20_132556_create_fewo_lodging_table.php | 1 + public/js/summernote-cleaner.js | 178 ++++++++++ public/wartung.html | 314 ++++++++++++++++++ resources/views/cms/fewo/all/index.blade.php | 209 ++++++++++++ .../views/cms/fewo/content/detail.blade.php | 273 +++++++++++++++ .../views/cms/fewo/content/index.blade.php | 85 +++++ resources/views/drafts/detail.blade.php | 112 +++---- resources/views/layouts/application.blade.php | 37 ++- .../layouts/includes/layout-sidenav.blade.php | 64 ++-- .../views/pdf/fewo_instructions.blade.php | 40 +++ resources/views/pdf/layout-small.blade.php | 143 ++++++++ resources/views/pdf/layout.blade.php | 4 +- .../user/booking/_detail_files.blade.php | 21 +- .../user/booking/_detail_info.blade.php | 2 +- .../mail/modal-new-booking-files.blade.php | 21 ++ routes/web.php | 12 +- .../06/5ef9ab45db7800.71530766_ust111.pdf | Bin 0 -> 7008 bytes ...7834_hinweise-ferienwohnung-strandstra.pdf | Bin 0 -> 21271 bytes ...3277_hinweise-ferienwohnung-strandstra.pdf | Bin 0 -> 21271 bytes 31 files changed, 1786 insertions(+), 147 deletions(-) create mode 100755 app/Http/Controllers/CMS/CMSFeWoController.php create mode 100644 app/Services/CreatePDF.php create mode 100644 config/fewo.php create mode 100755 public/js/summernote-cleaner.js create mode 100644 public/wartung.html create mode 100755 resources/views/cms/fewo/all/index.blade.php create mode 100755 resources/views/cms/fewo/content/detail.blade.php create mode 100755 resources/views/cms/fewo/content/index.blade.php create mode 100644 resources/views/pdf/fewo_instructions.blade.php create mode 100644 resources/views/pdf/layout-small.blade.php create mode 100644 storage/app/booking_fewo/files/2020/06/5ef9ab45db7800.71530766_ust111.pdf create mode 100644 storage/app/travel_user/attachment/2020/06/5ef9b97a102445.36057834_hinweise-ferienwohnung-strandstra.pdf create mode 100644 storage/app/travel_user/attachment/2020/06/5ef9b98209a9e6.83093277_hinweise-ferienwohnung-strandstra.pdf diff --git a/.idea/mein.sterntours.test.iml b/.idea/mein.sterntours.test.iml index d93092c..0356a1b 100644 --- a/.idea/mein.sterntours.test.iml +++ b/.idea/mein.sterntours.test.iml @@ -5,6 +5,9 @@ + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7b0fa8d..65fd67d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,6 +2,9 @@ + + + @@ -25,24 +28,24 @@ - - - - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + @@ -90,12 +93,14 @@ - - - - - - + + + + + + + + + + + + + + + @@ -330,13 +342,6 @@ - - - - - - - @@ -781,6 +792,10 @@ + + + + @@ -790,10 +805,10 @@ - + - + @@ -811,31 +826,32 @@ - + - + + - + - + - + - + - + - + diff --git a/app/Http/Controllers/CMS/CMSFeWoController.php b/app/Http/Controllers/CMS/CMSFeWoController.php new file mode 100755 index 0000000..37ee24d --- /dev/null +++ b/app/Http/Controllers/CMS/CMSFeWoController.php @@ -0,0 +1,164 @@ +identifier_content = config('fewo.identifier_content'); + $this->identifier_fewo = config('fewo.identifier_fewo'); + } + /* + * ALL + */ + public function all($step = false) + { + + $data = [ + 'contents' => CMSContent::where('identifier', '=', $this->identifier_content)->get()->sortBy('pos'), + 'identifier_content' => $this->identifier_content, + 'step' => $step + ]; + return view('cms.fewo.all.index', $data); + } + + public function storeAll($step = false) + { + $data = Request::all(); + + /*if($data['action'] === 'saveAll') { + //saveAll on each change + }*/ + $i = 1; + if(isset($data['contents'] )) { + foreach ($data['contents'] as $content_id => $item) { + $content = CMSContent::findOrFail($content_id); + $content->setObjectBy('page-break', (isset($item['page-break']) ? true : false)); + $content->name = $item['name']; + $content->slug = null; + $content->decimal = isset($item['in_pdf']) ? 1 : 0; + $content->full_text = $item['full_text']; + $content->pos = $i++; + $content->save(); + } + } + //last + if($data['action'] === 'addItem'){ + $create = [ + 'name' => 'Abschnitt', + 'field' => 'full_text', + 'decimal' => 1, + 'identifier' => $this->identifier_content, + 'pos' => $i, + ]; + CMSContent::create($create); + //store in cms old Datebase + \App\Models\Sym\CmsContent::create($create); + } + + \Session()->flash('alert-save', '1'); + return redirect(route('cms_fewo_all', [$step])); + } + + public function deleteAll($id){ + $content = CMSContent::findOrFail($id); + $content->delete(); + $m = \App\Models\Sym\CmsContent::find($id); + $m->delete(); + \Session()->flash('alert-success', __('Content gelöscht')); + return back(); //redirect(route('cms_content_all')); + } + /* + * CONTENT + */ + public function content() + { + $data = [ + 'fewo_lodgings' => FewoLodging::all() + ]; + return view('cms.fewo.content.index', $data); + } + + public function detail($id, $step = false) + { + $fewo = FewoLodging::findOrFail($id); + $identifier_fewo = $this->identifier_fewo.Util::sanitize($fewo->single_name); // //this->identifier_fewo = 'fewo-pdf-'; + + $data = [ + 'contents' => CMSContent::where('identifier', '=', $this->identifier_content)->get()->sortBy('pos'), + 'fewo' => $fewo, + 'identifier_content' => $this->identifier_content, + 'identifier_fewo' => $identifier_fewo, + 'step' => $step + ]; + return view('cms.fewo.content.detail', $data); + } + + public function store($id, $step = false) + { + $data = Request::all(); + $fewo = FewoLodging::findOrFail($id); + $identifier_fewo = $this->identifier_fewo.Util::sanitize($fewo->single_name); + + $i = 1; + $last_content_id = null; + if(isset($data['contents'] )) { + foreach ($data['contents'] as $content_id => $item) { + $content = CMSContent::findOrFail($content_id); + if ($item['identifier'] === $this->identifier_content) { + $last_content_id = $content->id; + } + if ($item['identifier'] === $identifier_fewo) { + $content->setObjectBy('page-break', (isset($item['page-break']) ? true : false)); + $content->name = $item['name']; + $content->slug = null; + $content->decimal = isset($item['in_pdf']) ? 1 : 0; + $content->full_text = $item['full_text']; + $content->integer = $last_content_id != null ? $last_content_id : $content->integer; //is the main obj + $content->pos = $i++; + $content->save(); + } + } + } + + if($data['action'] === 'previewPDF'){ + $pdf_content = BookingFewo::getFeWoCMSContentForPDF($this->identifier_content, $identifier_fewo); + $pdf_file = new CreatePDF('pdf.fewo_instructions'); + return $pdf_file->create($fewo, $pdf_content); + } + + if($data['action'] === 'addItem' && isset($data['content_pos_id'])) { + $create = [ + 'name' => 'Abschnitt', + 'field' => 'full_text', + 'decimal' => 1, + 'integer' => $data['content_pos_id'], + 'identifier' => $identifier_fewo, + 'pos' => 0, + ]; + CMSContent::create($create); + //store in cms old Datebase + \App\Models\Sym\CmsContent::create($create); + } + + \Session()->flash('alert-save', '1'); + return redirect(route('cms_fewo_content_detail', [$id, $step])); + } + +} diff --git a/app/Http/Controllers/CustomerFileController.php b/app/Http/Controllers/CustomerFileController.php index 7521746..4b63e68 100755 --- a/app/Http/Controllers/CustomerFileController.php +++ b/app/Http/Controllers/CustomerFileController.php @@ -8,10 +8,14 @@ use App\Models\BookingConfirmation; use App\Models\BookingStorno; use App\Models\BookingVoucher; use App\Models\Coupon; +use App\Models\FewoLodging; use App\Models\InsuranceCertificate; use App\Models\TravelInsurance; use App\Repositories\CustomerFileRepository; +use App\Services\BookingFewo; use App\Services\CreateCouponPDF; +use App\Services\CreatePDF; +use App\Services\Util; use Carbon; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\URL; @@ -39,7 +43,6 @@ class CustomerFileController extends Controller public function show($model, $id, $cd = false){ $content_disposition = $cd ? 'attachment' : 'inline'; - $file = false; $filename = ""; switch ($model){ @@ -90,6 +93,18 @@ class CustomerFileController extends Controller } break; + case 'fewo_instruction_pdf': + $fewo = FewoLodging::findOrFail($id); + $identifier_content = config('fewo.identifier_content'); + $identifier_fewo = config('fewo.identifier_fewo'); + $identifier_fewo = $identifier_fewo.Util::sanitize($fewo->single_name); + $pdf_name = \App\Services\BookingFewo::getFeWoInstructionPDFName($fewo); + $pdf_content = BookingFewo::getFeWoCMSContentForPDF($identifier_content, $identifier_fewo); + $pdf_file = new CreatePDF('pdf.fewo_instructions'); + return $pdf_file->create($fewo, $pdf_content, $pdf_name, $cd); + + break; + } diff --git a/app/Http/Controllers/DraftController.php b/app/Http/Controllers/DraftController.php index 6956063..dd31846 100755 --- a/app/Http/Controllers/DraftController.php +++ b/app/Http/Controllers/DraftController.php @@ -62,7 +62,7 @@ class DraftController extends Controller $i = 1; if(isset($data['draft_item'])){ foreach ($data['draft_item'] as $draft_item_id => $draft_item){ - if($data['action'] == 'saveAllFromOld'){ + if($data['action'] === 'saveAllFromOld'){ $di = $draft->draft_items()->create([]); }else{ $di = DraftItem::findOrFail($draft_item_id); @@ -82,7 +82,7 @@ class DraftController extends Controller } } - if($data['action'] == 'addItem'){ + if($data['action'] === 'addItem'){ $draft->draft_items()->create(['pos' => $i]); } if(strpos($data['action'], 'up_') !== false) { diff --git a/app/Http/Controllers/TravelUserBookingFewoController.php b/app/Http/Controllers/TravelUserBookingFewoController.php index 90d3d33..ca5487d 100755 --- a/app/Http/Controllers/TravelUserBookingFewoController.php +++ b/app/Http/Controllers/TravelUserBookingFewoController.php @@ -21,14 +21,13 @@ use Request; class TravelUserBookingFewoController extends Controller { protected $userBookingFewoRepo; + // protected $identifier_fewo; public function __construct(TravelUserBookingFewoRepository $userBookingFewoRepo) { $this->middleware('admin'); $this->userBookingFewoRepo = $userBookingFewoRepo; - - - + // $this->identifier_fewo = 'fewo-pdf-'; } public function index($step = false) @@ -59,6 +58,11 @@ class TravelUserBookingFewoController extends Controller $id = $travel_user_booking_fewo->id; $replace_info_text['fewo_user_anrede'] = $travel_user_booking_fewo->getUserSalutation(); $replace_info_text['fewo_adresse'] = $travel_user_booking_fewo->getNameAddressLocation(", "); + + /* if($travel_user_booking_fewo->fewo_lodging){ + + $this->identifier_fewo = $this->identifier_fewo.Util::sanitize($travel_user_booking_fewo->fewo_lodging->single_name); + }*/ } if(!$travel_user_booking_fewo->info_mail_text) { $travel_user_booking_fewo->info_mail_text = CMSContent::getContentBySlug('pdf-vorlage-anreiseinfo-fewo'); @@ -78,10 +82,10 @@ class TravelUserBookingFewoController extends Controller public function store($id) { $data = Request::all(); - if($data['action'] == 'saveAll'){ + if($data['action'] === 'saveAll'){ return $this->userBookingFewoRepo->update($id, $data); } - if($data['action'] == 'createInvoice'){ + if($data['action'] === 'createInvoice'){ if(!TravelUserBookingFewo::find($id)){ \Session()->flash('alert-error', __('Buchung nicht gefunden.')); return back()->withRequest(Request::all()); @@ -97,7 +101,7 @@ class TravelUserBookingFewoController extends Controller } } - if($data['action'] == 'createTravelInfo'){ + if($data['action'] === 'createTravelInfo'){ if(!TravelUserBookingFewo::find($id)){ \Session()->flash('alert-error', __('Buchung nicht gefunden.')); return back()->withRequest(Request::all()); @@ -114,7 +118,7 @@ class TravelUserBookingFewoController extends Controller } } - if($data['action'] == 'sendMailtoUser') { + if($data['action'] === 'sendMailtoUser') { $travel_user_booking_fewo = TravelUserBookingFewo::findOrFail($id); if($travel_user_booking_fewo->travel_user_id && $travel_user_booking_fewo->travel_user->email){ $mail_bbc = config('mail.mail_bbc'); @@ -128,7 +132,7 @@ class TravelUserBookingFewoController extends Controller } } - if($data['action'] == 'sendInfosMailtoUser') { + if($data['action'] === 'sendInfosMailtoUser') { $travel_user_booking_fewo = TravelUserBookingFewo::findOrFail($id); if($travel_user_booking_fewo->travel_user_id && $travel_user_booking_fewo->travel_user->email){ $mail_bbc = config('mail.mail_bbc'); @@ -142,7 +146,7 @@ class TravelUserBookingFewoController extends Controller } } - if($data['action'] == 'sendMailtoService') { + if($data['action'] === 'sendMailtoService') { $travel_user_booking_fewo = TravelUserBookingFewo::findOrFail($id); if($travel_user_booking_fewo){ $mail_bbc = config('mail.mail_bbc'); @@ -160,7 +164,7 @@ class TravelUserBookingFewoController extends Controller } } - if($data['action'] == 'sendMailtoEmployee') { + if($data['action'] === 'sendMailtoEmployee') { $travel_user_booking_fewo = TravelUserBookingFewo::findOrFail($id); if($travel_user_booking_fewo){ $mails = explode(",", Request::get('send_mail_employee_mail')); @@ -220,7 +224,6 @@ class TravelUserBookingFewoController extends Controller public function getTravelUserBookingFewos() { - $query = $this->prozessTravelUserBookingFewosSearch(); return \DataTables::eloquent($query) diff --git a/app/Models/CMSContent.php b/app/Models/CMSContent.php index 4d53889..1907ec1 100644 --- a/app/Models/CMSContent.php +++ b/app/Models/CMSContent.php @@ -219,6 +219,15 @@ class CMSContent extends Model $this->attributes['integer'] = intval($value); } + public function getObjectBy($key){ + return isset($this->object[$key]) ? $this->object[$key] : false; + } + + public function setObjectBy($key, $value){ + $obj = $this->object; + $obj[$key] = $value; + $this->object = $obj; + } public static function getContentBySlug($slug){ $CMSContent = CMSContent::whereSlug(trim($slug))->first(); @@ -251,4 +260,6 @@ class CMSContent extends Model public static function getModelBySlug($slug){ return CMSContent::whereSlug(trim($slug))->first(); } + + } diff --git a/app/Models/FewoLodging.php b/app/Models/FewoLodging.php index 22f597d..f2f8909 100644 --- a/app/Models/FewoLodging.php +++ b/app/Models/FewoLodging.php @@ -84,6 +84,7 @@ class FewoLodging extends Model 'type_id', 'name', 'single_name', + 'pdf_name', 'description', 'equipment', 'adress1', diff --git a/app/Services/BookingFewo.php b/app/Services/BookingFewo.php index 6158c98..6280760 100644 --- a/app/Services/BookingFewo.php +++ b/app/Services/BookingFewo.php @@ -76,4 +76,29 @@ class BookingFewo } return []; } + + public static function getFeWoInstructionPDFName($fewo){ + return "HINWEISE-FERIENWOHNUNG-".$fewo->pdf_name.".pdf"; + } + public static function getFeWoCMSContent($content, $identifier_fewo){ + return CMSContent::where('identifier', '=', $identifier_fewo)->where('integer', $content->id)->get()->sortBy('pos'); + } + + public static function getFeWoCMSContentForPDF($identifier_content, $identifier_fewo){ + $pdf_content = []; + $contents = CMSContent::where('identifier', '=', $identifier_content)->get()->sortBy('pos'); + foreach ($contents as $content){ + if($content->decimal > 0){ //in_pdf + $pdf_content[] = $content; + } + if($fewo_contents = BookingFewo::getFeWoCMSContent($content, $identifier_fewo)){ + foreach ($fewo_contents as $fewo_content){ + if($fewo_content->decimal > 0){ //in_pdf + $pdf_content[] = $fewo_content; + } + } + } + } + return $pdf_content; + } } \ No newline at end of file diff --git a/app/Services/CreatePDF.php b/app/Services/CreatePDF.php new file mode 100644 index 0000000..49637c4 --- /dev/null +++ b/app/Services/CreatePDF.php @@ -0,0 +1,60 @@ +view = $view; + } + + public function create($fewo, $contents, $name='test.pdf', $output='stream'){ + + header('Content-type: text/html; charset=UTF-8') ;//chrome + //dd($data); + $data = [ + 'contents' => $contents, + 'fewo' => $fewo, + ]; + $pdf = app('dompdf.wrapper'); + $pdf->getDomPDF()->set_option("enable_php", true); + $pdf->loadView($this->view, $data); + $pdf->setPaper('A4', 'portrait'); + + + if($output === 'stream'){ + return $pdf->stream($name); + } + if($output === 'download'){ + return $pdf->download($name); + } + + if($output === 'save'){ + /* $dir = $invoice->getInvoiceStorageDir(); + if(!Storage::disk('invoices')->exists( $dir )){ + Storage::disk('invoices')->makeDirectory($dir); //creates directory + } + $path = Storage::disk('invoices')->getAdapter()->getPathPrefix(); + + if($preview){ + $filename = "preview.pdf"; + }else{ + $filename = $invoice->invoice_number.".pdf"; + } + + $pdf->save($path.$dir.$filename); + + return $path.$dir.$filename; */ + //return $pdf->download($name); + } + } + +} +?> diff --git a/config/fewo.php b/config/fewo.php new file mode 100644 index 0000000..a857aba --- /dev/null +++ b/config/fewo.php @@ -0,0 +1,6 @@ + 'fewo-pdf-general', + 'identifier_fewo' => 'fewo-pdf-' +]; diff --git a/config/permissions.php b/config/permissions.php index 0057055..5a95f0e 100755 --- a/config/permissions.php +++ b/config/permissions.php @@ -23,6 +23,7 @@ return [ 'cms' => ['name' => 'ADMIN CMS' , 'color' => 'secondary'], 'cms-iq-assets' => ['name' => 'ADMIN CMS > Medien' , 'color' => 'secondary'], 'cms-tg' => ['name' => 'ADMIN CMS > Reiseführer' , 'color' => 'secondary'], + 'cms-fewo' => ['name' => 'ADMIN CMS > FeWo' , 'color' => 'secondary'], 'cms-fb' => ['name' => 'ADMIN CMS > Feedback' , 'color' => 'secondary'], 'cms-sb' => ['name' => 'ADMIN CMS > Sidebar' , 'color' => 'secondary'], 'cms-cn' => ['name' => 'ADMIN CMS > Inhalte' , 'color' => 'secondary'], diff --git a/database/migrations/2019_03_20_132556_create_fewo_lodging_table.php b/database/migrations/2019_03_20_132556_create_fewo_lodging_table.php index 753094f..3bf72e6 100644 --- a/database/migrations/2019_03_20_132556_create_fewo_lodging_table.php +++ b/database/migrations/2019_03_20_132556_create_fewo_lodging_table.php @@ -23,6 +23,7 @@ class CreateFewoLodgingTable extends Migration $table->integer('type_id')->nullable(); $table->string('name', 255); $table->string('single_name', 255); + $table->string('pdf_name', 255); $table->longText('description'); $table->longText('equipment'); $table->string('adress1', 255); diff --git a/public/js/summernote-cleaner.js b/public/js/summernote-cleaner.js new file mode 100755 index 0000000..ad456fe --- /dev/null +++ b/public/js/summernote-cleaner.js @@ -0,0 +1,178 @@ +/* https://github.com/DiemenDesign/summernote-cleaner */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + module.exports = factory(require('jquery')); + } else { + factory(window.jQuery); + } +} +(function ($) { + $.extend(true, $.summernote.lang, { + 'en-US': { + cleaner: { + tooltip: 'Cleaner', + not: 'Text has been Cleaned!!!', + limitText: 'Text', + limitHTML: 'HTML' + } + } + }); + $.extend($.summernote.options, { + cleaner: { + action: 'both', // both|button|paste 'button' only cleans via toolbar button, 'paste' only clean when pasting content, both does both options. + newline: '
', // Summernote's default is to use '


' + notStyle: 'position:absolute;top:0;left:0;right:0', + icon: '', + keepHtml: true, //Remove all Html formats + keepOnlyTags: [], // If keepHtml is true, remove all tags except these + keepClasses: false, //Remove Classes + badTags: ['style', 'script', 'applet', 'embed', 'noframes', 'noscript', 'html'], //Remove full tags with contents + badAttributes: ['style', 'start'], //Remove attributes from remaining tags + limitChars: 0, // 0|# 0 disables option + limitDisplay: 'both', // none|text|html|both + limitStop: false // true/false + } + }); + $.extend($.summernote.plugins, { + 'cleaner': function (context) { + var self = this, + ui = $.summernote.ui, + $note = context.layoutInfo.note, + $editor = context.layoutInfo.editor, + options = context.options, + lang = options.langInfo; + var cleanText = function (txt, nlO) { + var out = txt; + if (!options.cleaner.keepClasses) { + var sS = /(\n|\r| class=(")?Mso[a-zA-Z]+(")?)/g; + out = txt.replace(sS, ' '); + } + var nL = /(\n)+/g; + out = out.replace(nL, nlO); + if (options.cleaner.keepHtml) { + var cS = new RegExp('', 'gi'); + out = out.replace(cS, ''); + var tS = new RegExp('<(/)*(meta|link|\\?xml:|st1:|o:|font)(.*?)>', 'gi'); + out = out.replace(tS, ''); + var bT = options.cleaner.badTags; + for (var i = 0; i < bT.length; i++) { + tS = new RegExp('<' + bT[i] + '\\b.*>.*', 'gi'); + out = out.replace(tS, ''); + } + var allowedTags = options.cleaner.keepOnlyTags; + if (typeof(allowedTags) == "undefined") allowedTags = []; + if (allowedTags.length > 0) { + allowedTags = (((allowedTags||'') + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); + var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; + out = out.replace(tags, function($0, $1) { + return allowedTags.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '' + }); + } + var bA = options.cleaner.badAttributes; + for (var ii = 0; ii < bA.length; ii++ ) { + //var aS=new RegExp(' ('+bA[ii]+'="(.*?)")|('+bA[ii]+'=\'(.*?)\')', 'gi'); + var aS = new RegExp(' ' + bA[ii] + '=[\'|"](.*?)[\'|"]', 'gi'); + out = out.replace(aS, ''); + aS = new RegExp(' ' + bA[ii] + '[=0-9a-z]', 'gi'); + out = out.replace(aS, ''); + } + } + return out; + }; + if (options.cleaner.action == 'both' || options.cleaner.action == 'button') { + context.memo('button.cleaner', function () { + var button = ui.button({ + contents: options.cleaner.icon, + tooltip: lang.cleaner.tooltip, + container: 'body', + click: function () { + if ($note.summernote('createRange').toString()) + $note.summernote('pasteHTML', $note.summernote('createRange').toString()); + else + $note.summernote('code', cleanText($note.summernote('code'))); + if ($editor.find('.note-status-output').length > 0) + $editor.find('.note-status-output').html('
' + lang.cleaner.not + '
'); + } + }); + return button.render(); + }); + } + this.events = { + 'summernote.init': function () { + if ($.summernote.interface === 'lite') { + // $("head").append(''); + } + if (options.cleaner.limitChars != 0 || options.cleaner.limitDisplay != 'none') { + var textLength = $editor.find(".note-editable").text().replace(/(<([^>]+)>)/ig, "").replace(/( )/, " "); + var codeLength = $editor.find('.note-editable').html(); + var lengthStatus = ''; + if (textLength.length > options.cleaner.limitChars && options.cleaner.limitChars > 0) + lengthStatus += 'text-danger">'; + else + lengthStatus += '">'; + if (options.cleaner.limitDisplay == 'text' || options.cleaner.limitDisplay == 'both') lengthStatus += lang.cleaner.limitText + ': ' + textLength.length; + if (options.cleaner.limitDisplay == 'both') lengthStatus += ' / '; + if (options.cleaner.limitDisplay == 'html' || options.cleaner.limitDisplay == 'both') lengthStatus += lang.cleaner.limitHTML + ': ' + codeLength.length; + // $editor.find('.note-status-output').html(']+)>)/ig, "").replace(/( )/, " "); + var codeLength = $editor.find('.note-editable').html(); + var lengthStatus = ''; + if (options.cleaner.limitStop == true && textLength.length >= options.cleaner.limitChars) { + var key = e.keyCode; + allowed_keys = [8, 37, 38, 39, 40, 46] + if ($.inArray(key, allowed_keys) != -1) { + $editor.find('.cleanerLimit').removeClass('text-danger'); + return true; + } else { + $editor.find('.cleanerLimit').addClass('text-danger'); + e.preventDefault(); + e.stopPropagation(); + } + } else { + if (textLength.length > options.cleaner.limitChars && options.cleaner.limitChars > 0) + lengthStatus += 'text-danger">'; + else + lengthStatus += '">'; + if (options.cleaner.limitDisplay == 'text' || options.cleaner.limitDisplay == 'both') + lengthStatus += lang.cleaner.limitText + ': ' + textLength.length; + if (options.cleaner.limitDisplay == 'both') + lengthStatus += ' / '; + if (options.cleaner.limitDisplay == 'html' || options.cleaner.limitDisplay == 'both') + lengthStatus += lang.cleaner.limitHTML + ': ' + codeLength.length; + //$editor.find('.note-status-output').html(' 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./); + var ffox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; + if (msie) + var text = window.clipboardData.getData("Text"); + else + var text = e.originalEvent.clipboardData.getData(options.cleaner.keepHtml ? 'text/html' : 'text/plain'); + if (text) { + if (msie || ffox) + setTimeout(function () { + $note.summernote('pasteHTML', cleanText(text, options.cleaner.newline)); + }, 1); + else + $note.summernote('pasteHTML', cleanText(text, options.cleaner.newline)); + /*if ($editor.find('.note-status-output').length > 0) + $editor.find('.note-status-output').html('
' + lang.cleaner.not + '
');*/ + } + } + } + } + } + }); +})); diff --git a/public/wartung.html b/public/wartung.html new file mode 100644 index 0000000..f55aba5 --- /dev/null +++ b/public/wartung.html @@ -0,0 +1,314 @@ + + + + + Wartungsmodus + + + + +
+

Unsere Website befindet sich gerade in der Wartung.

+ +

+ Wir stehen Ihnen bald wieder zur Verfügung. Entschuldigen Sie etwaige Unannehmlichkeiten. +

+ +
+ +

Our website is currently undergoing maintenance.

+ +

+ We'll be back very soon. Sorry for any inconvenience. +

+ +
+
+ + \ No newline at end of file diff --git a/resources/views/cms/fewo/all/index.blade.php b/resources/views/cms/fewo/all/index.blade.php new file mode 100755 index 0000000..411ec74 --- /dev/null +++ b/resources/views/cms/fewo/all/index.blade.php @@ -0,0 +1,209 @@ +@extends('layouts.layout-2') + +@section('content') + + + +

+ FeWo Allgemein +

+ + +@endsection \ No newline at end of file diff --git a/resources/views/cms/fewo/content/detail.blade.php b/resources/views/cms/fewo/content/detail.blade.php new file mode 100755 index 0000000..464a9b5 --- /dev/null +++ b/resources/views/cms/fewo/content/detail.blade.php @@ -0,0 +1,273 @@ +@extends('layouts.layout-2') + +@section('content') + + + +

+ FeWo Inhalt {{ $fewo->name }} +

+ + +@endsection \ No newline at end of file diff --git a/resources/views/cms/fewo/content/index.blade.php b/resources/views/cms/fewo/content/index.blade.php new file mode 100755 index 0000000..07db94e --- /dev/null +++ b/resources/views/cms/fewo/content/index.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.layout-2') + +@section('content') + +

+ FeWo Inhalte +

+ + @if ($errors->any()) +
+
+
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+
+
+ @endif + +
+
+ + + + + + + + + + + + + + @foreach($fewo_lodgings as $value) + + + + + + + + + + + @endforeach + +
 {{__('Name')}}{{__('Adresse')}}{{__('Personen')}}{{__('Erwachsenen')}}{{__('Kinder')}}
+ + + + {{ $value->name }} + {{ $value->adress1 }}, {{ $value->zip_code }} {{ $value->city }} + + {{ $value->maximum_persons }} + + {{ $value->maximum_adults }} + + {{ $value->maximum_childs }} +
+
+ {{-- + + --}} + +
+@endsection \ No newline at end of file diff --git a/resources/views/drafts/detail.blade.php b/resources/views/drafts/detail.blade.php index 9da458a..a9ef6df 100755 --- a/resources/views/drafts/detail.blade.php +++ b/resources/views/drafts/detail.blade.php @@ -44,7 +44,6 @@ - - - - - - {!! Form::open(['url' => route('draft_detail', [$id]), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!} @@ -133,7 +127,6 @@ - @if(count($draft->draft_items)) @php($i = 1)
@@ -160,59 +153,60 @@ @foreach($draft->draft_items as $draft_item) - draft_type) style="background-color: {{ $draft_item->draft_type->color }}" @endif> - - + draft_type) style="background-color: {{ $draft_item->draft_type->color }}" @endif> + + - - {{ $i++ }} - - - - - - - - - - -
- + + {!! HTMLHelper::getDraftTypes($draft_item->draft_type_id) !!} - {{ Form::text('draft_item['.$draft_item->id.'][price_adult]', $draft_item->price_adult, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'draft_item_'.$draft_item->id.'_price_adult',)) }} - - - -
- - -
- + + {!! HTMLHelper::getRangeOptions($draft_item->days_start, 30, ' Tag(e)') !!} - {{ Form::text('draft_item['.$draft_item->id.'][price_children]', $draft_item->price_children, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'draft_item_'.$draft_item->id.'_price_children')) }} - - - -
- - - - - - + + + + + +
+ + {{ Form::text('draft_item['.$draft_item->id.'][price_adult]', $draft_item->price_adult, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'draft_item_'.$draft_item->id.'_price_adult',)) }} + + + +
+ + +
+ + {{ Form::text('draft_item['.$draft_item->id.'][price_children]', $draft_item->price_children, array('placeholder'=>__('Preis in €'), 'class'=>'form-control', 'id'=>'draft_item_'.$draft_item->id.'_price_children')) }} + + + +
+ + + + + + + draft_type) style="background-color: {{ $draft_item->draft_type->color }}" @endif class="border-none"> {{ Form::textarea('draft_item['.$draft_item->id.'][service]', $draft_item->service, array('placeholder'=>__('Leistungen'), 'class'=>'form-control autoExpand', 'id'=>'draft_item_'.$draft_item->id.'_service', 'rows'=>'1', 'data-min-rows'=>'1')) }} @@ -223,10 +217,8 @@ {{__('in PDF')}} - - - + @endforeach
diff --git a/resources/views/layouts/application.blade.php b/resources/views/layouts/application.blade.php index befc6dc..3dcbd95 100755 --- a/resources/views/layouts/application.blade.php +++ b/resources/views/layouts/application.blade.php @@ -139,13 +139,16 @@ + + + - - @if(isset($lfm_helper)) + + @endif @@ -311,6 +314,36 @@ }, }); + + $('.summernote-air').summernote({ + airMode: true, + lang: 'de-DE', + placeholder: 'Text ...', + tabsize: 2, + popover: { air:[ + ['style', ['style']], + ['font', ['bold', 'italic', 'underline', 'clear']], + ['font', ['strikethrough']], + ['para', ['ul', 'ol', 'paragraph']], + ['insert', ['link']], + ['color', ['color']], + ['view', ['codeview']], + ] }, + cleaner:{ + action: 'paste', // both|button|paste 'button' only cleans via toolbar button, 'paste' only clean when pasting content, both does both options. + newline: '
', // Summernote's default is to use '


' + notStyle: 'position:absolute;top:0;left:0;right:0', // Position of Notification + icon: '[Your Button]', + keepHtml: false, // Remove all Html formats + keepOnlyTags: ['

', '
', '

+ @endif + @if(Auth::user()->isPermission('cms-fewo')) +
  • + + +
    FeWo
    +
    + +
  • @endif @if(Auth::user()->isPermission('cms-fb'))
  • @@ -171,31 +187,31 @@
    Sidebar
  • @endif - @if(Auth::user()->isPermission('cms-cn')) -
  • - - -
    Inhalte
    -
    -
      - @if(Auth::user()->isPermission('cms-cn-in')) -
    • -
      Infos
      + @if(Auth::user()->isPermission('cms-cn')) +
    • + + +
      Inhalte
      +
      +
        + @if(Auth::user()->isPermission('cms-cn-in')) +
      • +
        Infos
        +
      • + @endif + @if(Auth::user()->isPermission('cms-cn-al')) +
      • +
        Allgemein
      • - @endif - @if(Auth::user()->isPermission('cms-cn-al')) -
      • -
        Allgemein
        -
      • - @endif - @if(Auth::user()->isPermission('cms-cn-au')) -
      • -
        Autoren
        -
      • - @endif -
      -
    • - @endif + @endif + @if(Auth::user()->isPermission('cms-cn-au')) +
    • +
      Autoren
      +
    • + @endif +
    +
  • + @endif @endif @endif diff --git a/resources/views/pdf/fewo_instructions.blade.php b/resources/views/pdf/fewo_instructions.blade.php new file mode 100644 index 0000000..f94348e --- /dev/null +++ b/resources/views/pdf/fewo_instructions.blade.php @@ -0,0 +1,40 @@ +@extends('pdf.layout-small') + +@section('content') + + +

    HINWEISE FERIENWOHNUNG STERN USEDOM

    +

    {{$fewo->single_name}} in der {{ $fewo->adress1 }} in {{ $fewo->zip_code }} {{ $fewo->city }}

    +
    + @foreach($contents as $content) + @if($content->getObjectBy('page-break')) +
    + @endif +
    +

    {{$content->name}}

    +
    + {!! $content->getContent() !!} +
    +
    + @endforeach +@endsection \ No newline at end of file diff --git a/resources/views/pdf/layout-small.blade.php b/resources/views/pdf/layout-small.blade.php new file mode 100644 index 0000000..6aa4a3e --- /dev/null +++ b/resources/views/pdf/layout-small.blade.php @@ -0,0 +1,143 @@ + + + + + + STERN TOURS + + + + +
    + STERNTOURS +
    + +
    +
    + @yield('content') +
    +
    + + \ No newline at end of file diff --git a/resources/views/pdf/layout.blade.php b/resources/views/pdf/layout.blade.php index 1674076..7e7cd14 100644 --- a/resources/views/pdf/layout.blade.php +++ b/resources/views/pdf/layout.blade.php @@ -3,7 +3,7 @@ - + STERN TOURS @@ -26,7 +26,7 @@ 10719 Berlin
    - Fon: 030 | 88 0 313 0
    + Tel.: 030 | 88 0 313 0
    Fax: 030 | 88 0 313 44
    E-Mail: kontakt@sterntours.de
    Web: www.sterntours.de diff --git a/resources/views/travel/user/booking/_detail_files.blade.php b/resources/views/travel/user/booking/_detail_files.blade.php index 56038d5..82352fd 100755 --- a/resources/views/travel/user/booking/_detail_files.blade.php +++ b/resources/views/travel/user/booking/_detail_files.blade.php @@ -19,7 +19,26 @@ - + @if($travel_user_booking_fewo->fewo_lodging) + + {{$booking_files_count++}} + + + {{\App\Services\BookingFewo::getFeWoInstructionPDFName($travel_user_booking_fewo->fewo_lodging)}} + + + + application/pdf + + - + + + + + + + @endif @foreach(\App\Services\BookingFewo::contentFiles() as $content_file) @if($file = \App\Models\CMSContent::getModelBySlug($content_file)) diff --git a/resources/views/travel/user/booking/_detail_info.blade.php b/resources/views/travel/user/booking/_detail_info.blade.php index 1686a57..6d35233 100755 --- a/resources/views/travel/user/booking/_detail_info.blade.php +++ b/resources/views/travel/user/booking/_detail_info.blade.php @@ -3,7 +3,7 @@ -
    +
    diff --git a/resources/views/travel/user/booking/mail/modal-new-booking-files.blade.php b/resources/views/travel/user/booking/mail/modal-new-booking-files.blade.php index f067d46..5deb9af 100644 --- a/resources/views/travel/user/booking/mail/modal-new-booking-files.blade.php +++ b/resources/views/travel/user/booking/mail/modal-new-booking-files.blade.php @@ -12,6 +12,27 @@ @php($booking_files_count = 1) + @if($booking->fewo_lodging) + + {{$booking_files_count++}} + + + {{\App\Services\BookingFewo::getFeWoInstructionPDFName($booking->fewo_lodging)}} + + + + application/pdf + + - + + + + + @endif + @foreach(\App\Services\BookingFewo::contentFiles() as $content_file) @if($file = \App\Models\CMSContent::getModelBySlug($content_file)) diff --git a/routes/web.php b/routes/web.php index 9d6df1c..107c83c 100755 --- a/routes/web.php +++ b/routes/web.php @@ -249,11 +249,21 @@ Route::group(['middleware' => ['admin']], function() Route::get('/cms/travel_guide/page/detail/{id}', 'CMS\CMSTravelGuideControllecr@pageDetail')->name('cms_travel_guide_page_detail'); Route::post('/cms/travel_guide/page/detail/{id}', 'CMS\CMSTravelGuideController@pageStore')->name('cms_travel_guide_page_detail'); - Route::get('/cms/travel_guide/detail/{id}', 'CMS\CMSTravelGuideController@detail')->name('cms_travel_guide_detail'); Route::post('/cms/travel_guide/detail/{id}', 'CMS\CMSTravelGuideController@store')->name('cms_travel_guide_detail'); Route::get('/cms/travel_guide/delete/{id}', 'CMS\CMSTravelGuideController@delete')->name('cms_travel_guide_delete'); }); + Route::group(['middleware' => ['auth.permission:cms-tg']], function() { + // CMS FeWo + Route::get('/cms/fewo/all/{step?}', 'CMS\CMSFeWoController@all')->name('cms_fewo_all'); + Route::post('/cms/fewo/all/{step?}', 'CMS\CMSFeWoController@storeAll')->name('cms_fewo_all'); + Route::get('/cms/fewo/all/delete/{id}', 'CMS\CMSFeWoController@deleteAll')->name('cms_fewo_all_delete'); + + Route::get('/cms/fewo/content', 'CMS\CMSFeWoController@content')->name('cms_fewo_content'); + Route::get('/cms/fewo/content/detail/{id}/{step?}', 'CMS\CMSFeWoController@detail')->name('cms_fewo_content_detail'); + Route::post('/cms/fewo/content/detail/{id}/{step?}', 'CMS\CMSFeWoController@store')->name('cms_fewo_content_store'); + + }); Route::group(['middleware' => ['auth.permission:cms-fb']], function() { // CMS Feedback Route::get('/cms/feedback', 'CMS\CMSFeedbackController@index')->name('cms_feedback'); diff --git a/storage/app/booking_fewo/files/2020/06/5ef9ab45db7800.71530766_ust111.pdf b/storage/app/booking_fewo/files/2020/06/5ef9ab45db7800.71530766_ust111.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c22f8d8482047d2ee3bb3dff4eeaafbfa529528 GIT binary patch literal 7008 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 fM}&>aKPNP_|*B_SXZ(%mi6DN2iUNeD=TN{Wi; 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 E0JR%50{{R3 literal 0 HcmV?d00001