From 9f49501d336e636e25d4d8145dbd0eb03197ed25 Mon Sep 17 00:00:00 2001 From: pro Date: Tue, 27 Jan 2026 23:42:31 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=8B=A0=EB=B6=84=EC=A6=9D/=ED=86=B5?= =?UTF-8?q?=EC=9E=A5=EC=82=AC=EB=B3=B8=20=EC=B2=A8=EB=B6=80=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SalesProspect 모델: id_card_image, bankbook_image 필드 추가 - hasIdCard(), hasBankbook() 메서드 및 URL 접근자 추가 - SalesProspectController: store/update/destroy에 처리 로직 추가 - create.blade.php: 드래그앤드롭 업로드 UI 추가 - edit.blade.php: 기존 이미지 표시 및 교체 UI 추가 Co-Authored-By: Claude Opus 4.5 --- .../Sales/SalesProspectController.php | 57 ++++++++++-- app/Models/Sales/SalesProspect.php | 42 +++++++++ .../views/sales/prospects/create.blade.php | 93 +++++++++++++++++++ .../views/sales/prospects/edit.blade.php | 31 +++++++ 4 files changed, 213 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Sales/SalesProspectController.php b/app/Http/Controllers/Sales/SalesProspectController.php index 396f36e2..b9f85555 100644 --- a/app/Http/Controllers/Sales/SalesProspectController.php +++ b/app/Http/Controllers/Sales/SalesProspectController.php @@ -94,13 +94,27 @@ public function store(Request $request) 'address' => 'nullable|string|max:500', 'status' => 'required|in:lead,prospect,negotiation,contracted,lost', 'business_card_image_data' => 'nullable|string', + 'id_card_image_data' => 'nullable|string', + 'bankbook_image_data' => 'nullable|string', ]); // 명함 이미지 저장 (Base64) if (!empty($validated['business_card_image_data'])) { - $validated['business_card_image'] = $this->saveBusinessCardImage($validated['business_card_image_data']); - unset($validated['business_card_image_data']); + $validated['business_card_image'] = $this->saveBase64Image($validated['business_card_image_data'], 'business-cards'); } + unset($validated['business_card_image_data']); + + // 신분증 이미지 저장 (Base64) + if (!empty($validated['id_card_image_data'])) { + $validated['id_card_image'] = $this->saveBase64Image($validated['id_card_image_data'], 'id-cards'); + } + unset($validated['id_card_image_data']); + + // 통장사본 이미지 저장 (Base64) + if (!empty($validated['bankbook_image_data'])) { + $validated['bankbook_image'] = $this->saveBase64Image($validated['bankbook_image_data'], 'bankbooks'); + } + unset($validated['bankbook_image_data']); $prospect = SalesProspect::create($validated); @@ -157,20 +171,40 @@ public function update(Request $request, int $id) 'address' => 'nullable|string|max:500', 'status' => 'required|in:lead,prospect,negotiation,contracted,lost', 'business_card' => 'nullable|image|max:5120', + 'id_card' => 'nullable|image|max:5120', + 'bankbook' => 'nullable|image|max:5120', ]); // 명함 이미지 업로드 처리 if ($request->hasFile('business_card')) { - // 기존 이미지 삭제 if ($prospect->business_card_image) { Storage::disk('public')->delete($prospect->business_card_image); } - $validated['business_card_image'] = $request->file('business_card') ->store('business-cards', 'public'); } unset($validated['business_card']); + // 신분증 이미지 업로드 처리 + if ($request->hasFile('id_card')) { + if ($prospect->id_card_image) { + Storage::disk('public')->delete($prospect->id_card_image); + } + $validated['id_card_image'] = $request->file('id_card') + ->store('id-cards', 'public'); + } + unset($validated['id_card']); + + // 통장사본 이미지 업로드 처리 + if ($request->hasFile('bankbook')) { + if ($prospect->bankbook_image) { + Storage::disk('public')->delete($prospect->bankbook_image); + } + $validated['bankbook_image'] = $request->file('bankbook') + ->store('bankbooks', 'public'); + } + unset($validated['bankbook']); + $prospect->update($validated); return redirect()->route('sales.prospects.show', $prospect->id) @@ -184,9 +218,12 @@ public function destroy(int $id) { $prospect = SalesProspect::findOrFail($id); - // 명함 이미지 삭제 - if ($prospect->business_card_image) { - Storage::disk('public')->delete($prospect->business_card_image); + // 첨부 이미지 삭제 + $imageFields = ['business_card_image', 'id_card_image', 'bankbook_image']; + foreach ($imageFields as $field) { + if ($prospect->$field) { + Storage::disk('public')->delete($prospect->$field); + } } $prospect->delete(); @@ -196,9 +233,9 @@ public function destroy(int $id) } /** - * Base64 명함 이미지 저장 + * Base64 이미지 저장 */ - private function saveBusinessCardImage(string $base64Data): ?string + private function saveBase64Image(string $base64Data, string $folder): ?string { // data:image/jpeg;base64,... 형식에서 데이터 추출 if (preg_match('/^data:image\/(\w+);base64,/', $base64Data, $matches)) { @@ -213,7 +250,7 @@ private function saveBusinessCardImage(string $base64Data): ?string return null; } - $filename = 'business-cards/' . date('Ymd') . '_' . uniqid() . '.' . $extension; + $filename = $folder . '/' . date('Ymd') . '_' . uniqid() . '.' . $extension; Storage::disk('public')->put($filename, $imageData); return $filename; diff --git a/app/Models/Sales/SalesProspect.php b/app/Models/Sales/SalesProspect.php index 793978e5..d478cd79 100644 --- a/app/Models/Sales/SalesProspect.php +++ b/app/Models/Sales/SalesProspect.php @@ -23,6 +23,8 @@ class SalesProspect extends Model 'email', 'address', 'business_card_image', + 'id_card_image', + 'bankbook_image', 'status', ]; @@ -157,4 +159,44 @@ public function getBusinessCardUrlAttribute(): ?string return asset('storage/' . $this->business_card_image); } + + /** + * 신분증 이미지 존재 여부 + */ + public function hasIdCard(): bool + { + return !empty($this->id_card_image); + } + + /** + * 신분증 이미지 URL + */ + public function getIdCardUrlAttribute(): ?string + { + if (!$this->hasIdCard()) { + return null; + } + + return asset('storage/' . $this->id_card_image); + } + + /** + * 통장사본 이미지 존재 여부 + */ + public function hasBankbook(): bool + { + return !empty($this->bankbook_image); + } + + /** + * 통장사본 이미지 URL + */ + public function getBankbookUrlAttribute(): ?string + { + if (!$this->hasBankbook()) { + return null; + } + + return asset('storage/' . $this->bankbook_image); + } } diff --git a/resources/views/sales/prospects/create.blade.php b/resources/views/sales/prospects/create.blade.php index aadc2a2b..2bc4cf55 100644 --- a/resources/views/sales/prospects/create.blade.php +++ b/resources/views/sales/prospects/create.blade.php @@ -112,6 +112,8 @@
@csrf + +
@@ -175,6 +177,37 @@ class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none foc

JPG, PNG 형식 (최대 5MB)

+ +
+

추가 서류

+
+
+ +
+ + + + +

클릭하여 업로드

+
+ +
+ +
+ +
+ + + + +

클릭하여 업로드

+
+ +
+
+

JPG, PNG 형식 (최대 5MB)

+
+