mein-sterntours/resources/views/newsletter/index.blade.php
2026-01-23 17:34:40 +01:00

322 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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>&nbsp;</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>&nbsp;</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