header('HX-Request')) { return response('', 200)->header('HX-Redirect', route('documents.index')); } $tenantId = session('selected_tenant_id'); // 템플릿 목록 (필터용) $templates = $tenantId ? DocumentTemplate::where(function ($q) use ($tenantId) { $q->whereNull('tenant_id')->orWhere('tenant_id', $tenantId); })->where('is_active', true)->orderBy('name')->get() : collect(); return view('documents.index', [ 'templates' => $templates, 'statuses' => Document::STATUS_LABELS, ]); } /** * 문서 생성 페이지 */ public function create(Request $request): View|Response { if ($request->header('HX-Request')) { return response('', 200)->header('HX-Redirect', route('documents.create', $request->query())); } $tenantId = session('selected_tenant_id'); $templateId = $request->query('template_id'); // 템플릿 목록 $templates = $tenantId ? DocumentTemplate::where(function ($q) use ($tenantId) { $q->whereNull('tenant_id')->orWhere('tenant_id', $tenantId); })->where('is_active', true)->orderBy('name')->get() : collect(); // 선택된 템플릿 $template = $templateId ? DocumentTemplate::with(['approvalLines', 'basicFields', 'sections.items', 'columns', 'sectionFields', 'links.linkValues'])->find($templateId) : null; return view('documents.edit', [ 'document' => null, 'template' => $template, 'templates' => $templates, 'isCreate' => true, 'linkedItemSpecs' => $template ? $this->getLinkedItemSpecs($template) : [], ]); } /** * 문서 수정 페이지 */ public function edit(int $id): View|Response { if (request()->header('HX-Request')) { return response('', 200)->header('HX-Redirect', route('documents.edit', $id)); } $tenantId = session('selected_tenant_id'); $document = Document::with([ 'template.approvalLines', 'template.basicFields', 'template.sections.items', 'template.columns', 'template.sectionFields', 'template.links.linkValues', 'approvals.user', 'data', 'attachments.file', 'creator', ])->where('tenant_id', $tenantId)->findOrFail($id); // 템플릿 목록 (변경용) $templates = $tenantId ? DocumentTemplate::where(function ($q) use ($tenantId) { $q->whereNull('tenant_id')->orWhere('tenant_id', $tenantId); })->where('is_active', true)->orderBy('name')->get() : collect(); return view('documents.edit', [ 'document' => $document, 'template' => $document->template, 'templates' => $templates, 'isCreate' => false, 'linkedItemSpecs' => $this->getLinkedItemSpecs($document->template), ]); } /** * 문서 인쇄용 화면 (성적서 양식) */ public function print(int $id): View { $tenantId = session('selected_tenant_id'); $document = Document::with([ 'template.approvalLines', 'template.basicFields', 'template.sections.items', 'template.columns', 'template.sectionFields', 'template.links.linkValues', 'approvals.user', 'data', 'creator', ])->where('tenant_id', $tenantId)->findOrFail($id); return view('documents.print', [ 'document' => $document, ]); } /** * 문서 상세 페이지 (읽기 전용) */ public function show(int $id): View { $tenantId = session('selected_tenant_id'); $document = Document::with([ 'template.approvalLines', 'template.basicFields', 'template.sections.items', 'template.columns', 'template.sectionFields', 'template.links.linkValues', 'approvals.user', 'data', 'attachments.file', 'creator', 'updater', ])->where('tenant_id', $tenantId)->findOrFail($id); return view('documents.show', [ 'document' => $document, ]); } /** * 템플릿에 연결된 품목들의 규격 정보 (thickness, width, length) 조회 */ private function getLinkedItemSpecs(DocumentTemplate $template): array { $specs = []; if (! $template->relationLoaded('links')) { $template->load('links.linkValues'); } foreach ($template->links as $link) { if ($link->source_table !== 'items') { continue; } foreach ($link->linkValues as $lv) { $item = Item::find($lv->linkable_id); if (! $item) { continue; } $attrs = $item->attributes ?? []; if (isset($attrs['thickness']) || isset($attrs['width']) || isset($attrs['length'])) { $specs[] = [ 'id' => $item->id, 'name' => $item->name, 'thickness' => $attrs['thickness'] ?? null, 'width' => $attrs['width'] ?? null, 'length' => $attrs['length'] ?? null, ]; } } } return $specs; } }