- 공문서 전용 폼/조회 파셜 추가 - create/edit/show 페이지에 공문서 통합 - 문서번호, 수신, 참조, 제목, 본문, 붙임 입력 - 발신자 정보 테넌트에서 자동 로드 - 미리보기/인쇄 기능 (공문서 형식)
175 lines
11 KiB
PHP
175 lines
11 KiB
PHP
{{--
|
|
공문서 전용 폼
|
|
Props:
|
|
$tenantInfo (array) - 테넌트(회사) 정보
|
|
--}}
|
|
@php
|
|
$tenantInfo = $tenantInfo ?? [];
|
|
@endphp
|
|
|
|
<div id="official-letter-form-container" style="display: none;" class="mb-4">
|
|
<input type="hidden" id="ol-company-name" value="{{ $tenantInfo['company_name'] ?? '' }}">
|
|
<input type="hidden" id="ol-business-num" value="{{ $tenantInfo['business_num'] ?? '' }}">
|
|
<input type="hidden" id="ol-ceo-name" value="{{ $tenantInfo['ceo_name'] ?? '' }}">
|
|
<input type="hidden" id="ol-company-address" value="{{ $tenantInfo['address'] ?? '' }}">
|
|
<input type="hidden" id="ol-phone" value="{{ $tenantInfo['phone'] ?? '' }}">
|
|
<input type="hidden" id="ol-fax" value="{{ $tenantInfo['fax'] ?? '' }}">
|
|
<input type="hidden" id="ol-email" value="{{ $tenantInfo['email'] ?? '' }}">
|
|
|
|
<div class="space-y-4">
|
|
{{-- 1. 문서 정보 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">1. 문서 정보</h3>
|
|
</div>
|
|
<div class="p-4 space-y-3">
|
|
<div class="flex gap-4 flex-wrap">
|
|
<div style="flex: 1 1 250px; max-width: 300px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">문서번호</label>
|
|
<input type="text" id="ol-doc-number" placeholder="예: 2026030601"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
<div style="flex: 0 0 180px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">일자 <span class="text-red-500">*</span></label>
|
|
<input type="date" id="ol-doc-date" value="{{ now()->format('Y-m-d') }}"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 2. 수신/참조/제목 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">2. 수신 정보</h3>
|
|
</div>
|
|
<div class="p-4 space-y-3">
|
|
<div class="flex gap-4 flex-wrap">
|
|
<div style="flex: 1 1 300px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">수신 <span class="text-red-500">*</span></label>
|
|
<input type="text" id="ol-recipient" placeholder="수신처 (예: ㈜OOO)"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
<div style="flex: 1 1 250px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">참조</label>
|
|
<input type="text" id="ol-reference" placeholder="참조 (선택사항)"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">제목 <span class="text-red-500">*</span></label>
|
|
<input type="text" id="ol-subject" placeholder="공문서 제목"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 3. 본문 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">3. 본문</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<textarea id="ol-body" rows="10" placeholder="공문서 본문을 작성하세요. 1. 귀사의 무궁한 발전을 기원합니다. 2. ..."
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 leading-relaxed"></textarea>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 4. 붙임 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">4. 붙임 (첨부서류)</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<textarea id="ol-attachments-desc" rows="3" placeholder="붙임 서류 목록 (선택사항) 예: 1. 기성실적증명서 3부 2. 세금계산서 사본 1부"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 5. 발신자 정보 (테넌트 자동) --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">5. 발신자</h3>
|
|
</div>
|
|
<div class="p-4 space-y-3">
|
|
<div class="flex gap-4 flex-wrap">
|
|
<div style="flex: 1 1 200px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">상호</label>
|
|
<input type="text" readonly value="{{ $tenantInfo['company_name'] ?? '' }}"
|
|
class="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm bg-gray-50 text-gray-700">
|
|
</div>
|
|
<div style="flex: 0 0 150px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">대표이사</label>
|
|
<input type="text" readonly value="{{ $tenantInfo['ceo_name'] ?? '' }}"
|
|
class="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm bg-gray-50 text-gray-700">
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">주소</label>
|
|
<input type="text" readonly value="{{ $tenantInfo['address'] ?? '' }}"
|
|
class="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm bg-gray-50 text-gray-700">
|
|
</div>
|
|
<div class="flex gap-4 flex-wrap">
|
|
<div style="flex: 1 1 180px; max-width: 220px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">전화</label>
|
|
<input type="text" id="ol-phone-input" value="{{ $tenantInfo['phone'] ?? '' }}" placeholder="전화번호"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
<div style="flex: 1 1 180px; max-width: 220px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">팩스</label>
|
|
<input type="text" id="ol-fax-input" value="{{ $tenantInfo['fax'] ?? '' }}" placeholder="팩스번호"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
<div style="flex: 1 1 220px;">
|
|
<label class="block text-xs font-medium text-gray-500 mb-1">이메일</label>
|
|
<input type="text" id="ol-email-input" value="{{ $tenantInfo['email'] ?? '' }}" placeholder="이메일"
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 미리보기 버튼 --}}
|
|
<div class="flex justify-end">
|
|
<button type="button" onclick="openOfficialLetterPreview()"
|
|
class="px-3 py-2 bg-indigo-50 text-indigo-600 hover:bg-indigo-100 border border-indigo-200 rounded-lg text-sm font-medium transition inline-flex items-center gap-1">
|
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
</svg>
|
|
미리보기
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 공문서 미리보기 모달 --}}
|
|
<div id="official-letter-preview-modal" style="display: none;" class="fixed inset-0 z-50">
|
|
<div class="absolute inset-0 bg-black/50" onclick="closeOfficialLetterPreview()"></div>
|
|
<div class="relative flex items-center justify-center min-h-full p-4">
|
|
<div class="bg-white rounded-xl shadow-2xl w-full overflow-hidden relative" style="max-width: 780px;">
|
|
<div class="flex items-center justify-between px-5 py-3 border-b border-gray-200 bg-gray-50">
|
|
<h3 class="text-base font-semibold text-gray-800">공문서 미리보기</h3>
|
|
<div class="flex items-center gap-2">
|
|
<button type="button" onclick="printOfficialLetterPreview()"
|
|
class="px-3 py-1.5 bg-white border border-gray-300 hover:bg-gray-50 rounded-lg text-xs font-medium transition inline-flex items-center gap-1">
|
|
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
|
|
</svg>
|
|
인쇄
|
|
</button>
|
|
<button type="button" onclick="closeOfficialLetterPreview()"
|
|
class="p-1 text-gray-400 hover:text-gray-600 transition">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="overflow-y-auto" style="max-height: 80vh;">
|
|
<div id="official-letter-preview-content" style="padding: 40px 48px; font-family: 'Pretendard', 'Malgun Gothic', sans-serif;"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|