Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Garrett/tms 77 carrier lookup via fmcsa #152

Merged
merged 13 commits into from
Feb 21, 2025
42 changes: 42 additions & 0 deletions _ide_helper_actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,48 @@
class CreateCarrier
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static \Illuminate\Foundation\Bus\PendingDispatch dispatch(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchIf(bool $boolean, \App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchUnless(bool $boolean, \App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static dispatchSync(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static dispatchNow(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static dispatchAfterResponse(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
* @method static \App\Models\Carrier run(\App\Models\Carriers\CarrierSaferReport $carrierSaferReport)
*/
class CreateCarrierFromSaferReport
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(string $dotNumber)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(string $dotNumber)
* @method static \Illuminate\Foundation\Bus\PendingDispatch dispatch(string $dotNumber)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchIf(bool $boolean, string $dotNumber)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchUnless(bool $boolean, string $dotNumber)
* @method static dispatchSync(string $dotNumber)
* @method static dispatchNow(string $dotNumber)
* @method static dispatchAfterResponse(string $dotNumber)
* @method static ?\App\Models\Carriers\CarrierSaferReport run(string $dotNumber)
*/
class FmcsaDOTLookup
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(string $name)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(string $name)
* @method static \Illuminate\Foundation\Bus\PendingDispatch dispatch(string $name)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchIf(bool $boolean, string $name)
* @method static \Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Support\Fluent dispatchUnless(bool $boolean, string $name)
* @method static dispatchSync(string $name)
* @method static dispatchNow(string $name)
* @method static dispatchAfterResponse(string $name)
* @method static \Illuminate\Support\Collection run(string $name)
*/
class FmcsaNameLookup
{
}
/**
* @method static \Lorisleiva\Actions\Decorators\JobDecorator|\Lorisleiva\Actions\Decorators\UniqueJobDecorator makeJob(\App\Models\Carrier $carrier, ?string $name = null, ?string $mc_number = null, ?string $dot_number = null, ?int $physical_location_id = null, ?string $contact_email = null, ?string $contact_phone = null)
* @method static \Lorisleiva\Actions\Decorators\UniqueJobDecorator makeUniqueJob(\App\Models\Carrier $carrier, ?string $name = null, ?string $mc_number = null, ?string $dot_number = null, ?int $physical_location_id = null, ?string $contact_email = null, ?string $contact_phone = null)
Expand Down
60 changes: 60 additions & 0 deletions app/Actions/Carriers/CreateCarrierFromSaferReport.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace App\Actions\Carriers;

use App\Http\Resources\CarrierResource;
use App\Models\Carrier;
use App\Models\Carriers\CarrierSaferReport;
use App\Models\Location;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;

class CreateCarrierFromSaferReport
{
use AsAction;

public function handle(
CarrierSaferReport $carrierSaferReport
): Carrier
{

$location = Location::firstOrCreate([
'address_line_1' => $carrierSaferReport->report['general']['carrier']['phyStreet'],
//'address_line_2' => $carrierSaferReport->report['general']['carrier']['phyStreet'],
'address_city' => $carrierSaferReport->report['general']['carrier']['phyCity'],
'address_state' => $carrierSaferReport->report['general']['carrier']['phyState'],
'address_zipcode' => $carrierSaferReport->report['general']['carrier']['phyZipcode'],
]);

$carrier = Carrier::create([
'name' => $carrierSaferReport->name,
'dot_number' => $carrierSaferReport->dot_number,
'physical_location_id' => $location->id,
]);

return $carrier;
}

public function asController(ActionRequest $request, CarrierSaferReport $carrierSaferReport): Carrier
{
return $this->handle(
$carrierSaferReport
);
}

public function jsonResponse(Carrier $carrier)
{
return CarrierResource::make($carrier);
}

public function htmlResponse(Carrier $carrier)
{
return redirect()->route('carriers.show', $carrier);
}

public function rules(): array
{
return [
];
}
}
62 changes: 62 additions & 0 deletions app/Actions/Carriers/FmcsaDOTLookup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace App\Actions\Carriers;

use App\Http\Resources\CarrierResource;
use App\Http\Resources\Carriers\CarrierSaferReportResource;
use App\Integrations\FmcsaService;
use App\Models\Carrier;
use App\Models\Carriers\CarrierSaferReport;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;

class FmcsaDOTLookup
{
use AsAction;

public function handle(
string $dotNumber,
): ?CarrierSaferReport
{
$fmcsaService = new FmcsaService();

$results = $fmcsaService->getFullReport($dotNumber);

if (isset($results['error'])) {
return null;
}

// We get a single result here so call single report not reports
$carrierSaferReport = CarrierSaferReport::createFromFmcsaReport($results);

return $carrierSaferReport;
}

public function asController(ActionRequest $request): ?CarrierSaferReport
{
return $this->handle(
dotNumber: $request->validated('dotNumber'),
);
}

public function jsonResponse(?CarrierSaferReport $carrierSaferReport)
{
if ($carrierSaferReport) {
return new CarrierSaferReportResource($carrierSaferReport);
}

return response()->json(['error' => 'Carrier not found'], 404);
}

public function htmlResponse(?CarrierSaferReport $carrierSaferReport)
{
return response('404');
}

public function rules(): array
{
return [
'dotNumber' => ['required', 'string'],
];
}
}
63 changes: 63 additions & 0 deletions app/Actions/Carriers/FmcsaNameLookup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace App\Actions\Carriers;

use App\Http\Resources\CarrierResource;
use App\Http\Resources\Carriers\CarrierSaferReportResource;
use App\Integrations\FmcsaService;
use App\Models\Carrier;
use App\Models\Carriers\CarrierSaferReport;
use Illuminate\Support\Collection;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;

class FmcsaNameLookup
{
use AsAction;

/**
* @return \Illuminate\Support\Collection<int, \App\Models\Carriers\CarrierSaferReport>
*/
public function handle(
string $name,
): Collection {
$fmcsaService = new FmcsaService();

$results = $fmcsaService->searchCarrierName($name);

if (isset($results['error'])) {
return collect([]);
}

$carrierSaferReports = CarrierSaferReport::createFromFmcsaReports($results);

return $carrierSaferReports;
}

/**
* @return \Illuminate\Support\Collection<int, \App\Models\Carriers\CarrierSaferReport>
*/
public function asController(ActionRequest $request): Collection
{
return $this->handle(
name: $request->validated('name'),
);
}

public function jsonResponse(Collection $carrierSaferReports)
{
return CarrierSaferReportResource::collection($carrierSaferReports);
}

public function htmlResponse(Collection $carrierSaferReports)
{
return response('404');
}

public function rules(): array
{
return [
'name' => ['required', 'string', 'min:3', 'max:255'],
];
}
}
37 changes: 37 additions & 0 deletions app/Http/Resources/Carriers/CarrierSaferReportResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace App\Http\Resources\Carriers;

use App\Http\Resources\CarrierResource;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

/**
* @mixin \App\Models\Carriers\CarrierSaferReport
*/
class CarrierSaferReportResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'dot_number' => $this->dot_number,
'report' => [
'name' => $this->report['general']['carrier']['legalName'],
'dba' => $this->report['general']['carrier']['dbaName'],
'full_address' => sprintf('%s %s, %s %s', $this->report['general']['carrier']['phyStreet'], $this->report['general']['carrier']['phyCity'], $this->report['general']['carrier']['phyState'], $this->report['general']['carrier']['phyZipcode']),
'address' => [
'street' => $this->report['general']['carrier']['phyStreet'],
'city' => $this->report['general']['carrier']['phyCity'],
'state' => $this->report['general']['carrier']['phyState'],
'zip' => $this->report['general']['carrier']['phyZipcode'],
],
'raw' => $this->report,
],
'is_full_report' => $this->report['full-report'] === 'true',
'carrier' => $this->whenLoaded('carrier', function () {
return new CarrierResource($this->carrier);
}),
];
}
}
Loading