mivita/resources/views/admin/dhl/show.blade.php
2025-10-20 17:42:08 +02:00

745 lines
No EOL
34 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')
<div class="d-flex justify-content-between align-items-center py-2 mb-4">
<h4 class="font-weight-bold mb-0">
<i class="fas fa-box text-primary"></i>
DHL Sendung #{{ $shipment->id }}
@if($shipment->type == 'return')
<span class="badge badge-info ml-2">
<i class="fas fa-undo"></i> Retoure
</span>
@endif
</h4>
<div>
<a href="{{ route('admin.dhl.cockpit') }}" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left"></i> Zurück zum Cockpit
</a>
@if($shipment->shoppingOrder)
<a href="{{ route('admin_sales_customers_detail', $shipment->shoppingOrder->id) }}"
class="btn btn-outline-primary ml-2">
<i class="fas fa-shopping-cart"></i> Bestellung anzeigen
</a>
@endif
</div>
</div>
<!-- Status & Key Info Row -->
<div class="row mb-4">
<div class="col-xl-3 col-md-6 mb-3">
<div class="card border-left-primary">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">Status</div>
@switch($shipment->status)
@case('pending')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-warning">{{ __('dhl.status.pending') }}</span>
</div>
@break
@case('created')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-success">{{ __('dhl.status.created') }}</span>
</div>
@break
@case('shipped')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-primary">{{ __('dhl.status.shipped') }}</span>
</div>
@break
@case('delivered')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-info">{{ __('dhl.status.delivered') }}</span>
</div>
@break
@case('cancelled')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-secondary">{{ __('dhl.status.cancelled') }}</span>
</div>
@break
@case('failed')
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-danger">{{ __('dhl.status.failed') }}</span>
</div>
@break
@default
<div class="h5 mb-0 font-weight-bold text-gray-800">
<span class="badge badge-light">{{ $shipment->getStatusTranslation() }}</span>
</div>
@endswitch
</div>
<div class="col-auto">
<i class="fas fa-flag fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="card border-left-success">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">Sendungsnummer</div>
<div class="h6 mb-0 font-weight-bold text-gray-800">
@if($shipment->dhl_shipment_no)
<code class="text-success">{{ $shipment->dhl_shipment_no }}</code>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</div>
</div>
<div class="col-auto">
<i class="fas fa-hashtag fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="card border-left-info">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">Tracking</div>
<div class="h6 mb-0 font-weight-bold text-gray-800">
@if(false)
<code class="text-info">{{ $shipment->dhl_shipment_no }}</code>
<br>
<a href="{{ route('public.tracking') }}?dhl_shipment_no={{ $shipment->dhl_shipment_no }}"
target="_blank" class="text-muted small">
<i class="fas fa-external-link-alt"></i> Verfolgen
</a>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</div>
</div>
<div class="col-auto">
<i class="fas fa-search fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="card border-left-warning">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">Gewicht</div>
<div class="h5 mb-0 font-weight-bold text-gray-800">
{{ number_format($shipment->weight_kg, 2, ',', '.') }} kg
</div>
</div>
<div class="col-auto">
<i class="fas fa-weight fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Action Buttons -->
@if($shipment->status != 'cancelled')
<div class="card mb-4">
<div class="card-body">
<div class="d-flex flex-wrap gap-2">
@if($shipment->label_path)
<a href="{{ route('admin.dhl.download-label', $shipment) }}"
class="btn btn-success mr-2">
<i class="fas fa-download"></i> Label herunterladen
</a>
@endif
{{-- Todo: Add tracking button
@if($shipment->canCancel())
<button type="button"
class="btn btn-warning mr-2"
id="cancel-shipment-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-ban"></i> Sendung stornieren
</button>
@endif
@if($shipment->type == 'outbound' && !$shipment->relatedShipment)
<button type="button"
class="btn btn-info mr-2"
id="create-return-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-undo"></i> Retourenlabel erstellen
</button>
@endif
--}}
@if($shipment->dhl_shipment_no)
<button type="button"
class="btn btn-secondary mr-2"
id="update-tracking-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-sync"></i> Tracking aktualisieren
</button>
@endif
</div>
</div>
</div>
@endif
<!-- Shipment Details -->
<div class="row">
<!-- Left Column -->
<div class="col-lg-8">
<!-- Shipment Information -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-info-circle text-primary"></i>
Sendungsinformationen
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">ID:</td>
<td>#{{ $shipment->id }}</td>
</tr>
<tr>
<td class="font-weight-semibold">DHL Sendungsnummer:</td>
<td>
@if($shipment->dhl_shipment_no)
<code class="text-success">{{ $shipment->dhl_shipment_no }}</code>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
{{--
<tr>
<td class="font-weight-semibold">Routing-Code:</td>
<td>
@if($shipment->routing_code)
<code class="text-info">{{ $shipment->routing_code }}</code>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
--}}
<tr>
<td class="font-weight-semibold">Rechnungsnummer:</td>
<td>
@if($shipment->billing_number)
<code class="text-dark">{{ $shipment->billing_number }}</code>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">Typ:</td>
<td>
@if($shipment->type == 'outbound')
<span class="badge badge-primary">
<i class="fas fa-arrow-right"></i> {{ __('dhl.type.outbound') }}
</span>
@else
<span class="badge badge-info">
<i class="fas fa-undo"></i> {{ __('dhl.type.return') }}
</span>
@if($shipment->relatedShipment)
<br>
<small class="text-muted">
Bezieht sich auf Sendung
<a href="{{ route('admin.dhl.show', $shipment->relatedShipment) }}">
#{{ $shipment->relatedShipment->id }}
</a>
</small>
@endif
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">{{ __('dhl.fields.product_code') }}:</td>
<td><code>{{ $shipment->product_code }}</code> - {{ $shipment->getProductCodeTranslation() }}</td>
</tr>
<tr>
<td class="font-weight-semibold">Label-Format:</td>
<td>{{ strtoupper($shipment->label_format) }}</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">Erstellt:</td>
<td>{{ $shipment->created_at->format('d.m.Y H:i:s') }}</td>
</tr>
<tr>
<td class="font-weight-semibold">Letzte Änderung:</td>
<td>{{ $shipment->updated_at->format('d.m.Y H:i:s') }}</td>
</tr>
@if($shipment->last_tracked_at)
<tr>
<td class="font-weight-semibold">Letztes Tracking:</td>
<td>{{ $shipment->last_tracked_at->format('d.m.Y H:i:s') }}</td>
</tr>
@endif
@if($shipment->length || $shipment->width || $shipment->height)
<tr>
<td class="font-weight-semibold">Abmessungen:</td>
<td>
{{ $shipment->length }}×{{ $shipment->width }}×{{ $shipment->height }} cm
</td>
</tr>
@endif
</table>
</div>
</div>
</div>
</div>
<!-- Recipient Information -->
@if($shipment->firstname || $shipment->lastname || $shipment->company || $shipment->recipient)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-user text-warning"></i>
Empfängerinformationen
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">Name:</td>
<td>
@if($shipment->firstname || $shipment->lastname)
{{ $shipment->firstname }} {{ $shipment->lastname }}
@elseif($shipment->recipient && isset($shipment->recipient['firstname']))
{{ $shipment->recipient['firstname'] }} {{ $shipment->recipient['lastname'] }}
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
@if($shipment->company)
<tr>
<td class="font-weight-semibold">Firma:</td>
<td>
@if($shipment->company)
{{ $shipment->company }}
@elseif($shipment->recipient && isset($shipment->recipient['company']))
{{ $shipment->recipient['company'] }}
@else
<span class="text-muted">-</span>
@endif
</td>
</tr>
@endif
<tr>
<td class="font-weight-semibold">Straße:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['street']))
{{ $shipment->recipient['street'] }}
@if(isset($shipment->recipient['houseNumber']))
{{ $shipment->recipient['houseNumber'] }}
@endif
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">PLZ:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['postalCode']))
{{ $shipment->recipient['postalCode'] }}
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">Stadt:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['city']))
{{ $shipment->recipient['city'] }}
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">Land:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['country']))
{{ $shipment->recipient['country'] }}
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">E-Mail:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['email']))
<a href="mailto:{{ $shipment->recipient['email'] }}" class="text-primary">
{{ $shipment->recipient['email'] }}
</a>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">Telefon:</td>
<td>
@if($shipment->recipient && isset($shipment->recipient['phone']))
<a href="tel:{{ $shipment->recipient['phone'] }}" class="text-primary">
{{ $shipment->recipient['phone'] }}
</a>
@else
<span class="text-muted">Nicht verfügbar</span>
@endif
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
@endif
<!-- Order Information -->
@if($shipment->shoppingOrder)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-shopping-cart text-success"></i>
Bestellinformationen
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">Bestellungs-ID:</td>
<td>
<a href="{{ route('admin_sales_customers_detail', $shipment->shoppingOrder->id) }}" class="text-primary">
#{{ $shipment->shoppingOrder->id }}
</a>
</td>
</tr>
<tr>
<td class="font-weight-semibold">Kunde:</td>
<td>
@if($shipment->shoppingOrder->shopping_user)
{{ $shipment->shoppingOrder->shopping_user->billing_firstname }} {{ $shipment->shoppingOrder->shopping_user->billing_lastname }}
<br>
<small class="text-muted">{{ $shipment->shoppingOrder->shopping_user->billing_email }}</small>
@else
<span class="text-muted">Unbekannt</span>
@endif
</td>
</tr>
<tr>
<td class="font-weight-semibold">Bestelldatum:</td>
<td>{{ $shipment->shoppingOrder->created_at->format('d.m.Y H:i') }}</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-sm">
<tr>
<td class="font-weight-semibold">Bestellwert:</td>
<td><strong>{{ number_format($shipment->shoppingOrder->total, 2, ',', '.') }} </strong></td>
</tr>
<tr>
<td class="font-weight-semibold">Status:</td>
<td>
<span class="badge badge-pill badge-{{ $shipment->shoppingOrder->getShippedColor() }}">{{ $shipment->shoppingOrder->getShippedType() }}</span>
</td>
</tr>
<tr>
<td class="font-weight-semibold">Artikel:</td>
<td>{{ $shipment->shoppingOrder->shopping_order_items->count() ?? 0 }} Artikel</td>
</tr>
</table>
</div>
</div>
</div>
</div>
@endif
</div>
<!-- Right Column -->
<div class="col-lg-4">
<!-- Tracking Information -->
@if($shipment->tracking_status || $shipment->dhl_shipment_no)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-route text-info"></i>
Tracking-Informationen
</h5>
</div>
<div class="card-body">
@if($shipment->tracking_status)
<div class="alert alert-info">
<h6 class="alert-heading">
<i class="fas fa-map-marker-alt"></i>
Aktueller Status: {{ $shipment->tracking_status }}
</h6>
@if($shipment->last_tracked_at)
<small class="text-muted">
Zuletzt aktualisiert: {{ $shipment->last_tracked_at->format('d.m.Y H:i') }}
</small>
@endif
</div>
@endif
@if($shipment->dhl_shipment_no)
<div class="text-center">
<p>Verfolgen Sie diese Sendung direkt bei DHL:</p>
<a href="https://www.dhl.de/de/privatkunden/pakete-empfangen/verfolgen.html?lang=de&idc={{ $shipment->dhl_shipment_no }}"
target="_blank"
class="btn btn-warning">
<i class="fas fa-external-link-alt"></i>
Bei DHL verfolgen
</a>
{{-- TODO: Tracking-Nummer ist nicht mehr verfügbar
<a href="{{ route('public.tracking') }}?tracking_number={{ $shipment->dhl_shipment_no }}"
target="_blank"
class="btn btn-outline-info ml-2">
<i class="fas fa-search"></i>
Lokales Tracking
</a>
--}}
</div>
@endif
</div>
</div>
@endif
<!-- Related Shipments -->
@if($shipment->type == 'outbound' && $shipment->relatedShipments && $shipment->relatedShipments->count() > 0)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-link text-warning"></i>
Verknüpfte Retouren
</h5>
</div>
<div class="card-body">
@foreach($shipment->relatedShipments as $relatedShipment)
<div class="d-flex justify-content-between align-items-center mb-2">
<div>
<a href="{{ route('admin.dhl.show', $relatedShipment) }}" class="text-primary">
Retoure #{{ $relatedShipment->id }}
</a>
<br>
<small class="text-muted">{{ $relatedShipment->created_at->format('d.m.Y H:i') }}</small>
</div>
<span class="badge badge-{{ $relatedShipment->status == 'created' ? 'success' : 'warning' }}">
{{ $relatedShipment->status }}
</span>
</div>
@endforeach
</div>
</div>
@endif
<!-- Additional Services -->
@if($shipment->services)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-plus-circle text-success"></i>
Zusatzleistungen
</h5>
</div>
<div class="card-body">
@foreach($shipment->services as $service => $enabled)
@if($enabled)
<div class="badge badge-success mr-1 mb-1">{{ $service }}</div>
@endif
@endforeach
</div>
</div>
@endif
<!-- API Response Data -->
@if($shipment->api_response_data && auth()->user()->isSuperAdmin())
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-code text-muted"></i>
API Response (Debug)
</h5>
</div>
<div class="card-body">
<pre class="small text-muted" style="max-height: 300px; overflow-y: auto;">{{ json_encode($shipment->api_response_data, JSON_PRETTY_PRINT) }}</pre>
</div>
</div>
@endif
</div>
</div>
@endsection
@section('scripts')
<script>
$(document).ready(function() {
// Cancel shipment
$('#cancel-shipment-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
if (!confirm('Möchten Sie diese Sendung wirklich stornieren?\n\nDieser Vorgang kann nicht rückgängig gemacht werden.')) {
return;
}
var btn = $(this);
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Wird storniert...');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/cancel`,
method: 'DELETE',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
setTimeout(function() {
location.reload();
}, 2000);
} else {
showAlert('error', response.message);
resetButton(btn, '<i class="fas fa-ban"></i> Sendung stornieren');
}
},
error: function(xhr) {
showAlert('error', 'Fehler beim Stornieren der Sendung.');
resetButton(btn, '<i class="fas fa-ban"></i> Sendung stornieren');
}
});
});
// Create return label
$('#create-return-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
if (!confirm('Möchten Sie ein Retourenlabel für diese Sendung erstellen?')) {
return;
}
var btn = $(this);
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Wird erstellt...');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/return-label`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
setTimeout(function() {
location.reload();
}, 2000);
} else {
showAlert('error', response.message);
resetButton(btn, '<i class="fas fa-undo"></i> Retourenlabel erstellen');
}
},
error: function(xhr) {
showAlert('error', 'Fehler beim Erstellen des Retourenlabels.');
resetButton(btn, '<i class="fas fa-undo"></i> Retourenlabel erstellen');
}
});
});
// Update tracking
$('#update-tracking-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Wird aktualisiert...');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/update-tracking`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
setTimeout(function() {
location.reload();
}, 3000);
} else {
showAlert('error', response.message);
resetButton(btn, '<i class="fas fa-sync"></i> Tracking aktualisieren');
}
},
error: function(xhr) {
showAlert('error', 'Fehler beim Aktualisieren der Tracking-Informationen.');
resetButton(btn, '<i class="fas fa-sync"></i> Tracking aktualisieren');
}
});
});
// Helper functions
function resetButton(btn, originalText) {
btn.prop('disabled', false).html(originalText);
}
function showAlert(type, message) {
var alertClass = type === 'success' ? 'alert-success' : 'alert-danger';
var iconClass = type === 'success' ? 'fas fa-check-circle' : 'fas fa-exclamation-circle';
var alertHtml = `
<div class="alert ${alertClass} alert-dismissible fade show" role="alert">
<i class="${iconClass}"></i>
${message}
<button type="button" class="close" data-dismiss="alert">
<span aria-hidden="true">&times;</span>
</button>
</div>
`;
$('.py-2.mb-4').after(alertHtml);
// Scroll to top
$('html, body').animate({ scrollTop: 0 }, 500);
// Auto-hide success alerts after 5 seconds
if (type === 'success') {
setTimeout(function() {
$('.alert-success').alert('close');
}, 5000);
}
}
});
</script>
@endsection