322 lines
13 KiB
PHP
322 lines
13 KiB
PHP
@extends('layouts.layout-2')
|
||
|
||
@section('content')
|
||
<h4 class="d-flex justify-content-between align-items-center w-100 font-weight-bold py-3 mb-4">
|
||
<div>
|
||
<i class="ion ion-md-mail text-primary"></i> Newsletter-Kontakte
|
||
</div>
|
||
<div>
|
||
<a href="{{ route('newsletter.edit', 'new') }}" class="btn btn-primary btn-sm">
|
||
<i class="fa fa-plus"></i> Neuer Kontakt
|
||
</a>
|
||
</div>
|
||
</h4>
|
||
|
||
@if (Session::has('alert-success'))
|
||
<div class="alert alert-success alert-dismissible fade show">
|
||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||
{{ Session::get('alert-success') }}
|
||
</div>
|
||
@endif
|
||
|
||
<!-- Statistiken -->
|
||
<div class="row">
|
||
<div class="col-sm-6 col-xl-3">
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<div class="d-flex align-items-center">
|
||
<div class="lnr lnr-users display-4 text-primary"></div>
|
||
<div class="ml-3">
|
||
<div class="text-muted small">Gesamte Kontakte</div>
|
||
<div class="text-large">{{ $statistics['total'] }}</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-sm-6 col-xl-3">
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<div class="d-flex align-items-center">
|
||
<div class="lnr lnr-checkmark-circle display-4 text-success"></div>
|
||
<div class="ml-3">
|
||
<div class="text-muted small">Aktive Kontakte</div>
|
||
<div class="text-large">{{ $statistics['active'] }}</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-sm-6 col-xl-3">
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<div class="d-flex align-items-center">
|
||
<div class="lnr lnr-map display-4 text-info"></div>
|
||
<div class="ml-3">
|
||
<div class="text-muted small">Kulturreisen</div>
|
||
<div class="text-large">{{ $statistics['kulturreisen'] }}</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-sm-6 col-xl-3">
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<div class="d-flex align-items-center">
|
||
<div class="lnr lnr-home display-4 text-primary"></div>
|
||
<div class="ml-3">
|
||
<div class="text-muted small">Ferienwohnungen</div>
|
||
<div class="text-large">{{ $statistics['ferienwohnungen'] }}</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Filter & Aktionen -->
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<div class="row">
|
||
<div class="col-md-3">
|
||
<label>Gruppe</label>
|
||
<select class="form-control" id="filter-group">
|
||
<option value="">Alle Gruppen</option>
|
||
<option value="kulturreisen">Kulturreisen</option>
|
||
<option value="ferienwohnungen">Ferienwohnungen</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label>Status</label>
|
||
<select class="form-control" id="filter-status">
|
||
<option value="">Alle Status</option>
|
||
<option value="active">Aktiv</option>
|
||
<option value="inactive">Inaktiv</option>
|
||
<option value="unsubscribed">Abgemeldet</option>
|
||
<option value="bounced">Bounced</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label>Herkunft</label>
|
||
<select class="form-control" id="filter-source">
|
||
<option value="">Alle Herkünfte</option>
|
||
<option value="booking_kulturreisen">Buchung Kulturreisen</option>
|
||
<option value="booking_ferienwohnungen">Buchung Ferienwohnungen</option>
|
||
<option value="newsletter_signup">Newsletter-Anmeldung</option>
|
||
<option value="manual">Manuell</option>
|
||
<option value="import">Import</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label> </label>
|
||
<button type="button" class="btn btn-primary btn-block" id="btn-filter">
|
||
<i class="fa fa-filter"></i> Filtern
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="row mt-3">
|
||
<div class="col-md-3">
|
||
<label>Letzte Reise von</label>
|
||
<input type="text" class="form-control datepicker-base" id="filter-travel-from"
|
||
placeholder="TT.MM.JJJJ">
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label>Letzte Reise bis</label>
|
||
<input type="text" class="form-control datepicker-base" id="filter-travel-to"
|
||
placeholder="TT.MM.JJJJ">
|
||
</div>
|
||
<div class="col-md-6">
|
||
<label> </label>
|
||
<button type="button" class="btn btn-secondary btn-block" id="btn-reset-filter">
|
||
<i class="fa fa-times"></i> Filter zurücksetzen
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="row mt-3">
|
||
<div class="col-md-12">
|
||
<div class="btn-group">
|
||
<button type="button" class="btn btn-success btn-sm" onclick="syncContacts('all', false)">
|
||
<i class="fa fa-sync"></i> Synchronisieren
|
||
</button>
|
||
<button type="button" class="btn btn-warning btn-sm" onclick="syncContacts('all', true)">
|
||
<i class="fa fa-sync"></i> Voll-Sync (alle)
|
||
</button>
|
||
</div>
|
||
<button type="button" class="btn btn-info btn-sm ml-2" onclick="exportContacts()">
|
||
<i class="fa fa-download"></i> Export (mit aktuellen Filtern)
|
||
</button>
|
||
@if ($statistics['last_sync'])
|
||
<small class="text-muted ml-3">
|
||
Letzte Synchronisation: {{ $statistics['last_sync'] }}
|
||
</small>
|
||
@endif
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Tabelle -->
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<div class="table-responsive">
|
||
<table class="table table-striped table-bordered" id="newsletter-table">
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>E-Mail</th>
|
||
<th>Name</th>
|
||
<th>Gruppen</th>
|
||
<th>Status</th>
|
||
<th>Herkunft</th>
|
||
<th>Buchungen</th>
|
||
<th>Letzte Reise</th>
|
||
<th>Letzte Buchung</th>
|
||
<th>Erstellt</th>
|
||
<th>Aktionen</th>
|
||
</tr>
|
||
</thead>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@endsection
|
||
|
||
@section('scripts')
|
||
<script>
|
||
$(document).ready(function() {
|
||
var table = $('#newsletter-table').DataTable({
|
||
processing: true,
|
||
serverSide: true,
|
||
ajax: {
|
||
url: '{{ route('newsletter.datatable') }}',
|
||
data: function(d) {
|
||
d.group = $('#filter-group').val();
|
||
d.status = $('#filter-status').val();
|
||
d.source = $('#filter-source').val();
|
||
d.travel_from = $('#filter-travel-from').val();
|
||
d.travel_to = $('#filter-travel-to').val();
|
||
}
|
||
},
|
||
columns: [{
|
||
data: 'id',
|
||
name: 'id'
|
||
},
|
||
{
|
||
data: 'email',
|
||
name: 'email'
|
||
},
|
||
{
|
||
data: 'full_name',
|
||
name: 'full_name',
|
||
orderable: false,
|
||
searchable: false
|
||
},
|
||
{
|
||
data: 'groups',
|
||
name: 'groups',
|
||
orderable: false,
|
||
searchable: false
|
||
},
|
||
{
|
||
data: 'status_badge',
|
||
name: 'status'
|
||
},
|
||
{
|
||
data: 'source_label',
|
||
name: 'source_label'
|
||
},
|
||
{
|
||
data: 'total_bookings',
|
||
name: 'total_bookings',
|
||
orderable: false,
|
||
searchable: false
|
||
},
|
||
{
|
||
data: 'last_travel',
|
||
name: 'last_travel_end_date'
|
||
},
|
||
{
|
||
data: 'last_booking',
|
||
name: 'last_booking_at'
|
||
},
|
||
{
|
||
data: 'created',
|
||
name: 'created_at'
|
||
},
|
||
{
|
||
data: 'actions',
|
||
name: 'actions',
|
||
orderable: false,
|
||
searchable: false
|
||
}
|
||
],
|
||
order: [
|
||
[0, 'desc']
|
||
],
|
||
iDisplayLength: 50,
|
||
language: {
|
||
url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'
|
||
}
|
||
});
|
||
|
||
$('#btn-filter').on('click', function() {
|
||
table.draw();
|
||
});
|
||
|
||
$('#btn-reset-filter').on('click', function() {
|
||
$('#filter-group').val('');
|
||
$('#filter-status').val('');
|
||
$('#filter-source').val('');
|
||
$('#filter-travel-from').val('');
|
||
$('#filter-travel-to').val('');
|
||
table.draw();
|
||
});
|
||
});
|
||
|
||
function syncContacts(type, force) {
|
||
if (!confirm('Möchten Sie die Synchronisation wirklich starten?')) {
|
||
return;
|
||
}
|
||
|
||
var url = '{{ route('newsletter.sync') }}';
|
||
var data = {
|
||
type: type,
|
||
_token: '{{ csrf_token() }}'
|
||
};
|
||
|
||
if (force) {
|
||
data.force = true;
|
||
}
|
||
|
||
$.post(url, data, function(response) {
|
||
location.reload();
|
||
}).fail(function() {
|
||
alert('Fehler bei der Synchronisation');
|
||
});
|
||
}
|
||
|
||
function exportContacts() {
|
||
var params = [];
|
||
|
||
var group = $('#filter-group').val();
|
||
var status = $('#filter-status').val();
|
||
var source = $('#filter-source').val();
|
||
var travelFrom = $('#filter-travel-from').val();
|
||
var travelTo = $('#filter-travel-to').val();
|
||
|
||
if (group) params.push('group=' + encodeURIComponent(group));
|
||
if (status) params.push('status=' + encodeURIComponent(status));
|
||
if (source) params.push('source=' + encodeURIComponent(source));
|
||
if (travelFrom) params.push('travel_from=' + encodeURIComponent(travelFrom));
|
||
if (travelTo) params.push('travel_to=' + encodeURIComponent(travelTo));
|
||
|
||
var url = '{{ route('newsletter.export') }}';
|
||
if (params.length > 0) {
|
||
url += '?' + params.join('&');
|
||
}
|
||
|
||
window.location.href = url;
|
||
}
|
||
</script>
|
||
@endsection
|