whereRaw('LOWER(TRIM(company_name)) = LOWER(TRIM(?))', [$companyName]) ->first(); if ($partner) { if ($partner->trashed()) { $partner->restore(); } $partner->update(array_merge($data, [ 'status' => PartnerAgreementStatusEnum::ACTIVE, ])); return [$partner->fresh(), false]; } $user = $this->findOrCreateUser($companyName); $partner = PartnerAgreement::create(array_merge($data, [ 'company_name' => $companyName, 'user_id' => $user->id, 'status' => PartnerAgreementStatusEnum::ACTIVE, ])); return [$partner, true]; } private function findOrCreateUser(string $companyName): User { $slug = Str::slug($companyName); $email = "{$slug}@serprati.com"; $counter = 2; while (User::where('email', $email)->exists()) { $email = "{$slug}{$counter}@serprati.com"; $counter++; } return User::create([ 'name' => $companyName, 'email' => $email, 'password' => Hash::make('Serprati2026'), 'type' => UserTypeEnum::PARCEIRO, 'status' => UserStatusEnum::ACTIVE, ]); } private function parsePrice(?string $value): ?float { if (empty($value)) { return null; } $cleaned = preg_replace('/[^\d,]/', '', (string) $value); $cleaned = str_replace(',', '.', $cleaned); return is_numeric($cleaned) ? (float) $cleaned : null; } private function cell(mixed $value): string { return trim(preg_replace('/\s+/', ' ', (string) ($value ?? ''))); } private function firstLine(mixed $value): string { return trim(explode("\n", (string) ($value ?? ''))[0]); } }