$input * * @throws ValidationException */ public function create(array $input): User { Validator::make($input, [ 'name' => [ 'required', 'string', 'max:255', ], 'email' => [ 'required', 'string', 'email', 'max:255', new UniqueEloquent(User::class, 'email', function (Builder $builder): Builder { /** @var Builder $builder */ return $builder->where('is_placeholder', '=', false); }), ], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', 'newsletter_consent' => [ 'boolean', ], ])->validate(); $timezone = null; if (array_key_exists('timezone', $input) && is_string($input['timezone'])) { if (app(TimezoneService::class)->isValid($input['timezone'])) { $timezone = $input['timezone']; } else { $timezone = app(TimezoneService::class)->mapLegacyTimezone($input['timezone']); if ($timezone === null) { Log::debug('Invalid timezone', ['timezone' => $input['timezone']]); } } } $ipLookupResponse = app(IpLookupServiceContract::class)->lookup(request()->ip()); $startOfWeek = Weekday::Monday; $currency = null; if ($ipLookupResponse !== null) { $startOfWeek = $ipLookupResponse->startOfWeek ?? Weekday::Monday; if ($timezone === null) { $timezone = $ipLookupResponse->timezone; } $currency = $ipLookupResponse->currency; } $user = null; $organization = null; DB::transaction(function () use (&$user, &$organization, $input, $timezone, $startOfWeek, $currency) { $user = User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), 'timezone' => $timezone ?? 'UTC', 'week_start' => $startOfWeek, ]); $organization = new Organization; $organization->name = explode(' ', $user->name, 2)[0]."'s Organization"; $organization->personal_team = true; $organization->currency = $currency ?? 'EUR'; $organization->owner()->associate($user); $organization->save(); $organization->users()->attach( $user, [ 'role' => Role::Owner->value, ] ); $user->ownedTeams()->save($organization); }); $newsletterConsent = isset($input['newsletter_consent']) && (bool) $input['newsletter_consent']; if ($newsletterConsent) { NewsletterRegistered::dispatch($input['name'], $input['email'], $user->getKey()); } return $user; } }