# 생산/공사 (Production/Work) 분석

## 개요
- **디렉토리**: `/make/`, `/work/`
- **DB 테이블**: `work`, 동적 테이블 (`make_*`)
- **주요 기능**: 공사 관리, 생산 지시, 작업 진행 추적

## 디렉토리 구조

### /make/ (생산 지시)
```
/make/
├── _request.php           # 요청 파라미터
├── _row.php               # 행 렌더링
├── insert.php             # 데이터 저장
├── insert_new.php         # 신규 저장
├── list.php               # 생산 목록
├── write.php              # 생산 지시 등록
├── write_form.php         # 생산 지시 폼 (37KB)
├── print.php              # 인쇄
├── print_list.php         # 목록 인쇄
├── make.js                # 자바스크립트 (22KB)
├── get_check_done.php     # 완료 체크
├── get_screenlist.php     # 스크린 목록
├── update_checkbox.php    # 체크박스 업데이트
└── load*.php              # 데이터 로드
```

### /work/ (공사 관리)
```
/work/
├── _request.php           # 요청 파라미터 (91개 변수)
├── _row.php               # 행 렌더링
├── insert.php             # 데이터 저장
├── list.php               # 공사 목록
├── write_form.php         # 공사 등록 폼
├── view.php               # 공사 상세
├── searchkd.php           # 검색
├── workerlist.php         # 작업자 목록
├── savefile.php           # 파일 저장
└── ...
```

## DB 스키마

### work 테이블 (공사 마스터)
```sql
CREATE TABLE work (
    num INT AUTO_INCREMENT PRIMARY KEY,

    -- 공사 기본정보
    work_state VARCHAR(50),            -- 공사상태
    workplacename VARCHAR(200),        -- 현장명
    address TEXT,                      -- 현장주소
    chargedperson VARCHAR(50),         -- 공사담당자

    -- 발주처 정보 (1차)
    firstord VARCHAR(100),             -- 1차 발주처 (건설사)
    firstordman VARCHAR(50),           -- 1차 담당자
    firstordmantel VARCHAR(20),        -- 1차 연락처

    -- 발주처 정보 (2차)
    secondord VARCHAR(100),            -- 2차 발주처 (시공사)
    secondordman VARCHAR(50),          -- 2차 담당자
    secondordmantel VARCHAR(20),       -- 2차 연락처

    -- 작업 정보
    worklist TEXT,                     -- 작업 목록
    motormaker VARCHAR(100),           -- 모터 제조사
    power VARCHAR(50),                 -- 전원

    -- 일정 정보
    workday DATE,                      -- 시공 시작일
    endworkday DATE,                   -- 시공 완료일
    cableday DATE,                     -- 결선 시작일
    endcableday DATE,                  -- 결선 완료일

    -- 작업자 정보
    worker VARCHAR(100),               -- 시공팀
    cablestaff VARCHAR(100),           -- 결선팀

    -- AS 정보
    asday DATE,                        -- AS 접수일
    asman VARCHAR(50),                 -- AS 담당자
    asendday DATE,                     -- AS 완료일
    asproday DATE,                     -- AS 처리예정일
    setdate DATE,                      -- 세팅예정일
    asorderman VARCHAR(50),            -- AS 의뢰자
    asordermantel VARCHAR(20),         -- AS 의뢰자 연락처
    aslist TEXT,                       -- AS 내역
    asresult TEXT,                     -- AS 결과
    ashistory TEXT,                    -- AS 이력
    as_state VARCHAR(50),              -- AS 상태
    as_step VARCHAR(50),               -- AS 단계
    as_check TINYINT,                  -- AS 체크
    aswriter VARCHAR(50),              -- AS 등록자
    asfee TINYINT,                     -- AS 유/무상
    asfee_estimate INT,                -- AS 유상금액
    as_checkboxvalue1 CHAR(1),         -- AS 체크1
    as_checkboxvalue2 CHAR(1),         -- AS 체크2
    as_checkboxvalue3 CHAR(1),         -- AS 체크3
    as_checkboxvalue4 CHAR(1),         -- AS 체크4

    -- 클레임 정보
    claimperson VARCHAR(50),           -- 클레임 담당자
    claimtel VARCHAR(20),              -- 클레임 연락처
    claimList TEXT,                    -- 클레임 리스트 (JSON)

    -- 금액 정보
    sum_estimate DECIMAL(15,0),        -- 견적합계
    sum_bill DECIMAL(15,0),            -- 청구합계
    sum_receivable DECIMAL(15,0),      -- 미수금
    sum_deposit DECIMAL(15,0),         -- 입금합계
    sum_claimamount DECIMAL(15,0),     -- 클레임금액
    receivable DECIMAL(15,0),          -- 미수잔액
    totalbill DECIMAL(15,0),           -- 총청구액
    decided_estimate DECIMAL(15,0),    -- 확정견적
    total_receivable DECIMAL(15,0),    -- 총미수금
    total_deposit DECIMAL(15,0),       -- 총입금액
    issued_receivable DECIMAL(15,0),   -- 발행미수금
    issued_amount DECIMAL(15,0),       -- 발행금액

    -- 보증 정보
    warrantyFromDate DATE,             -- 보증 시작일
    warrantyToDate DATE,               -- 보증 종료일
    warrantyPeriod VARCHAR(50),        -- 보증 기간
    warrantyMemo TEXT,                 -- 보증 메모

    -- 인정검사 정보
    certifiedInspector VARCHAR(50),    -- 인정검사원
    certifiedLabelAttachedDate DATE,   -- 인정라벨 부착일

    -- 상태 정보
    checkbox TINYINT,                  -- 계약체결여부
    checkstep VARCHAR(50),             -- 진행단계
    workStatus VARCHAR(50),            -- 시공상태
    cableworkStatus VARCHAR(50),       -- 결선상태
    motorwirestatus VARCHAR(50),       -- 모터결선상태

    -- 체크 플래그
    checkreceivable TINYINT,           -- 미수금 체크
    checkbond TINYINT,                 -- 채권 체크

    -- JSON 데이터
    accountList TEXT,                  -- 회계 리스트 (JSON)
    estimateList TEXT,                 -- 견적 리스트 (JSON)
    equipmentList TEXT,                -- 장비 리스트 (JSON)

    -- 기타
    comment TEXT,                      -- 비고
    outputmemo TEXT,                   -- 출하 메모
    accountnote TEXT,                  -- 회계 메모
    change_worklist TEXT,              -- 변경 작업목록
    as_refer TEXT,                     -- AS 참조
    promiseday DATE,                   -- 약속일

    -- 시스템 필드
    regist_day DATETIME,               -- 등록일
    update_day DATETIME,               -- 수정일
    update_log TEXT,                   -- 수정이력
    searchtag TEXT,                    -- 검색태그
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그
    hit INT DEFAULT 0,                 -- 조회수

    INDEX idx_workplacename (workplacename),
    INDEX idx_secondord (secondord),
    INDEX idx_work_state (work_state)
);
```

## 공사 진행 상태

### work_state 상태값
| 상태 | 설명 | 조건 |
|------|------|------|
| 계약전 | 초기 상태 | checkbox = 0 |
| 착공전 | 계약 완료 | checkbox = 1 |
| 시공중 | 시공 시작 | workday 입력 |
| 결선대기 | 시공 완료 | endworkday 입력 |
| 결선중 | 결선 시작 | cableday 입력 |
| 결선완료 | 결선 완료 | endcableday 입력 |

### AS 상태 (as_state)
| 상태 | 설명 | 조건 |
|------|------|------|
| 미접수 | 초기 상태 | - |
| 접수완료 | AS 접수 | asday 입력 |
| 처리예약 | 처리 예정 | asproday 입력 |
| 세팅예약 | 세팅 예정 | setdate 입력 |
| 처리완료 | AS 완료 | asendday 입력 |

## 비즈니스 로직

### 공사 상태 자동 계산
```php
// as/list.php
$state_work = 0;
if ($row["checkbox"] == 0) $state_work = 1;           // 착공전
if (substr($row["workday"], 0, 2) == "20") $state_work = 2;      // 시공중
if (substr($row["endworkday"], 0, 2) == "20") $state_work = 3;   // 결선대기
if (substr($row["cableday"], 0, 2) == "20") $state_work = 4;     // 결선중
if (substr($row["endcableday"], 0, 2) == "20") $state_work = 5;  // 결선완료
```

### 생산 지시 처리
```php
// make/insert.php
// screen_state 업데이트
$sql = "UPDATE $DB.$tablename SET screen_state=?, update_log=? WHERE num=?";
```

## 관련 디렉토리

### 벤딩 관련
```
/bending/            # 벤딩 작업 관리
/bendingfee/         # 벤딩 비용
/bendingmap/         # 벤딩 맵
/etcbending/         # 기타 벤딩
```

### 출력물 관련
```
/output/             # 출하/출력
/egimake/            # EGI 제작
/guiderail/          # 가이드레일
/shutterbox/         # 셔터박스
```

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

### 1. 공사/프로젝트 분리
```sql
-- SAM: 프로젝트 마스터
projects (
    id,
    tenant_id,
    project_number,
    project_name,
    customer_id,
    status,              -- draft, contracted, in_progress, completed
    contracted_date,
    start_date,
    end_date
)

-- SAM: 공사 단계
project_phases (
    id,
    project_id,
    phase_type,          -- construction, wiring, testing
    planned_start,
    planned_end,
    actual_start,
    actual_end,
    assigned_team,
    status
)
```

### 2. 작업 지시서
```sql
-- SAM: 작업 지시
work_orders (
    id,
    project_id,
    work_order_number,
    work_type,           -- production, assembly, installation
    status,
    priority,
    due_date,
    assigned_to
)

-- SAM: 작업 상세
work_order_items (
    id,
    work_order_id,
    item_id,
    quantity,
    completed_quantity,
    status
)
```

### 3. 진행 상태 추적
```sql
-- SAM: 상태 이력
status_histories (
    id,
    entity_type,         -- project, work_order, phase
    entity_id,
    from_status,
    to_status,
    changed_by,
    changed_at,
    reason
)
```

## 참고 파일
- `/work/_request.php` - 91개 요청 변수 정의
- `/work/insert.php` - 저장 로직
- `/make/write_form.php` - 생산 지시 UI
- `/as/list.php` - 공사 상태 계산 로직
