Skip to content

Commit

Permalink
Merge pull request #189 from loadpartner/garrett/tms-103-shipment-lif…
Browse files Browse the repository at this point in the history
…ecycle-state-system

Garrett/tms 103 shipment lifecycle state system
  • Loading branch information
adrenallen authored Mar 3, 2025
2 parents 8aa9d02 + 77eec41 commit 8b926f9
Show file tree
Hide file tree
Showing 32 changed files with 2,058 additions and 217 deletions.
28 changes: 28 additions & 0 deletions _ide_helper_actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,20 @@ class SendInvite
}
namespace App\Actions\Shipments;

/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(\App\Models\Shipments\Shipment $shipment)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(\App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch dispatch(\App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchIf(bool $boolean, \App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchUnless(bool $boolean, \App\Models\Shipments\Shipment $shipment)
* @method static dispatchSync(\App\Models\Shipments\Shipment $shipment)
* @method static dispatchNow(\App\Models\Shipments\Shipment $shipment)
* @method static dispatchAfterResponse(\App\Models\Shipments\Shipment $shipment)
* @method static \App\Models\Shipments\Shipment run(\App\Models\Shipments\Shipment $shipment)
*/
class CancelShipment
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(array $customerIds, int $carrierId, array $stops, ?float $weight = null, ?float $tripDistance = null, ?int $trailerTypeId = null, ?int $trailerSizeId = null, ?bool $trailerTemperatureRange = false, ?float $trailerTemperature = null, ?float $trailerTemperatureMaximum = null, ?string $shipmentNumber = null)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(array $customerIds, int $carrierId, array $stops, ?float $weight = null, ?float $tripDistance = null, ?int $trailerTypeId = null, ?int $trailerSizeId = null, ?bool $trailerTemperatureRange = false, ?float $trailerTemperature = null, ?float $trailerTemperatureMaximum = null, ?string $shipmentNumber = null)
Expand All @@ -296,6 +310,20 @@ class SendInvite
class CreateShipment
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(\App\Models\Shipments\Shipment $shipment)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(\App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch dispatch(\App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchIf(bool $boolean, \App\Models\Shipments\Shipment $shipment)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchUnless(bool $boolean, \App\Models\Shipments\Shipment $shipment)
* @method static dispatchSync(\App\Models\Shipments\Shipment $shipment)
* @method static dispatchNow(\App\Models\Shipments\Shipment $shipment)
* @method static dispatchAfterResponse(\App\Models\Shipments\Shipment $shipment)
* @method static \App\Models\Shipments\Shipment run(\App\Models\Shipments\Shipment $shipment)
*/
class DispatchShipment
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(\App\Models\Shipments\Shipment $shipment, int $carrierId)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(\App\Models\Shipments\Shipment $shipment, int $carrierId)
Expand Down
42 changes: 42 additions & 0 deletions app/Actions/Shipments/CancelShipment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace App\Actions\Shipments;

use App\Models\Shipments\Shipment;
use App\States\Shipments\Canceled;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;

class CancelShipment
{
use AsAction;

public function handle(
Shipment $shipment,
): Shipment {

$shipment->state->transitionTo(Canceled::class);

return $shipment;
}

public function asController(ActionRequest $request, Shipment $shipment)
{
$this->handle(
$shipment,
);

return redirect()->back()->with('success', 'Shipment canceled successfully');
}

public function rules(): array
{
return [
];
}

public function authorize(ActionRequest $request): bool
{
return $request->user()->can(\App\Enums\Permission::SHIPMENT_EDIT);
}
}
48 changes: 48 additions & 0 deletions app/Actions/Shipments/DispatchShipment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace App\Actions\Shipments;

use App\Enums\TemperatureUnit;
use App\Http\Requests\Shipments\UpdateShipmentGeneralRequest;
use App\Http\Requests\Shipments\UpdateShipmentNumberRequest;
use App\Models\Shipments\Shipment;
use App\States\Shipments\Dispatched;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Nette\NotImplementedException;

class DispatchShipment
{
use AsAction;

public function handle(
Shipment $shipment,
): Shipment {

$shipment->state->transitionTo(Dispatched::class);

return $shipment;
}

public function asController(ActionRequest $request, Shipment $shipment)
{
$this->handle(
$shipment,
);

return redirect()->back()->with('success', 'Shipment dispatched successfully');
}

public function rules(): array
{
return [
];
}

public function authorize(ActionRequest $request): bool
{
return $request->user()->can(\App\Enums\Permission::SHIPMENT_EDIT);
}
}
9 changes: 3 additions & 6 deletions app/Actions/Shipments/UpdateShipmentCarrierDetails.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@

namespace App\Actions\Shipments;

use App\Enums\TemperatureUnit;
use App\Http\Requests\Shipments\UpdateShipmentGeneralRequest;
use App\Http\Requests\Shipments\UpdateShipmentNumberRequest;
use App\Events\Shipments\ShipmentCarrierUpdated;
use App\Models\Shipments\Shipment;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Nette\NotImplementedException;

class UpdateShipmentCarrierDetails
{
Expand All @@ -25,6 +20,8 @@ public function handle(
'carrier_id' => $carrierId,
]);

event(new ShipmentCarrierUpdated($shipment));

return $shipment;
}

Expand Down
3 changes: 3 additions & 0 deletions app/Actions/Shipments/UpdateShipmentStops.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Actions\Shipments;

use App\Enums\StopType;
use App\Events\Shipments\ShipmentStopsUpdated;
use App\Models\Shipments\Shipment;
use App\Models\Shipments\ShipmentStop;
use Illuminate\Validation\Rule;
Expand All @@ -26,6 +27,8 @@ public function handle(
$shipment->stops()->updateOrCreate(['id' => $stop['id']], $stop);
}

event(new ShipmentStopsUpdated($shipment));

return $shipment;
}

Expand Down
38 changes: 38 additions & 0 deletions app/Events/Shipments/ShipmentCarrierUpdated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace App\Events\Shipments;

use App\Models\Shipments\Shipment;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ShipmentCarrierUpdated
{
use Dispatchable, InteractsWithSockets, SerializesModels;

/**
* Create a new event instance.
*/
public function __construct(
public Shipment $shipment,
) {

}

/**
* Get the channels the event should broadcast on.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(): array
{
return [

];
}
}
38 changes: 38 additions & 0 deletions app/Events/Shipments/ShipmentStopsUpdated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace App\Events\Shipments;

use App\Models\Shipments\Shipment;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ShipmentStopsUpdated
{
use Dispatchable, InteractsWithSockets, SerializesModels;

/**
* Create a new event instance.
*/
public function __construct(
public Shipment $shipment,
) {

}

/**
* Get the channels the event should broadcast on.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(): array
{
return [

];
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/Shipments/ShipmentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public function create()
public function show(Shipment $shipment)
{
return Inertia::render('Shipments/Show', [
'shipment' => $shipment->load('carrier', 'customers'),
'shipment' => ShipmentResource::make($shipment->load('carrier', 'customers')),
'stops' => ShipmentStopResource::collection($shipment->stops->load('facility')),
'trailerTypes' => TrailerTypeResource::collection(TrailerType::all()),
'trailerSizes' => TrailerSizeResource::collection(TrailerSize::all()),
Expand Down
2 changes: 2 additions & 0 deletions app/Http/Resources/ShipmentResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public function toArray(Request $request): array
'stops' => ShipmentStopResource::collection($this->whenLoaded('stops')),
'lane' => $this->whenLoaded('stops', $this->lane()),
'next_stop' => $this->whenLoaded('stops', new ShipmentStopResource($this->nextStop)),
'state_label' => $this->state->label(),
'state' => $this->state,
];
}
}
Loading

0 comments on commit 8b926f9

Please sign in to comment.