twilioPhoneService = app(TwilioPhoneService::class); return $form->schema([ TextInput::make('area_code') ->label('Area Code') ->placeholder('Enter Area Code') ->required() ->reactive() ->afterStateUpdated(function (callable $set) { $set('phone_number', null); }) ->hint('Enter the area code to search for available Twilio numbers'), Select::make('phone_number') ->label('Available Twilio Numbers') ->searchable() ->options(function (callable $get) { $areaCode = $get('area_code'); if ($areaCode) { return $this->twilioPhoneService->getAvailablePhoneNumbers($areaCode); } return []; }) ->required() ->hint('Select a Twilio number to purchase') ->reactive() ->afterStateUpdated(function (callable $set, $state) { if (is_array($state)) { $set('phone_number', $state[0]); } else { $set('phone_number', $state); } }), TextInput::make('route_to') ->label('Route To') ->required() ->tel()->mask('(999) 999-9999') ->placeholder('Enter the phone number to route to') ->rules(['phone:US,MX,CA']) ->hint('The phone number to which Twilio will route calls'), Select::make('type') ->label('Type') ->searchable() ->options([ 'revenue_code' => 'Revenue Code', 'operational_user' => 'Operational User', ]) ->required() ->reactive(), Select::make('value') ->label('Value') ->searchable() ->options(function (callable $get) { $tenant = auth()->user()->getCurrentTenant(); $clientId = $tenant ? $tenant->id : null; if ($get('type') === 'revenue_code' && $clientId) { return Load::where('client_id', $clientId) ->whereNotNull('revenue_code') ->pluck('revenue_code', 'revenue_code') ->toArray(); } elseif ($get('type') === 'operational_user' && $clientId) { return User::selectRaw('CONCAT(first_name, \' \', last_name) as full_name, id') ->whereHas('clients', function ($query) use ($clientId) { $query->where('client_id', $clientId) ->whereNull('client_user.deleted_at'); }) ->pluck('full_name', 'id') ->toArray(); } return []; }) ->required() ->visible(fn(callable $get) => in_array($get('type'), ['revenue_code', 'operational_user'])) ->hint('Select an associated revenue code or operational user'), ]); } protected function mutateFormDataBeforeCreate(array $data): array { $companyName = auth()->user()->getCurrentTenant()->name; $type = $data['type']; $value = $data['value']; $phoneNumber = $data['phone_number']; $result = $this->twilioPhoneService->purchasePhoneNumberAndSetWebhook($phoneNumber, $companyName, $type, $value); $data['phone_number'] = $result['phone_number']; $data['sid'] = $result['sid']; $data['route_to'] = $data['route_to']; $data['type'] = $data['type']; $data['value'] = $data['value']; return $data; } }