feat:신분증/통장사본 첨부파일 기능 추가

- 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 <noreply@anthropic.com>
This commit is contained in:
pro
2026-01-27 23:42:31 +09:00
parent e9f77cb5f1
commit 9f49501d33
4 changed files with 213 additions and 10 deletions

View File

@@ -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;