diff --git a/.env b/.env
index 330163d..860c260 100755
--- a/.env
+++ b/.env
@@ -23,11 +23,11 @@ LOG_CHANNEL=stack
#DB_PASSWORD=KT32vQ7
# on neptune
DB_CONNECTION=mysql
-DB_HOST=192.168.1.7
+DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=cmssso_db1
-DB_USERNAME=cmssso_1
-DB_PASSWORD=ZXk8Udm8
+DB_USERNAME=root
+DB_PASSWORD=KT32vQ7
DB_CONNECTION_STERN=mysql
@@ -54,7 +54,7 @@ MAIL_FEWO_EMPLOYEE=kevin@adametz.media
#MAIL_FEWO_EMPLOYEE=katrin.nikolai@stern-tours.de,gerda.fritsch@stern-tours.de
#MAIL_BBC=kontakt@stern-tours.de,thomas.stern@stern-tours.de
MAIL_FROM_ADDRESS=info@mein.sterntours.de
-MAIL_FROM_NAME=Mein Reisebüro STERN TOURS
+MAIL_FROM_NAME="Mein Reisebüro STERN TOURS"
MAIL_DRIVER=smtp
MAIL_HOST=mail.your-server.de
MAIL_PORT=587
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index de6e0d3..2739eb7 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,15 +2,11 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -30,27 +26,90 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -100,18 +159,13 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -315,24 +369,24 @@
-
+
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
@@ -639,6 +693,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -670,7 +737,6 @@
-
@@ -679,15 +745,10 @@
-
+
-
-
-
-
-
-
+
@@ -698,20 +759,31 @@
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+ file://$PROJECT_DIR$/resources/views/booking/detail.blade.php
+ 313
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Http/Controllers/BookingController.php b/app/Http/Controllers/BookingController.php
index 28998a6..070acb8 100755
--- a/app/Http/Controllers/BookingController.php
+++ b/app/Http/Controllers/BookingController.php
@@ -4,7 +4,9 @@ namespace App\Http\Controllers;
use App\Models\Booking;
use App\Models\BookingDraftItem;
+use App\Models\Customer;
use App\Repositories\BookingRepository;
+use App\Repositories\CustomerMailRepository;
use Request;
class BookingController extends Controller
@@ -184,6 +186,25 @@ class BookingController extends Controller
}
+
+ public function loadModal(){
+ $data = Request::all();
+ $ret = "";
+ if(Request::ajax()){
+ $data['customers'] = [];
+ if($data['action'] === "new-customer-mail" && isset($data['booking_id']) && $booking = Booking::find($data['booking_id'])){
+ $tmp = "";
+ $tmp .= $booking->customer ? $booking->customer->email." | " : "- | ";
+ $tmp .= $booking->customer ? $booking->customer->firstname." ".$booking->customer->name." | " : "- | ";
+ $tmp .= $booking->travel_country_id ? $booking->travel_country->name." | " : "- | ";
+ $tmp .= $booking->travelagenda_id ? $booking->travel_agenda->name."" : "-";
+ $data['customers'][$booking->id] = $tmp;
+ }
+ $ret = CustomerMailRepository::loadModal($data);
+ }
+ return response()->json(['response' => $data, 'html'=>$ret]);
+ }
+
public function draftItemDelete($id){
$boking_draft_item = BookingDraftItem::findOrFail($id);
$booking = $boking_draft_item->booking;
diff --git a/app/Http/Controllers/CustomerMailController.php b/app/Http/Controllers/CustomerMailController.php
index 8decf16..e630a22 100755
--- a/app/Http/Controllers/CustomerMailController.php
+++ b/app/Http/Controllers/CustomerMailController.php
@@ -3,10 +3,15 @@
namespace App\Http\Controllers;
use App\Models\Customer;
+use App\Models\CustomerFile;
use App\Models\CustomerMail;
use App\Repositories\CustomerMailRepository;
+use App\Repositories\FileRepository;
use Carbon;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\URL;
use Request;
+use Response;
class CustomerMailController extends Controller
{
@@ -37,9 +42,12 @@ class CustomerMailController extends Controller
$customer_mail = CustomerMail::findOrFail($id);
$id = $customer_mail->id;
}
+
+
$data = [
'customer_mail' => $customer_mail,
'id' => $id,
+ 'back' => URL::previous(),
];
return view('customer.mail.detail', $data);
@@ -61,6 +69,56 @@ class CustomerMailController extends Controller
return redirect(route('lead_detail', [$lead->id]));*/
}
+
+ /* public function loadModal(){
+ $data = Request::all();
+ $ret = "";
+ if(Request::ajax()){
+
+ $customers = [];
+ $query = $this->getSearchRequests();
+ $bookings = $query->orderBy('id', 'DESC')->limit(50)->get();
+ foreach ($bookings as $booking){
+ $tmp = "";
+ $tmp .= $booking->customer ? $booking->customer->email." | " : "- | ";
+ $tmp .= $booking->customer ? $booking->customer->firstname." ".$booking->customer->name." | " : "- | ";
+ $tmp .= $booking->travel_country_id ? $booking->travel_country->name." | " : "- | ";
+ $tmp .= $booking->travelagenda_id ? $booking->travel_agenda->name."" : "-";
+
+ $customers[$booking->id] = $tmp;
+ }
+
+ // return TravelAgenda::whereIn('id', $ret)->get()->pluck('name', 'id');
+
+ if($data['action'] === "send-customer-mail"){
+ $value = new Collection();
+ $value->id = "add";
+ $value->customers = $customers;
+ $value->message = "Sehr #geehrte/r# #Anrede# #Vorname# #Nachname#,\n\nText ....";
+ $data['title'] = "E-Mail-Nachricht an Auswahl";
+ $url = route('requests_send_customer_mail');
+ $ret = view("customer.mail.modal-mail", compact('data','value', 'url') )->render();
+ }
+
+ }
+ return response()->json(['response' => $data, 'html'=>$ret]);
+ }*/
+
+
+ public function sendMail(CustomerMailRepository $customerMailRepository){
+ $data = Request::all();
+ $customerMailRepository->sendAndStore($data);
+ \Session()->flash('alert-success', "Mails gesendet!");
+ return back();
+ }
+
+ public function replyMail(CustomerMailRepository $customerMailRepository){
+ $data = Request::all();
+ $customerMailRepository->replyStore($data);
+ \Session()->flash('alert-success', "Mail gespeichert!");
+ return back();
+ }
+
public function getCustomerMails()
{
$query = CustomerMail::with('booking')->with('customer');
@@ -109,6 +167,25 @@ class CustomerMailController extends Controller
->rawColumns(['action_edit', 'send', 'customer_id', 'booking_id', 'id'])
->make(true);
}
+
+
+ public function uploadAttachment($id){
+
+ $fileRepo = new FileRepository(new CustomerFile());
+ if($id === 'tmp'){
+ $fileRepo->_set('disk', 'customer');
+ $fileRepo->_set('dir', '/attachment/'.date('Y/m').'/');
+ $fileRepo->_set('customer_id', NULL);
+ $fileRepo->_set('customer_mail_id', NULL);
+ $fileRepo->_set('identifier', 'tmp');
+ return $fileRepo->uploadFile(Request::all());
+ }
+
+ return Response::json([
+ 'error' => true,
+ 'code' => 200
+ ], 200);
+ }
}
diff --git a/app/Http/Controllers/RequestController.php b/app/Http/Controllers/RequestController.php
index 0619b5f..da0bc9a 100755
--- a/app/Http/Controllers/RequestController.php
+++ b/app/Http/Controllers/RequestController.php
@@ -3,11 +3,11 @@
namespace App\Http\Controllers;
use App\Models\Booking;
+use App\Models\Status;
use App\Models\Sym\TravelCountry;
use App\Models\TravelAgenda;
use App\Repositories\CustomerMailRepository;
use Carbon\Carbon;
-use Illuminate\Database\Eloquent\Collection;
use Request;
use DataTables;
@@ -23,22 +23,36 @@ class RequestController extends Controller
public function index($step = false)
{
- $d = Booking::join('travel_country', 'travel_country_id', '=', 'travel_country.id')->get()->pluck('name', 'travel_country_id')->unique()->toArray();
+ $travel_countries = Booking::join('travel_country', 'travel_country_id', '=', 'travel_country.id')->get()->pluck('name', 'travel_country_id')->unique()->toArray();
+
+ $filter_lead_status = Status::get()->pluck('name', 'id')->toArray();
+
+ $filter_paying_out = Booking::$paying_out_types;
+ $filter_paying_out_status = Booking::$paying_out_status_types;
+ $filter_refund = Booking::$refund_types;
+ $filter_xx_tkt = Booking::$xx_tkt_types;
+
+ unset($filter_paying_out[0]);
+ unset($filter_refund[0]);
+ unset($filter_xx_tkt[0]);
$data = [
'step' => $step,
- 'travel_countries' => $d,
+ 'travel_countries' => $travel_countries,
+ 'filter_lead_status' => $filter_lead_status,
+ 'filter_paying_out' => $filter_paying_out,
+ 'filter_paying_out_status' => $filter_paying_out_status,
+ 'filter_refund' => $filter_refund,
+ 'filter_xx_tkt' => $filter_xx_tkt,
];
return view('request.index', $data);
}
public function detail($id)
{
-
- $d = Booking::join('travel_country', 'travel_country_id', '=', 'travel_country.id')->get()->pluck('name', 'travel_country_id')->unique()->toArray();
-
+ $travel_countries = Booking::join('travel_country', 'travel_country_id', '=', 'travel_country.id')->get()->pluck('name', 'travel_country_id')->unique()->toArray();
$data = [
- 'travel_countries' => $d,
+ 'travel_countries' => $travel_countries,
];
return view('request.index', $data);
}
@@ -59,7 +73,7 @@ class RequestController extends Controller
*/
private function getSearchRequests(){
- $query = Booking::where('lead_id', '!=', NULL);
+ $query = Booking::with('lead')->where('lead_id', '!=', NULL);
if(Request::get('full_firstname_search') != ""){
$query->where('participant_firstname', 'LIKE', '%'.Request::get('full_firstname_search').'%');
@@ -69,18 +83,34 @@ class RequestController extends Controller
$query->where('participant_name', 'LIKE', '%'.Request::get('full_lastname_search').'%');
}
-
if(Request::get('travel_option_country_id') != ""){
$country_ids = TravelCountry::where('contact_lands', 'LIKE', '%"'.Request::get('travel_option_country_id').'"%')->get()->pluck('id');
$country_ids[] = Request::get('travel_option_country_id');
$query->whereIn('travel_country_id', $country_ids);
-
}
if(Request::get('travel_option_agenda_id') != ""){
$query->where('travelagenda_id', '=', Request::get('travel_option_agenda_id'));
-
}
+ if(Request::get('travel_option_lead_status_id') != ""){
+ $query->whereHas('lead', function ($q) {
+ $q->where('status_id', '=', Request::get('travel_option_lead_status_id'));
+ });
+ }
+ if(Request::get('travel_option_paying_out') != ""){
+ $query->where('paying_out', '=', Request::get('travel_option_paying_out'));
+ }
+ if(Request::get('travel_option_paying_out_status') != ""){
+ $query->where('paying_out_status', '=', Request::get('travel_option_paying_out_status'));
+ }
+ if(Request::get('travel_option_refund') != ""){
+ $query->where('refund', '=', Request::get('travel_option_refund'));
+ }
+ if(Request::get('travel_option_xx_tkt') != ""){
+ $query->where('xx_tkt', '=', Request::get('travel_option_xx_tkt'));
+ }
+
+
// $query->where('end_date', '<=', $now);
if(Request::get('travel_option_search')){
$now = Carbon::now();
@@ -172,7 +202,6 @@ class RequestController extends Controller
$query->where('travel_documents', '=', Request::get('sort_travel_documents'));
}
-
if(Request::get('full_lead_id_search') != ""){
$query->where('lead_id', 'LIKE', '%'.Request::get('full_lead_id_search'). '%');
}
@@ -194,8 +223,7 @@ class RequestController extends Controller
$data = Request::all();
$ret = "";
if(Request::ajax()){
-
- $customers = [];
+ $data['customers'] = [];
$query = $this->getSearchRequests();
$bookings = $query->orderBy('id', 'DESC')->limit(50)->get();
foreach ($bookings as $booking){
@@ -204,41 +232,19 @@ class RequestController extends Controller
$tmp .= $booking->customer ? $booking->customer->firstname." ".$booking->customer->name." | " : "- | ";
$tmp .= $booking->travel_country_id ? $booking->travel_country->name." | " : "- | ";
$tmp .= $booking->travelagenda_id ? $booking->travel_agenda->name."" : "-";
-
- $customers[$booking->id] = $tmp;
+ $data['customers'][$booking->id] = $tmp;
}
-
- // return TravelAgenda::whereIn('id', $ret)->get()->pluck('name', 'id');
-
- if($data['action'] === "send-customer-mail"){
- $value = new Collection();
- $value->id = "add";
- $value->customers = $customers;
- $value->message = "Sehr #geehrte/r# #Anrede# #Vorname# #Nachname#,\n\nText ....";
- $data['title'] = "E-Mail-Nachricht an Auswahl";
- $url = route('requests_send_customer_mail');
- $ret = view("request.modal-mail", compact('data','value', 'url') )->render();
- }
-
+ $ret = CustomerMailRepository::loadModal($data);
}
return response()->json(['response' => $data, 'html'=>$ret]);
}
- public function sendCustomerMail(CustomerMailRepository $customerMailRepository){
- $data = Request::all();
-
- $customerMailRepository->sendAndStore($data);
- \Session()->flash('alert-success', "Mails gesendet!");
-
- return back();
- }
-
public function getRequests()
{
$query = $this->getSearchRequests();
- return \DataTables::eloquent($query)
+ return DataTables::eloquent($query)
->addColumn('action_lead_edit', function (Booking $booking) {
return ' ';
})
@@ -276,7 +282,56 @@ class RequestController extends Controller
return ''.($booking->sf_guard_user_id? $booking->sf_guard_user->first_name." ".$booking->sf_guard_user->last_name : "-").' ';
})
->addColumn('lead.status_id', function (Booking $booking) {
- return ''.($booking->lead->status_id ? $booking->lead->status->name : "-").' ';
+ //umbuchen
+ if($booking->lead->status_id){
+ $color = $booking->lead->status->color;
+ $icon = "";
+ if($booking->lead->status_id == 14 && $booking->lead->is_rebook){
+ $color = '#94ae59';
+ $icon = ' ';
+ }
+ if($booking->lead->status_id == 14 && !$booking->lead->is_rebook){
+ $icon = ' ';
+ }
+ return ''.$icon.$booking->lead->status->name.' ';
+
+ }
+ return '- ';
+ })
+ ->addColumn('last_customer_email', function (Booking $booking) {
+ //umbuchen
+ if($booking->customer_mails->count()){
+
+ $customer_mail = $booking->customer_mails_sent_at->last();
+
+ return ''.$customer_mail->sent_at.' ';
+
+ }
+ return '- ';
+ })
+
+ ->addColumn('paying_out', function (Booking $booking) {
+ $icon = "";
+ $badge = $booking->getPayingOutColor();
+ if($booking->paying_out_status == 1){ //offen
+ $icon = ' ';
+ }
+ if($booking->paying_out_status == 2){ //erledigt
+ $badge = 'success';
+ $icon = ' ';
+ }
+ return ''.$icon.$booking->getPayingOutType().' ';
+ })
+ ->addColumn('paying_out_status', function (Booking $booking) {
+ return ''.$booking->getPayingOutStatusType().' ';
+ })
+
+
+ ->addColumn('refund', function (Booking $booking) {
+ return ''.$booking->getRefundTypeList().' ';
+ })
+ ->addColumn('xx_tkt', function (Booking $booking) {
+ return ''.$booking->getXxTktTypeList().' ';
})
/* ->filterColumn('travel_country_id', function($query, $keyword) {
@@ -301,8 +356,12 @@ class RequestController extends Controller
->orderColumn('sf_guard_user_id', 'sf_guard_user_id $1')
->orderColumn('start_date', 'start_date $1')
->orderColumn('end_date', 'end_date $1')
+ ->orderColumn('paying_out', 'paying_out $1')
+ ->orderColumn('paying_out_status', 'paying_out_status $1')
+ ->orderColumn('refund', 'refund_date $1')
+ ->orderColumn('xx_tkt', 'xx_tkt_date $1')
->orderColumn('travel_documents', 'travel_documents $1')
- ->rawColumns(['action_lead_edit', 'lead_id', 'participant_firstname', 'participant_name', 'action_booking_edit', 'travel_country_id', 'travelagenda_id', 'sf_guard_user_id', 'lead.status_id', 'id', 'travel_documents'])
+ ->rawColumns(['action_lead_edit', 'lead_id', 'participant_firstname', 'participant_name', 'action_booking_edit', 'travel_country_id', 'travelagenda_id', 'sf_guard_user_id', 'lead.status_id', 'last_customer_email', 'id', 'travel_documents', 'paying_out', 'paying_out_status', 'refund', 'xx_tkt'])
->make(true);
}
}
diff --git a/app/Http/Controllers/Settings/BookingStatusController.php b/app/Http/Controllers/Settings/BookingStatusController.php
new file mode 100755
index 0000000..12bb0ab
--- /dev/null
+++ b/app/Http/Controllers/Settings/BookingStatusController.php
@@ -0,0 +1,60 @@
+middleware('admin');
+ }
+
+ public function index($step = false)
+ {
+ $data = [
+ 'status' => Status::all(),
+ ];
+ return view('settings.status.index', $data);
+ }
+
+
+ public function update(){
+
+ $data = Request::all();
+ if($data['id'] === "new"){
+ $model = Status::create([
+ 'name' => $data['name'],
+ 'color' => $data['color'],
+ 'handling_days' => $data['handling_days'],
+ ]);
+ }else{
+ $model = Status::find($data['id']);
+ $model->name = $data['name'];
+ $model->color = $data['color'];
+ $model->handling_days = $data['handling_days'];
+ $model->save();
+ }
+
+ \Session()->flash('alert-save', '1');
+ return redirect(route('admin_settings_booking_status'));
+ }
+
+ public function delete($id){
+
+ $model = Status::findOrFail($id);
+ $model->delete();
+ \Session()->flash('alert-success', 'Eintrag gelöscht');
+ return redirect()->back();
+
+ }
+
+}
+
+
diff --git a/app/Http/Controllers/Settings/TravelAgendaController.php b/app/Http/Controllers/Settings/TravelAgendaController.php
index 59e88f4..da6a361 100755
--- a/app/Http/Controllers/Settings/TravelAgendaController.php
+++ b/app/Http/Controllers/Settings/TravelAgendaController.php
@@ -28,7 +28,7 @@ class TravelAgendaController extends Controller
public function update(){
$data = Request::all();
- if($data['id'] == "new"){
+ if($data['id'] === "new"){
$model = TravelAgenda::create([
'name' => $data['name'],
'active' => isset($data['active']) ? true : false,
diff --git a/app/Mail/MailSendInfo.php b/app/Mail/MailSendInfo.php
index 55c89bd..df69e2a 100644
--- a/app/Mail/MailSendInfo.php
+++ b/app/Mail/MailSendInfo.php
@@ -12,23 +12,39 @@ class MailSendInfo extends Mailable
{
use Queueable, SerializesModels;
- protected $travel_user_booking_fewo;
public $subject;
protected $content;
+ public $files;
- public function __construct($subject, $content)
+ public function __construct($subject, $content, $files = [])
{
$this->subject = $subject;
$this->content = $content;
+ $this->files = $files;
}
public function build()
{
- return $this->view('emails.content')->with([
+
+
+ $message = $this->view('emails.content')->with([
'content' => $this->content,
'greetings' => __('Best regards'),
]);
+
+ /* foreach ($this->files as $file) {
+ $message->attach($file->getPath(),[
+ 'as' => $file->original_name,
+ 'mime' => $file->mine,
+ ]); // attach each file
+ }*/
+
+ foreach ($this->files as $file) {
+ $message->attach((string) $file->getPath()); // attach each file
+ }
+
+ return $message;
}
}
\ No newline at end of file
diff --git a/app/Models/Booking.php b/app/Models/Booking.php
index 176f35f..3a2146e 100644
--- a/app/Models/Booking.php
+++ b/app/Models/Booking.php
@@ -142,15 +142,20 @@ class Booking extends Model
'price_total' => 'float',
'deposit_total' => 'float',
'final_payment' => 'float',
- 'travelagenda_id' => 'int'
- ];
+ 'travelagenda_id' => 'int',
+ 'paying_out' => 'int',
+ 'refund' => 'int',
+ 'xx_tkt' => 'int',
+
+ ];
protected $dates = [
'booking_date',
'start_date',
'end_date',
'participant_birthdate',
- 'final_payment_date'
+ 'final_payment_date',
+ 'refund_date'
];
protected $fillable = [
@@ -184,9 +189,69 @@ class Booking extends Model
'deposit_total',
'final_payment',
'final_payment_date',
- 'travelagenda_id'
+ 'travelagenda_id',
+ 'paying_out',
+ 'paying_out_status',
+ 'refund',
+ 'refund_date',
+ 'xx_tkt',
+ 'xx_tkt_date',
];
+ public static $paying_out_types = [
+ 0 => '-',
+ 1 => 'Gutschein',
+ 2 => 'Auszahlung',
+ 3 => 'Umbuchung',
+ 4 => 'AZ + GS',
+ 5 => 'AZ o. FP',
+ ];
+
+ public static $refund_types = [
+ 0 => '-',
+ 1 => 'eingereicht',
+ 2 => 'erledigt',
+ ];
+
+ public static $xx_tkt_types = [
+ 0 => '-',
+ 1 => 'offen',
+ 2 => 'erledigt',
+ ];
+
+ public static $paying_out_status_types = [
+ 0 => '-',
+ 1 => 'offen',
+ 2 => 'erledigt',
+ ];
+
+
+ protected $paying_out_colors = [
+ 0 => '',
+ 1 => 'info',
+ 2 => 'dark',
+ 3 => 'warning',
+ 4 => 'warning',
+ 5 => 'warning',
+ ];
+
+ protected $refund_colors = [
+ 0 => '',
+ 1 => 'warning',
+ 2 => 'success',
+ ];
+
+ protected $xx_tkt_colors = [
+ 0 => '',
+ 1 => 'danger',
+ 2 => 'success',
+ ];
+
+ protected $paying_out_status_colors = [
+ 0 => '',
+ 1 => 'danger',
+ 2 => 'success',
+ ];
/*public function branch()
{
return $this->belongsTo(Branch::class);
@@ -297,6 +362,17 @@ class Booking extends Model
{
return $this->hasMany(ServiceProviderEntry::class);
}
+
+
+ public function customer_mails()
+ {
+ return $this->hasMany(CustomerMail::class, 'booking_id', 'id');
+ }
+
+ public function customer_mails_sent_at()
+ {
+ return $this->hasMany(CustomerMail::class, 'booking_id')->orderBy('sent_at', 'ASC');
+ }
/*
public function travel_insurances()
{
@@ -437,4 +513,57 @@ class Booking extends Model
return $this->ev_number;
}
+ public function getPayingOutType(){
+ return isset(self::$paying_out_types[$this->paying_out]) ? self::$paying_out_types[$this->paying_out] : '-';
+ }
+
+ public function getPayingOutStatusType(){
+ return isset(self::$paying_out_status_types[$this->paying_out_status]) ? self::$paying_out_status_types[$this->paying_out_status] : '-';
+ }
+
+ public function getRefundType(){
+ return isset(self::$refund_types[$this->refund]) ? self::$refund_types[$this->refund] : '-';
+ }
+
+ public function getXxTktType(){
+ return isset(self::$xx_tkt_types[$this->xx_tkt]) ? self::$xx_tkt_types[$this->xx_tkt] : '-';
+ }
+
+ public function getXxTktTypeList(){
+ if(isset(self::$xx_tkt_types[$this->xx_tkt])){
+ if($this->xx_tkt == 1 && $this->xx_tkt_date){
+ return Carbon::parse($this->xx_tkt_date)->format('d.m.Y');
+ }
+ return self::$xx_tkt_types[$this->xx_tkt];
+ }
+ return "-";
+ }
+
+ public function getRefundTypeList(){
+ if(isset(self::$refund_types[$this->refund])){
+ if($this->refund == 1 && $this->refund_date){
+ return Carbon::parse($this->refund_date)->format('d.m.Y');
+ }
+ return self::$refund_types[$this->refund];
+ }
+ return "-";
+ }
+
+ public function getPayingOutColor(){
+ return isset($this->paying_out_colors[$this->paying_out]) ? $this->paying_out_colors[$this->paying_out] : '';
+ }
+
+ public function getPayingOutStatusColor(){
+ return isset($this->paying_out_status_colors[$this->paying_out_status]) ? $this->paying_out_status_colors[$this->paying_out_status] : '';
+ }
+
+ public function getRefundColor(){
+ return isset($this->refund_colors[$this->refund]) ? $this->refund_colors[$this->refund] : '-';
+ }
+
+ public function getXxTktColor(){
+ return isset($this->xx_tkt_colors[$this->xx_tkt]) ? $this->xx_tkt_colors[$this->xx_tkt] : '-';
+ }
+
+
}
diff --git a/app/Models/Coupon.php b/app/Models/Coupon.php
index 873bd76..39a3c4b 100644
--- a/app/Models/Coupon.php
+++ b/app/Models/Coupon.php
@@ -72,7 +72,8 @@ class Coupon extends Model
'issue_date',
'valid_date',
'is_redeemed',
- 'redeem_date'
+ 'redeem_date',
+ 'text'
];
public function booking()
diff --git a/app/Models/CustomerFile.php b/app/Models/CustomerFile.php
new file mode 100644
index 0000000..a25250a
--- /dev/null
+++ b/app/Models/CustomerFile.php
@@ -0,0 +1,106 @@
+ 'int',
+ 'customer_mail_id' => 'int',
+ 'size' => 'int'
+ ];
+
+ public static $icon_ext = [
+ 'default' => 'fa fa-file',
+ 'pdf'=> 'fa fa-file-pdf',
+ 'jpg'=> 'fa fa-file-image',
+ 'png'=> 'fa fa-file-image',
+
+ ];
+ protected $fillable = [
+ 'customer_id',
+ 'customer_mail_id',
+ 'identifier',
+ 'filename',
+ 'dir',
+ 'original_name',
+ 'ext',
+ 'mine',
+ 'size'
+ ];
+
+ public function customer()
+ {
+ return $this->belongsTo(Customer::class);
+ }
+
+ public function customer_mail()
+ {
+ return $this->belongsTo(CustomerMail::class);
+ }
+
+ public function user()
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ public function getIconExt(){
+ return isset(self::$icon_ext[$this->ext]) ? self::$icon_ext[$this->ext] : self::$icon_ext['default'];
+ }
+
+ public function getURL(){
+ return route('storage_file', [$this->id, 'customer']);
+ }
+
+ public function getPath(){
+ return \Storage::disk('customer')->path($this->dir."/".$this->filename);
+
+ }
+
+ public function formatBytes($precision = 2)
+ {
+ $size = $this->size;
+
+ if ($size > 0) {
+ $size = (int) $size;
+ $base = log($size) / log(1024);
+ $suffixes = array(' bytes', ' KB', ' MB', ' GB', ' TB');
+
+ return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
+ } else {
+ return $size;
+ }
+ }
+}
diff --git a/app/Models/CustomerMail.php b/app/Models/CustomerMail.php
index b081be0..6f21598 100644
--- a/app/Models/CustomerMail.php
+++ b/app/Models/CustomerMail.php
@@ -7,15 +7,19 @@
namespace App\Models;
use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Collection;
use Reliese\Database\Eloquent\Model;
/**
* Class CustomerMail
- *
+ *
* @property int $id
* @property int $booking_id
* @property int $customer_id
* @property int $lead_id
+ * @property bool $is_answer
+ * @property int $reply_id
+ * @property string $email
* @property string $subject
* @property string $message
* @property bool $send
@@ -26,28 +30,15 @@ use Reliese\Database\Eloquent\Model;
* @property Carbon $delivered_at
* @property Carbon $created_at
* @property Carbon $updated_at
+ *
* @property Booking $booking
* @property Customer $customer
+ * @property CustomerMail $customer_mail
* @property Lead $lead
+ * @property Collection|CustomerFile[] $customer_files
+ * @property Collection|CustomerMail[] $customer_mails
+ *
* @package App\Models
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail newModelQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail newQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail query()
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereBookingId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereCreatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereCustomerId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereDeliveredAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereError($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereFail($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereLeadId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereMessage($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereScheduledAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereSend($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereSentAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereSubject($value)
- * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\CustomerMail whereUpdatedAt($value)
- * @mixin \Eloquent
*/
class CustomerMail extends Model
{
@@ -57,6 +48,8 @@ class CustomerMail extends Model
'booking_id' => 'int',
'customer_id' => 'int',
'lead_id' => 'int',
+ 'is_answer' => 'bool',
+ 'reply_id' => 'int',
'send' => 'bool',
'fail' => 'bool'
];
@@ -71,7 +64,9 @@ class CustomerMail extends Model
'booking_id',
'customer_id',
'lead_id',
- 'email',
+ 'is_answer',
+ 'reply_id',
+ 'email',
'subject',
'message',
'send',
@@ -92,11 +87,27 @@ class CustomerMail extends Model
return $this->belongsTo(Customer::class);
}
+ public function customer_mail()
+ {
+ return $this->belongsTo(CustomerMail::class, 'reply_id');
+ }
+
public function lead()
{
return $this->belongsTo(Lead::class);
}
+ public function customer_files()
+ {
+ return $this->hasMany(CustomerFile::class);
+ }
+
+ public function customer_mails()
+ {
+ return $this->hasMany(CustomerMail::class, 'reply_id');
+ }
+
+
public function getSentAtAttribute(){
if(!$this->attributes['sent_at']){ return ""; }
return Carbon::parse($this->attributes['sent_at'])->format(\Util::formatDateTimeDB());
diff --git a/app/Models/Lead.php b/app/Models/Lead.php
index f91f98c..98592c2 100644
--- a/app/Models/Lead.php
+++ b/app/Models/Lead.php
@@ -105,7 +105,8 @@ class Lead extends Model
'travelagenda_id' => 'int',
'sf_guard_user_id' => 'int',
'is_closed' => 'bool',
- 'initialcontacttype_id' => 'int',
+ 'is_rebook' => 'bool',
+ 'initialcontacttype_id' => 'int',
'searchengine_id' => 'int',
'status_id' => 'int',
'website_id' => 'int',
@@ -134,6 +135,7 @@ class Lead extends Model
'remarks',
'sf_guard_user_id',
'is_closed',
+ 'is_rebook',
'initialcontacttype_id',
'searchengine_id',
'searchengine_keywords',
diff --git a/app/Models/Status.php b/app/Models/Status.php
index 9900caa..6f5b36a 100644
--- a/app/Models/Status.php
+++ b/app/Models/Status.php
@@ -1,25 +1,26 @@
belongsTo('App\Models\Status', 'status_id', 'id');
- }
+ public $timestamps = false;
+
+ protected $casts = [
+ 'handling_days' => 'int'
+ ];
+
+ protected $fillable = [
+ 'name',
+ 'handling_days',
+ 'color'
+ ];
+
+ public function leads()
+ {
+ return $this->hasMany(Lead::class);
+ }
+
+ /*public function status_histories()
+ {
+ return $this->hasMany(StatusHistory::class);
+ }*/
}
diff --git a/app/Repositories/CustomerMailRepository.php b/app/Repositories/CustomerMailRepository.php
index 2d6849c..529e8a0 100644
--- a/app/Repositories/CustomerMailRepository.php
+++ b/app/Repositories/CustomerMailRepository.php
@@ -6,7 +6,9 @@ namespace App\Repositories;
use App\Mail\MailSendFeWoService;
use App\Mail\MailSendInfo;
use App\Models\Booking;
+use App\Models\CustomerFile;
use App\Models\CustomerMail;
+use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Mail;
@@ -25,36 +27,80 @@ class CustomerMailRepository extends BaseRepository {
public function sendAndStore($data){
if(isset($data['send_mail_to']) && is_array($data['send_mail_to'])) {
+ //has Attachments
+ $customer_files = [];
+ if(isset($data['message_attachment_id']) && is_array($data['message_attachment_id'])){
+ foreach ($data['message_attachment_id'] as $message_attachment_id){
+ if($CustomerFile = CustomerFile::find($message_attachment_id)){
+ $customer_files[] = $CustomerFile;
+ }
+ }
+ }
+
foreach ($data['send_mail_to'] as $booking_id => $on) {
$booking = Booking::find($booking_id);
if ($booking->customer) {
$message = $this->prepareContent($booking, $data['message']);
$subject = $this->prepareContent($booking, $data['subject']);
- $customer_mail = $this->store($booking, $subject, $message);
- $this->sendMail($customer_mail);
+ $reply_id = isset($data['customer_mail_id']) ? $data['customer_mail_id'] : NULL;
+ $customer_mail = $this->store($booking, $subject, $message, $booking->customer->email, false, $reply_id);
+ $this->sendMail($customer_mail, $customer_files);
+ foreach ($customer_files as $file) {
+ $file->customer_id = $booking->customer_id;
+ $file->customer_mail_id = $customer_mail->id;
+ $file->save();
+ }
}
}
}
}
- public function store($booking, $subject, $message){
+ public function replyStore($data){
+ if(isset($data['booking_id']) && $booking = Booking::find($data['booking_id'])) {
+ //has Attachments
+ $customer_files = [];
+ if(isset($data['message_attachment_id']) && is_array($data['message_attachment_id'])){
+ foreach ($data['message_attachment_id'] as $message_attachment_id){
+ if($CustomerFile = CustomerFile::find($message_attachment_id)){
+ $customer_files[] = $CustomerFile;
+ }
+ }
+ }
+ if ($booking->customer) {
+ $mail_from = isset($data['mail_from']) ? $data['mail_from'] : $booking->customer->email;
+ $sent_at = isset($data['sent_at']) ? \Carbon::parse(str_replace("- ", "", $data['sent_at'])) : now();
+ $reply_id = isset($data['customer_mail_id']) ? $data['customer_mail_id'] : NULL;
+ $customer_mail = $this->store($booking, $data['subject'], $data['message'], $mail_from, true, $reply_id, $sent_at);
+ foreach ($customer_files as $file) {
+ $file->customer_id = $booking->customer_id;
+ $file->customer_mail_id = $customer_mail->id;
+ $file->save();
+ }
+ }
+
+ }
+ }
+
+ public function store($booking, $subject, $message, $mail_from, $is_answer = false, $reply_id = NULL, $sent_at=false){
$customer_mail = CustomerMail::create([
'booking_id' => $booking->id,
'customer_id' => $booking->customer_id,
'lead_id' => $booking->lead_id,
- 'email' => $booking->customer->email,
+ 'is_answer' => $is_answer,
+ 'reply_id' => $reply_id,
+ 'email' => $mail_from,
'subject' => $subject,
'message' => $message,
-
+ 'sent_at' => $sent_at ? $sent_at : now(),
]);
return $customer_mail;
}
- private function sendMail($customer_mail){
+ private function sendMail($customer_mail, $customer_files){
try{
- Mail::to($customer_mail->email)->send(new MailSendInfo($customer_mail->subject, $customer_mail->message));
+ Mail::to($customer_mail->email)->send(new MailSendInfo($customer_mail->subject, $customer_mail->message, $customer_files));
}
catch(\Exception $e){
// Never reached
@@ -68,6 +114,9 @@ class CustomerMailRepository extends BaseRepository {
$customer_mail->save();
return true;
}
+
+
+
private function prepareContent($booking, $content){
$first_name = $booking->customer->firstname;
@@ -76,7 +125,6 @@ class CustomerMailRepository extends BaseRepository {
$program = $booking->travelagenda_id ? $booking->travel_agenda->name : "-";
$salutation = $booking->customer->salutation->name;
-
$dear = $booking->customer->salutation_id == 1 ? 'geehrter' : 'geehrte';
$search = ['#geehrte/r#', '#Anrede#', '#Vorname#', '#Nachname#', '#Reiseland#', '#Programm#'];
$replace = [$dear, $salutation, $first_name, $last_name, $country, $program, $salutation];
@@ -86,4 +134,70 @@ class CustomerMailRepository extends BaseRepository {
}
+ public static function loadModal($data)
+ {
+
+ $value = new Collection();
+ $value->title = "";
+ $value->subtitle = "";
+ $value->url = "";
+ if ($data['action'] === "new-customer-mail") {
+ if (isset($data['booking_id'])) {
+ $value->id = $data['booking_id'];
+ $value->customers = $data['customers'];
+ $value->subject = "";
+ $value->message = "Sehr #geehrte/r# #Anrede# #Vorname# #Nachname#,\n\nText ....";
+ $value->s_placeholder = "Betreff der E-Mail";
+ $value->m_placeholder = "Nachricht der E-Mail";
+
+ if(isset($data['customer_mail_id']) && $customer_mail = CustomerMail::find($data['customer_mail_id'])){
+ $value->subject = "Re: ".$customer_mail->subject;
+ $value->customer_mail = $customer_mail;
+ }
+
+ $value->title = "E-Mail- Nachricht an Kunden senden";
+ $value->subtitle = "Dem Kunden wird eine E-Mail zugesendet.";
+ if($data['id'] === 'reply-send'){
+ $value->title = "E-Mail Antwort an Kunden senden";
+ $value->subtitle = "Dem Kunden wird eine E-Mail zugesendet, die im System als Antwort gespeichert wird.";
+ }
+ $value->url = $data['url'];
+ return view("customer.mail.modal-new-mail", compact('data', 'value'))->render();
+ }
+ }
+
+ if ($data['action'] === "show-customer-mail") {
+ if (isset($data['customer_mail_id']) && $customer_mail = CustomerMail::find($data['customer_mail_id'])) {
+ $value->url = $data['url'];
+ $value->title = "E-Mail Ansicht";
+ return view("customer.mail.modal-show-mail", compact('data', 'value', 'customer_mail'))->render();
+ }
+ }
+
+ if ($data['action'] === "reply-customer-mail") {
+ if (isset($data['booking_id']) && $booking = Booking::find($data['booking_id'])) {
+ $value->id = $data['booking_id'];
+ $value->booking = $booking;
+ $value->message = "";
+ $value->subject = "";
+ $value->s_placeholder = "Betreff des Kunden";
+ $value->m_placeholder = "Nachricht des Kunden";
+ if(isset($data['customer_mail_id']) && $customer_mail = CustomerMail::find($data['customer_mail_id'])){
+ $value->subject = "Re: ".$customer_mail->subject;
+ $value->customer_mail = $customer_mail;
+ }
+ $value->title = "E-Mail Antwort speichern";
+ $value->subtitle = "Die E-Mail wird im System gespeichert.";
+ if($data['id'] === 'reply-save'){
+ $value->subtitle = "Die E-Mail wird im System als Antwort gespeichert.";
+
+ }
+ $value->url = $data['url'];
+
+ return view("customer.mail.modal-new-mail", compact('data', 'value'))->render();
+ }
+
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/Repositories/FileRepository.php b/app/Repositories/FileRepository.php
new file mode 100644
index 0000000..828bd64
--- /dev/null
+++ b/app/Repositories/FileRepository.php
@@ -0,0 +1,147 @@
+model = $model;
+
+ $this->rules = [
+ 'file' => 'required|mimes:pdf,jpeg,png|max:32768'
+ ];
+ $this->messages = [
+ 'file.mimes' => 'Datei ist kein PDF/JPG/PNG Format',
+ 'file.required' => 'PDF/JPG/PNG-Datei wird benötigt'
+ ];
+ }
+
+ public function _set($name, $value){
+ $this->{$name} = $value;
+ }
+
+ /* public function load($id){
+ $this->model = $id;
+ }
+ */
+
+
+ public function uploadFile( $form_data )
+ {
+
+ $validator = Validator::make($form_data, $this->rules, $this->messages);
+
+ if ($validator->fails()) {
+ return Response::json([
+ 'error' => true,
+ 'message' => $validator->messages()->first(),
+ 'code' => 400
+ ], 400);
+ }
+ $file = $form_data['file'];
+
+ $originalName = $file->getClientOriginalName();
+ $extension = $file->getClientOriginalExtension();
+ $mine = $file->getClientMimeType();
+ $size = $file->getClientSize();
+
+
+ $originalNameWithoutExt = substr($originalName, 0, strlen($originalName) - strlen($extension) - 1);
+ $filename = Util::sanitize($originalNameWithoutExt, true, false, true);
+ $allowed_filename = uniqid() . '_' . $filename.".".$extension;
+
+ //$dir = $this->model->getInvoiceStorageAttDir();
+
+ if(!Storage::disk($this->disk)->exists( $this->dir )){
+ Storage::disk($this->disk)->makeDirectory($this->dir); //creates directory
+ }
+ Storage::disk($this->disk)->put($this->dir.$allowed_filename, file_get_contents($file->getRealPath()));
+
+ $customer_file = CustomerFile::create([
+ 'customer_id' => $this->customer_id,
+ 'customer_mail_id' => $this->customer_mail_id,
+ 'identifier' => $this->identifier,
+ 'filename' => $allowed_filename,
+ 'dir' => $this->dir,
+ 'original_name' => $originalName,
+ 'ext' => $extension,
+ 'mine' => $mine,
+ 'size' => $size
+ ]);
+
+ return Response::json([
+ 'error' => false,
+ 'filename' => $allowed_filename,
+ 'file_id' =>$customer_file->id,
+ 'file_data' => $extension,
+ 'file_icon' => $customer_file->getIconExt(),
+ 'file_format_bytes' => $customer_file->formatBytes(),
+ 'file_url' => $customer_file->getURL(),
+ 'redirect' => '',
+ 'code' => 200
+ ], 200);
+ }
+
+ /* public function createFile(Request $request)
+ {
+ $locale = \App::getLocale();
+ $data = [
+ 'step' => 2,
+ 'locale' => $locale,
+ ];
+ $rules = array(
+ 'network_name' => 'required|max:255',
+ 'input_file_now' => 'required|mimes:png,pdf,jpg,jpeg|max:30000'
+ );
+ $validator = Validator::make(Input::all(), $rules);
+
+ if ($validator->fails()) {
+ // get the error messages from the validator
+ $messages = $validator->messages();
+ // redirect our user back to the form with the errors from the validator
+ return view('user.register_complete', $data)->withErrors($validator);
+
+ } else {
+ $user = \Auth::user();
+ if(!$user->account->network_name){
+ $file = request()->file('input_file_now');
+ //$ext = $file->guessClientExtension();
+ //$file->storeAs('user/' . $user->id .'/verification');
+ $data = $file->store('user/' . $user->id .'/verification');
+ $account = $user->account;
+ $account->network_name = Input::get('network_name');
+ $account->network_verification = basename($data);
+ $account->save();
+
+ $user->role_id = 2; //set as User by default!
+ $user->save();
+
+
+ }
+
+ return redirect('complete_register');
+ //return view('user.register_complete', $data);
+ }
+ }*/
+
+
+}
\ No newline at end of file
diff --git a/app/Services/Util.php b/app/Services/Util.php
index db1c6ea..7eaeb3b 100644
--- a/app/Services/Util.php
+++ b/app/Services/Util.php
@@ -29,6 +29,14 @@ class Util
return 'd.m.Y - H:i';
}
+ public static function _format_date($date, $to = 'date'){
+ if($to === 'datetime'){
+ return \Carbon::parse($date)->format(\Util::formatDateTimeDB());
+ }
+ //date
+ return \Carbon::parse($date)->format(\Util::formatDateDB());
+ }
+
public static function _format_number($value){
return preg_replace("/[^0-9,]/", "", $value);
diff --git a/app/helpers.php b/app/helpers.php
index 7aaa3c6..aa1d409 100644
--- a/app/helpers.php
+++ b/app/helpers.php
@@ -17,6 +17,13 @@ if (! function_exists('make_v2_url')) {
}
}
+if (! function_exists('_format_date')) {
+ function _format_date($date, $to = 'date')
+ {
+ return \App\Services\Util::_format_date($date, $to);
+ }
+}
+
if (! function_exists('array_to_json')) {
function array_to_json($value)
diff --git a/config/debugbar.php b/config/debugbar.php
index 0495fcf..ebc2536 100644
--- a/config/debugbar.php
+++ b/config/debugbar.php
@@ -66,7 +66,7 @@ return [
| Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.
*/
- 'capture_ajax' => true,
+ 'capture_ajax' => false,
'add_ajax_timing' => false,
/*
diff --git a/config/filesystems.php b/config/filesystems.php
index 13b8615..d96f81a 100755
--- a/config/filesystems.php
+++ b/config/filesystems.php
@@ -54,6 +54,12 @@ return [
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
+ 'customer' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/customer'),
+ 'url' => env('APP_URL').'/storage/customer',
+ 'visibility' => 'public',
+ ],
'fewo_invoices' => [
'driver' => 'local',
'root' => storage_path('app/fewo/invoices'),
diff --git a/config/permissions.php b/config/permissions.php
index 294de3f..8384ff1 100755
--- a/config/permissions.php
+++ b/config/permissions.php
@@ -36,6 +36,7 @@ return [
'sua-st-tp' => ['name' => 'SUPERADMIN > Einstellungen > Reisprogramme' , 'color' => 'superadmin'],
'sua-st-tc' => ['name' => 'SUPERADMIN > Einstellungen > Reiseländer' , 'color' => 'superadmin'],
'sua-st-tn' => ['name' => 'SUPERADMIN > Einstellungen > Nationalitäten' , 'color' => 'superadmin'],
+ 'sua-st-bs' => ['name' => 'SUPERADMIN > Einstellungen > Reisestatus' , 'color' => 'superadmin'],
'sua-st-ke' => ['name' => 'SUPERADMIN > Einstellungen > Keywords' , 'color' => 'superadmin'],
'sua-re' => ['name' => 'SUPERADMIN > Export' , 'color' => 'superadmin'],
'sua-re-bo' => ['name' => 'SUPERADMIN > Export > Buchungen' , 'color' => 'superadmin'],
diff --git a/database/migrations/2018_10_29_202123_create_booking_table.php b/database/migrations/2018_10_29_202123_create_booking_table.php
index b031d35..945887d 100644
--- a/database/migrations/2018_10_29_202123_create_booking_table.php
+++ b/database/migrations/2018_10_29_202123_create_booking_table.php
@@ -22,7 +22,7 @@ class CreateBookingTable extends Migration
$table->date('booking_date')->nullable();
$table->bigInteger('customer_id');
$table->bigInteger('lead_id')->nullable();
- $table->tinyInteger('new_drafts')->nullable();
+ $table->tinyInteger('new_drafts')->nullable()->default(0);
$table->integer('sf_guard_user_id');
$table->bigInteger('branch_id');
$table->decimal('service_fee', 10, 2)->nullable()->default(0.00);
@@ -30,13 +30,11 @@ class CreateBookingTable extends Migration
$table->bigInteger('travel_category_id')->nullable();
$table->bigInteger('pax')->nullable();
$table->bigInteger('coupon_id')->nullable();
- $table->dateTime('created_at');
- $table->dateTime('updated_at');
$table->string('title', 255)->nullable();
$table->date('start_date')->nullable();
$table->date('end_date')->nullable();
$table->bigInteger('website_id')->nullable();
- $table->string('travel_number', 30)->nullable();
+ $table->string('travel_number', 80)->nullable();
$table->string('participant_name', 255)->nullable();
$table->string('participant_firstname', 255)->nullable();
$table->date('participant_birthdate')->nullable();
@@ -45,12 +43,22 @@ class CreateBookingTable extends Migration
$table->string('merlin_knr', 255)->nullable();
$table->string('merlin_order_number', 255)->nullable();
$table->bigInteger('travel_company_id')->nullable();
+ $table->tinyInteger('travel_documents')->nullable()->default(0);
+ $table->decimal('canceled', 5, 2)->nullable()->default(0.00);
$table->decimal('price', 10, 2)->nullable();
+ $table->decimal('price_canceled', 10, 2)->nullable();
$table->decimal('price_total', 10, 2)->nullable();
$table->decimal('deposit_total', 10, 2)->nullable();
$table->decimal('final_payment', 10, 2)->nullable();
$table->date('final_payment_date')->nullable();
$table->bigInteger('travelagenda_id')->nullable();
+ $table->tinyInteger('paying_out')->nullable()->default(0);
+ $table->tinyInteger('paying_out_status')->nullable()->default(0);
+ $table->tinyInteger('refund')->nullable()->default(0);
+ $table->date('refund_date')->nullable();
+ $table->tinyInteger('xx_tkt')->nullable()->default(0);
+ $table->dateTime('updated_at');
+ $table->dateTime('created_at');
$table->index('lead_id', 'lead_id_idx');
$table->index('sf_guard_user_id', 'sf_guard_user_id_idx');
@@ -82,9 +90,6 @@ class CreateBookingTable extends Migration
')->onUpdate('RESTRICT');
});
-
-
-
}
/**
diff --git a/database/migrations/2018_10_29_202125_create_lead_table.php b/database/migrations/2018_10_29_202125_create_lead_table.php
index dd21170..50e6575 100644
--- a/database/migrations/2018_10_29_202125_create_lead_table.php
+++ b/database/migrations/2018_10_29_202125_create_lead_table.php
@@ -29,6 +29,7 @@ class CreateLeadTable extends Migration
$table->text('remarks')->nullable();
$table->integer('sf_guard_user_id');
$table->tinyInteger('is_closed')->nullable()->default(0);
+ $table->tinyInteger('is_rebook')->nullable()->default(0);
$table->bigInteger('initialcontacttype_id')->nullable();
$table->bigInteger('searchengine_id')->nullable();
$table->string('searchengine_keywords', 255)->nullable();
diff --git a/database/migrations/2020_01_29_152708_create_coupon_table.php b/database/migrations/2020_01_29_152708_create_coupon_table.php
index 5921a1d..fc38dc5 100644
--- a/database/migrations/2020_01_29_152708_create_coupon_table.php
+++ b/database/migrations/2020_01_29_152708_create_coupon_table.php
@@ -27,6 +27,7 @@ class CreateCouponTable extends Migration
$table->date('valid_date');
$table->tinyInteger('is_redeemed')->default(0);
$table->date('redeem_date')->nullable();
+ $table->text('text')->nullable();
$table->dateTime('created_at');
$table->dateTime('updated_at');
@@ -38,6 +39,7 @@ class CreateCouponTable extends Migration
$table->foreign('customer_id', 'coupon_customer_id_customer_id')->references('id')->on('customer')->onDelete('RESTRICT
')->onUpdate('RESTRICT');
+
});
diff --git a/database/migrations/2020_03_11_131408_create_customer_mails_table.php b/database/migrations/2020_03_11_131408_create_customer_mails_table.php
index 755375e..e522985 100644
--- a/database/migrations/2020_03_11_131408_create_customer_mails_table.php
+++ b/database/migrations/2020_03_11_131408_create_customer_mails_table.php
@@ -20,6 +20,10 @@ class CreateCustomerMailsTable extends Migration
$table->bigInteger('customer_id');
$table->bigInteger('lead_id')->nullable();
+ $table->boolean('is_answer')->default(false);
+ $table->unsignedBigInteger('reply_id');
+
+
$table->string('email', 255);
$table->string('subject', 255);
$table->text('message')->nullable();
@@ -46,6 +50,10 @@ class CreateCustomerMailsTable extends Migration
->references('id')
->on('lead');
+ $table->foreign('reply_id')
+ ->references('id')
+ ->on('customer_mails');
+
});
}
diff --git a/database/migrations/2020_03_19_152708_create_booking_storno_table.php b/database/migrations/2020_03_19_152708_create_booking_storno_table.php
new file mode 100644
index 0000000..9220074
--- /dev/null
+++ b/database/migrations/2020_03_19_152708_create_booking_storno_table.php
@@ -0,0 +1,53 @@
+bigIncrements('id');
+ $table->bigInteger('booking_id');
+ $table->decimal('total', 10, 2)->default(0.00);
+ $table->decimal('storno', 10, 2)->default(0.00);
+ $table->date('storno_date')->nullable();
+ //$table->UNKNOWN:longblob('binary_data');
+ $table->tinyInteger('done')->nullable()->default(0);
+ $table->dateTime('created_at');
+ $table->dateTime('updated_at');
+
+ $table->index('booking_id', 'booking_storno_booking_id_idx');
+
+ $table->foreign('booking_id', 'booking_storno_booking_id_booking_id')->references('id')->on('booking')->onDelete('CASCADE
+')->onUpdate('RESTRICT');
+
+
+
+ });
+
+
+
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('booking_storno');
+ }
+}
diff --git a/database/migrations/2020_03_23_151608_create_customer_files_table.php b/database/migrations/2020_03_23_151608_create_customer_files_table.php
new file mode 100644
index 0000000..e5a3853
--- /dev/null
+++ b/database/migrations/2020_03_23_151608_create_customer_files_table.php
@@ -0,0 +1,51 @@
+bigIncrements('id');
+
+ $table->bigInteger('customer_id')->nullable();
+ $table->unsignedBigInteger('customer_mail_id')->nullable();
+
+ $table->string('identifier')->index();
+ $table->string('filename');
+ $table->string('dir');
+ $table->string('original_name');
+ $table->string('ext');
+ $table->string('mine');
+ $table->unsignedInteger('size');
+ $table->timestamps();
+
+ $table->foreign('customer_id')
+ ->references('id')
+ ->on('customer');
+
+ $table->foreign('customer_mail_id')
+ ->references('id')
+ ->on('customer_mails');
+
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('customer_files');
+ }
+}
diff --git a/public/css/application.css b/public/css/application.css
index e61effd..cad3583 100644
--- a/public/css/application.css
+++ b/public/css/application.css
@@ -696,3 +696,15 @@ figcaption {
left: auto
}
}
+
+.badge-dark {
+ background-color: rgba(200, 21, 176, 0.9);
+ color: #fff;
+}
+
+.default-style .datepicker-dropdown {
+ z-index: 2080 !important;
+}
+.default-style .dtp {
+ z-index: 2080;
+}
diff --git a/public/js/custom.js b/public/js/custom.js
index c3cec68..da0e86e 100644
--- a/public/js/custom.js
+++ b/public/js/custom.js
@@ -107,17 +107,29 @@ $(function() {
});
$(function () {
+
+ $('#modals-load-content').on('show.bs.modal', function (event) {
+ var button = $(event.relatedTarget);
+ if (!button.data('id')) {
+ return;
+ }
+ var data = {};
+ $.each(button.data(), function(index, value){
+ data[index] = value;
+ });
+ console.log(data);
+ loadModalInner(this, data);
+
+ });
+
function initModalInner() {
$('[data-toggle="reloadModal"]').off().on('click', function(event) {
event.preventDefault();
button = $(this);
var data = {};
- data.id = button.data('id');
- data.model = button.data('model');
- data.action = button.data('action');
- data.request = button.data('request');
- data.route = button.data('route');
- data.target = button.data('target');
+ $.each(button.data(), function(index, value){
+ data[index] = value;
+ });
console.log(data);
loadModalInner(this, data);
});
@@ -141,7 +153,7 @@ $(function () {
success: function(data) {
console.log(data);
$(data.response.target).find('.modal-dialog').html(data.html);
- $('.selectpicker').selectpicker('refresh');
+ $(data.response.target + '.selectpicker').selectpicker('refresh');
initModalInner();
},
error: function(xhr, status, errorThrown) {
@@ -156,24 +168,6 @@ $(function () {
-
-
- $('#modals-load-content').on('show.bs.modal', function (event) {
- var button = $(event.relatedTarget);
- if (!button.data('id')) {
- return;
- }
- var data = {};
- data.id = button.data('id');
- data.model = button.data('model');
- data.action = button.data('action');
- data.request = button.data('request');
- data.route = button.data('route');
- data.target = button.data('target');
- console.log(data);
- loadModalInner(this, data);
-
- });
});
function update_modal_data_show(e, $ele) {
diff --git a/resources/views/booking/detail.blade.php b/resources/views/booking/detail.blade.php
index 131361b..c939a61 100755
--- a/resources/views/booking/detail.blade.php
+++ b/resources/views/booking/detail.blade.php
@@ -3,14 +3,14 @@
@section('content')
-
+
Buchung verwalten
+ {{--
+
+
+--}}
+
+
+
+
{!! Form::open(['url' => route('booking_detail', [$id]), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
-
-
-
-
- {{ __('MyJack Nr.') }}*
- {{ Form::text('merlin_order_number', $booking->merlin_order_number, array('placeholder'=>__('MyJack Nr.'), 'class'=>'form-control', 'id'=>'merlin_order_number')) }}
-
-
-
- {{ __('Nr.') }}*
- {{ Form::text('id', $booking->id, array('placeholder'=>__('Nr.'), 'class'=>'form-control', 'id'=>'booking_id', 'readonly')) }}
-
-
-
-
+
Filter Reiseland
Filter aus
@@ -68,12 +68,59 @@
@endforeach
-
+
Filter Programm
Filter aus
+
+ Filter Status
+
+ Filter aus
+ @foreach($filter_lead_status as $id=>$name)
+ {{$name}}
+ @endforeach
+
+
+
+
@@ -122,9 +169,16 @@
{{--
{{__('Kategorie')}} --}}
{{__('Anreise')}}
{{__('Abreise')}}
-
{{__('Reiseunterlage')}}
+
{{__('U.')}}
{{__('Sachbearbeiter')}}
{{__('Status')}}
+
{{__('E-Mail')}}
+
{{__('K-Wunsch')}}
+
{{__('KW-Status')}}
+
{{__('Refund')}}
+
{{__('XX TKT')}}
+
+
@@ -133,10 +187,13 @@
- E-Mail-Nachricht an Auswahl (max. 50)
@@ -169,6 +226,11 @@
d.travel_option_search = $('select[name=travel_option_search]').val();
d.travel_option_country_id = $('select[name=travel_option_country_id]').val();
d.travel_option_agenda_id = $('select[name=travel_option_agenda_id]').val();
+ d.travel_option_lead_status_id = $('select[name=travel_option_lead_status_id]').val();
+ d.travel_option_paying_out = $('select[name=travel_option_paying_out]').val();
+ d.travel_option_paying_out_status = $('select[name=travel_option_paying_out_status]').val();
+ d.travel_option_refund = $('select[name=travel_option_refund]').val();
+ d.travel_option_xx_tkt = $('select[name=travel_option_xx_tkt]').val();
}
},
"columns": [
@@ -184,7 +246,12 @@
{ data: 'end_date', name: 'end_date' },
{ data: 'travel_documents', name: 'travel_documents', orderable: false },
{ data: 'sf_guard_user_id', name: 'sf_guard_user_id', orderable: false },
- { data: 'lead.status_id', name: 'lead.status_id', orderable: false },
+ { data: 'lead.status_id', name: 'lead.status_id', orderable: false },
+ { data: 'last_customer_email', name: 'last_customer_email', orderable: true },
+ { data: 'paying_out', name: 'paying_out' },
+ { data: 'paying_out_status', name: 'paying_out_status' },
+ { data: 'refund', name: 'refund' },
+ { data: 'xx_tkt', name: 'xx_tkt' },
],
"bLengthChange": false,
"iDisplayLength": 50,
@@ -194,7 +261,7 @@
"url": "/js/German.json"
},
initComplete: function () {
- this.api().columns(8).every( function () {
+ /*this.api().columns(10).every( function () {
var column = this;
var title = $(column.header()).html();
var select = $('
'+title+' ')
@@ -211,8 +278,26 @@
}
}
} );
+ } );*/
+ this.api().columns(11).every( function () {
+ var column = this;
+ var title = $(column.header()).html();
+ var select = $('
'+title+' ')
+ .appendTo( $(column.header()).empty() )
+ .on( 'change', function () {
+ $('input[name=sort_sf_guard_user_id]').val($(this).val());
+ table.order( [ 5, 'desc' ] ).draw();
+ } );
+ column.data().unique().sort().each( function ( d, j ) {
+ if(d !== ""){
+ var text = $(d+' span').text();
+ if(text !== "" && text !== "-"){
+ select.append( '
'+ $(d+' span').text()+' ' );
+ }
+ }
+ } );
} );
- this.api().columns(9).every( function () {
+ /* this.api().columns(12).every( function () {
var column = this;
var title = $(column.header()).html();
var select = $('
'+title+' ')
@@ -230,6 +315,7 @@
}
} );
} );
+ */
$('.selectpicker').selectpicker();
},
drawCallback: function () {
@@ -287,15 +373,31 @@
$(this).removeClass('active');
}
clearTravelOptionAgenda();
- table.order( [ 3, 'desc' ] ).draw();
+ table.order( [ 5, 'desc' ] ).draw();
});
$('#travel_option_country_id').on('change', function(){
clearTravelOptionAgenda();
- table.order( [ 3, 'desc' ] ).draw();
+ table.order( [ 5, 'desc' ] ).draw();
});
$('#travel_option_agenda_id').on('change', function(){
- table.order( [ 3, 'desc' ] ).draw();
+ table.order( [ 5, 'desc' ] ).draw();
});
+ $('#travel_option_lead_status_id').on('change', function(){
+ table.order( [ 5, 'desc' ] ).draw();
+ });
+ $('#travel_option_paying_out').on('change', function(){
+ table.order( [ 5, 'desc' ] ).draw();
+ });
+ $('#travel_option_paying_out_status').on('change', function(){
+ table.order( [ 5, 'desc' ] ).draw();
+ });
+ $('#travel_option_refund').on('change', function(){
+ table.order( [ 5, 'desc' ] ).draw();
+ });
+ $('#travel_option_xx_tkt').on('change', function(){
+ table.order( [ 5, 'desc' ] ).draw();
+ });
+
$('.datepicker-base').on('change', function(){
if($(this).val() != ""){
$('#travel_option_search').removeClass('active');
@@ -308,11 +410,11 @@
$('#travel_option_search').removeClass('deactive');
}
clearTravelOptionAgenda();
- table.order( [ 3, 'desc' ] ).draw();
+ table.order( [ 5, 'desc' ] ).draw();
});
$('.full_search').on('keyup', function(){
clearTravelOptionAgenda();
- table.order( [ 3, 'desc' ] ).draw();
+ table.order( [ 5, 'desc' ] ).draw();
});
function loadModalInner(self, data){
@@ -350,12 +452,10 @@
if (!button.data('id')) {
return;
}
- //var data = {};
var data = table.ajax.params();
- data.action = button.data('action');
- data.route = button.data('route');
- data.target = button.data('target');
- //console.log(data);
+ $.each(button.data(), function(index, value){
+ data[index] = value;
+ });
loadModalInner(this, data);
});
@@ -366,7 +466,4 @@
-
-
-
@endsection
\ No newline at end of file
diff --git a/resources/views/request/modal-mail.blade.php b/resources/views/request/modal-mail.blade.php
deleted file mode 100644
index 2c4e038..0000000
--- a/resources/views/request/modal-mail.blade.php
+++ /dev/null
@@ -1,40 +0,0 @@
-{!! Form::open(['url' => $url, 'class' => 'modal-content', 'onsubmit'=>'return confirm("E-Mail wirklich senden?");']) !!}
-
-
-
-
-
-
-
-
- Nachricht
- {{ Form::textarea('message', $value->message, array('class'=>'form-control', 'rows'=>15)) }}
-
-
Platzhalter: #geehrte/r# #Anrede# #Vorname# #Nachname# #Reiseland# #Programm#
-
-
-{!! Form::close() !!}
-
diff --git a/resources/views/settings/status/index.blade.php b/resources/views/settings/status/index.blade.php
new file mode 100755
index 0000000..047eaa0
--- /dev/null
+++ b/resources/views/settings/status/index.blade.php
@@ -0,0 +1,137 @@
+@extends('layouts.layout-2')
+
+@section('content')
+
+ Reisestatus
+
+
+
+
+
+
+
+
+
+ {{__('Name')}}
+ {{__('Farbe')}}
+ {{__('Bearbeitung Tage')}}
+
+
+
+
+ @foreach($status as $value)
+
+
+
+
+
+
+ {{ $value->name }}
+
+ @if($value->color)
+
+ {{ $value->color }}
+ @else
+
+ @endif
+
+ {{ $value->handling_days }}
+
+
+
+
+ @endforeach
+
+
+
+ Neuen Status anlegen
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 7966430..56e75e7 100755
--- a/routes/web.php
+++ b/routes/web.php
@@ -58,6 +58,16 @@ Route::get('/check/login/{identify}/{token}/{show?}', 'HomeController@checkLogin
Route::get('/user/update_email_confirm/{token}', 'UserUpdateEmailController@activateMail')->name('user_update_email_confirm');
+Route::get('/storage/file/{id}/{disk}', function($id = null, $disk = null)
+{
+
+ $file = \App\Models\CustomerFile::findOrFail($id);
+ $path = Storage::disk($disk)->path($file->dir.$file->filename);
+
+ if (file_exists($path)) {
+ return Response::file($path);
+ }
+})->name('storage_file');
Route::group(['middleware' => ['auth']], function()
{
@@ -142,6 +152,12 @@ Route::group(['middleware' => ['admin']], function()
Route::get('/iq/content/tree/delete/{id}/{node_id?}/{area_section_id?}', 'IQ\ContentTreeController@delete')->name('iq_content_tree_delete');
Route::get('/iq/content/tree/repair/{id}', 'IQ\ContentTreeController@repair')->name('iq_content_tree_repair');
+ Route::post('/iq/content/modal/load', 'IQ\ContentModalController@load')->name('iq_content_modal_load');
+
+ Route::post('/customer_mail//upload/attachment/{id}', 'CustomerMailController@uploadAttachment')->name('customer_mail_upload_attachment');
+ Route::post('/customer_mail/send/mail', 'CustomerMailController@sendMail')->name('customer_mail_send_mail');
+ Route::post('/customer_mail/reply/mail', 'CustomerMailController@replyMail')->name('customer_mail_reply_mail');
+
Route::group(['middleware' => ['auth.permission:cms-iq-assets']], function() {
//assets
@@ -189,7 +205,6 @@ Route::group(['middleware' => ['admin']], function()
Route::get('data/table/requests', 'RequestController@getRequests')->name('data_table_requests');
Route::post('data/ajax/requests', 'RequestController@getAjaxRequests')->name('data_ajax_requests');
Route::post('/requests/modal/load', 'RequestController@loadModal')->name('requests_modal_load');
- Route::post('/requests/send_customer_mail', 'RequestController@sendCustomerMail')->name('requests_send_customer_mail');
});
Route::group(['middleware' => ['auth.permission:crm-bo-bo']], function() {
//Buchungen > Buchungen
@@ -198,6 +213,8 @@ Route::group(['middleware' => ['admin']], function()
Route::get('/booking/detail/{id}', 'BookingController@detail')->name('booking_detail');
Route::post('/booking/detail/{id}', 'BookingController@store')->name('booking_detail');
Route::get('/booking/draft_item/delete/{id}', 'BookingController@draftItemDelete')->name('booking_draft_item_delete');
+ Route::post('/booking/modal/load', 'BookingController@loadModal')->name('booking_modal_load');
+
});
Route::group(['middleware' => ['auth.permission:crm-bo-le']], function() {
//Buchungen > Leads
@@ -222,6 +239,7 @@ Route::group(['middleware' => ['admin']], function()
Route::get('/customer_mail/detail/{id}', 'CustomerMailController@detail')->name('customer_mail_detail');
Route::post('/customer_mail/detail/{id}', 'CustomerMailController@store')->name('customer_mail_detail');
Route::get('/customer_mail/delete/{id}', 'CustomerMailController@delete')->name('customer_mail_delete');
+
});
Route::group(['middleware' => ['auth.permission:crm-cm-cf']], function() {
//Kundenverwaltung > Kunden (FeWo)
@@ -271,7 +289,7 @@ Route::group(['middleware' => ['admin']], function()
Route::get('/cms/travel_guide/content', 'CMS\CMSTravelGuideController@index')->name('cms_travel_guide_content');
Route::get('/cms/travel_guide/page', 'CMS\CMSTravelGuideController@page')->name('cms_travel_guide_page');
- Route::get('/cms/travel_guide/page/detail/{id}', 'CMS\CMSTravelGuideController@pageDetail')->name('cms_travel_guide_page_detail');
+ 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');
@@ -331,6 +349,13 @@ Route::group(['middleware' => ['superadmin']], function() {
Route::get('/admin/settings/travel/nationality/delete/{id}', 'Settings\TravelNationalityController@delete')->name('admin_settings_travel_nationality_delete');
});
+ Route::group(['middleware' => ['auth.permission:sua-st-bs']], function() {
+ //SUPERADMIN > Einstellungen > Nationalitäten
+ Route::get('/admin/settings/booking/status', 'Settings\BookingStatusController@index')->name('admin_settings_booking_status');
+ Route::post('/admin/settings/booking/status/update', 'Settings\BookingStatusController@update')->name('admin_settings_booking_status_update');
+ Route::get('/admin/settings/booking/status/delete/{id}', 'Settings\BookingStatusController@delete')->name('admin_settings_booking_status_delete');
+ });
+
Route::group(['middleware' => ['auth.permission:sua-st-ke']], function() {
//SUPERADMIN > Einstellungen > Keywords
Route::get('/admin/settings/keyword', 'Settings\KeywordController@index')->name('admin_settings_keyword');
diff --git a/storage/app/customer/attachment/2020/03/5e78e1ac59cc0_ust111.pdf b/storage/app/customer/attachment/2020/03/5e78e1ac59cc0_ust111.pdf
new file mode 100644
index 0000000..9c22f8d
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e78e1ac59cc0_ust111.pdf differ
diff --git a/storage/app/customer/attachment/2020/03/5e78e1ae88686_ustvadezember.pdf b/storage/app/customer/attachment/2020/03/5e78e1ae88686_ustvadezember.pdf
new file mode 100644
index 0000000..73b3d15
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e78e1ae88686_ustvadezember.pdf differ
diff --git a/storage/app/customer/attachment/2020/03/5e78e1ef84dc1_mcwebartworkqrg181130.pdf b/storage/app/customer/attachment/2020/03/5e78e1ef84dc1_mcwebartworkqrg181130.pdf
new file mode 100644
index 0000000..e77f64b
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e78e1ef84dc1_mcwebartworkqrg181130.pdf differ
diff --git a/storage/app/customer/attachment/2020/03/5e78e1f2d7c2e_payoneplatformtestdataen.pdf b/storage/app/customer/attachment/2020/03/5e78e1f2d7c2e_payoneplatformtestdataen.pdf
new file mode 100644
index 0000000..57b35f7
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e78e1f2d7c2e_payoneplatformtestdataen.pdf differ
diff --git a/storage/app/customer/attachment/2020/03/5e7b225b0ed62_jdatlastoollogo.png b/storage/app/customer/attachment/2020/03/5e7b225b0ed62_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e7b225b0ed62_jdatlastoollogo.png differ
diff --git a/storage/app/customer/attachment/2020/03/5e7b3644bf721_wlogo.png b/storage/app/customer/attachment/2020/03/5e7b3644bf721_wlogo.png
new file mode 100644
index 0000000..bb18b78
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e7b3644bf721_wlogo.png differ
diff --git a/storage/app/customer/attachment/2020/03/5e7b492402436_jdatlastoollogo.png b/storage/app/customer/attachment/2020/03/5e7b492402436_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e7b492402436_jdatlastoollogo.png differ
diff --git a/storage/app/customer/attachment/2020/03/5e7b8ab17b3b5_jdatlastoollogo.png b/storage/app/customer/attachment/2020/03/5e7b8ab17b3b5_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/attachment/2020/03/5e7b8ab17b3b5_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78c9ab01d68_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78c9ab01d68_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78c9ab01d68_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78ca461db73_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78ca461db73_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78ca461db73_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cabfcc631_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cabfcc631_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cabfcc631_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78caee86679_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78caee86679_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78caee86679_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cb08e8fda_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cb08e8fda_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cb08e8fda_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cb0c29487_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cb0c29487_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cb0c29487_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cb5297d99_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cb5297d99_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cb5297d99_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78ce73a0b51_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78ce73a0b51_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78ce73a0b51_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78cec300ea9_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cec300ea9_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cec300ea9_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cef2a2811_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cef2a2811_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cef2a2811_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78ceff86c13_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78ceff86c13_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78ceff86c13_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cf1d742c7_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cf1d742c7_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cf1d742c7_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cf23670ae_ust111.pdf b/storage/app/customer/tmp/attachment/5e78cf23670ae_ust111.pdf
new file mode 100644
index 0000000..9c22f8d
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cf23670ae_ust111.pdf differ
diff --git a/storage/app/customer/tmp/attachment/5e78cfb1a7800_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cfb1a7800_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cfb1a7800_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78cfbd8ef63_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78cfbd8ef63_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78cfbd8ef63_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d0037eca4_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d0037eca4_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d0037eca4_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d02050d7c_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d02050d7c_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d02050d7c_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d02498dfd_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d02498dfd_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d02498dfd_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d183c4f80_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d183c4f80_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d183c4f80_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d1c454e6f_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d1c454e6f_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d1c454e6f_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d1cf536e8_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d1cf536e8_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d1cf536e8_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d35b13cdf_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d35b13cdf_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d35b13cdf_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d3faa91df_ust111.pdf b/storage/app/customer/tmp/attachment/5e78d3faa91df_ust111.pdf
new file mode 100644
index 0000000..9c22f8d
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d3faa91df_ust111.pdf differ
diff --git a/storage/app/customer/tmp/attachment/5e78d45fdbc3b_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d45fdbc3b_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d45fdbc3b_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d463478f2_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d463478f2_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d463478f2_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d464c5ab1_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d464c5ab1_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d464c5ab1_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d46a01b5d_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78d46a01b5d_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d46a01b5d_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78d46a312bf_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d46a312bf_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d46a312bf_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d564d217f_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d564d217f_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d564d217f_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d5ef6c709_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d5ef6c709_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d5ef6c709_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d60335e7a_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d60335e7a_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d60335e7a_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d6341a8ab_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d6341a8ab_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d6341a8ab_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d6470bf25_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d6470bf25_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d6470bf25_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d7038592f_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d7038592f_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d7038592f_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d78baa10e_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d78baa10e_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d78baa10e_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78d98658c62_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78d98658c62_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78d98658c62_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78db64e414c_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78db64e414c_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78db64e414c_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78dbc255921_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78dbc255921_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dbc255921_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78dc789e5ec_ust111.pdf b/storage/app/customer/tmp/attachment/5e78dc789e5ec_ust111.pdf
new file mode 100644
index 0000000..9c22f8d
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dc789e5ec_ust111.pdf differ
diff --git a/storage/app/customer/tmp/attachment/5e78dce263b11_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78dce263b11_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dce263b11_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78dd3a57e2c_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78dd3a57e2c_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dd3a57e2c_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78ddbd11b14_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78ddbd11b14_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78ddbd11b14_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78de3e83a57_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78de3e83a57_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78de3e83a57_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78de619eef4_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78de619eef4_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78de619eef4_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78dea62a197_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78dea62a197_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dea62a197_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78dfdf5464a_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78dfdf5464a_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78dfdf5464a_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78e019450d8_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78e019450d8_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78e019450d8_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78e0416765e_jackodurextrusionsstrang.jpg b/storage/app/customer/tmp/attachment/5e78e0416765e_jackodurextrusionsstrang.jpg
new file mode 100644
index 0000000..2c7fd76
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78e0416765e_jackodurextrusionsstrang.jpg differ
diff --git a/storage/app/customer/tmp/attachment/5e78e05dcf7c8_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78e05dcf7c8_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78e05dcf7c8_jdatlastoollogo.png differ
diff --git a/storage/app/customer/tmp/attachment/5e78e086b0a43_jdatlastoollogo.png b/storage/app/customer/tmp/attachment/5e78e086b0a43_jdatlastoollogo.png
new file mode 100644
index 0000000..6d4306f
Binary files /dev/null and b/storage/app/customer/tmp/attachment/5e78e086b0a43_jdatlastoollogo.png differ