From 1c68fff301f4203240ff55876112f1341911fab6 Mon Sep 17 00:00:00 2001 From: twotalesanimation <80506065+twotalesanimation@users.noreply.github.com> Date: Fri, 2 Jan 2026 17:26:11 +0200 Subject: [PATCH] feat: Add CreateShipmentOnReadyToShip listener to handle webhook-triggered shipments - Create new listener that fires on ReadyToShipIntent event - Register listener in EventServiceProvider - Fix log statements in ShippingController to use order UUID instead of ID - Now when Trello card moves to 'Ready to Ship', backend automatically creates shipment --- app/Http/Controllers/ShippingController.php | 7 +-- app/Listeners/CreateShipmentOnReadyToShip.php | 46 +++++++++++++++++++ app/Providers/EventServiceProvider.php | 7 +++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 app/Listeners/CreateShipmentOnReadyToShip.php diff --git a/app/Http/Controllers/ShippingController.php b/app/Http/Controllers/ShippingController.php index 287c54e..dd8a4a4 100644 --- a/app/Http/Controllers/ShippingController.php +++ b/app/Http/Controllers/ShippingController.php @@ -23,6 +23,7 @@ class ShippingController extends Controller */ public function createShipment(Request $request, Order $order) { + Log::info('Initiating shipment creation', ['order_uuid' => $order->uuid]); // Guard 1: Verify packing completed with valid dimensions if (! $this->validatePackingGate($order)) { return response()->json([ @@ -60,7 +61,7 @@ class ShippingController extends Controller // Guard 4: Idempotency - if already shipped, return existing shipment if ($order->courier_waybill_id) { - Log::info('Shipment already exists, returning existing', ['order_id' => $order->id]); + Log::info('Shipment already exists, returning existing', ['order_uuid' => $order->uuid]); return response()->json([ 'success' => true, @@ -90,7 +91,7 @@ class ShippingController extends Controller ]); Log::info('Shipment created with courier', [ - 'order_id' => $order->id, + 'order_uuid' => $order->uuid, 'waybill_id' => $shipmentData['waybill_id'], 'tracking_number' => $shipmentData['tracking_number'], ]); @@ -120,7 +121,7 @@ class ShippingController extends Controller ]); } catch (\Exception $e) { Log::error('Failed to create shipment', [ - 'order_id' => $order->id, + 'order_uuid' => $order->uuid, 'error' => $e->getMessage(), ]); diff --git a/app/Listeners/CreateShipmentOnReadyToShip.php b/app/Listeners/CreateShipmentOnReadyToShip.php new file mode 100644 index 0000000..9a63036 --- /dev/null +++ b/app/Listeners/CreateShipmentOnReadyToShip.php @@ -0,0 +1,46 @@ + $event->order->uuid, + ]); + + try { + // Create a mock request object for the controller + $request = new \Illuminate\Http\Request(); + + // Call the shipping controller to create shipment + $this->shippingController->createShipment($request, $event->order); + + Log::info('Shipment created successfully from webhook', [ + 'order_uuid' => $event->order->uuid, + ]); + } catch (\Exception $e) { + Log::error('Failed to create shipment from Ready to Ship intent', [ + 'order_uuid' => $event->order->uuid, + 'error' => $e->getMessage(), + ]); + } + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index db1d45a..027e148 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,10 @@ use App\Events\ParcelInTransit; use App\Events\ProofApproved; use App\Events\ProofRevisionRequested; use App\Events\ProofUploaded; +use App\Events\ReadyToShipIntent; use App\Events\ShipmentCreated; use App\Events\ShipmentCreationFailed; +use App\Listeners\CreateShipmentOnReadyToShip; use App\Listeners\NotifySlackOnOrderCreated; use App\Listeners\NotifySlackOnOrderPacked; use App\Listeners\NotifySlackOnParcelCollected; @@ -42,8 +44,13 @@ class EventServiceProvider extends ServiceProvider // Packing events OrderPacked::class => [ NotifySlackOnOrderPacked::class, + ],Ready to Ship intent (from Trello webhook) + ReadyToShipIntent::class => [ + CreateShipmentOnReadyToShip::class, ], + // + // Shipment events ShipmentCreated::class => [ NotifySlackOnShipmentCreated::class,