Files
sam-react-prod/src/components/quality/InspectionManagement/documents/InspectionRequestDocument.tsx

267 lines
12 KiB
TypeScript
Raw Normal View History

'use client';
/**
*
*
* :
* - (/)
* - (, , )
* - (, , , )
* -
*/
import {
ConstructionApprovalTable,
DocumentWrapper,
DocumentTable,
DOC_STYLES,
} from '@/components/document-system';
import type { InspectionRequestDocument as InspectionRequestDocumentType } from '../types';
interface InspectionRequestDocumentProps {
data: InspectionRequestDocumentType;
}
/** 라벨 셀 */
const lbl = `${DOC_STYLES.label} w-28`;
/** 서브 라벨 셀 (bg-gray-50) */
const subLbl = 'bg-gray-50 px-2 py-1 font-medium border-r border-gray-300 w-28';
/** 값 셀 */
const val = DOC_STYLES.value;
export function InspectionRequestDocument({ data }: InspectionRequestDocumentProps) {
return (
<DocumentWrapper fontSize="text-[11px]">
{/* 헤더: 제목 (좌측) + 결재란 (우측) */}
<div className="flex justify-between items-start mb-4">
<div>
<h1 className="text-2xl font-bold tracking-widest mb-2"> </h1>
<div className="text-[10px] space-y-1">
<div className="flex gap-4">
<span>: <strong>{data.documentNumber}</strong></span>
<span>: <strong>{data.createdDate}</strong></span>
</div>
</div>
</div>
<ConstructionApprovalTable
approvers={{
writer: data.approvalLine[0]
? { name: data.approvalLine[0].name, department: data.approvalLine[0].department }
: undefined,
approver1: data.approvalLine[1]
? { name: data.approvalLine[1].name, department: data.approvalLine[1].department }
: undefined,
approver2: data.approvalLine[2]
? { name: data.approvalLine[2].name, department: data.approvalLine[2].department }
: undefined,
approver3: data.approvalLine[3]
? { name: data.approvalLine[3].name, department: data.approvalLine[3].department }
: undefined,
}}
/>
</div>
{/* 기본 정보 */}
<DocumentTable header="기본 정보" headerVariant="light" spacing="mb-4">
<tbody>
<tr className="border-b border-gray-300">
<td className={lbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.client || '-'}</td>
<td className={lbl}></td>
<td className={val}>{data.companyName || '-'}</td>
</tr>
<tr className="border-b border-gray-300">
<td className={lbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.manager || '-'}</td>
<td className={lbl}></td>
<td className={val}>{data.orderNumber || '-'}</td>
</tr>
<tr className="border-b border-gray-300">
<td className={lbl}> </td>
<td className={`${val} border-r border-gray-300`}>{data.managerContact || '-'}</td>
<td className={lbl}></td>
<td className={val}>{data.siteName || '-'}</td>
</tr>
<tr className="border-b border-gray-300">
<td className={lbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.deliveryDate || '-'}</td>
<td className={lbl}> </td>
<td className={val}>{data.siteAddress || '-'}</td>
</tr>
<tr>
<td className={lbl}> </td>
<td className={`${val} border-r border-gray-300`}>{data.totalLocations || '-'}</td>
<td className={lbl}></td>
<td className={val}>{data.receptionDate || '-'}</td>
</tr>
<tr className="border-t border-gray-300">
<td className={lbl}></td>
<td className={val} colSpan={3}>{data.visitRequestDate || '-'}</td>
</tr>
</tbody>
</DocumentTable>
{/* 입력사항: 4개 섹션 */}
<div className="border border-gray-400 mb-4">
<div className="bg-gray-200 text-center py-1 font-bold border-b border-gray-400"></div>
{/* 건축공사장 정보 */}
<div className="border-b border-gray-300">
<div className="bg-gray-100 px-2 py-1 font-medium border-b border-gray-300"> </div>
<table className="w-full">
<tbody>
<tr>
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.constructionSite.siteName || '-'}</td>
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.constructionSite.landLocation || '-'}</td>
<td className={`${subLbl} w-20`}></td>
<td className={val}>{data.constructionSite.lotNumber || '-'}</td>
</tr>
</tbody>
</table>
</div>
{/* 자재유통업자 정보 */}
<div className="border-b border-gray-300">
<div className="bg-gray-100 px-2 py-1 font-medium border-b border-gray-300"> </div>
<table className="w-full">
<tbody>
<tr className="border-b border-gray-300">
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.materialDistributor.companyName || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.materialDistributor.companyAddress || '-'}</td>
</tr>
<tr>
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.materialDistributor.representativeName || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.materialDistributor.phone || '-'}</td>
</tr>
</tbody>
</table>
</div>
{/* 공사시공자 정보 */}
<div className="border-b border-gray-300">
<div className="bg-gray-100 px-2 py-1 font-medium border-b border-gray-300"> </div>
<table className="w-full">
<tbody>
<tr className="border-b border-gray-300">
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.constructorInfo.companyName || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.constructorInfo.companyAddress || '-'}</td>
</tr>
<tr>
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.constructorInfo.name || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.constructorInfo.phone || '-'}</td>
</tr>
</tbody>
</table>
</div>
{/* 공사감리자 정보 */}
<div>
<div className="bg-gray-100 px-2 py-1 font-medium border-b border-gray-300"> </div>
<table className="w-full">
<tbody>
<tr className="border-b border-gray-300">
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.supervisor.officeName || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.supervisor.officeAddress || '-'}</td>
</tr>
<tr>
<td className={subLbl}></td>
<td className={`${val} border-r border-gray-300`}>{data.supervisor.name || '-'}</td>
<td className={subLbl}></td>
<td className={val}>{data.supervisor.phone || '-'}</td>
</tr>
</tbody>
</table>
</div>
</div>
{/* 검사 요청 시 필독 */}
<DocumentTable header="검사 요청 시 필독" headerVariant="dark" spacing="mb-4">
<tbody>
<tr>
<td className="px-4 py-3 text-[11px] leading-relaxed text-center">
<p>
,
<br />
.
<br />
<span className="text-red-600 font-medium"> .</span>
</p>
<p className="mt-2 text-gray-600">
( .)
</p>
</td>
</tr>
</tbody>
</DocumentTable>
{/* 검사대상 사전 고지 정보 */}
<DocumentTable header="검사대상 사전 고지 정보" headerVariant="dark" spacing="mb-4">
<thead>
{/* 1단: 오픈사이즈 병합 */}
<tr className="bg-gray-100 border-b border-gray-300">
<th className={`${DOC_STYLES.th} w-12`} rowSpan={3}>No.</th>
<th className={`${DOC_STYLES.th} w-16`} rowSpan={3}></th>
<th className={`${DOC_STYLES.th} w-20`} rowSpan={3}></th>
<th className={DOC_STYLES.th} colSpan={4}></th>
<th className={`${DOC_STYLES.th} border-r-0`} rowSpan={3}></th>
</tr>
{/* 2단: 발주 규격, 시공후 규격 */}
<tr className="bg-gray-100 border-b border-gray-300">
<th className={DOC_STYLES.th} colSpan={2}> </th>
<th className={DOC_STYLES.th} colSpan={2}> </th>
</tr>
{/* 3단: 가로, 세로 */}
<tr className="bg-gray-100 border-b border-gray-400">
<th className={`${DOC_STYLES.th} w-16`}></th>
<th className={`${DOC_STYLES.th} w-16`}></th>
<th className={`${DOC_STYLES.th} w-16`}></th>
<th className={`${DOC_STYLES.th} w-16`}></th>
</tr>
</thead>
<tbody>
{data.priorNoticeItems.map((item, index) => (
<tr key={item.id} className="border-b border-gray-300">
<td className={DOC_STYLES.tdCenter}>{index + 1}</td>
<td className={DOC_STYLES.tdCenter}>{item.floor}</td>
<td className={DOC_STYLES.tdCenter}>{item.symbol}</td>
<td className={DOC_STYLES.tdCenter}>{item.orderWidth}</td>
<td className={DOC_STYLES.tdCenter}>{item.orderHeight}</td>
<td className={DOC_STYLES.tdCenter}>{item.constructionWidth}</td>
<td className={DOC_STYLES.tdCenter}>{item.constructionHeight}</td>
<td className={DOC_STYLES.td}>{item.changeReason || '-'}</td>
</tr>
))}
{data.priorNoticeItems.length === 0 && (
<tr>
<td colSpan={8} className="px-2 py-4 text-center text-gray-400">
.
</td>
</tr>
)}
</tbody>
</DocumentTable>
{/* 서명 영역 */}
<div className="mt-8 text-center text-[10px]">
<p> .</p>
<div className="mt-6">
<p>{data.createdDate}</p>
</div>
</div>
</DocumentWrapper>
);
}