Feature: Order Updates, Events, Order Flows, Shipment And COD support

This commit is contained in:
2026-09-14 00:03:06 +03:00
parent 78bbd8390a
commit 44c6b7defd
73 changed files with 2854 additions and 464 deletions
@@ -0,0 +1,55 @@
<?php
namespace Modules\Core\Shipping\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Core\Shipping\Contracts\CarrierFulfillmentInterface;
use Modules\Core\Shipping\Models\Shipment;
/**
* Streams a carrier's raw label bytes (CarrierFulfillmentInterface::
* printLabel() — already whatever file format the carrier's own API
* returns, e.g. a PDF for both ACS and Box Now today) straight to the
* browser. Only reachable via a short-lived signed URL (see
* Modules\Core\Shipping\Extensions\OrderShipmentsExtension's "Print
* Label" action) — the same auth model Lunar's own vendor
* DownloadPdfController uses for order PDFs (a valid signature IS the
* auth check; there is no separate staff-session check here, matching
* that precedent), so the link only works for the few minutes it's
* actually open in a browser tab.
*
* Looks the Shipment up manually from a plain {shipment} id rather than
* relying on implicit route-model-binding — this route is registered via
* loadRoutesFrom() with no middleware group (see
* Modules\Core\Providers\ShippingServiceProvider::boot()), so
* SubstituteBindings never runs and a type-hinted Shipment parameter
* silently resolves to an empty, non-existent model instead of 404ing.
*
* Sets label_printed_at as a side effect of a successful stream — this is
* the first place in the codebase that actually delivers a label's bytes
* to a human; the existing Modules\Core\Shipping\Filament\Pages\
* ManagePickupManifests "Print" action calls printLabel() too, but only
* to mark the timestamp, discarding the returned bytes entirely (no
* download route existed until this one).
*/
class DownloadShipmentLabelController extends Controller
{
public function __invoke(Request $request, int $shipment)
{
if (! $request->hasValidSignature()) {
abort(401);
}
$shipment = Shipment::findOrFail($shipment);
$service = app(CarrierFulfillmentInterface::class, ['carrier' => $shipment->carrier]);
$bytes = $service->printLabel($shipment);
return response($bytes, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="shipment-'.$shipment->tracking_reference.'.pdf"',
]);
}
}