types->pluck('type')->contains(ClientTypeValue::ADMIN->value); } public static function infolist(Infolist $infolist): Infolist { return $infolist->schema([ \Filament\Infolists\Components\Section::make('Information')->schema([ TextEntry::make('legal_name') ->label('Name'), TextEntry::make('mc_number') ->label('MC Number'), TextEntry::make('dot_number') ->label('DOT Number'), TextEntry::make('email') ->label('Email'), TextEntry::make('address_line_1') ->label('Street Address'), TextEntry::make('city') ->label('City'), TextEntry::make('state') ->label('State'), TextEntry::make('postal_code') ->label('Postal Code'), ])->columns(4) ]); } public static function form(Form $form): Form { return $form ->schema([ Section::make('Company Information') ->schema([]) ->columns(4) ->headerActions([ Action::make('Contact Carrier') ->icon('heroicon-o-envelope') ->form([ Select::make('method') ->live() ->options([ 'email' => 'Email', 'sms' => 'Text Message', 'phone' => 'Phone', ]), Grid::make('email') ->schema(function (Get $get): array { return match ($get('method')) { 'email' => [ TextInput::make('subject') ->label('Subject') ->placeholder('Subject') ->required(), Textarea::make('message') ->label('Message') ->placeholder('Message') ->required(), ], 'sms' => [ Textarea::make('message') ->label('Message') ->placeholder('Message') ->maxLength(160 * 3), ], 'phone' => [ TextInput::make('phone_number') ->label('Your Phone Number') ->tel() ->mask('(999) 999-9999') ->hint('Enter your phone number to be connected to the carrier.') ->placeholder('Phone Number') ->required(), ], default => [], }; }), ]) ->modal() ->modalSubmitActionLabel('Contact Carrier'), ]), ]); } public static function table(Table $table): Table { $truckMax = ClientCarrierEquipment::select(DB::raw('MAX(quantity) AS maximum'))->first()->maximum; return $table ->paginated([50]) ->searchable(false) ->columns([ TextColumn::make('client.name') ->label('Client') ->visible(fn() => auth()->user() instanceof User) ->visible(!static::isScopedToTenant()), TextColumn::make('name') ->label('Company Name') ->searchable() ->sortable(), TextColumn::make('dot_number') ->label('DOT Number'), TextColumn::make('mc_number') ->label('MC Number'), TextColumn::make('equipment') ->label('Equipment Types') ->getStateUsing(function (ClientCarrier $clientCarrier) { if ($clientCarrier->equipment->count() === 0 && $clientCarrier->carrier->is_imported === true) { return [ 'Power Units x ' . $clientCarrier->carrier->power_units, 'Trailers x ' . $clientCarrier->carrier->total_trailers, ]; } elseif ($clientCarrier->equipment->count() > 0) { return $clientCarrier->equipment ->sortBy(function (ClientCarrierEquipment $equipment) { return $equipment->type->name; }) ->map(function (ClientCarrierEquipment $equipment) { return "{$equipment->type->name} x {$equipment->quantity}"; }); } return 'N/A'; }) ->listWithLineBreaks() ->width('10%'), TextColumn::make('active') ->label('Status') ->badge() ->getStateUsing(function (ClientCarrier $clientCarrier) { return $clientCarrier->active ? 'Active' : 'Inactive'; }) ->color(function (ClientCarrier $clientCarrier) { return $clientCarrier->active ? 'success' : 'info'; }), TextColumn::make('Bookings')->state(function (ClientCarrier $clientCarrier) { return $clientCarrier->bookings_count; }), TextColumn::make('Contacts')->state(function (ClientCarrier $clientCarrier) { return $clientCarrier->contacts_count; }), ]) ->filters([ SelectFilter::make('client_id')->label('Client') ->multiple() ->options(Client::all()->pluck('name', 'id')) ->visible(!static::isScopedToTenant()), Filter::make('keyword') ->indicateUsing(function (array $data) { if (empty($data['keyword'])) { return; } return 'Search Term: ' . $data['keyword']; }) ->form([ TextInput::make('keyword')->label('Name, MC Number, or DOT Number'), ]) ->query(function (Builder $query, array $data) { if (!empty($data['keyword'])) { $query->where(function (Builder $query) use ($data) { $query->where('name', 'ILIKE', '%' . $data['keyword'] . '%') ->orWhere('legal_name', 'ILIKE', '%' . $data['keyword'] . '%'); }); if (Str::of($data['keyword'])->isMatch('/[0-9]/')) { $query->orWhereHas('carrier', function (Builder $query) use ($data) { $query->where('mc_number', 'ILIKE', $data['keyword'] . '%') ->orWhere('dot_number', 'ILIKE', $data['keyword'] . '%'); }); } return $query; } }), SelectFilter::make('client') ->options(function () { return Client::has('carriers')->get()->pluck('name', 'id'); }) ->preload() ->multiple() ->placeholder('Choose Client') ->label('Client') ->modifyQueryUsing(function (Builder $query, array $data): Builder { if (!empty($data['values']) && count($data['values']) > 0) { return $query->whereIn('client_id', $data['values']); } return $query; }) ->visible(User::getCurrentTenant()->types()->where('type', ClientTypeValue::ADMIN)->exists()), Filter::make('equipment') ->form([ Select::make('equipment_type') ->label('Equipment') ->options(function () { return Equipment::orderBy('name')->get()->pluck('name', 'id'); }) ->preload(true) ->multiple() ->placeholder('Choose Equipment Type'), Select::make('equipment_minimum') ->label('Truck Count') ->options([ 1 => '1-50', 2 => '51-100', 3 => '100+', ]), ]) ->columns(2) ->columnSpan(2) ->modifyQueryUsing(function (Builder $query, array $data) use ($truckMax): Builder { if (!empty($data['equipment_type']) && count($data['equipment_type']) > 0) { $query->whereHas('equipment', function (Builder $query) use ($data) { $query->whereIn('equipment_id', $data['equipment_type']); }); } if ($data['equipment_minimum'] !== null && $data['equipment_minimum'] > 0) { [$minimumTrucks, $maximumTrucks] = match ((int) $data['equipment_minimum']) { 1 => [1, 50], 2 => [51, 100], 3 => [101, $truckMax], default => [1, $truckMax], }; $query->whereIn('client_carriers.id', function ($query) use ($maximumTrucks, $minimumTrucks, $data) { $query->select('client_carrier_equipment.carrier_id') ->from('client_carrier_equipment') ->groupBy('client_carrier_equipment.carrier_id') ->havingRaw('SUM(client_carrier_equipment.quantity) >= ? AND SUM(client_carrier_equipment.quantity) <= ?', [$minimumTrucks, $maximumTrucks]); if (!empty($data['equipment_type']) && count($data['equipment_type']) > 0) { $query->whereIn('client_carrier_equipment.equipment_id', $data['equipment_type']); } }); } return $query; }), ]) ->modifyQueryUsing(function (Builder $query) { return $query->where('client_carriers.active', true) ->withCount('contacts', 'bookings'); }) ->defaultSort('name') ->persistFiltersInSession() ->persistSortInSession() ->actions([ ViewAction::make(), ]) ->emptyStateActions([]) ->bulkActions([]) ->headerActions([]) ->filtersFormColumns(4) ->emptyStateActions([]) ->bulkActions([]); } public static function getRelations(): array { return [ PreferredLanesRelationManager::class, AvailableTrucksRelationManager::class, ]; } public static function getPages(): array { return [ 'index' => Pages\ListCarriers::route('/'), 'view' => Pages\ViewCarrier::route('/{record}'), ]; } public static function relationManagers(): array { return [ 'preferredLanes' => PreferredLanesRelationManager::class, ]; } }