DHL-Versand: Sendungs-Info-Button in Bestelllisten & Absenderadresse
Neuer schlanker DHL-Info-Button (getDhlShippingButton) in den Order- und Shop-Sales-Datatables, oeffnet ein Read-only-Modal (modal_dhl_shipping_info) mit den Tracking-Daten; dhlShipments wird dafuer eager geladen. Absenderadresse in config/dhl.php aktualisiert, plus kleinere Fixes in DhlShipmentController/Service/DataHelper und CreateReturnLabelJob. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
54bf2e5595
commit
e401251b0d
14 changed files with 315 additions and 61 deletions
|
|
@ -2,12 +2,32 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use App\Models\ShoppingOrder;
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||
|
||||
/**
|
||||
* Renders the DHL shipping-info button for order datatables when the order
|
||||
* has at least one shipment label. Opens a read-only modal with the
|
||||
* tracking details. Returns an empty string when no shipment exists.
|
||||
*/
|
||||
protected function getDhlShippingButton(ShoppingOrder $shoppingOrder): string
|
||||
{
|
||||
if ($shoppingOrder->dhlShipments->isEmpty()) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return ' <button type="button" class="btn btn-xs btn-light btn-round" data-toggle="modal" data-target="#modals-load-content"'
|
||||
.' data-id="'.$shoppingOrder->id.'"'
|
||||
.' data-action="user-order-dhl-info"'
|
||||
.' data-modal="modal-lg"'
|
||||
.' data-route="'.route('modal_load').'"'
|
||||
.' title="'.__('tables.shipping').'"><span class="fas fa-shipping-fast"></span></button>';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ use App\Services\DhlAddressValidator;
|
|||
use App\Services\DhlModalService;
|
||||
use App\Services\DhlProductResolver;
|
||||
use App\Services\DhlShipmentService;
|
||||
use App\Services\DhlShipmentWeightCalculator;
|
||||
use App\Services\DhlTrackingService;
|
||||
use Exception;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
|
@ -305,10 +304,7 @@ class DhlShipmentController extends Controller
|
|||
]);
|
||||
|
||||
$order = ShoppingOrder::findOrFail($request->order_id);
|
||||
$shipmentWeight = max(
|
||||
(float) $request->weight,
|
||||
(new DhlShipmentWeightCalculator)->calculate($order)
|
||||
);
|
||||
$shipmentWeight = (float) $request->weight;
|
||||
|
||||
// Check if shipment already exists
|
||||
/* $existingShipment = DhlShipment::where('shopping_order_id', $order->id)
|
||||
|
|
@ -344,7 +340,6 @@ class DhlShipmentController extends Controller
|
|||
Log::info('[DHL Controller] Shipment creation processed', [
|
||||
'order_id' => $order->id,
|
||||
'weight' => $shipmentWeight,
|
||||
'requested_weight' => $request->weight,
|
||||
'queued' => $result['queued'] ?? false,
|
||||
'success' => $result['success'] ?? false,
|
||||
]);
|
||||
|
|
@ -686,10 +681,10 @@ class DhlShipmentController extends Controller
|
|||
'consignee' => [
|
||||
'name' => $dhlConfig['sender']['company'] ?? 'mivita care gmbh',
|
||||
'name2' => $dhlConfig['sender']['name'] ?? '',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Leinfeld',
|
||||
'houseNumber' => $dhlConfig['sender']['house_number'] ?? '2',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '87755',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kirchhaslach',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Waldstr.',
|
||||
'houseNumber' => $dhlConfig['sender']['houseNumber'] ?? '3e',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '86498',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kettershausen',
|
||||
'country' => $dhlConfig['sender']['country'] ?? DhlProductResolver::DOMESTIC_COUNTRY,
|
||||
'email' => $dhlConfig['sender']['email'] ?? 'versand@mivita.care',
|
||||
'phone' => $dhlConfig['sender']['phone'] ?? '+49 123 456789',
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class OrderController extends Controller
|
|||
public function ordersDatatable()
|
||||
{
|
||||
$user = User::find(Auth::user()->id);
|
||||
$query = ShoppingOrder::with('shopping_user', 'shopping_payments')
|
||||
$query = ShoppingOrder::with('shopping_user', 'shopping_payments', 'dhlShipments')
|
||||
->select('shopping_orders.*')
|
||||
->where('auth_user_id', '=', $user->id)
|
||||
->where('txaction', '!=', null);
|
||||
|
|
@ -88,16 +88,18 @@ class OrderController extends Controller
|
|||
})
|
||||
->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) {
|
||||
if ($ShoppingOrder->payment_for === 8) {
|
||||
return '<button type="button" class="btn btn-xs btn-info btn-round" data-toggle="modal" data-target="#modals-load-content"
|
||||
$shipped = '<button type="button" class="btn btn-xs btn-info btn-round" data-toggle="modal" data-target="#modals-load-content"
|
||||
data-id="'.$ShoppingOrder->id.'"
|
||||
data-action="shop-user-order-shipping-detail"
|
||||
data-back=""
|
||||
data-modal="modal-xl"
|
||||
data-init_from="user"
|
||||
data-action="shop-user-order-shipping-detail"
|
||||
data-back=""
|
||||
data-modal="modal-xl"
|
||||
data-init_from="user"
|
||||
data-route="'.route('modal_load').'"><span class="fa fa-eye"></span></button>';
|
||||
} else {
|
||||
$shipped = '<span class="badge badge-pill badge-'.$ShoppingOrder->getShippedColor().'">'.$ShoppingOrder->getShippedType().'</span>';
|
||||
}
|
||||
|
||||
return '<span class="badge badge-pill badge-'.$ShoppingOrder->getShippedColor().'">'.$ShoppingOrder->getShippedType().'</span>';
|
||||
return $shipped.$this->getDhlShippingButton($ShoppingOrder);
|
||||
})
|
||||
->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) {
|
||||
return Payment::getPaymentForBadge($ShoppingOrder);
|
||||
|
|
|
|||
|
|
@ -1,16 +1,14 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace App\Http\Controllers\User;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ShoppingOrder;
|
||||
use App\Services\Payment;
|
||||
use App\User;
|
||||
|
||||
|
||||
class ShopSalesController extends Controller
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('active.shop');
|
||||
|
|
@ -20,6 +18,7 @@ class ShopSalesController extends Controller
|
|||
{
|
||||
$data = [
|
||||
];
|
||||
|
||||
return view('user.shop.sales.orders', $data);
|
||||
}
|
||||
|
||||
|
|
@ -27,38 +26,39 @@ class ShopSalesController extends Controller
|
|||
{
|
||||
$user = User::find(\Auth::user()->id);
|
||||
$shopping_order = ShoppingOrder::findOrFail($id);
|
||||
if($shopping_order->member_id !== $user->id){
|
||||
if ($shopping_order->member_id !== $user->id) {
|
||||
abort(403, 'Unauthorized action. User ID does not match.');
|
||||
}
|
||||
if( $shopping_order->payment_for !== 6 && $shopping_order->payment_for !== 7){
|
||||
if ($shopping_order->payment_for !== 6 && $shopping_order->payment_for !== 7) {
|
||||
return redirect(route('user_order_detail', [$shopping_order->id]));
|
||||
abort(403, 'Beraterbestellung');
|
||||
}
|
||||
$data = [
|
||||
'shopping_order' => $shopping_order,
|
||||
'isAdmin' => false,
|
||||
'shopping_order' => $shopping_order,
|
||||
'isAdmin' => false,
|
||||
];
|
||||
|
||||
|
||||
return view('user.shop.sales.order_detail', $data);
|
||||
}
|
||||
|
||||
public function ordersDatatable(){
|
||||
public function ordersDatatable()
|
||||
{
|
||||
|
||||
$user = User::find(\Auth::user()->id);
|
||||
$query = ShoppingOrder::with('shopping_user')->select('shopping_orders.*')->where('shopping_orders.member_id', $user->id);
|
||||
$query = ShoppingOrder::with('shopping_user', 'dhlShipments')->select('shopping_orders.*')->where('shopping_orders.member_id', $user->id);
|
||||
|
||||
return \DataTables::eloquent($query)
|
||||
->addColumn('id', function (ShoppingOrder $ShoppingOrder) {
|
||||
return '<a href="' . route('user_shop_order_detail', [$ShoppingOrder->id]) . '" class="btn icon-btn btn-sm btn-primary"><span class="fa fa-edit"></span></a>';
|
||||
return '<a href="'.route('user_shop_order_detail', [$ShoppingOrder->id]).'" class="btn icon-btn btn-sm btn-primary"><span class="fa fa-edit"></span></a>';
|
||||
})
|
||||
->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) {
|
||||
return $ShoppingOrder->created_at->format("d.m.Y");
|
||||
return $ShoppingOrder->created_at->format('d.m.Y');
|
||||
})
|
||||
->addColumn('txaction', function (ShoppingOrder $ShoppingOrder) {
|
||||
return Payment::getShoppingOrderBadge($ShoppingOrder);
|
||||
})
|
||||
->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) {
|
||||
return '<span class="no-line-break">'.$ShoppingOrder->getFormattedTotalShipping()." €</span>";
|
||||
return '<span class="no-line-break">'.$ShoppingOrder->getFormattedTotalShipping().' €</span>';
|
||||
})
|
||||
->addColumn('orders', function (ShoppingOrder $ShoppingOrder) {
|
||||
return $ShoppingOrder->shopping_user ? $ShoppingOrder->shopping_user->orders : '';
|
||||
|
|
@ -70,8 +70,8 @@ class ShopSalesController extends Controller
|
|||
return Payment::getPaymentForBadge($ShoppingOrder);
|
||||
})
|
||||
->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) {
|
||||
return '<span class="badge badge-pill badge-'.$ShoppingOrder->getShippedColor().'">'.$ShoppingOrder->getShippedType().'</span>
|
||||
';
|
||||
return '<span class="badge badge-pill badge-'.$ShoppingOrder->getShippedColor().'">'.$ShoppingOrder->getShippedType().'</span>'
|
||||
.$this->getDhlShippingButton($ShoppingOrder);
|
||||
})
|
||||
->addColumn('invoice', function (ShoppingOrder $ShoppingOrder) {
|
||||
return $ShoppingOrder->isInvoice() ? '<span class="no-line-break"><a href="'.route('storage_file', [$ShoppingOrder->id, 'invoice', 'download']).'" class="btn btn-primary btn-xs"><i class="fa fa-download"></i></a>
|
||||
|
|
@ -86,7 +86,4 @@ class ShopSalesController extends Controller
|
|||
->rawColumns(['id', 'txaction', 'user_shop_id', 'total_shipping', 'invoice', 'shipped', 'payment_for'])
|
||||
->make(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -173,10 +173,10 @@ class CreateReturnLabelJob implements ShouldQueue
|
|||
'consignee' => [
|
||||
'name' => $dhlConfig['sender']['company'] ?? 'mivita care gmbh',
|
||||
'name2' => $dhlConfig['sender']['name'] ?? '',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Leinfeld',
|
||||
'houseNumber' => $dhlConfig['sender']['house_number'] ?? '2',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '87755',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kirchhaslach',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Waldstr.',
|
||||
'houseNumber' => $dhlConfig['sender']['houseNumber'] ?? '3e',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '86498',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kettershausen',
|
||||
'country' => $dhlConfig['sender']['country'] ?? 'DEU',
|
||||
'email' => $dhlConfig['sender']['email'] ?? 'versand@mivita.care',
|
||||
'phone' => $dhlConfig['sender']['phone'] ?? '+49 123 456789',
|
||||
|
|
|
|||
|
|
@ -69,10 +69,10 @@ class DhlDataHelper
|
|||
'shipper' => [
|
||||
'name' => $dhlConfig['sender']['company'] ?? 'mivita care gmbh',
|
||||
'name2' => $dhlConfig['sender']['name'] ?? '',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Leinfeld',
|
||||
'houseNumber' => $dhlConfig['sender']['house_number'] ?? '2',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '87755',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kirchhaslach',
|
||||
'street' => $dhlConfig['sender']['street'] ?? 'Waldstr.',
|
||||
'houseNumber' => $dhlConfig['sender']['houseNumber'] ?? '3e',
|
||||
'postalCode' => $dhlConfig['sender']['postalCode'] ?? '86498',
|
||||
'city' => $dhlConfig['sender']['city'] ?? 'Kettershausen',
|
||||
'country' => $dhlConfig['sender']['country'] ?? 'DE',
|
||||
'email' => $dhlConfig['sender']['email'] ?? 'versand@mivita.care',
|
||||
'phone' => $dhlConfig['sender']['phone'] ?? '+49 123 456789',
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@ class DhlShipmentService
|
|||
*/
|
||||
public function createShipment(ShoppingOrder $order, float $weight = 1.0, array $options = []): array
|
||||
{
|
||||
$weight = max($weight, (new DhlShipmentWeightCalculator)->calculate($order));
|
||||
|
||||
// Get DHL configuration
|
||||
$settingController = new SettingController;
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
|
|
|
|||
|
|
@ -78,13 +78,13 @@ return [
|
|||
'sender' => [
|
||||
'company' => env('DHL_SENDER_COMPANY', 'mivita care gmbh'),
|
||||
'name' => env('DHL_SENDER_NAME', ''),
|
||||
'street' => env('DHL_SENDER_STREET', 'Leinfeld'),
|
||||
'houseNumber' => env('DHL_SENDER_STREET_NUMBER', '2'),
|
||||
'postalCode' => env('DHL_SENDER_POSTAL_CODE', '87755'),
|
||||
'city' => env('DHL_SENDER_CITY', 'Kirchhaslach'),
|
||||
'street' => env('DHL_SENDER_STREET', 'Waldstr.'),
|
||||
'houseNumber' => env('DHL_SENDER_STREET_NUMBER', '3e'),
|
||||
'postalCode' => env('DHL_SENDER_POSTAL_CODE', '86498'),
|
||||
'city' => env('DHL_SENDER_CITY', 'Kettershausen'),
|
||||
'country' => env('DHL_SENDER_COUNTRY', 'DE'),
|
||||
'email' => env('DHL_SENDER_EMAIL', 'versand@mivita.care'),
|
||||
'phone' => env('DHL_SENDER_PHONE', '+49 123 456789'),
|
||||
'phone' => env('DHL_SENDER_PHONE', '+49 8333 9461767'),
|
||||
],
|
||||
|
||||
/*
|
||||
|
|
|
|||
49
docs/dhl/Anpassung DHL Modul.md
Normal file
49
docs/dhl/Anpassung DHL Modul.md
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
|
||||
Das DHL Cockpit ist super, leider klappt es nur für Deutschland.
|
||||
Kommt Österreich, Spanien etc auch noch dazu?
|
||||
Vermutlich ist derzeit die Schnittstelle nur für den deutschen Markt ausgelegt prüfen, wie wir die weiteren reinbekommen.
|
||||
|
||||
|
||||
1 Feld für Sendungsreferenz oder Sonstiges (da wir öfters "Nachlieferung" oder ähnliches rein schreiben müssen)
|
||||
|
||||
Es wäre gut, wenn eine Meldung kommen würde, falls die Straße, PLZ oder Ort falsch ist, bevor das Etikett erstellt wird. Erst wenn man das Etikett ausdrucken will erscheint in DHL eine Information, dass zb die Straße nicht existiert. Dann muss man alles stornieren. Warenpost können wir nicht stornieren und muss beszehalt werden.
|
||||
Ihr brauchen wir eine Lösung, die die Adresse validiert bitte einmal vorschlagen, was es hier für Lösungen gibt über APIs - Direkt über DHL?
|
||||
|
||||
stornieren über das DHL Cockpit hat leider noch nicht funktioniert. Da kam eine Fehlermeldung.
|
||||
Wäre super, wenn Du das noch ergänzen könntest.
|
||||
Prüfen, warum das nicht funktioniert. Hier gibt es bisher schon eine implementierte Lösung.
|
||||
|
||||
|
||||
=> Gewicht Kompenataion, wird aktuell nicht mit in das DHL Paket Gewicht mit eingerechnet, da das Kompensation Produkt mit dem Gewicht null in den Warenkorb kommt damit keine Berechnung des Produktes entsteht. Hier müssten wir eine Lösung finden, wie wir das Gewicht vermutlich direkt über das Produkt auslesen und zum Paketgewicht hinzufügen.
|
||||
|
||||
Prüfen der Verwandte E-Mails. Derzeit werden Tracking Mails generiert. Hier müssen wir einmal prüfen, in welchem Rhythmus und wie oft diese generiert und ausgelöst werden. Wichtig ist, dass wir hier nicht zu viele raussenden etc.
|
||||
Wichtig ist auch, dass bei jeder Bestellung sowohl beim Admin als auch beim User als auch im User N Portal die Tracking Codes entsprechend einsehbar Sendung aufrufbar.
|
||||
|
||||
Versenden nur mit Statusänderung.
|
||||
|
||||
Prüfen folgender Mail
|
||||
|
||||
Sehr geehrte Kundinnen und Kunden,
|
||||
|
||||
wir möchten Sie erneut daran erinnern, dass bis spätestens Sonntag, 31.05.2026, eine technische Umstellung Ihrer Systeme erforderlich ist. Ab dem 31.05.2026 treten verbindliche technische Anpassungen an unseren DHL-Systemen in Kraft.
|
||||
|
||||
Bitte stellen Sie sicher, dass die Umstellung fristgerecht erfolgt, um eine weiterhin reibungslose Nutzung unserer DHL-Systeme zu gewährleisten.
|
||||
|
||||
Deaktivierung Produktkürzel Warenpost zum 31.05.2026
|
||||
|
||||
Zum 01.01.2025 wurde das neue Produkt DHL Kleinpaket eingeführt und hat das bisherige Produkt Warenpost abgelöst. Wir haben festgestellt, dass Sie aktuell noch das veraltete Produktkürzel für Warenpost verwenden. Bislang wurde dieses Kürzel in unseren Systemen automatisch in DHL Kleinpaket umgewandelt. Diese technische Übergangslösung wird zum 31.05.2026 deaktiviert. Ab diesem Zeitpunkt ist eine automatische Anpassung des veralteten Produktkürzels leider nicht mehr möglich.
|
||||
|
||||
Bitte nehmen Sie die Umstellung daher zeitnah vor:
|
||||
|
||||
API-Anbindung: Ersetzen Sie das Produktkürzel „V62WP“ (Warenpost) durch „V62KP“ (DHL Kleinpaket). Sollten Sie eine Softwarelösung für die Sendungsbeauftragung nutzen, setzen Sie sich bitte zeitnah mit dem Hersteller in Verbindung,
|
||||
|
||||
CSV-Import (Funktion „Versenden“ im Post & DHL Geschäftskundenportal oder DHL Polling Software): Passen Sie Ihre CSV-Dateien entsprechend an und ersetzen Sie „V62WP“ durch „V62KP“.
|
||||
|
||||
Bei Fragen zur Umstellung können Sie uns jederzeit über das Group API Developer Portal Help Center kontaktieren. https://support-developer.dhl.com/support/home Als eingeloggter Nutzer können Sie dort außerdem ein Ticket erstellen, um Unterstützung zu erhalten.
|
||||
|
||||
Vielen Dank für Ihre Unterstützung bei der Umstellung, mit der Sie einen reibungslosen Versand auch über den 31.05.2026 hinaus sicherstellen.
|
||||
|
||||
Viele Grüße
|
||||
|
||||
Ihr DHL-Team
|
||||
|
|
@ -26,9 +26,15 @@
|
|||
@foreach($shopping_order->dhlShipments as $shipment)
|
||||
<tr class="{{ $shipment->type === 'return' ? 'bg-warning bg-opacity-10' : '' }}" style="{{ $shipment->type === 'return' ? 'background-color: rgba(255, 193, 7, 0.1);' : '' }}">
|
||||
<td>
|
||||
<a href="{{ route('admin.dhl.show', $shipment) }}" class="font-weight-bold {{ $shipment->type === 'return' ? 'text-warning' : 'text-primary' }}">
|
||||
@if($shipment->type === 'return')<i class="fas fa-undo mr-1"></i>@endif#{{ $shipment->id }}
|
||||
</a>
|
||||
@if (isset($isAdmin) && $isAdmin)
|
||||
<a href="{{ route('admin.dhl.show', $shipment) }}" class="font-weight-bold {{ $shipment->type === 'return' ? 'text-warning' : 'text-primary' }}">
|
||||
@if($shipment->type === 'return')<i class="fas fa-undo mr-1"></i>@endif#{{ $shipment->id }}
|
||||
</a>
|
||||
@else
|
||||
<span class="font-weight-bold {{ $shipment->type === 'return' ? 'text-warning' : 'text-primary' }}">
|
||||
@if($shipment->type === 'return')<i class="fas fa-undo mr-1"></i>@endif#{{ $shipment->id }}
|
||||
</span>
|
||||
@endif
|
||||
@if($shipment->type === 'return')
|
||||
<br><span class="badge badge-warning badge-sm" style="font-weight: 600;">RETOURE</span>
|
||||
@endif
|
||||
|
|
|
|||
20
resources/views/user/order/modal_dhl_shipping_info.blade.php
Normal file
20
resources/views/user/order/modal_dhl_shipping_info.blade.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
<i class="fas fa-shipping-fast"></i>
|
||||
{{ __('tables.shipping') }}
|
||||
<span class="text-muted">#{{ $shopping_order->id }}</span>
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@if ($shopping_order->dhlShipments && $shopping_order->dhlShipments->count() > 0)
|
||||
@include('admin.sales._detail_dhl_shipments', ['shopping_order' => $shopping_order, 'isAdmin' => false])
|
||||
@else
|
||||
<p class="text-muted mb-0">{{ __('tables.shipping') }} -</p>
|
||||
@endif
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('team.close') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -43,10 +43,10 @@ function dhlReferenceConfig(): array
|
|||
'sender' => [
|
||||
'company' => 'mivita care gmbh',
|
||||
'name' => '',
|
||||
'street' => 'Leinfeld',
|
||||
'house_number' => '2',
|
||||
'postalCode' => '87755',
|
||||
'city' => 'Kirchhaslach',
|
||||
'street' => 'Waldstr.',
|
||||
'houseNumber' => '3e',
|
||||
'postalCode' => '86498',
|
||||
'city' => 'Kettershausen',
|
||||
'country' => 'DE',
|
||||
'email' => 'versand@example.com',
|
||||
'phone' => '+4987654321',
|
||||
|
|
@ -88,6 +88,17 @@ it('normalizes the DHL reference to the API length limit', function () {
|
|||
->and($orderData['reference'])->toBe('Sehr lange interne Referenz fuer DH');
|
||||
});
|
||||
|
||||
it('uses the sender house number from DHL config', function () {
|
||||
$orderData = DhlDataHelper::prepareOrderData(
|
||||
dhlReferenceOrder(),
|
||||
1.2,
|
||||
dhlReferenceOptions(),
|
||||
dhlReferenceConfig()
|
||||
);
|
||||
|
||||
expect($orderData['shipper']['houseNumber'])->toBe('3e');
|
||||
});
|
||||
|
||||
it('passes the DHL mustEncode option into order data', function () {
|
||||
$orderData = DhlDataHelper::prepareOrderData(
|
||||
dhlReferenceOrder(),
|
||||
|
|
|
|||
113
tests/Unit/Dhl/DhlShipmentManualWeightTest.php
Normal file
113
tests/Unit/Dhl/DhlShipmentManualWeightTest.php
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\SettingController;
|
||||
use App\Jobs\CreateShipmentJob;
|
||||
use App\Models\ShoppingOrder;
|
||||
use App\Services\DhlDataHelper;
|
||||
use App\Services\DhlShipmentService;
|
||||
use App\Services\DhlShipmentWeightCalculator;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
|
||||
beforeEach(function () {
|
||||
SettingController::flushDhlConfigCache();
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
SettingController::flushDhlConfigCache();
|
||||
});
|
||||
|
||||
it('uses the manually entered weight for DHL order data even below the calculated order weight', function () {
|
||||
$orderData = DhlDataHelper::prepareOrderData(
|
||||
tap(new ShoppingOrder, fn (ShoppingOrder $order) => $order->id = 98765),
|
||||
0.5,
|
||||
[
|
||||
'product_code' => 'V01PAK',
|
||||
'shipping_address' => [
|
||||
'firstname' => 'Max',
|
||||
'lastname' => 'Mustermann',
|
||||
'company' => '',
|
||||
'address' => 'Hauptstrasse',
|
||||
'houseNumber' => '5',
|
||||
'zipcode' => '10115',
|
||||
'city' => 'Berlin',
|
||||
'country' => (object) ['code' => 'DE'],
|
||||
'email' => 'max@example.com',
|
||||
'phone' => '+4930123456',
|
||||
'postnumber' => null,
|
||||
],
|
||||
],
|
||||
[
|
||||
'default_product' => 'V01PAK',
|
||||
'label_format' => 'PDF',
|
||||
'dimensions' => [
|
||||
'V01PAK' => ['length' => 30, 'width' => 20, 'height' => 10],
|
||||
'default' => ['length' => 30, 'width' => 20, 'height' => 10],
|
||||
],
|
||||
'sender' => [
|
||||
'company' => 'mivita care gmbh',
|
||||
'name' => '',
|
||||
'street' => 'Waldstr.',
|
||||
'houseNumber' => '3e',
|
||||
'postalCode' => '86498',
|
||||
'city' => 'Kettershausen',
|
||||
'country' => 'DE',
|
||||
'email' => 'versand@example.com',
|
||||
'phone' => '+4987654321',
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
expect($orderData['weight_kg'])->toBe(0.5);
|
||||
});
|
||||
|
||||
it('allows manually entered weights below the calculated order weight within DHL limits', function () {
|
||||
(new DhlShipmentWeightCalculator)->assertWithinProductLimit(0.5, 'V01PAK');
|
||||
|
||||
expect(true)->toBeTrue();
|
||||
});
|
||||
|
||||
it('passes the manually entered weight to the shipment creation job', function () {
|
||||
Bus::fake();
|
||||
|
||||
$reflection = new ReflectionClass(SettingController::class);
|
||||
$property = $reflection->getProperty('cachedDhlConfig');
|
||||
$property->setAccessible(true);
|
||||
$property->setValue(null, [
|
||||
'use_queue' => true,
|
||||
'print_only_if_codeable' => false,
|
||||
'base_url' => 'https://api-eu.dhl.com',
|
||||
'default_product' => 'V01PAK',
|
||||
'label_format' => 'PDF',
|
||||
'dimensions' => [
|
||||
'V01PAK' => ['length' => 30, 'width' => 20, 'height' => 10],
|
||||
'default' => ['length' => 30, 'width' => 20, 'height' => 10],
|
||||
],
|
||||
'sender' => [
|
||||
'company' => 'mivita care gmbh',
|
||||
'street' => 'Waldstr.',
|
||||
'houseNumber' => '3e',
|
||||
'postalCode' => '86498',
|
||||
'city' => 'Kettershausen',
|
||||
'country' => 'DE',
|
||||
],
|
||||
]);
|
||||
|
||||
$order = new ShoppingOrder;
|
||||
$order->id = 12345;
|
||||
$order->weight = 2500;
|
||||
$order->exists = true;
|
||||
|
||||
$service = new DhlShipmentService;
|
||||
$result = $service->createShipment($order, 0.5, [
|
||||
'shipping_address' => [
|
||||
'country' => (object) ['code' => 'AT'],
|
||||
],
|
||||
]);
|
||||
|
||||
expect($result['success'])->toBeTrue()
|
||||
->and($result['queued'])->toBeTrue();
|
||||
|
||||
Bus::assertDispatched(CreateShipmentJob::class, function (CreateShipmentJob $job) {
|
||||
return $job->weight === 0.5;
|
||||
});
|
||||
});
|
||||
43
tests/Unit/Dhl/OrderDhlShippingButtonTest.php
Normal file
43
tests/Unit/Dhl/OrderDhlShippingButtonTest.php
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
use Acme\Dhl\Models\DhlShipment;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ShoppingOrder;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
beforeEach(function () {
|
||||
Route::post('modal/load', fn () => '')->name('modal_load');
|
||||
app('router')->getRoutes()->refreshNameLookups();
|
||||
});
|
||||
|
||||
function dhlShippingButtonProbe(): Controller
|
||||
{
|
||||
return new class extends Controller
|
||||
{
|
||||
public function render(ShoppingOrder $order): string
|
||||
{
|
||||
return $this->getDhlShippingButton($order);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
it('renders no shipping button when the order has no DHL shipment', function () {
|
||||
$order = new ShoppingOrder;
|
||||
$order->id = 5;
|
||||
$order->setRelation('dhlShipments', collect());
|
||||
|
||||
expect(dhlShippingButtonProbe()->render($order))->toBe('');
|
||||
});
|
||||
|
||||
it('renders the shipping-fast button when the order has a DHL shipment', function () {
|
||||
$order = new ShoppingOrder;
|
||||
$order->id = 42;
|
||||
$order->setRelation('dhlShipments', collect([new DhlShipment]));
|
||||
|
||||
$html = dhlShippingButtonProbe()->render($order);
|
||||
|
||||
expect($html)
|
||||
->toContain('fa-shipping-fast')
|
||||
->toContain('data-action="user-order-dhl-info"')
|
||||
->toContain('data-id="42"');
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue