Files
sam-manage/app/Models/Sales/SalesManagerDocument.php
김보곤 8291cdc39b feat: [database] codebridge DB 분리 - 118개 MNG 전용 테이블 connection 설정
- config/database.php에 codebridge connection 추가
- 78개 MNG 전용 모델에 $connection = 'codebridge' 설정
  - Admin (15): PM, 로드맵, API Explorer
  - Sales (16): 영업파트너, 수수료, 가망고객
  - Finance (9): 법인카드, 자금관리, 홈택스
  - Barobill (12): 은행/카드 동기화 관리
  - Interview (1), ESign (6), Equipment (2)
  - AI (3), Audit (3), 기타 (11)
2026-03-07 11:31:27 +09:00

146 lines
3.2 KiB
PHP

<?php
namespace App\Models\Sales;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Storage;
class SalesManagerDocument extends Model
{
use SoftDeletes;
protected $connection = 'codebridge';
protected $table = 'sales_manager_documents';
protected $fillable = [
'tenant_id',
'user_id',
'file_path',
'original_name',
'stored_name',
'mime_type',
'file_size',
'document_type',
'description',
'uploaded_by',
'deleted_by',
];
protected $casts = [
'file_size' => 'integer',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
/**
* 문서 타입 목록
* - 계약서는 모두의싸인을 통해 별도 처리
*/
public const DOCUMENT_TYPES = [
'resident_copy' => '등본사본',
'bank_account' => '통장사본',
];
/**
* 사용자 (영업파트너)
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
/**
* 업로더
*/
public function uploader(): BelongsTo
{
return $this->belongsTo(User::class, 'uploaded_by');
}
/**
* 문서 타입 라벨
*/
public function getDocumentTypeLabelAttribute(): string
{
return self::DOCUMENT_TYPES[$this->document_type] ?? $this->document_type;
}
/**
* 파일 크기 포맷팅
*/
public function getFormattedSizeAttribute(): string
{
$bytes = $this->file_size;
if ($bytes >= 1073741824) {
return number_format($bytes / 1073741824, 2).' GB';
} elseif ($bytes >= 1048576) {
return number_format($bytes / 1048576, 2).' MB';
} elseif ($bytes >= 1024) {
return number_format($bytes / 1024, 2).' KB';
}
return $bytes.' bytes';
}
/**
* 파일 확장자
*/
public function getExtensionAttribute(): string
{
return pathinfo($this->original_name, PATHINFO_EXTENSION);
}
/**
* 이미지 여부
*/
public function isImage(): bool
{
return str_starts_with($this->mime_type ?? '', 'image/');
}
/**
* 스토리지 전체 경로
*/
public function getStoragePath(): string
{
return Storage::disk('tenant')->path($this->file_path);
}
/**
* 파일 존재 여부
*/
public function existsInStorage(): bool
{
return Storage::disk('tenant')->exists($this->file_path);
}
/**
* 파일 URL
*/
public function getUrl(): ?string
{
if (! $this->existsInStorage()) {
return null;
}
return Storage::disk('tenant')->url($this->file_path);
}
/**
* 파일 다운로드 응답
*/
public function download()
{
if (! $this->existsInStorage()) {
abort(404, '파일을 찾을 수 없습니다.');
}
return Storage::disk('tenant')->download($this->file_path, $this->original_name);
}
}