Files
sam-docs/plans/document-management-system-plan.md
권혁성 0a80b79679 docs:문서관리 계획 Phase 2.3 완료 반영 (진행률 40%)
- Phase 2.3 완료 (결재 워크플로우: 제출/승인/반려)
- changelog에 Phase 2.3 상세 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:00:50 +09:00

37 KiB
Raw Blame History

문서관리 시스템 개발 계획

작성일: 2026-01-31 목적: mng에서 문서양식(템플릿)을 관리하고 문서를 생성하여, SAM(react)에서 JSON으로 소비하는 문서관리 시스템을 구축한다 기준 문서: docs/specs/database-schema.md, mng/CLAUDE.md 상태: 📋 계획 확정 → Phase 1 시작 대기


🚀 새 세션 시작 가이드

이 섹션은 새 세션에서 이 문서만 보고 작업을 시작할 수 있도록 작성되었습니다.

프로젝트 정보

항목 내용
작업 프로젝트 mng (관리자 패널)
절대 경로 /Users/kent/Works/@KD_SAM/SAM/mng/
기술 스택 Laravel 12 + Plain Blade + DaisyUI + HTMX + Alpine.js
로컬 URL https://mng.sam.kr (Docker 로컬, admin.sam.kr도 동일)
관련 API /Users/kent/Works/@KD_SAM/SAM/api/ (Laravel 12 REST API)
프론트 /Users/kent/Works/@KD_SAM/SAM/react/ (Next.js 15, 이 작업에서는 미수정)
5130 레거시 /Users/kent/Works/@KD_SAM/SAM/5130/ (참조 전용)
문서 경로 /Users/kent/Works/@KD_SAM/SAM/docs/

mng Git 저장소

cd /Users/kent/Works/@KD_SAM/SAM/mng
git status && git branch

주의: SAM/ 루트는 Git 저장소가 아님. api/, mng/, react/ 각각 독립 Git 저장소.

세션 시작 체크리스트

1. 이 문서를 읽는다 (📍 현재 진행 상태 섹션 확인)
2. mng/CLAUDE.md 를 읽는다 (mng 프로젝트 규칙 확인)
3. 마지막 완료 작업 확인 → 다음 작업 결정
4. 해당 Phase의 상세 절차(섹션 11)를 읽는다
5. 작업 시작 전 사용자에게 "Phase X.X 시작할까요?" 확인

핵심 파일 (작업 빈도순)

파일 설명 크기
mng/resources/views/document-templates/edit.blade.php 양식 편집 UI (메인 작업 대상) 44.5KB
mng/app/Http/Controllers/DocumentTemplateController.php 양식 CRUD 컨트롤러
mng/app/Http/Controllers/DocumentController.php 문서 CRUD 컨트롤러
mng/app/Models/DocumentTemplate.php 양식 모델 (관계 정의)
mng/app/Models/Documents/Document.php 문서 모델 (상태 워크플로우)
mng/routes/web.php (340-353줄) 양식/문서 라우트

모델 관계 구조 (코드 참조)

// DocumentTemplate.php 주요 관계
class DocumentTemplate extends Model {
    use BelongsToTenant, SoftDeletes;

    // 결재라인: template->approval_lines (작성/검토/승인)
    public function approvalLines() { return $this->hasMany(DocumentTemplateApprovalLine::class, 'template_id')->orderBy('sort_order'); }

    // 기본필드: template->basic_fields (품명, LOT NO 등)
    public function basicFields() { return $this->hasMany(DocumentTemplateBasicField::class, 'template_id')->orderBy('sort_order'); }

    // 섹션: template->sections->items (검사기준서 섹션 + 검사항목)
    public function sections() { return $this->hasMany(DocumentTemplateSection::class, 'template_id')->orderBy('sort_order'); }

    // 컬럼: template->columns (데이터 테이블 컬럼 정의)
    public function columns() { return $this->hasMany(DocumentTemplateColumn::class, 'template_id')->orderBy('sort_order'); }
}

// Document.php 주요 관계
class Document extends Model {
    use BelongsToTenant, SoftDeletes;

    // 상태: DRAFT -> PENDING -> APPROVED/REJECTED/CANCELLED
    protected $casts = ['status' => DocumentStatus::class];

    public function template() { return $this->belongsTo(DocumentTemplate::class); }
    public function approvals() { return $this->hasMany(DocumentApproval::class); }
    public function data() { return $this->hasMany(DocumentData::class); }         // EAV 패턴
    public function attachments() { return $this->hasMany(DocumentAttachment::class); }
    public function linkable() { return $this->morphTo(); }  // 다형성 연결 (수주, 작업지시 등)
}

mng 라우트 구조

// mng/routes/web.php (340-353줄)
Route::resource('document-templates', DocumentTemplateController::class);  // /document-templates
Route::resource('documents', DocumentController::class);                   // /documents

URL 확인: https://mng.sam.kr/document-templates (양식 관리), https://mng.sam.kr/documents (문서 관리)


📍 현재 진행 상태

항목 내용
마지막 완료 작업 Phase 2.3 - 결재 워크플로우 (제출/승인/반려 + 단계별 처리)
다음 작업 Phase 2.4 - 문서 목록/검색/필터
진행률 8/20 (40%) - Phase 1 , Phase 2.1~2.3
마지막 업데이트 2026-01-31

1. 개요

1.1 배경

현재 SAM(react)에는 검사 성적서(수입검사, 중간검사), 작업일지 등이 하드코딩된 모달 컴포넌트로 존재한다. 5130 레거시 시스템에도 동일 문서들이 PHP 파일 단위로 구현되어 있다. 이들을 mng에서 동적으로 양식을 관리하고, API를 통해 JSON으로 제공하여 SAM에서 렌더링하는 구조로 전환한다.

핵심 문제:

  • 현재 검사 문서가 React 컴포넌트에 하드코딩되어, 새 양식 추가 시 코드 수정이 필요
  • 5130의 수입검사만 약 40종의 자재별 페이지가 개별 PHP 파일로 존재
  • 검사 기준, 항목, 판정 로직이 코드와 혼재되어 비개발자가 관리 불가
  • 중간검사(절곡/스크린/슬랫/조인트바)도 각각 별도 컴포넌트로 분산

해결 방향:

  • mng에서 문서양식(템플릿)을 동적으로 정의 → 검사 항목/기준/판정 로직 포함
  • 양식 기반으로 실제 문서 인스턴스를 생성 → 데이터 입력/결재/출력
  • SAM에서 API로 양식+데이터를 JSON 수신 → 범용 렌더러로 표시

1.2 기준 원칙

┌─────────────────────────────────────────────────────────────────┐
│  핵심 원칙                                                       │
├─────────────────────────────────────────────────────────────────┤
│  1. 양식 정의는 mng에서만 관리 (비개발자도 양식 수정 가능하도록)   │
│  2. SAM(react)은 JSON을 받아 렌더링만 담당 (문서 로직 없음)       │
│  3. 기존 DB 구조(document_templates 계열) 최대한 활용             │
│  4. 5130 레거시의 검사 기준/항목을 데이터로 이관                  │
│  5. 결재 워크플로우(DRAFT->PENDING->APPROVED) 유지                │
└─────────────────────────────────────────────────────────────────┘

1.3 변경 승인 정책

분류 예시 승인
즉시 가능 양식 필드 추가/변경, 검사항목 추가, 기준값 수정, 뷰(Blade) 수정 불필요
컨펌 필요 새 DB 테이블 추가, 기존 테이블 컬럼 변경, API 엔드포인트 추가, 마이그레이션 필수
금지 기존 document_templates 테이블 구조 파괴적 변경, 기존 API 삭제 별도 협의

1.4 준수 규칙

  • docs/specs/database-schema.md - DB 스키마 참조
  • docs/standards/quality-checklist.md - 품질 체크리스트
  • mng/CLAUDE.md - MNG 프로젝트 규칙

2. 현황 분석

2.1 기존 DB 구조 (이미 생성됨)

document_templates                    # 양식 마스터
├── document_template_approval_lines  # 결재라인 (작성/검토/승인)
├── document_template_basic_fields    # 기본필드 (품명, LOT NO 등)
├── document_template_sections        # 섹션 (검사기준서 섹션)
│   └── document_template_section_items # 섹션 항목 (검사항목)
└── document_template_columns         # 데이터 테이블 컬럼

documents                             # 문서 인스턴스
├── document_approvals                # 결재 이력
├── document_data                     # 필드 데이터 (EAV 패턴)
└── document_attachments              # 첨부 파일

주요 테이블 컬럼:

테이블 핵심 컬럼
document_templates tenant_id, name, category, title, company_name, footer_remark_label, footer_judgement_label, footer_judgement_options(json)
document_template_approval_lines template_id, name, dept, role, sort_order
document_template_basic_fields template_id, label, field_type(text/date), default_value, sort_order
document_template_sections template_id, title, image_path, sort_order
document_template_section_items section_id, category, item, standard, method, frequency, regulation, sort_order
document_template_columns template_id, label, column_type(text/check/measurement/select/complex), group_name, sub_labels(json), width, sort_order
documents tenant_id, template_id, document_no, title, status(DRAFT/PENDING/APPROVED/REJECTED/CANCELLED), linkable_type, linkable_id
document_data document_id, section_id, column_id, row_index, field_key, field_value
document_approvals document_id, user_id, step, role, status(PENDING/APPROVED/REJECTED), comment, acted_at

2.2 기존 MNG 코드 현황

항목 경로 상태
DocumentTemplate 모델 mng/app/Models/DocumentTemplate.php 존재
Document 모델 mng/app/Models/Documents/Document.php 존재
관련 하위 모델 6개 mng/app/Models/Documents/, mng/app/Models/DocumentTemplate*.php 존재
DocumentTemplateController mng/app/Http/Controllers/DocumentTemplateController.php 존재
DocumentController mng/app/Http/Controllers/DocumentController.php 존재
라우트 (templates, documents) mng/routes/web.php 340-353줄 존재
양식 편집 Blade mng/resources/views/document-templates/edit.blade.php (44.5KB) 존재
문서 Blade (index/edit/show) mng/resources/views/documents/ 존재

2.3 5130 레거시 검사 문서 현황

수입검사 (instock)

항목 내용
위치 5130/instock/
자재별 검사 페이지 40+ PHP 파일 (i_EGI155.php, i_SUSplate.php, i_wire.php, i_motor.php 등)
메인 로더 fetch_inspection.php (21.8KB) - 자재코드별 동적 로딩
검사 필드 로트번호, 검사일, 납품업체, 품명, 규격, 단위, 품목코드, 입고량, 자재번호, 제조사
판정 방식 항목별 합격/불합격 -> 종합판정 자동계산
LOT 관리 lotnum.txt 파일 기반, YYMMDD-## 형식
PDF 출력 html2pdf.js 사용

중간검사 (output)

검사 종류 파일 DB 필드
절곡품 중간검사 viewMidInspectBending.php (60.7KB) recordbendingMid (JSON)
스크린 중간검사 viewMidInspectScreen.php (33.6KB) recordscreenMid (JSON)
슬랫 중간검사 viewMidInspectSlat.php recordslatMid (JSON)
조인트바 검사 viewinspectionJointbar.php (34.1KB) recordjointbar (JSON)

검사 공통 구조

  • 결재: 작성(판매/Order) -> 검토(생산) -> 승인(품질/QC)
  • 검사 기준 이미지: 5130/img/inspection/ (20+ 이미지)
  • 데이터: JSON으로 DB 저장 (approval chain + measurements)
  • QC 관리자 권한 제어 (이세희, 함신옥, 이경호, 노완호)

2.4 SAM(react) 현재 검사 컴포넌트

컴포넌트 경로 용도
ImportInspectionDocument react/src/.../quality/qms/components/documents/ 수입검사 성적서
ScreenInspectionDocument 동일 경로 스크린 중간검사 성적서
SlatInspectionDocument 동일 경로 슬랫 중간검사 성적서
BendingInspectionDocument 동일 경로 절곡품 중간검사 성적서
JointbarInspectionDocument 동일 경로 조인트바 중간검사 성적서
ProductInspectionDocument 동일 경로 제품검사 성적서
WorkLogContent react/src/components/production/WorkerScreen/ 작업일지
InspectionReportModal react/src/components/production/WorkOrders/documents/ 중간검사 모달
DocumentViewer react/src/components/document-system/viewer/ 범용 문서 뷰어

공통 컴포넌트 (document-system):

  • DocumentHeader.tsx - 문서 헤더 (로고, 결재라인)
  • QualityApprovalTable.tsx - 품질 결재표
  • InfoTable.tsx - 정보 테이블
  • DocumentViewer.tsx - 문서 뷰어 (zoom, drag, print, download)

3. 대상 범위

3.1 Phase 1: mng 양식 관리 기능 완성 (수입검사)

수입검사 양식 20여종을 mng에서 동적으로 관리할 수 있도록 기존 코드를 보강한다.

# 작업 항목 상태 완료 기준 비고
1.1 기존 document-templates 편집 UI 점검 및 보완 mng.sam.kr/document-templates/{id}/edit에서 결재라인/기본필드/섹션/항목/컬럼 모두 CRUD 가능. 저장 후 DB에 정상 반영 확인 5개 탭 전체 CRUD 완료 확인
1.2 5130 수입검사 데이터 분석 및 양식 구조 설계 라우팅 구조 + 대표 자재 2종(EGI, SUS) 상세 분석 완료. 나머지 21종은 Phase 1.3에서 개별 분석 병행 viewJS.php 라우팅 + 공통패턴 추출
1.3 수입검사 양식 시드 데이터 생성 EGI(ID:7), SUS(ID:8) 2종 생성 완료. 각각 결재2+기본필드10+섹션1+검사항목7~8+컬럼7. 나머지 자재는 개별 분석 후 시더에 추가 IncomingInspectionTemplateSeeder.php
1.4 양식 미리보기 기능 edit.blade.php에 모달 미리보기 구현 완료. 결재란+기본정보+검사이미지+검사테이블(complex 지원)+Footer(비고+판정) 모두 렌더링 기존 구현 확인 완료
1.5 양식 복제 기능 API POST /{id}/duplicate + 목록 복제 버튼. 이름 입력 prompt → 전체 관계(결재/필드/섹션/항목/컬럼) 복제. 비활성 상태로 생성 API+UI 구현 완료

3.2 Phase 2: mng 문서 생성/관리 기능

양식을 기반으로 실제 검사 문서를 생성하고 데이터를 입력/결재하는 기능.

# 작업 항목 상태 완료 기준 비고
2.1 문서 생성 (양식 선택 -> 빈 문서 생성) 양식 선택 후 빈 문서(DRAFT)가 documents 테이블에 생성됨. 문서번호 자동 채번 카테고리별 prefix (IQC/PRD/SLS/PUR), 결재라인 초기화, 기본필드 뷰 수정 완료
2.2 문서 데이터 입력 UI 양식의 columns/sections 기반 동적 테이블 렌더링. complex/select/check/measurement/text 컬럼 타입 지원. EAV 저장 (section_id, column_id, row_index) field_key 패턴: s{섹션}_r{행}_c{컬럼}_sub{인덱스}
2.3 결재 워크플로우 (제출/승인/반려) DRAFT→PENDING→APPROVED/REJECTED 전체 동작. 단계별 승인, 반려 사유 필수, 재제출 시 결재라인 초기화 submit/approve/reject API + 승인·반려 UI
2.4 문서 목록/검색/필터 상태별(DRAFT/PENDING/APPROVED), 양식별, 날짜별 필터 동작. 페이징 포함
2.5 문서 PDF 출력 ⏭️ 추후 고려 - react에 이미 html2pdf.js 구현됨 (6.2 결정사항 #1 참고)

3.3 Phase 3: 중간검사 양식 추가

# 작업 항목 상태 완료 기준 비고
3.1 중간검사 양식 구조 설계 절곡/스크린/슬랫/조인트바 4종의 검사항목/기준/판정방식 문서화 완료 5130 JSON 구조 분석
3.2 5130 중간검사 데이터 이관 설계 recordbendingMid 등 JSON→양식 매핑 테이블 완성
3.3 중간검사 양식 시드 데이터 4종 양식 seeder 생성, mng.sam.kr/document-templates에서 확인 가능
3.4 검사 기준 이미지 관리 5130/img/inspection/ 이미지 → mng/storage/app/public/inspection/로 이관. 양식에서 참조 가능 20+ 이미지

3.4 Phase 4: API 연동 및 mng JSON 화면 구현

# 작업 항목 상태 완료 기준 비고
4.1 API 엔드포인트 설계 (양식 조회, 문서 CRUD) api 저장소에 REST 엔드포인트 구현. Swagger 문서화 완료. 섹션 4.1의 엔드포인트 전체 동작 ⚠️ 컨펌 필요
4.2 mng에서 JSON 기반 문서 화면 구현 API에서 받은 양식 JSON으로 검사 성적서 형태 화면 렌더링. 기본정보+검사테이블+판정란 표시 Blade + HTMX
4.3 mng에서 문서 데이터 입력/저장 연동 JSON 화면에서 검사값 입력→API 호출→DB 저장. 판정(합격/불합격) 결과 저장 확인 6.2 결정사항 #2 적용
4.4 프론트엔드 담당자 협의 후 react 전환 결정 mng 완성 후 프론트 담당자와 미팅. react 기존 컴포넌트는 미수정 (6.2 결정사항 #4) 협의 결과 문서화

3.5 Phase 5 (추후): 기타 문서 확장

# 작업 항목 상태 비고
5.1 제품검사 양식 Phase 3 이후
5.2 작업일지 양식 WorkLogContent 기반
5.3 견적서/거래명세서/발주서 양식 기존 문서 모달 분석 필요

4. 아키텍처 설계

4.1 시스템 흐름

[mng - 양식 관리]                    [api - REST API]                [SAM - react 프론트]

DocumentTemplate CRUD  ---------->  GET /document-templates         양식 목록/상세
  - 결재라인 설정                    GET /document-templates/{id}
  - 기본필드 설정
  - 섹션/항목 설정                 POST /documents                  문서 생성
  - 컬럼 설정                      PUT  /documents/{id}             데이터 입력
                                    GET  /documents/{id}             문서 조회
Document 생성/관리  ------------>  POST /documents/{id}/submit      결재 제출
  - 데이터 입력                    POST /documents/{id}/approve     결재 승인
  - 결재 처리                      POST /documents/{id}/reject      결재 반려
  - PDF 출력                       GET  /documents/{id}/pdf         PDF 다운로드

4.2 JSON 응답 구조 (양식 상세)

{
  "template": {
    "id": 1,
    "name": "EGI 1.55T 수입검사",
    "category": "incoming_inspection",
    "title": "수 입 검 사 성 적 서",
    "companyName": "케이디산업",
    "approvalLines": [
      { "name": "작성", "dept": "판매/Order", "role": "담당자", "sortOrder": 1 },
      { "name": "검토", "dept": "생산", "role": "담당자", "sortOrder": 2 },
      { "name": "승인", "dept": "품질", "role": "QC", "sortOrder": 3 }
    ],
    "basicFields": [
      { "label": "품명", "fieldType": "text", "sortOrder": 1 },
      { "label": "규격", "fieldType": "text", "sortOrder": 2 },
      { "label": "LOT NO", "fieldType": "text", "sortOrder": 3 },
      { "label": "검사일자", "fieldType": "date", "sortOrder": 4 },
      { "label": "납품업체", "fieldType": "text", "sortOrder": 5 },
      { "label": "검사자", "fieldType": "text", "sortOrder": 6 }
    ],
    "sections": [
      {
        "title": "가이드레일",
        "imagePath": "/storage/inspection/guiderail.jpg",
        "items": [
          {
            "category": "겉모양",
            "item": "사용상 결함이 될 흠이 없을 것",
            "standard": "KS D 3506",
            "method": "육안검사",
            "frequency": "체크검사",
            "regulation": "KS D 3506"
          },
          {
            "category": "치수",
            "item": "두께",
            "standard": "1.55 +/- 0.15",
            "method": "계측",
            "frequency": "입고시",
            "regulation": "KS D 3506"
          }
        ]
      }
    ],
    "columns": [
      { "label": "NO", "columnType": "text", "width": "50px", "sortOrder": 1 },
      { "label": "검사항목", "columnType": "text", "width": "120px", "sortOrder": 2 },
      { "label": "검사기준", "columnType": "text", "width": "150px", "sortOrder": 3 },
      {
        "label": "검사 DATA",
        "columnType": "complex",
        "groupName": "검사 DATA",
        "subLabels": ["1", "2", "3", "4", "5"],
        "width": "300px",
        "sortOrder": 4
      },
      { "label": "판정", "columnType": "select", "width": "80px", "sortOrder": 5 }
    ],
    "footerRemarkLabel": "부적합 내용",
    "footerJudgementLabel": "종합판정",
    "footerJudgementOptions": ["합격", "불합격"]
  }
}

4.3 JSON 응답 구조 (문서 상세)

{
  "document": {
    "id": 1,
    "templateId": 1,
    "documentNo": "IQC-260131-01",
    "title": "EGI 1.55T 수입검사 성적서",
    "status": "APPROVED",
    "template": { "...위 구조와 동일..." },
    "basicData": {
      "품명": "전기 아연도금 강판",
      "규격": "EGI 1.55T",
      "LOT NO": "260131-01",
      "검사일자": "2026-01-31",
      "납품업체": "포스코",
      "검사자": "이세희"
    },
    "tableData": [
      {
        "sectionId": 1,
        "rows": [
          {
            "rowIndex": 0,
            "values": {
              "NO": "1",
              "검사항목": "겉모양",
              "검사기준": "사용상 결함 없을 것",
              "검사 DATA": { "1": "양호", "2": "양호", "3": "양호", "4": "-", "5": "-" },
              "판정": "적합"
            }
          }
        ]
      }
    ],
    "footerData": {
      "remark": "",
      "judgement": "합격"
    },
    "approvals": [
      { "step": 1, "role": "작성", "userName": "홍길동", "status": "APPROVED", "actedAt": "2026-01-31" },
      { "step": 2, "role": "검토", "userName": "김철수", "status": "APPROVED", "actedAt": "2026-01-31" },
      { "step": 3, "role": "승인", "userName": "이세희", "status": "APPROVED", "actedAt": "2026-01-31" }
    ]
  }
}

5. 5130 데이터 이관 계획

5.1 수입검사 자재 목록 (주요)

5130의 instock/fetch_inspection.php에서 자재코드별로 로딩하는 개별 페이지를 분석하여, 각 자재별 검사항목을 양식 시드 데이터로 변환한다.

# 자재 5130 파일 검사 항목 수 우선순위
1 EGI 1.55T (전기아연도금강판) i_EGI155.php ~8 높음
2 SUS Plate (스테인리스강판) i_SUSplate.php ~6 높음
3 GI Plate (아연도금강판) i_GIplate.php ~6 높음
4 Wire (와이어) i_wire.php ~4 중간
5 Motor (모터) i_motor.php ~5 중간
6 Angle (앵글) i_angle.php ~4 중간
7-20+ 기타 자재 개별 PHP 파일 다양 낮음

5.2 중간검사 이관 항목

검사 종류 5130 DB 필드 검사 항목 판정 방식
절곡품 recordbendingMid (JSON) 겉모양, 치수(높이/길이/간격), 가공상태 양호/불량 + 측정값 허용범위
스크린 recordscreenMid (JSON) 가공상태, 재봉상태, 조립상태, 길이, 나비, 간격 양호/불량 + OK/NG
슬랫 recordslatMid (JSON) 절곡품과 유사 구조 양호/불량 + 측정값
조인트바 recordjointbar (JSON) 가공상태, 조립상태, 치수(높이1/높이2/길이/간격) 양호/불량 + 측정값 허용치

5.3 검사 기준 이미지 이관

5130/img/inspection/ 디렉토리의 이미지를 mng storage로 이관:

  • jointbar_inspection.jpg
  • screen_inspection.jpg
  • bending_inspection1.jpg, bending_inspection2.jpg
  • slat_inspection.jpg
  • guiderail_* (다수 변형)
  • 기타 17+ 이미지

6. 기술 결정사항

6.1 확정된 사항

항목 결정 이유
양식 관리 위치 mng (Laravel + Blade) 관리자 전용, HTMX 기반 UI 이미 존재
데이터 저장 패턴 EAV (document_data 테이블) 이미 설계됨, 동적 필드 지원
문서 상태 DRAFT -> PENDING -> APPROVED/REJECTED/CANCELLED 이미 구현됨
API 제공 api 저장소 (Laravel REST API) SAM 표준 아키텍처
프론트엔드 소비 react (Next.js) JSON 렌더링 기존 document-system 컴포넌트 확장

6.2 검토 완료 사항 (2026-01-31 확정)

# 항목 결정 근거
1 PDF 생성 추후 고려 react에 이미 구현됨 (html2pdf.js + DocumentViewer). mng 단계에서는 PDF 불필요
2 검사 판정 로직 프론트에서 입력, 결과만 저장 양식이 검사항목/기준을 정의하고, 프론트에서 사용자가 입력. 저장 시 입력값+판정 결과를 그대로 저장. 별도 판정 엔진 불필요
3 양식 버전 관리 수정 시 새 버전 생성 요청마다 검사 기준이 다를 수 있으므로 버전 관리 필수. document_templates에 version 컬럼 추가 필요
4 기존 react 컴포넌트 전환 기존 react 미수정 mng에서 JSON 기반 화면 구현까지만 개발. 이후 프론트엔드 담당자와 협의하여 react 전환 여부 결정

7. 컨펌 대기 목록

# 항목 변경 내용 영향 범위 상태
1 API 엔드포인트 추가 /api/v1/document-templates, /api/v1/documents api 저장소 Phase 4 전
2 DB 마이그레이션 변경 여부 기존 테이블로 충분한지 vs version 컬럼 추가 필요 (6.2 #3 확정) api 저장소 Phase 1 중
3 검사 판정 로직 위치 프론트 vs 백엔드프론트 입력, 결과만 저장 - 해결됨 (6.2 #2)
4 PDF 생성 방식 클라이언트 vs 서버추후 고려 (react 기 구현) - 해결됨 (6.2 #1)

8. 변경 이력

📎 별도 파일로 관리: document-management-system-changelog.md


9. 참고 문서 및 파일

프로젝트 문서

  • docs/specs/database-schema.md - DB 스키마
  • docs/standards/quality-checklist.md - 품질 체크리스트
  • mng/CLAUDE.md - MNG 프로젝트 규칙

기존 코드 (mng)

  • mng/app/Models/DocumentTemplate.php - 양식 모델
  • mng/app/Models/Documents/Document.php - 문서 모델
  • mng/app/Http/Controllers/DocumentTemplateController.php - 양식 컨트롤러
  • mng/app/Http/Controllers/DocumentController.php - 문서 컨트롤러
  • mng/resources/views/document-templates/edit.blade.php - 양식 편집 UI (44.5KB)
  • mng/routes/web.php 340-353줄 - 라우트

기존 코드 (react)

  • react/src/components/document-system/ - 문서 공통 시스템
  • react/src/app/[locale]/(protected)/quality/qms/components/documents/ - QMS 검사 문서
  • react/src/components/production/WorkerScreen/WorkLogContent.tsx - 작업일지
  • react/src/components/production/WorkOrders/documents/ - 중간검사

5130 레거시

  • 5130/instock/fetch_inspection.php - 수입검사 메인 로더 (21.8KB)
  • 5130/instock/i_*.php - 자재별 수입검사 페이지 (40+)
  • 5130/output/viewMidInspect*.php - 중간검사 성적서
  • 5130/output/viewinspectionJointbar.php - 조인트바 검사
  • 5130/img/inspection/ - 검사 기준 이미지 (20+)

DB 마이그레이션

  • api/database/migrations/2026_01_26_200000_create_document_templates_table.php
  • api/database/migrations/2026_01_28_200000_create_documents_table.php

11. Phase별 상세 실행 절차

각 Phase 작업 시 이 섹션을 먼저 읽고 진행한다.

11.1 Phase 1.1 - 기존 document-templates 편집 UI 점검 및 보완

목표: mng.sam.kr/document-templates/{id}/edit에서 수입검사 양식에 필요한 모든 구성요소를 관리할 수 있는지 확인하고 부족한 부분을 보완한다.

사전 조건: 없음 (첫 번째 작업)

실행 절차:

Step 1: 현재 UI 분석
├── mng/resources/views/document-templates/edit.blade.php (44.5KB) 읽기
├── 기존 기능 목록 정리:
│   - 양식 기본정보 (이름, 카테고리, 제목, 회사명) 편집 가능?
│   - 결재라인 (approval_lines) CRUD 가능?
│   - 기본필드 (basic_fields) CRUD 가능?
│   - 섹션 (sections) CRUD 가능?
│   - 섹션 항목 (section_items) CRUD 가능?
│   - 컬럼 (columns) CRUD 가능?
│   - footer_remark_label, footer_judgement_label, footer_judgement_options 편집 가능?
└── 누락된 기능 목록화

Step 2: 브라우저에서 실제 동작 확인
├── https://mng.sam.kr/document-templates 접속
├── 기존 양식 편집 시도 (or 새 양식 생성 후 편집)
├── 각 탭/섹션별 CRUD 동작 확인
└── JS 에러, 저장 실패 등 이슈 기록

Step 3: 보완 작업
├── 누락된 CRUD 기능 구현 (Blade + HTMX + Alpine.js)
├── DocumentTemplateController 메서드 보강
├── 유효성 검증 추가 (FormRequest 패턴)
└── 섹션 항목(section_items)의 drag-drop 정렬 (있는 경우 확인, 없으면 sort_order 수동 관리)

Step 4: 검증
├── 새 양식 생성 → 모든 하위 요소 추가 → 저장 → DB 확인
├── 기존 양식 수정 → 저장 → 정상 반영 확인
└── 양식 삭제 → 하위 요소 cascade 삭제 확인

11.2 Phase 1.2 - 5130 수입검사 데이터 분석

목표: 5130의 자재별 수입검사 파일을 분석하여, 양식 시드 데이터로 변환할 수 있는 구조화된 데이터를 생성한다.

상태: 완료 (2026-01-31, 경량 분석)

분석 결과:

라우팅 구조

5130/instock/common/viewJS.phpviewBoardInstock() 함수가 item_name(품명) 기준 switch-case로 개별 검사 페이지(i_*.php)를 팝업 호출한다.

  • fetch_inspection.php = 데이터 입력 폼 (목록에서 호출)
  • i_*.php = 검사 성적서 뷰 (viewinspection 버튼에서 호출)
  • 총 23개 파일, 품명별 1:1 또는 N:1 매핑

자재 → 검사파일 매핑 (23개)

품명 파일 비고
EGI1.55T, EGI1.15T, EGI1.6T i_EGI155.php 전기아연도금강판
SUS1.55T, SUS1.5T, SUS1.2T i_SUSplate.php 스테인리스강판
GI0.5T, GI0.45T i_GIplate.php 아연도금강판
앵글 i_angle.php
받침용앵글 i_anglebottom.php
방화유리 i_antifireglass.php
절곡코일(EGI) i_bendingcoil.php spec 앞3자=EGI
베어링부 i_bracket.php
바이오세라크울96K i_cerakwool.php
연동제어기 i_controller.php
화이바원단 i_fiber.php
내화충진재 i_Fireproof_sealings.php
내화실 i_fireproofWire.php
전동개폐기 i_motor.php
평철 i_platesteel.php
마환봉 i_pole.php
각파이프 i_recpipe.php
감기샤프트 i_shaft.php
실리카원단 i_sillica.php
슬랫코일 i_slatcoil.php
절곡코일(SUS) i_SUScoil.php spec 앞3자=SUS
와이어원단 i_wire.php 기본
와이어원단(대한) i_wireDaehan.php remarks에 '대한' 포함 시

대표 자재 분석: EGI 1.55T (i_EGI155.php)

NO 검사항목 검사기준 검사방식 검사주기 데이터 타입
1 겉모양 사용상 해로울 결함이 없을 것 육안검사 n=3, c=0 OK/NG 체크 ×3
2 치수-두께 두께별 허용범위 (±0.07~±0.12, 4구간) 체크검사 n=3, c=0 측정값 ×3
2 치수-너비 1250 미만: +7/-0 체크검사 n=3, c=0 측정값 ×3
2 치수-길이 길이별 허용범위 (+10~+20/-0, 3구간) 체크검사 n=3, c=0 측정값 ×3
3 인장강도 (N/mm²) 270 이상 밀시트 입고시 단일값
4 연신율 (%) 두께별 36~38 이상 (3구간) 밀시트 입고시 단일값
5 아연 최소 부착량 (g/m²) 한면 17 이상 밀시트 입고시 단일값

대표 자재 분석: SUS Plate (i_SUSplate.php)

NO 검사항목 검사기준 검사방식 검사주기 데이터 타입
1 겉모양 사용상 해로울 결함이 없을 것 육안검사 n=3, c=0 OK/NG 체크 ×3
2 치수-두께 두께별 허용범위 (±0.10~±0.12, 2구간) 체크검사 n=3, c=0 측정값 ×3
2 치수-너비 1250 미만: +7/-0 체크검사 n=3, c=0 측정값 ×3
2 치수-길이 길이별 허용범위 (+10~+20/-0, 2구간) 체크검사 n=3, c=0 측정값 ×3
3 항복강도 (N/mm²) 205 이상 밀시트 입고시 단일값
4 인장강도 (N/mm²) 520 이상 밀시트 입고시 단일값
5 연신율 (%) 40 이상 밀시트 입고시 단일값
6 경도 (HV) 200 이하 밀시트 입고시 단일값

공통 패턴 요약

공통 구조 (모든 자재 동일):

  • 결재: 담당 / 부서장 (2단계)
  • 기본정보: 품명, 규격(두께×너비×길이), 납품업체/제조업체, 로트번호, 자재번호, 검사일자, 로트크기, 검사자
  • 검사 테이블 컬럼: NO / 검사항목 / 검사기준 / 검사방식 / 검사주기 / 측정치(n1,n2,n3) / 판정(적/부)
  • Footer: 부적합 내용 + 종합판정(합격/불합격)
  • 판정 로직: JS 자동 계산 (모든 항목 적→합격, 하나라도 부→불합격)
  • 저장: JSON(iList hidden field) → AJAX POST → insert_iList.php

자재별 차이점:

  • 검사항목 수/종류 (EGI: 5항목 7행, SUS: 6항목 8행)
  • 기준값 범위 (두께별 허용 오차, 강도/경도 기준 등)
  • 두께 범위 구간 수 (EGI: 4구간, SUS: 2구간)
  • 밀시트 항목 차이 (EGI: 인장+연신+아연, SUS: 항복+인장+연신+경도)

결론: 나머지 21개 자재는 Phase 1.3 시드 데이터 생성 시 개별 분석하면서 병행 진행

11.3 Phase 1.3 - 수입검사 양식 시드 데이터 생성

실행 절차:

Step 1: Seeder 파일 생성
├── mng/database/seeders/IncomingInspectionTemplateSeeder.php 생성
├── 1.2에서 정리한 데이터 기반
└── 주요 자재 10종 양식 생성 (EGI, SUS, GI, Wire, Motor, Angle 등)

Step 2: 실행 및 검증
├── php artisan db:seed --class=IncomingInspectionTemplateSeeder
├── mng.sam.kr/document-templates 에서 목록 확인
└── 각 양식 편집 화면에서 데이터 정합성 확인

12. 자기완결성 점검 결과

12.1 체크리스트 검증

# 검증 항목 상태 비고
1 작업 목적이 명확한가? 섹션 1.1 배경
2 성공 기준이 정의되어 있는가? 각 Phase 작업 항목에 "완료 기준" 컬럼 추가됨
3 작업 범위가 구체적인가? 섹션 3 Phase 1-5 + 섹션 11 상세 절차
4 의존성이 명시되어 있는가? 기존 DB/모델/컨트롤러 현황 + 새 세션 가이드
5 참고 파일 경로가 정확한가? 절대 경로 + 상대 경로 모두 명시
6 단계별 절차가 실행 가능한가? 섹션 11 Phase별 Step-by-step 절차
7 검증 방법이 명시되어 있는가? 각 Phase 완료 기준에 검증 방법 포함
8 모호한 표현이 없는가? 구체적 파일/테이블/컬럼/URL 명시

12.2 새 세션 시뮬레이션 테스트

질문 답변 가능 참조 섹션
Q1. 이 작업의 목적은 무엇인가? 1.1 배경
Q2. 어디서부터 시작해야 하는가? 🚀 새 세션 시작 가이드 + 📍 현재 진행 상태
Q3. 어떤 파일을 수정해야 하는가? 새 세션 가이드 "핵심 파일" + 2.2 + 9. 참고 파일
Q4. 작업 완료 확인 방법은? 각 Phase "완료 기준" 컬럼
Q5. 막혔을 때 참고 문서는? 9. 참고 문서 + 새 세션 가이드
Q6. mng 기술 스택과 로컬 환경은? 새 세션 가이드 "프로젝트 정보"
Q7. 모델 관계와 DB 구조는? 새 세션 가이드 "모델 관계 구조" + 2.1
Q8. Phase 1.1의 구체적 첫 단계는? 11.1 상세 실행 절차

결과: 8/8 통과 - 자기완결성 확보

12.3 보완 이력

날짜 항목 원본 보완 내용
2026-01-31 초기 검증 - 5/5 통과
2026-01-31 자기완결성 강화 새 세션에서 시작 불가 🚀 새 세션 시작 가이드 추가, 절대 경로/기술 스택/모델 코드 인라인, Phase 완료 기준 추가, 섹션 11 상세 실행 절차 추가, 컨펌 대기 목록 해결 항목 반영

이 문서는 /plan 스킬로 생성되었습니다.