# 출하 (Shipping/Output) 분석

## 개요
- **디렉토리**: `/output/`
- **DB 테이블**: `output` (메인), `output_extra` (서브)
- **주요 기능**: 출하 관리, 배송 추적, 인정검사(ACI), 품질 서류

## 디렉토리 구조
```
/output/
├── _request.php                   # 요청 파라미터 (108개)
├── _row.php                       # 행 렌더링
├── _row_extra.php                 # 추가 행 렌더링
├── insert.php                     # 출하 저장 (342줄)
├── list.php                       # 출하 목록
├── list_*.php                     # 용도별 목록 (20개+)
│   ├── list_ACI.php               # 인정검사 목록
│   ├── list_POD.php               # 출고증 목록
│   ├── list_QCdoc.php             # 품질서류 목록
│   ├── list_QCsales.php           # 품질매출 목록
│   ├── list_account.php           # 회계 목록
│   ├── list_bending.php           # 벤딩 목록
│   ├── list_bending_mid.php       # 벤딩 중간검사
│   ├── list_deliveryfee.php       # 배송비 목록
│   ├── list_document.php          # 서류 목록
│   ├── list_jointbar.php          # 조인트바 목록
│   ├── list_order.php             # 발주 목록
│   ├── list_output.php            # 출력 목록
│   ├── list_requestACI.php        # ACI 요청 목록
│   ├── list_screen.php            # 스크린 목록
│   ├── list_screen_mid.php        # 스크린 중간검사
│   ├── list_slat.php              # 슬랫 목록
│   └── list_slat_mid.php          # 슬랫 중간검사
├── write_form.php                 # 출하 등록 폼 (107KB)
├── write_form_script.php          # 스크립트 (267KB)
├── view*.php                      # 각종 뷰 (30개+)
├── insert_*.php                   # 부분 저장
├── fetch_*.php                    # AJAX 데이터 조회
└── json/                          # JSON 데이터 저장
```

## DB 스키마

### output 테이블 (메인)
```sql
CREATE TABLE output (
    num INT AUTO_INCREMENT PRIMARY KEY,

    -- 기본 정보
    outdate DATE,                      -- 출하일
    indate DATE,                       -- 등록일
    orderman VARCHAR(50),              -- 담당자
    outworkplace VARCHAR(200),         -- 현장명/거래처
    outputplace VARCHAR(200),          -- 출하장소
    receiver VARCHAR(50),              -- 수령자
    phone VARCHAR(20),                 -- 연락처
    delivery VARCHAR(100),             -- 배송방법/업체

    -- 분류 정보
    root VARCHAR(50),                  -- 경로
    steel VARCHAR(50),                 -- 강종
    motor VARCHAR(100),                -- 모터

    -- 상태 정보
    regist_state VARCHAR(20),          -- 등록상태 (등록, 완료)
    bend_state VARCHAR(20),            -- 벤딩상태
    motor_state VARCHAR(20),           -- 모터상태 (준비완료 등)

    -- 발주처 정보
    con_num VARCHAR(50),               -- 계약번호
    secondord VARCHAR(100),            -- 2차 발주처
    secondordman VARCHAR(50),          -- 2차 담당자
    secondordmantel VARCHAR(20),       -- 2차 연락처
    secondordnum VARCHAR(50),          -- 2차 발주번호

    -- 스크린 정보
    screen VARCHAR(100),               -- 스크린 유형
    screen_su INT,                     -- 스크린 수량
    screen_m2 DECIMAL(10,2),           -- 스크린 면적(m²)
    screenlist TEXT,                   -- 스크린 리스트 (JSON)

    -- 슬랫 정보
    slat VARCHAR(100),                 -- 슬랫 유형
    slat_su INT,                       -- 슬랫 수량
    slat_m2 DECIMAL(10,2),             -- 슬랫 면적(m²)
    slatlist TEXT,                     -- 슬랫 리스트 (JSON)

    -- 제품/LOT 정보
    prodCode VARCHAR(50),              -- 제품코드
    warrantyNum VARCHAR(50),           -- 보증번호
    lotNum VARCHAR(50),                -- LOT 번호
    warranty VARCHAR(100),             -- 보증정보

    -- 인정검사(ACI) 정보
    ACIregDate DATE,                   -- ACI 등록일
    ACIaskDate DATE,                   -- ACI 신청일
    ACIdoneDate DATE,                  -- ACI 완료일
    ACImemo TEXT,                      -- ACI 메모
    ACIcheck TINYINT,                  -- ACI 체크
    ACIgroupCode VARCHAR(50),          -- ACI 그룹코드
    ACIgroupName VARCHAR(100),         -- ACI 그룹명

    -- 배송비 정보
    deliveryfeeList TEXT,              -- 배송비 리스트 (JSON)

    -- 견적 연결
    estimate_num INT,                  -- 연결된 견적번호
    displayText TEXT,                  -- 표시 텍스트

    -- 체크 플래그
    slatcheck VARCHAR(10),             -- 슬랫 체크
    partscheck VARCHAR(10),            -- 부품 체크
    devMode VARCHAR(10),               -- 개발자모드

    -- 기타
    comment TEXT,                      -- 비고
    updatecomment TEXT,                -- 수정 비고
    orderdate DATE,                    -- 발주일

    -- 시스템 필드
    searchtag TEXT,                    -- 검색태그
    update_log TEXT,                   -- 수정이력
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그

    INDEX idx_outdate (outdate),
    INDEX idx_outworkplace (outworkplace),
    INDEX idx_prodCode (prodCode)
);
```

### output_extra 테이블 (상세/견적)
```sql
CREATE TABLE output_extra (
    id INT AUTO_INCREMENT PRIMARY KEY,
    parent_num INT,                    -- output.num 참조

    -- 견적 상세 JSON
    detailJson TEXT,                   -- 상세 정보 JSON
    estimateList TEXT,                 -- 견적 리스트 JSON
    estimateSlatList TEXT,             -- 슬랫 견적 리스트 JSON
    estimateList_auto TEXT,            -- 자동계산 리스트 JSON
    estimateSlatList_auto TEXT,        -- 슬랫 자동계산 JSON

    -- 금액 정보
    estimateTotal INT DEFAULT 0,       -- 견적 총액
    EstimateFirstSum INT DEFAULT 0,    -- 최초 견적
    EstimateUpdatetSum INT DEFAULT 0,  -- 수정 견적
    EstimateDiffer INT DEFAULT 0,      -- 차액
    estimateSurang INT DEFAULT 0,      -- 수량
    inspectionFee INT DEFAULT 50000,   -- 인정검사비
    EstimateDiscountRate DECIMAL(5,2), -- 할인율
    EstimateDiscount INT DEFAULT 0,    -- 할인금액
    EstimateFinalSum INT DEFAULT 0,    -- 최종금액
    ET_unapproved INT DEFAULT 0,       -- 비인정 금액
    ET_total INT DEFAULT 0,            -- 총 금액

    -- 규격 정보
    pjnum VARCHAR(50),                 -- 프로젝트 번호
    major_category VARCHAR(50),        -- 대분류
    position VARCHAR(50),              -- 위치
    makeWidth INT,                     -- 제작 폭
    makeHeight INT,                    -- 제작 높이
    maguriWing VARCHAR(20),            -- 마구리 윙

    -- 작업/검사 리스트 (JSON)
    screen_unapprovedList TEXT,        -- 스크린 비인정 리스트
    slat_unapprovedList TEXT,          -- 슬랫 비인정 리스트
    motorList TEXT,                    -- 모터 리스트
    bendList TEXT,                     -- 벤딩 리스트
    etcList TEXT,                      -- 기타 리스트
    controllerList TEXT,               -- 컨트롤러 리스트

    -- 회계 정보
    accountDate DATE,                  -- 회계일
    accountList TEXT,                  -- 회계 리스트 (JSON)

    FOREIGN KEY (parent_num) REFERENCES output(num),
    INDEX idx_parent_num (parent_num)
);
```

## JSON 데이터 구조

### screenlist / slatlist
```json
[
    {
        "seq": 1,
        "item_code": "SCR001",
        "width": 1200,
        "height": 2400,
        "quantity": 2,
        "area": 5.76,
        "note": "비고"
    }
]
```

### deliveryfeeList
```json
[
    {
        "delivery_date": "2025-01-15",
        "carrier": "한진택배",
        "fee": 50000,
        "paid_by": "발송인"
    }
]
```

### motorList / bendList
```json
[
    {
        "model": "KD-M001",
        "quantity": 1,
        "status": "완료",
        "note": ""
    }
]
```

## 비즈니스 로직

### 출하 등록 프로세스
```php
// insert.php
if ($mode == "insert") {
    // 1. output 테이블 저장
    $sql = "INSERT INTO $DB.output (outdate, indate, orderman, ...) VALUES (?, ?, ?, ...)";
    $output_num = $pdo->lastInsertId();

    // 2. output_extra 테이블 저장
    $sql2 = "INSERT INTO $DB.output_extra (parent_num, detailJson, ...) VALUES (?, ?, ...)";

    // 3. 첨부파일 연결 (timekey → num)
    if ($timekey != '') {
        $sql = "UPDATE $DB.picuploads SET parentnum=? WHERE parentnum=?";
    }
}
```

### 상태 변경
```php
// 완료 처리 시 모터 상태 자동 변경
if ($regist_state == '완료') {
    $motor_state = "준비완료";
}
```

## 관련 뷰 파일

### 작업 뷰 (생산 작업지시서)
- `viewBendingWork.php` - 벤딩 작업
- `viewScreenWork.php` - 스크린 작업
- `viewSlatWork.php` - 슬랫 작업

### 검사 뷰 (중간검사)
- `viewMidInspectBending.php` - 벤딩 중간검사
- `viewMidInspectScreen.php` - 스크린 중간검사
- `viewMidInspectSlat.php` - 슬랫 중간검사

### 발주/출고 뷰
- `viewOrder.php` - 발주서
- `viewOutput.php` - 출하서
- `viewConfirm.php` - 확인서

### ACI 뷰
- `view_requestACI.php` - ACI 요청
- `view_requestACIgroup.php` - ACI 그룹 요청
- `view_QCcertificate.php` - 품질인증서

## SAM 마이그레이션 포인트

### 1. 출하 구조 개선
```sql
-- SAM: 출하 헤더
shipments (
    id,
    tenant_id,
    shipment_number,
    project_id,
    customer_id,
    ship_date,
    status,              -- draft, confirmed, shipped, delivered
    delivery_address,
    receiver_name,
    receiver_phone,
    carrier,
    tracking_number
)

-- SAM: 출하 상세
shipment_items (
    id,
    shipment_id,
    item_type,           -- screen, slat, motor, etc.
    item_code,
    quantity,
    lot_number,
    note
)
```

### 2. 인정검사(ACI) 분리
```sql
-- SAM: 인정검사 관리
aci_inspections (
    id,
    shipment_id,
    inspection_number,
    request_date,
    inspection_date,
    result,              -- pending, passed, failed
    inspector,
    certificate_number,
    documents JSON       -- 첨부문서
)
```

### 3. 배송비 관리
```sql
-- SAM: 배송비 이력
delivery_fees (
    id,
    shipment_id,
    carrier,
    fee_amount,
    payment_type,        -- prepaid, collect
    paid_date,
    receipt_number
)
```

### 4. 문서 관리
```sql
-- SAM: 출하 문서
shipment_documents (
    id,
    shipment_id,
    document_type,       -- work_order, inspection, certificate
    document_number,
    generated_at,
    file_path
)
```

## 참고 파일
- `/output/insert.php` - 저장 로직 (342줄)
- `/output/_request.php` - 108개 요청 변수
- `/output/write_form.php` - 대형 UI (107KB)
- `/output/write_form_script.php` - 스크립트 (267KB)
