diff --git a/app/Http/Controllers/Sales/TenantProspectController.php b/app/Http/Controllers/Sales/TenantProspectController.php index d44472a8..730babef 100644 --- a/app/Http/Controllers/Sales/TenantProspectController.php +++ b/app/Http/Controllers/Sales/TenantProspectController.php @@ -65,6 +65,7 @@ public function store(Request $request) 'contact_email' => 'nullable|email|max:100', 'address' => 'nullable|string|max:500', 'business_card' => 'nullable|image|max:5120', + 'business_card_image_data' => 'nullable|string', 'memo' => 'nullable|string|max:1000', ]); @@ -79,9 +80,14 @@ public function store(Request $request) // 등록자는 현재 로그인 사용자 $validated['registered_by'] = auth()->id(); + // Base64 이미지 데이터가 있으면 전달 + $businessCardBase64 = $validated['business_card_image_data'] ?? null; + unset($validated['business_card_image_data']); + $this->service->register( $validated, - $request->file('business_card') + $request->file('business_card'), + $businessCardBase64 ); return redirect()->route('sales.prospects.index') diff --git a/app/Services/Sales/TenantProspectService.php b/app/Services/Sales/TenantProspectService.php index 94f46c24..655fa5c5 100644 --- a/app/Services/Sales/TenantProspectService.php +++ b/app/Services/Sales/TenantProspectService.php @@ -14,17 +14,19 @@ class TenantProspectService /** * 명함 등록 (영업권 확보) */ - public function register(array $data, ?UploadedFile $businessCard = null): TenantProspect + public function register(array $data, ?UploadedFile $businessCard = null, ?string $businessCardBase64 = null): TenantProspect { - return DB::transaction(function () use ($data, $businessCard) { + return DB::transaction(function () use ($data, $businessCard, $businessCardBase64) { $now = now(); $expiresAt = $now->copy()->addMonths(TenantProspect::VALIDITY_MONTHS); $cooldownEndsAt = $expiresAt->copy()->addMonths(TenantProspect::COOLDOWN_MONTHS); - // 명함 이미지 저장 + // 명함 이미지 저장 (파일 업로드 또는 Base64) $businessCardPath = null; if ($businessCard) { $businessCardPath = $this->uploadBusinessCard($businessCard, $data['registered_by']); + } elseif ($businessCardBase64) { + $businessCardPath = $this->saveBase64Image($businessCardBase64, $data['registered_by']); } return TenantProspect::create([ @@ -265,6 +267,32 @@ private function uploadBusinessCard(UploadedFile $file, int $userId): string return $this->uploadAttachment($file, $userId); } + /** + * Base64 이미지 저장 + */ + private function saveBase64Image(string $base64Data, int $userId): ?string + { + // data:image/jpeg;base64,... 형식에서 데이터 추출 + if (preg_match('/^data:image\/(\w+);base64,/', $base64Data, $matches)) { + $extension = $matches[1]; + $base64Data = preg_replace('/^data:image\/\w+;base64,/', '', $base64Data); + } else { + $extension = 'jpg'; + } + + $imageData = base64_decode($base64Data); + if ($imageData === false) { + return null; + } + + $storedName = Str::uuid() . '.' . $extension; + $filePath = "prospects/{$userId}/{$storedName}"; + + Storage::disk('tenant')->put($filePath, $imageData); + + return $filePath; + } + /** * 명함 이미지 삭제 */