feat: [tenant-settings] 회사 표시명 설정 추가

- 테넌트 설정에 '인쇄용 회사명' 입력 필드 추가
- 재직증명서 등 문서 인쇄 시 표시명 우선 적용
- 비워두면 기본 company_name 사용
This commit is contained in:
김보곤
2026-03-05 19:36:44 +09:00
parent b16eb343a0
commit 21f930a52f
3 changed files with 68 additions and 8 deletions

View File

@@ -14,7 +14,7 @@
class TenantSettingController extends Controller
{
/**
* 설정 목록 (재고 설정 페이지)
* 설정 목록 (재고 설정 + 회사 표시명 설정)
*/
public function index(Request $request): View|Response
{
@@ -30,21 +30,25 @@ public function index(Request $request): View|Response
$itemTypeLabels = $tenantId ? CommonCode::getItemTypes($tenantId) : [];
// 테넌트 미선택 시 빈 설정
$stockSettings = collect();
$allSettings = collect();
if ($tenantId) {
$stockSettings = TenantSetting::withoutGlobalScopes()
$allSettings = TenantSetting::withoutGlobalScopes()
->where('tenant_id', $tenantId)
->where('setting_group', 'stock')
->get()
->keyBy('setting_key');
->get();
}
// 설정값 (저장된 값이 없으면 빈 배열/기본값)
$stockSettings = $allSettings->where('setting_group', 'stock')->keyBy('setting_key');
$companySettings = $allSettings->where('setting_group', 'company')->keyBy('setting_key');
// 재고 설정값
$hasSettings = $stockSettings->isNotEmpty();
$stockItemTypes = $stockSettings->get('stock_item_types')?->setting_value ?? [];
$defaultSafetyStock = $stockSettings->get('default_safety_stock')?->setting_value ?? 10;
$lowStockAlert = $stockSettings->get('low_stock_alert')?->setting_value ?? true;
// 회사 표시명 설정값
$displayCompanyName = $companySettings->get('display_company_name')?->setting_value ?? '';
return view('tenant-settings.index', [
'tenant' => $tenant,
'hasSettings' => $hasSettings,
@@ -52,6 +56,7 @@ public function index(Request $request): View|Response
'stockItemTypes' => $stockItemTypes,
'defaultSafetyStock' => $defaultSafetyStock,
'lowStockAlert' => $lowStockAlert,
'displayCompanyName' => $displayCompanyName,
]);
}
@@ -77,6 +82,7 @@ public function store(Request $request): RedirectResponse
'stock_item_types.*' => 'string|in:'.implode(',', $validItemTypes),
'default_safety_stock' => 'required|integer|min:0|max:9999',
'low_stock_alert' => 'nullable|boolean',
'display_company_name' => 'nullable|string|max:100',
]);
// 재고관리 품목유형 저장
@@ -121,6 +127,20 @@ public function store(Request $request): RedirectResponse
]
);
// 회사 표시명 저장
TenantSetting::withoutGlobalScopes()->updateOrCreate(
[
'tenant_id' => $tenantId,
'setting_group' => 'company',
'setting_key' => 'display_company_name',
],
[
'setting_value' => trim($validated['display_company_name'] ?? ''),
'description' => '문서에 인쇄되는 회사 표시명',
'updated_by' => $userId,
]
);
return redirect()->route('tenant-settings.index')
->with('success', '설정이 저장되었습니다.');
}

View File

@@ -4,6 +4,7 @@
use App\Models\HR\Employee;
use App\Models\Tenants\Tenant;
use App\Models\Tenants\TenantSetting;
use Illuminate\Support\Facades\Log;
class EmploymentCertService
@@ -33,6 +34,15 @@ public function getCertInfo(int $userId, int $tenantId): array
$tenant = Tenant::findOrFail($tenantId);
// 인쇄용 회사 표시명 조회 (설정 없으면 기본 company_name 사용)
$displaySetting = TenantSetting::withoutGlobalScopes()
->where('tenant_id', $tenantId)
->where('setting_group', 'company')
->where('setting_key', 'display_company_name')
->first();
$displayName = $displaySetting?->setting_value ?? '';
$companyName = ! empty($displayName) ? $displayName : ($tenant->company_name ?? '');
$residentNumber = $employee->resident_number;
$maskedResident = $residentNumber
? substr($residentNumber, 0, 8).'******'
@@ -46,7 +56,7 @@ public function getCertInfo(int $userId, int $tenantId): array
'department' => $employee->department?->name ?? '',
'position' => $employee->position_label ?? '',
'hire_date' => $employee->hire_date ?? '',
'company_name' => $tenant->company_name ?? '',
'company_name' => $companyName,
'business_num' => $tenant->business_num ?? '',
'ceo_name' => $tenant->ceo_name ?? '',
'phone' => $tenant->phone ?? '',

View File

@@ -63,6 +63,36 @@
@csrf
<div class="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-6">
<!-- 회사 표시명 설정 -->
<div class="bg-white rounded-lg shadow-sm p-5">
<div class="flex items-center gap-3 mb-4">
<div class="w-9 h-9 bg-purple-100 rounded-lg flex items-center justify-center">
<svg class="w-5 h-5 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
</svg>
</div>
<div>
<h3 class="font-semibold text-gray-800">회사 표시명</h3>
<p class="text-xs text-gray-500">재직증명서 문서 인쇄 사용</p>
</div>
</div>
<div class="space-y-3">
<div>
<label for="display_company_name" class="block text-sm font-medium text-gray-600 mb-1">인쇄용 회사명</label>
<input type="text"
id="display_company_name"
name="display_company_name"
value="{{ old('display_company_name', $displayCompanyName) }}"
placeholder="{{ $tenant?->company_name ?? '(주)회사명' }}"
class="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<p class="mt-1.5 text-xs text-gray-400">
비워두면 기본 회사명({{ $tenant?->company_name ?? '-' }}) 사용됩니다.
</p>
</div>
</div>
</div>
<!-- 재고관리 품목유형 -->
<div class="bg-white rounded-lg shadow-sm p-5">
<div class="flex items-center gap-3 mb-4">