-- ============================================================
-- LMS 시스템 전체 DB DDL (SCHEMA)
-- 한국산업인력공단 EMON 연계 온라인평생교육원 LMS
-- Version : 1.0.0
-- Date    : 2026-03-19
-- Engine  : MySQL 8.x | InnoDB | utf8mb4_unicode_ci
-- Total   : 56개 테이블 (API_* 8개 + lms_* 48개)
-- 규칙    : PDO 금지 / mysqli_query 기반 / PHP 7.x 호환
-- ============================================================


-- ============================================================
-- [그룹 A] EMON 제공 테이블 - 8개 (원형유지)
-- ============================================================

-- A-1. API_USER_HIST (회원정보이력)
CREATE TABLE IF NOT EXISTS `API_USER_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID(member_id)',
  `USER_ID`            VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 로그인ID',
  `USER_NM`            VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '훈련생명',
  `EMAIL`              VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '이메일',
  `MOBILE`             VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '휴대폰',
  `REG_DT`             VARCHAR(14) NOT NULL DEFAULT ''          COMMENT '등록일시(YYYYMMDDHHmmss)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_agent_pk`      (`AGENT_PK`),
  KEY `idx_user_agent_pk` (`USER_AGENT_PK`),
  KEY `idx_send`          (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 회원정보이력 전송 테이블';

-- A-2. API_USER_LOGIN_HIST (회원로그인이력)
CREATE TABLE IF NOT EXISTS `API_USER_LOGIN_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID',
  `LOGIN_DT`           VARCHAR(14) NOT NULL DEFAULT ''          COMMENT '로그인일시(YYYYMMDDHHmmss)',
  `LOGIN_IP`           VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '로그인IP',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_user_agent_pk` (`USER_AGENT_PK`),
  KEY `idx_send`          (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 회원로그인이력 전송 테이블';

-- A-3. API_COURSE_HIST (과정이력)
CREATE TABLE IF NOT EXISTS `API_COURSE_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `COURSE_AGENT_PK`    VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '과정 고유ID(course_id)',
  `COURSE_NM`          VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '과정명',
  `HRD_COURSE_CD`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT 'HRD-Net 과정코드',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_course_agent_pk` (`COURSE_AGENT_PK`),
  KEY `idx_send`            (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 과정이력 전송 테이블';

-- A-4. API_CLASS_HIST (차수이력)
CREATE TABLE IF NOT EXISTS `API_CLASS_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `CLASS_AGENT_PK`     VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '차수 고유ID(class_id)',
  `COURSE_AGENT_PK`    VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '과정 고유ID',
  `HRD_CLASS_SEQ`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT 'HRD-Net 회차번호',
  `EMP_INS_FLAG`       TINYINT(1) NOT NULL DEFAULT 0            COMMENT '훈련유형(0:비환급,1:사업주,2:컨소시엄,3:실업자,4:근로자)',
  `LEARN_START_DT`     VARCHAR(8) NOT NULL DEFAULT ''           COMMENT '학습시작일(YYYYMMDD)',
  `LEARN_END_DT`       VARCHAR(8) NOT NULL DEFAULT ''           COMMENT '학습종료일(YYYYMMDD)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_class_agent_pk`  (`CLASS_AGENT_PK`),
  KEY `idx_send`            (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 차수이력 전송 테이블';

-- A-5. API_ATTEND_HIST (수강이력)
CREATE TABLE IF NOT EXISTS `API_ATTEND_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `CLASS_AGENT_PK`     VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '차수 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID',
  `EMP_INS_FLAG`       TINYINT(1) NOT NULL DEFAULT 0            COMMENT '훈련유형',
  `WORKER_TYPE`        VARCHAR(3) NOT NULL DEFAULT ''           COMMENT '훈련생구분코드',
  `IRREGULAR_TYPE`     VARCHAR(3) NOT NULL DEFAULT ''           COMMENT '비정규직구분코드',
  `COST_COMPANY_NO`    VARCHAR(11) NOT NULL DEFAULT ''          COMMENT '비용수급사업장번호',
  `ENROLL_DT`          VARCHAR(8) NOT NULL DEFAULT ''           COMMENT '수강신청일(YYYYMMDD)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_class_agent_pk`  (`CLASS_AGENT_PK`),
  KEY `idx_user_agent_pk`   (`USER_AGENT_PK`),
  KEY `idx_send`            (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 수강이력 전송 테이블';

-- A-6. API_ATTEND_RESULT_HIST (수강결과이력)
CREATE TABLE IF NOT EXISTS `API_ATTEND_RESULT_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `CLASS_AGENT_PK`     VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '차수 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID',
  `PROGRESS_RATE`      DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '진도율(%)',
  `FINAL_SCORE`        DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '최종점수',
  `PASS_YN`            CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '수료여부(Y/N)',
  `PASS_DT`            VARCHAR(8) NOT NULL DEFAULT ''           COMMENT '수료일(YYYYMMDD)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_class_agent_pk`  (`CLASS_AGENT_PK`),
  KEY `idx_user_agent_pk`   (`USER_AGENT_PK`),
  KEY `idx_send`            (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 수강결과이력 전송 테이블';

-- A-7. API_SCORE_HIST (성적이력)
CREATE TABLE IF NOT EXISTS `API_SCORE_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `CLASS_AGENT_PK`     VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '차수 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID',
  `SCORE_TYPE`         VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '성적유형(EXAM/TASK/INGTEST)',
  `SCORE`              DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '점수',
  `SCORE_DT`           VARCHAR(14) NOT NULL DEFAULT ''          COMMENT '성적일시(YYYYMMDDHHmmss)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_class_agent_pk`  (`CLASS_AGENT_PK`),
  KEY `idx_user_agent_pk`   (`USER_AGENT_PK`),
  KEY `idx_send`            (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 성적이력 전송 테이블';

-- A-8. API_PHONE_AUTH_HIST (본인인증이력)
CREATE TABLE IF NOT EXISTS `API_PHONE_AUTH_HIST` (
  `SEQ`                BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '순번',
  `AGENT_PK`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '훈련기관 고유ID',
  `USER_AGENT_PK`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '훈련생 고유ID',
  `AUTH_TYPE`          VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '인증유형(JOIN:가입,LOGIN:로그인,CHANGE:변경)',
  `AUTH_MOBILE`        VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '인증 휴대폰번호',
  `AUTH_DT`            VARCHAR(14) NOT NULL DEFAULT ''          COMMENT '인증일시(YYYYMMDDHHmmss)',
  `AUTH_RESULT`        CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '인증결과(Y:성공,N:실패)',
  `SEND`               TINYINT(1) NOT NULL DEFAULT 0            COMMENT '전송여부(0:대기,1:성공,-1:실패)',
  `SEND_DT`            DATETIME NULL DEFAULT NULL               COMMENT '전송일시',
  `SEND_RESULT`        TEXT NULL                                COMMENT '전송결과 메시지',
  `CREATED_AT`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`SEQ`),
  KEY `idx_user_agent_pk` (`USER_AGENT_PK`),
  KEY `idx_send`          (`SEND`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='EMON 본인인증이력 전송 테이블';

-- B-3. lms_admin_log (관리자 활동이력)
CREATE TABLE IF NOT EXISTS `lms_admin_log` (
  `log_id`             BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '로그 고유번호',
  `admin_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '관리자 ID',
  `admin_name`         VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '관리자명(스냅샷)',
  `action`             VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '행위(LOGIN/LOGOUT/INSERT/UPDATE/DELETE 등)',
  `target_table`       VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '대상 테이블',
  `target_id`          VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '대상 레코드 ID',
  `description`        VARCHAR(500) NOT NULL DEFAULT ''         COMMENT '상세 설명',
  `before_data`        LONGTEXT NULL                            COMMENT '변경 전 데이터(JSON)',
  `after_data`         LONGTEXT NULL                            COMMENT '변경 후 데이터(JSON)',
  `ip_addr`            VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '접속 IP',
  `user_agent`         VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '브라우저 정보',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '기록일시',
  PRIMARY KEY (`log_id`),
  KEY `idx_admin_id`   (`admin_id`),
  KEY `idx_action`     (`action`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='관리자 활동 이력';

-- B-4. lms_popup (팝업 관리)
CREATE TABLE IF NOT EXISTS `lms_popup` (
  `popup_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '팝업 고유번호',
  `popup_title`        VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '팝업 제목(관리용)',
  `popup_content`      LONGTEXT NULL                            COMMENT '팝업 내용(HTML)',
  `popup_image`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '팝업 이미지 경로',
  `popup_link`         VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '클릭시 이동 URL',
  `popup_target`       VARCHAR(10) NOT NULL DEFAULT '_blank'    COMMENT '링크 타겟(_blank/_self)',
  `pos_top`            INT(5) NOT NULL DEFAULT 0                COMMENT '상단 위치(px)',
  `pos_left`           INT(5) NOT NULL DEFAULT 0                COMMENT '좌측 위치(px)',
  `width`              INT(5) NOT NULL DEFAULT 400              COMMENT '팝업 너비(px)',
  `height`             INT(5) NOT NULL DEFAULT 500              COMMENT '팝업 높이(px)',
  `start_date`         DATE NULL DEFAULT NULL                   COMMENT '노출 시작일',
  `end_date`           DATE NULL DEFAULT NULL                   COMMENT '노출 종료일',
  `display_yn`         CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '노출여부(Y/N)',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '노출 순서',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`popup_id`),
  KEY `idx_display`    (`display_yn`, `start_date`, `end_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='메인 팝업 관리';

-- B-5. lms_banner (배너 관리)
CREATE TABLE IF NOT EXISTS `lms_banner` (
  `banner_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '배너 고유번호',
  `banner_zone`        VARCHAR(20) NOT NULL DEFAULT 'MAIN'      COMMENT '배너존(MAIN:메인상단,SUB:서브,SIDE:사이드)',
  `banner_title`       VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '배너 제목(관리용)',
  `banner_image`       VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '배너 이미지 경로(PC)',
  `banner_image_mo`    VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '배너 이미지 경로(모바일)',
  `banner_link`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '클릭 URL',
  `banner_target`      VARCHAR(10) NOT NULL DEFAULT '_self'     COMMENT '링크 타겟',
  `alt_text`           VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '이미지 대체 텍스트',
  `start_date`         DATE NULL DEFAULT NULL                   COMMENT '노출 시작일',
  `end_date`           DATE NULL DEFAULT NULL                   COMMENT '노출 종료일',
  `display_yn`         CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '노출여부(Y/N)',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '노출 순서',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`banner_id`),
  KEY `idx_zone_display` (`banner_zone`, `display_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='배너 관리';

-- C-2. lms_member_login_log (훈련생 로그인이력)
CREATE TABLE IF NOT EXISTS `lms_member_login_log` (
  `log_id`             BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '로그 고유번호',
  `member_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '회원 ID',
  `user_id`            VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '로그인 시도 아이디',
  `login_result`       CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '로그인결과(Y:성공,N:실패)',
  `fail_reason`        VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '실패사유(WRONG_PW/NOT_FOUND/SUSPENDED 등)',
  `ip_addr`            VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '접속 IP',
  `user_agent`         VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '브라우저 정보',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '로그인일시',
  PRIMARY KEY (`log_id`),
  KEY `idx_member_id`  (`member_id`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='훈련생 로그인 이력';

-- C-3. lms_phone_auth (휴대폰 본인인증이력)
CREATE TABLE IF NOT EXISTS `lms_phone_auth` (
  `auth_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '인증 고유번호',
  `mobile`             VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '인증 휴대폰번호',
  `auth_code`          VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '인증번호(6자리)',
  `auth_type`          VARCHAR(10) NOT NULL DEFAULT 'JOIN'      COMMENT '인증유형(JOIN:가입,FIND:아이디/비번찾기,CHANGE:변경)',
  `auth_result`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '인증완료여부(Y/N)',
  `expire_at`          DATETIME NULL DEFAULT NULL               COMMENT '만료일시(발송후 3분)',
  `verified_at`        DATETIME NULL DEFAULT NULL               COMMENT '인증완료일시',
  `ip_addr`            VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '요청 IP',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '발송일시',
  PRIMARY KEY (`auth_id`),
  KEY `idx_mobile`     (`mobile`),
  KEY `idx_expire_at`  (`expire_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='휴대폰 본인인증 이력';

-- C-4. lms_member_withdraw (회원탈퇴이력)
CREATE TABLE IF NOT EXISTS `lms_member_withdraw` (
  `withdraw_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '탈퇴이력 고유번호',
  `member_id`          INT(10) NOT NULL                         COMMENT '탈퇴한 회원 ID',
  `user_id`            VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '탈퇴한 로그인ID(스냅샷)',
  `user_name`          VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '이름(스냅샷)',
  `email`              VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '이메일(스냅샷)',
  `withdraw_reason`    VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '탈퇴사유',
  `withdraw_detail`    TEXT NULL                                COMMENT '탈퇴 상세내용',
  `withdraw_type`      CHAR(1) NOT NULL DEFAULT 'S'             COMMENT '탈퇴구분(S:본인신청,A:관리자강제)',
  `processed_by`       INT(10) NOT NULL DEFAULT 0               COMMENT '처리 관리자ID(강제탈퇴시)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '탈퇴일시',
  PRIMARY KEY (`withdraw_id`),
  KEY `idx_member_id`  (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원 탈퇴 이력';

-- D-2. lms_tutor_career (강사 경력/학력/자격)
CREATE TABLE IF NOT EXISTS `lms_tutor_career` (
  `career_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '경력 고유번호',
  `tutor_id`           INT(10) NOT NULL                         COMMENT '강사 ID',
  `career_type`        TINYINT(1) NOT NULL DEFAULT 1            COMMENT '구분(1:학력,2:경력,3:자격증,4:수상)',
  `institution`        VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '기관/학교명',
  `content`            VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '내용(전공/직위/자격명 등)',
  `start_date`         VARCHAR(7) NOT NULL DEFAULT ''           COMMENT '시작년월(YYYY-MM)',
  `end_date`           VARCHAR(7) NOT NULL DEFAULT ''           COMMENT '종료년월(YYYY-MM, 현재=현재)',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '출력 순서',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`career_id`),
  KEY `idx_tutor_id`   (`tutor_id`),
  KEY `idx_career_type` (`career_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='강사 경력/학력/자격 정보';

-- D-3. lms_tutor_log (강사 활동이력)
CREATE TABLE IF NOT EXISTS `lms_tutor_log` (
  `log_id`             BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '로그 고유번호',
  `tutor_id`           INT(10) NOT NULL                         COMMENT '강사 ID',
  `action`             VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '행위(LOGIN/GRADE_TASK/ANSWER_QNA 등)',
  `target_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '대상 ID (enroll_id/qna_id 등)',
  `description`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '상세 설명',
  `ip_addr`            VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '접속 IP',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '기록일시',
  PRIMARY KEY (`log_id`),
  KEY `idx_tutor_id`   (`tutor_id`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='강사 활동 이력';

-- E-2. lms_company_dept (기업 부서정보)
CREATE TABLE IF NOT EXISTS `lms_company_dept` (
  `dept_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '부서 고유번호',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID',
  `dept_name`          VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '부서명',
  `dept_code`          VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '부서 코드(내부관리)',
  `parent_dept_id`     INT(10) NOT NULL DEFAULT 0               COMMENT '상위 부서 ID(0=최상위)',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '정렬순서',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`dept_id`),
  KEY `idx_company_id` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기업 부서 정보';

-- E-3. lms_company_manager (기업 담당자)
CREATE TABLE IF NOT EXISTS `lms_company_manager` (
  `manager_id`         INT(10) NOT NULL AUTO_INCREMENT          COMMENT '담당자 고유번호',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID',
  `manager_name`       VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '담당자명',
  `manager_type`       TINYINT(1) NOT NULL DEFAULT 1            COMMENT '구분(1:교육담당자,2:지도담당자,3:결제담당자)',
  `dept_name`          VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '부서명',
  `position`           VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '직급',
  `tel`                VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '전화번호',
  `email`              VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '이메일',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '재직여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`manager_id`),
  KEY `idx_company_id` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기업 담당자 정보';

-- E-4. lms_company_contract (기업 위탁계약)
CREATE TABLE IF NOT EXISTS `lms_company_contract` (
  `contract_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '계약 고유번호',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID',
  `class_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '차수 ID',
  `contract_no`        VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '계약번호',
  `contract_date`      DATE NULL DEFAULT NULL                   COMMENT '계약일',
  `contract_file`      VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '계약서 파일 경로',
  `edu_price`          INT(10) NOT NULL DEFAULT 0               COMMENT '교육비 합계',
  `self_price`         INT(10) NOT NULL DEFAULT 0               COMMENT '자부담 합계',
  `invoice_date`       DATE NULL DEFAULT NULL                   COMMENT '청구계산서 발행일',
  `receipt_date`       DATE NULL DEFAULT NULL                   COMMENT '영수계산서 발행일',
  `deposit_date`       DATE NULL DEFAULT NULL                   COMMENT '자부담 입금일',
  `memo`               TEXT NULL                                COMMENT '비고',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`contract_id`),
  KEY `idx_company_id` (`company_id`),
  KEY `idx_class_id`   (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기업 위탁계약 정보';

-- E-5. lms_branch (지사/지점)
CREATE TABLE IF NOT EXISTS `lms_branch` (
  `branch_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '지사 고유번호',
  `branch_name`        VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '지사명',
  `branch_code`        VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '지사 코드',
  `region`             VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '담당 지역',
  `tel`                VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '전화번호',
  `fax`                VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '팩스',
  `email`              VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '이메일',
  `post_code`          VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '우편번호',
  `addr1`              VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '주소',
  `addr2`              VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '상세주소',
  `manager_name`       VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '담당자명',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`branch_id`),
  KEY `idx_use_yn`     (`use_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='지사/지점 정보';


-- ============================================================
-- [그룹 F] 과정 - 5개
-- ============================================================

-- F-1. lms_category (과정 카테고리)
CREATE TABLE IF NOT EXISTS `lms_category` (
  `category_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '카테고리 고유번호',
  `parent_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '상위 카테고리 ID(0=최상위)',
  `category_name`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '카테고리명',
  `category_icon`      VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '아이콘 클래스 또는 이미지',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '정렬순서',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`category_id`),
  KEY `idx_parent_id`  (`parent_id`),
  KEY `idx_use_yn`     (`use_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='과정 카테고리';

-- F-2. lms_course (훈련과정 기본정보)
CREATE TABLE IF NOT EXISTS `lms_course` (
  `course_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '과정 고유번호',
  `category_id`        INT(10) NOT NULL DEFAULT 0               COMMENT '카테고리 ID',
  `hrd_course_code`    VARCHAR(50) NOT NULL DEFAULT ''          COMMENT 'HRD-Net 과정코드(TRACSE_ID)',
  `hrd_simsa_code`     VARCHAR(200) NOT NULL DEFAULT ''         COMMENT 'HRD-Net 심사과정코드',
  `ncs_code`           VARCHAR(50) NOT NULL DEFAULT ''          COMMENT 'NCS 코드',
  `course_title`       VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '과정명',
  `course_summary`     VARCHAR(500) NULL                        COMMENT '과정 요약(한줄소개)',
  `course_desc`        LONGTEXT NULL                            COMMENT '과정 소개(상세)',
  `learning_goal`      TEXT NULL                                COMMENT '학습목표',
  `target_learner`     TEXT NULL                                COMMENT '수강대상',
  `thumb_image`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '썸네일 이미지 경로',
  `total_time`         INT(10) NOT NULL DEFAULT 0               COMMENT '총 학습시간(분)',
  `content_count`      INT(5) NOT NULL DEFAULT 0                COMMENT '총 차시수',
  `period_type`        CHAR(1) NOT NULL DEFAULT 'D'             COMMENT '수강기간 단위(M:월,W:주,D:일)',
  `period_value`       INT(4) NOT NULL DEFAULT 30               COMMENT '수강기간 값',
  -- 훈련유형 (다중 가능)
  `type_normal`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '일반과정(Y/N)',
  `type_company`       CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '사업주훈련(Y/N)',
  `type_consortium`    CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '컨소시엄훈련(Y/N)',
  `type_unemployed`    CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '내일배움카드-실업자(Y/N)',
  `type_worker`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '내일배움카드-근로자(Y/N)',
  `type_legal`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '법정필수교육(Y/N)',
  `legal_type`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '법정교육구분(sexual/privacy/safety/disability/harassment)',
  -- 가격
  `price_normal`       INT(10) NOT NULL DEFAULT 0               COMMENT '정가',
  `price_sale`         INT(10) NOT NULL DEFAULT 0               COMMENT '판매가(일반)',
  `price_company`      INT(10) NOT NULL DEFAULT 0               COMMENT '사업주훈련 단가',
  `price_hrd`          INT(10) NOT NULL DEFAULT 0               COMMENT '정부지원단가(내일배움카드)',
  -- 평가 배점
  `score_weight_progress` INT(3) NOT NULL DEFAULT 0            COMMENT '진도 배점(%)',
  `score_weight_exam`     INT(3) NOT NULL DEFAULT 0            COMMENT '시험 배점(%)',
  `score_weight_task`     INT(3) NOT NULL DEFAULT 0            COMMENT '과제 배점(%)',
  `score_weight_ingtest`  INT(3) NOT NULL DEFAULT 0            COMMENT '진행평가 배점(%)',
  `pass_min_score`     INT(3) NOT NULL DEFAULT 60               COMMENT '수료 최저점수',
  `pass_min_progress`  INT(3) NOT NULL DEFAULT 80               COMMENT '수료 최저진도율(%)',
  -- 시험 설정
  `exam_question_cnt`  INT(3) NOT NULL DEFAULT 0                COMMENT '시험 문항수',
  `exam_time_limit`    INT(5) NOT NULL DEFAULT 0                COMMENT '시험 제한시간(분)',
  `exam_retry_cnt`     INT(3) NOT NULL DEFAULT 1                COMMENT '시험 재응시 가능횟수',
  `exam_choice_cnt`    TINYINT(1) NOT NULL DEFAULT 4            COMMENT '선택지수(4:4지선다,5:5지선다)',
  `task_cnt`           INT(3) NOT NULL DEFAULT 0                COMMENT '과제 수',
  -- 강사/운영
  `main_tutor_id`      INT(10) NOT NULL DEFAULT 0               COMMENT '주 강사 ID',
  `mobile_yn`          CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '모바일 수강가능(Y/N)',
  `display_yn`         CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사이트 노출여부(Y/N)',
  `post_course_yn`     CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '우편과정 여부(Y/N)',
  `status`             TINYINT(1) NOT NULL DEFAULT 1            COMMENT '상태(1:정상,2:심사중,3:중단,9:삭제)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록자 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '수정자 관리자 ID',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`course_id`),
  KEY `idx_category_id`   (`category_id`),
  KEY `idx_hrd_code`      (`hrd_course_code`),
  KEY `idx_type_legal`    (`type_legal`),
  KEY `idx_display`       (`display_yn`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='훈련과정 기본정보';

-- F-3. lms_course_type (과정-훈련유형 상세 매핑)
CREATE TABLE IF NOT EXISTS `lms_course_type` (
  `type_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '매핑 고유번호',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `emp_ins_flag`       TINYINT(1) NOT NULL DEFAULT 0            COMMENT 'EMON 훈련유형코드(0~4)',
  `hrd_type_code`      VARCHAR(20) NOT NULL DEFAULT ''          COMMENT 'HRD-Net 훈련유형코드',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  PRIMARY KEY (`type_id`),
  KEY `idx_course_id`  (`course_id`),
  KEY `idx_emp_ins_flag` (`emp_ins_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='과정별 훈련유형 매핑 (EMON EMP_INS_FLAG)';

-- F-4. lms_content (차시/콘텐츠 목록)
CREATE TABLE IF NOT EXISTS `lms_content` (
  `content_id`         INT(10) NOT NULL AUTO_INCREMENT          COMMENT '차시 고유번호',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `content_order`      INT(5) NOT NULL DEFAULT 0                COMMENT '차시 순서',
  `content_title`      VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '차시명',
  `content_type`       VARCHAR(20) NOT NULL DEFAULT 'scorm'     COMMENT '콘텐츠유형(scorm/video/html/pdf)',
  `content_url`        VARCHAR(500) NOT NULL DEFAULT ''         COMMENT '콘텐츠 URL(PC)',
  `mobile_url`         VARCHAR(500) NOT NULL DEFAULT ''         COMMENT '콘텐츠 URL(모바일)',
  `content_time`       INT(10) NOT NULL DEFAULT 0               COMMENT '차시 학습시간(초)',
  `page_count`         INT(5) NOT NULL DEFAULT 0                COMMENT '페이지수(HTML스크롤형)',
  `has_debate`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '토론게시판 여부(Y/N)',
  `has_ingtest`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '차시별 퀴즈 여부(Y/N)',
  `del_yn`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '삭제여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록자 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`content_id`),
  KEY `idx_course_id`  (`course_id`),
  KEY `idx_order`      (`course_id`, `content_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='차시(콘텐츠) 목록';

-- F-5. lms_course_tutor (과정-강사 배정)
CREATE TABLE IF NOT EXISTS `lms_course_tutor` (
  `assign_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '배정 고유번호',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `tutor_id`           INT(10) NOT NULL                         COMMENT '강사 ID',
  `role_type`          TINYINT(1) NOT NULL DEFAULT 1            COMMENT '역할(1:주강사,2:보조강사,3:튜터)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '배정일시',
  PRIMARY KEY (`assign_id`),
  UNIQUE KEY `uk_course_tutor` (`course_id`, `tutor_id`),
  KEY `idx_tutor_id`   (`tutor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='과정-강사 배정 정보';


-- ============================================================
-- [그룹 G] 차수(기수) - 3개
-- ============================================================

-- G-1. lms_class (훈련차수/기수)
CREATE TABLE IF NOT EXISTS `lms_class` (
  `class_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '차수 고유번호',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `hrd_class_seq`      VARCHAR(50) NOT NULL DEFAULT ''          COMMENT 'HRD-Net 회차번호',
  `class_year`         INT(4) NOT NULL DEFAULT 0                COMMENT '연도',
  `class_seq`          INT(4) NOT NULL DEFAULT 0                COMMENT '차수번호',
  `emp_ins_flag`       TINYINT(1) NOT NULL DEFAULT 0            COMMENT 'EMON 훈련유형(0:비환급,1:사업주,2:컨소시엄,3:실업자,4:근로자)',
  `class_type`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '운영구분(N:일반,C:기업단체,L:법정)',
  `reg_start_date`     DATE NULL DEFAULT NULL                   COMMENT '수강신청 시작일',
  `reg_end_date`       DATE NULL DEFAULT NULL                   COMMENT '수강신청 종료일',
  `learn_start_date`   DATE NULL DEFAULT NULL                   COMMENT '학습 시작일',
  `learn_end_date`     DATE NULL DEFAULT NULL                   COMMENT '학습 종료일',
  `capacity`           INT(5) NOT NULL DEFAULT 0                COMMENT '정원(0=무제한)',
  `enroll_count`       INT(5) NOT NULL DEFAULT 0                COMMENT '현재 수강인원',
  `tutor_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '담당 튜터 ID',
  `price`              INT(10) NOT NULL DEFAULT 0               COMMENT '차수 수강료(0이면 과정 가격 따름)',
  `status`             CHAR(1) NOT NULL DEFAULT 'W'             COMMENT '상태(W:대기,R:진행중,P:수료처리,E:종료)',
  `sms_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT 'SMS 자동발송여부(Y/N)',
  `alimtalk_yn`        CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '알림톡 자동발송여부(Y/N)',
  `display_yn`         CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '노출여부(Y/N)',
  `del_yn`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '삭제여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`class_id`),
  KEY `idx_course_id`  (`course_id`),
  KEY `idx_dates`      (`learn_start_date`, `learn_end_date`),
  KEY `idx_status`     (`status`),
  KEY `idx_emp_ins_flag` (`emp_ins_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='훈련차수(기수) 정보';

-- G-2. lms_class_company (차수-기업 배정)
CREATE TABLE IF NOT EXISTS `lms_class_company` (
  `assign_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '배정 고유번호',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID',
  `allocated_count`    INT(5) NOT NULL DEFAULT 0                COMMENT '배정 인원',
  `memo`               VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '비고',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '배정일시',
  PRIMARY KEY (`assign_id`),
  UNIQUE KEY `uk_class_company` (`class_id`, `company_id`),
  KEY `idx_company_id` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='차수별 기업 배정 (사업주훈련)';

-- G-3. lms_class_schedule (차수별 학사일정)
CREATE TABLE IF NOT EXISTS `lms_class_schedule` (
  `schedule_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '일정 고유번호',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `schedule_type`      VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '일정유형(EXAM:시험,TASK:과제,SURVEY:설문,EVENT:기타)',
  `schedule_name`      VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '일정명',
  `start_date`         DATETIME NULL DEFAULT NULL               COMMENT '시작일시',
  `end_date`           DATETIME NULL DEFAULT NULL               COMMENT '종료일시',
  `description`        TEXT NULL                                COMMENT '설명',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`schedule_id`),
  KEY `idx_class_id`   (`class_id`),
  KEY `idx_type`       (`schedule_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='차수별 학사일정';


-- ============================================================
-- [그룹 H] 수강/학습 - 4개
-- ============================================================

-- H-1. lms_enrollment (수강신청/등록)
CREATE TABLE IF NOT EXISTS `lms_enrollment` (
  `enroll_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '수강신청 고유번호',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '소속기업 ID(사업주훈련시)',
  `emp_ins_flag`       TINYINT(1) NOT NULL DEFAULT 0            COMMENT 'EMON 훈련유형(0~4)',
  `worker_type`        VARCHAR(3) NOT NULL DEFAULT ''           COMMENT '훈련생구분코드(EMON)',
  `irregular_type`     VARCHAR(3) NOT NULL DEFAULT ''           COMMENT '비정규직구분코드(EMON)',
  `cost_company_no`    VARCHAR(11) NOT NULL DEFAULT ''          COMMENT '비용수급사업장번호(사업주훈련)',
  -- 결제
  `payment_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '결제 ID',
  `order_price`        INT(10) NOT NULL DEFAULT 0               COMMENT '결제금액',
  `refund_price`       INT(10) NOT NULL DEFAULT 0               COMMENT '환불금액',
  `refund_date`        DATE NULL DEFAULT NULL                   COMMENT '환불일',
  `pay_status`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '결제상태(Y:완료,N:미결제,R:환불,F:무료)',
  -- 수강 상태
  `enroll_status`      CHAR(1) NOT NULL DEFAULT 'W'             COMMENT '수강상태(W:대기,R:심사중,A:수강중,C:취소,D:수료,F:미수료)',
  `enroll_date`        DATETIME NULL DEFAULT NULL               COMMENT '수강승인일시',
  -- 학습 성적
  `progress_rate`      DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '진도율(%)',
  `score_progress`     DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '진도 점수',
  `score_exam`         DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '시험 점수',
  `score_task`         DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '과제 점수',
  `score_ingtest`      DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '진행평가 점수',
  `final_score`        DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '최종 점수',
  -- 수료
  `pass_yn`            CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '수료여부(Y/N)',
  `pass_date`          DATE NULL DEFAULT NULL                   COMMENT '수료일',
  -- 세부 진행상태
  `exam_status`        TINYINT(1) NOT NULL DEFAULT 1            COMMENT '시험상태(1:미응시,2:응시중,3:완료)',
  `task_status`        TINYINT(1) NOT NULL DEFAULT 1            COMMENT '과제상태(1:미제출,2:제출,3:채점완료)',
  `survey_yn`          CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '설문완료(Y/N)',
  `cert_issued_yn`     CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '수료증발급여부(Y/N)',
  `del_yn`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '삭제여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '수강신청일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`enroll_id`),
  UNIQUE KEY `uk_class_member`   (`class_id`, `member_id`),
  KEY `idx_member_id`            (`member_id`),
  KEY `idx_company_id`           (`company_id`),
  KEY `idx_enroll_status`        (`enroll_status`),
  KEY `idx_emp_ins_flag`         (`emp_ins_flag`),
  KEY `idx_pass_yn`              (`pass_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='수강신청 및 학습진행 정보';

-- H-2. lms_enrollment_company (기업단체 수강신청)
CREATE TABLE IF NOT EXISTS `lms_enrollment_company` (
  `enroll_co_id`       INT(10) NOT NULL AUTO_INCREMENT          COMMENT '기업수강신청 고유번호',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `company_id`         VARCHAR(20) NOT NULL                     COMMENT '기업 ID',
  `emp_ins_flag`       TINYINT(1) NOT NULL DEFAULT 1            COMMENT 'EMON 훈련유형',
  `apply_count`        INT(5) NOT NULL DEFAULT 0                COMMENT '신청 인원',
  `confirm_count`      INT(5) NOT NULL DEFAULT 0                COMMENT '확정 인원',
  `edu_expense_yn`     CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '교육비 지원여부(Y/N)',
  `self_pay_rate`      INT(3) NOT NULL DEFAULT 0                COMMENT '자부담 비율(%)',
  `edu_price`          INT(10) NOT NULL DEFAULT 0               COMMENT '교육비 합계',
  `self_price`         INT(10) NOT NULL DEFAULT 0               COMMENT '자부담 합계',
  `contract_yn`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '위탁계약서 수령(Y/N)',
  `contract_date`      DATE NULL DEFAULT NULL                   COMMENT '계약일',
  `invoice_date`       DATE NULL DEFAULT NULL                   COMMENT '청구계산서 발행일',
  `receipt_date`       DATE NULL DEFAULT NULL                   COMMENT '영수계산서 발행일',
  `deposit_date`       DATE NULL DEFAULT NULL                   COMMENT '자부담 입금일',
  `manager_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '담당 운영자 관리자 ID',
  `status`             CHAR(1) NOT NULL DEFAULT 'W'             COMMENT '상태(W:대기,A:승인,C:취소)',
  `remark`             TEXT NULL                                COMMENT '비고',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`enroll_co_id`),
  KEY `idx_company_class` (`company_id`, `class_id`),
  KEY `idx_status`        (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기업단체 수강신청 (사업주훈련/법정교육)';

-- H-3. lms_content_progress (차시별 학습진도)
CREATE TABLE IF NOT EXISTS `lms_content_progress` (
  `progress_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '진도 고유번호',
  `enroll_id`          INT(10) NOT NULL                         COMMENT '수강신청 ID',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `content_id`         INT(10) NOT NULL                         COMMENT '차시 ID',
  `study_time`         INT(10) NOT NULL DEFAULT 0               COMMENT '누적학습시간(초)',
  `last_position`      INT(10) NOT NULL DEFAULT 0               COMMENT '마지막 학습위치(초 또는 페이지)',
  `complete_yn`        CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '완료여부(Y/N)',
  `complete_date`      DATETIME NULL DEFAULT NULL               COMMENT '완료일시',
  `access_ip`          VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '학습 접속 IP',
  `start_at`           DATETIME NULL DEFAULT NULL               COMMENT '학습 최초 시작일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '최종 학습일시',
  PRIMARY KEY (`progress_id`),
  UNIQUE KEY `uk_enroll_content` (`enroll_id`, `content_id`),
  KEY `idx_class_member` (`class_id`, `member_id`),
  KEY `idx_member_id`    (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='차시별 학습진도';

-- H-4. lms_learning_log (학습 접속로그 - FDS용)
CREATE TABLE IF NOT EXISTS `lms_learning_log` (
  `log_id`             BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '로그 고유번호',
  `enroll_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '수강신청 ID',
  `member_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '회원 ID',
  `content_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '차시 ID',
  `log_type`           VARCHAR(20) NOT NULL DEFAULT 'ACCESS'    COMMENT '유형(ACCESS:접속,PLAY:재생,PAUSE:일시정지,COMPLETE:완료,EXIT:종료)',
  `position`           INT(10) NOT NULL DEFAULT 0               COMMENT '학습위치(초)',
  `ip_addr`            VARCHAR(45) NOT NULL DEFAULT ''          COMMENT '접속 IP',
  `user_agent`         VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '브라우저 정보',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '기록일시',
  PRIMARY KEY (`log_id`),
  KEY `idx_enroll_id`  (`enroll_id`),
  KEY `idx_member_id`  (`member_id`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='학습 상세 접속로그 (FDS 이상학습 탐지용)';


-- ============================================================
-- [그룹 I] 시험/평가 - 4개
-- ============================================================

-- I-1. lms_exam_question (시험 문제은행)
CREATE TABLE IF NOT EXISTS `lms_exam_question` (
  `question_id`        INT(10) NOT NULL AUTO_INCREMENT          COMMENT '문제 고유번호',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `question_type`      TINYINT(1) NOT NULL DEFAULT 1            COMMENT '문제유형(1:객관식,2:주관식,3:OX)',
  `question_level`     TINYINT(1) NOT NULL DEFAULT 1            COMMENT '난이도(1:하,2:중,3:상)',
  `question_text`      TEXT NOT NULL                            COMMENT '문제 내용',
  `question_image`     VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '문제 이미지 경로',
  `choice1`            TEXT NULL                                COMMENT '선택지1',
  `choice2`            TEXT NULL                                COMMENT '선택지2',
  `choice3`            TEXT NULL                                COMMENT '선택지3',
  `choice4`            TEXT NULL                                COMMENT '선택지4',
  `choice5`            TEXT NULL                                COMMENT '선택지5',
  `answer`             VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '정답(객관식:번호, 주관식:텍스트)',
  `explanation`        TEXT NULL                                COMMENT '해설',
  `content_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '연관 차시 ID(0=과정 전체)',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록자 관리자/강사 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`question_id`),
  KEY `idx_course_id`      (`course_id`),
  KEY `idx_question_type`  (`question_type`),
  KEY `idx_use_yn`         (`use_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='시험/진행평가 문제은행';

-- I-2. lms_exam_paper (시험지 - 출제 세트)
CREATE TABLE IF NOT EXISTS `lms_exam_paper` (
  `paper_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '시험지 고유번호',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `paper_type`         VARCHAR(10) NOT NULL DEFAULT 'FINAL'     COMMENT '시험유형(FINAL:최종,MID:중간,INGTEST:진행평가)',
  `paper_name`         VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '시험지명',
  `question_ids`       TEXT NULL                                COMMENT '출제 문제 ID 목록(JSON 배열)',
  `question_cnt`       INT(3) NOT NULL DEFAULT 0                COMMENT '출제 문항수',
  `time_limit`         INT(5) NOT NULL DEFAULT 0                COMMENT '제한시간(분)',
  `pass_score`         INT(3) NOT NULL DEFAULT 60               COMMENT '합격 점수',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록자 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`paper_id`),
  KEY `idx_class_id`   (`class_id`),
  KEY `idx_paper_type` (`paper_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='시험지 구성 (차수별 출제 세트)';

-- I-3. lms_exam_result (시험/진행평가 결과)
CREATE TABLE IF NOT EXISTS `lms_exam_result` (
  `result_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '결과 고유번호',
  `enroll_id`          INT(10) NOT NULL                         COMMENT '수강신청 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `paper_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '시험지 ID',
  `exam_type`          VARCHAR(10) NOT NULL DEFAULT 'FINAL'     COMMENT '시험유형(FINAL/MID/INGTEST)',
  `attempt_no`         INT(3) NOT NULL DEFAULT 1                COMMENT '응시 회차',
  `answers`            LONGTEXT NULL                            COMMENT '제출 답안(JSON)',
  `score`              DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '획득 점수',
  `total_count`        INT(3) NOT NULL DEFAULT 0                COMMENT '총 문항수',
  `correct_count`      INT(3) NOT NULL DEFAULT 0                COMMENT '정답 수',
  `pass_yn`            CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '합격여부(Y/N)',
  `start_at`           DATETIME NULL DEFAULT NULL               COMMENT '시험 시작일시',
  `submit_at`          DATETIME NULL DEFAULT NULL               COMMENT '시험 제출일시',
  `graded_by`          INT(10) NOT NULL DEFAULT 0               COMMENT '채점자 ID(자동=0)',
  PRIMARY KEY (`result_id`),
  KEY `idx_enroll_id`  (`enroll_id`),
  KEY `idx_member_id`  (`member_id`),
  KEY `idx_class_id`   (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='시험/진행평가 결과';

-- I-4. lms_task (과제 제출/채점)
CREATE TABLE IF NOT EXISTS `lms_task` (
  `task_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '과제 고유번호',
  `enroll_id`          INT(10) NOT NULL                         COMMENT '수강신청 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `task_no`            INT(3) NOT NULL DEFAULT 1                COMMENT '과제 번호(1차,2차 등)',
  `task_title`         VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '과제명',
  `task_content`       LONGTEXT NULL                            COMMENT '과제 내용',
  `task_file`          VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '첨부 파일 경로',
  `task_file_name`     VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '첨부 파일 원본명',
  `submit_at`          DATETIME NULL DEFAULT NULL               COMMENT '제출일시',
  `score`              DECIMAL(5,2) NOT NULL DEFAULT 0.00       COMMENT '획득 점수',
  `feedback`           TEXT NULL                                COMMENT '채점 피드백',
  `graded_by`          INT(10) NOT NULL DEFAULT 0               COMMENT '채점자 ID(강사/관리자)',
  `graded_at`          DATETIME NULL DEFAULT NULL               COMMENT '채점일시',
  `status`             TINYINT(1) NOT NULL DEFAULT 1            COMMENT '상태(1:미제출,2:제출완료,3:채점완료)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`task_id`),
  KEY `idx_enroll_id`  (`enroll_id`),
  KEY `idx_member_id`  (`member_id`),
  KEY `idx_class_id`   (`class_id`),
  KEY `idx_status`     (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='과제 제출 및 채점';


-- ============================================================
-- [그룹 J] 수료/인증 - 2개
-- ============================================================

-- J-1. lms_certificate (수료증 발급이력)
CREATE TABLE IF NOT EXISTS `lms_certificate` (
  `cert_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '수료증 고유번호',
  `enroll_id`          INT(10) NOT NULL                         COMMENT '수강신청 ID',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID(기업단체수강시)',
  `cert_type`          VARCHAR(20) NOT NULL DEFAULT 'PERSONAL'  COMMENT '수료증유형(PERSONAL:개인/COMPANY:기업단체/LEGAL:법정)',
  `cert_no`            VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '수료증 발급번호(고유)',
  `cert_name`          VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '수료자 이름(스냅샷)',
  `course_name`        VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '과정명(스냅샷)',
  `total_time`         INT(10) NOT NULL DEFAULT 0               COMMENT '총 학습시간(분,스냅샷)',
  `pass_date`          DATE NULL DEFAULT NULL                   COMMENT '수료일',
  `issue_date`         DATE NOT NULL                            COMMENT '발급일',
  `tpl_id`             INT(10) NOT NULL DEFAULT 0               COMMENT '사용한 양식 ID',
  `issue_count`        INT(3) NOT NULL DEFAULT 1                COMMENT '발급 횟수(재발급시 증가)',
  `last_issue_at`      DATETIME NULL DEFAULT NULL               COMMENT '최종 발급일시',
  `issued_by`          VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '발급자(member_id 또는 admin_id)',
  `cert_file`          VARCHAR(300) NOT NULL DEFAULT ''         COMMENT 'PDF 파일 경로',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '최초 발급일시',
  PRIMARY KEY (`cert_id`),
  UNIQUE KEY `uk_cert_no`    (`cert_no`),
  KEY `idx_enroll_id`        (`enroll_id`),
  KEY `idx_member_id`        (`member_id`),
  KEY `idx_company_id`       (`company_id`),
  KEY `idx_cert_type`        (`cert_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='수료증/이수증 발급 이력';

-- J-2. lms_certificate_tpl (수료증 양식 템플릿)
CREATE TABLE IF NOT EXISTS `lms_certificate_tpl` (
  `tpl_id`             INT(10) NOT NULL AUTO_INCREMENT          COMMENT '양식 고유번호',
  `tpl_name`           VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '양식명',
  `tpl_type`           VARCHAR(20) NOT NULL DEFAULT 'PERSONAL'  COMMENT '양식유형(PERSONAL:개인/COMPANY:기업단체/LEGAL:법정교육)',
  `course_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '특정과정 전용(0=공통)',
  `tpl_html`           LONGTEXT NULL                            COMMENT '수료증 HTML 양식(치환자 포함)',
  `paper_size`         VARCHAR(10) NOT NULL DEFAULT 'A4'        COMMENT '용지크기(A4/A5)',
  `orientation`        VARCHAR(10) NOT NULL DEFAULT 'PORTRAIT'  COMMENT '방향(PORTRAIT:세로/LANDSCAPE:가로)',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `is_default`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '기본양식여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록자 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`tpl_id`),
  KEY `idx_tpl_type`   (`tpl_type`),
  KEY `idx_course_id`  (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='수료증/이수증 양식 (개인/기업단체/법정교육 구분)';


-- ============================================================
-- [그룹 K] 결제 - 5개
-- ============================================================

-- K-1. lms_payment (결제 내역)
CREATE TABLE IF NOT EXISTS `lms_payment` (
  `payment_id`         INT(10) NOT NULL AUTO_INCREMENT          COMMENT '결제 고유번호',
  `member_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '결제 회원 ID',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '결제 기업 ID(기업결제시)',
  `order_no`           VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '주문번호(고유)',
  `order_name`         VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '주문명(과정명)',
  `total_price`        INT(10) NOT NULL DEFAULT 0               COMMENT '결제 전 금액',
  `discount_price`     INT(10) NOT NULL DEFAULT 0               COMMENT '할인금액(쿠폰+기타)',
  `pay_price`          INT(10) NOT NULL DEFAULT 0               COMMENT '실결제금액',
  `pay_method`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '결제수단(card/vbank/transfer/free)',
  `pg_company`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT 'PG사',
  `pg_tid`             VARCHAR(100) NOT NULL DEFAULT ''         COMMENT 'PG 거래ID',
  `pg_data`            LONGTEXT NULL                            COMMENT 'PG 응답 원본(JSON)',
  `pay_status`         CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '결제상태(N:미결제,Y:완료,R:환불,P:부분환불,C:취소)',
  `pay_date`           DATETIME NULL DEFAULT NULL               COMMENT '결제 완료일시',
  `refund_price`       INT(10) NOT NULL DEFAULT 0               COMMENT '환불금액',
  `refund_reason`      VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '환불사유',
  `refund_date`        DATETIME NULL DEFAULT NULL               COMMENT '환불 처리일시',
  `refund_by`          INT(10) NOT NULL DEFAULT 0               COMMENT '환불처리 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '주문일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`payment_id`),
  UNIQUE KEY `uk_order_no`   (`order_no`),
  KEY `idx_member_id`        (`member_id`),
  KEY `idx_company_id`       (`company_id`),
  KEY `idx_pay_status`       (`pay_status`),
  KEY `idx_pay_date`         (`pay_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='결제 내역';

-- K-2. lms_payment_vbank (가상계좌 정보)
CREATE TABLE IF NOT EXISTS `lms_payment_vbank` (
  `vbank_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '가상계좌 고유번호',
  `payment_id`         INT(10) NOT NULL                         COMMENT '결제 ID',
  `bank_name`          VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '은행명',
  `bank_code`          VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '은행코드',
  `account_no`         VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '가상계좌번호',
  `depositor`          VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '예금주',
  `expire_date`        DATETIME NULL DEFAULT NULL               COMMENT '입금 만료일시',
  `deposit_amount`     INT(10) NOT NULL DEFAULT 0               COMMENT '입금해야 할 금액',
  `deposit_date`       DATETIME NULL DEFAULT NULL               COMMENT '실제 입금일시',
  `deposit_status`     CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '입금여부(N:대기,Y:완료,E:만료)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  PRIMARY KEY (`vbank_id`),
  KEY `idx_payment_id` (`payment_id`),
  KEY `idx_expire`     (`expire_date`, `deposit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='가상계좌 입금 정보';

-- K-3. lms_cart (수강신청 장바구니)
CREATE TABLE IF NOT EXISTS `lms_cart` (
  `cart_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '장바구니 고유번호',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `class_id`           INT(10) NOT NULL                         COMMENT '차수 ID',
  `course_id`          INT(10) NOT NULL                         COMMENT '과정 ID',
  `price`              INT(10) NOT NULL DEFAULT 0               COMMENT '담을 당시 가격',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '담은 일시',
  PRIMARY KEY (`cart_id`),
  UNIQUE KEY `uk_member_class` (`member_id`, `class_id`),
  KEY `idx_member_id`  (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='수강신청 장바구니';

-- K-4. lms_coupon (쿠폰)
CREATE TABLE IF NOT EXISTS `lms_coupon` (
  `coupon_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '쿠폰 고유번호',
  `coupon_code`        VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '쿠폰 코드(고유)',
  `coupon_name`        VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '쿠폰명',
  `discount_type`      CHAR(1) NOT NULL DEFAULT 'P'             COMMENT '할인유형(P:정률%,A:정액원)',
  `discount_value`     INT(10) NOT NULL DEFAULT 0               COMMENT '할인값(정률:%,정액:원)',
  `min_price`          INT(10) NOT NULL DEFAULT 0               COMMENT '최소 결제금액(0=제한없음)',
  `max_discount`       INT(10) NOT NULL DEFAULT 0               COMMENT '최대 할인금액(0=제한없음,정률시)',
  `start_date`         DATE NULL DEFAULT NULL                   COMMENT '사용 시작일',
  `end_date`           DATE NULL DEFAULT NULL                   COMMENT '사용 종료일',
  `total_count`        INT(10) NOT NULL DEFAULT 0               COMMENT '발급 총수량(0=무제한)',
  `used_count`         INT(10) NOT NULL DEFAULT 0               COMMENT '사용된 수량',
  `per_member_limit`   INT(3) NOT NULL DEFAULT 1                COMMENT '1인당 사용가능횟수',
  `course_ids`         TEXT NULL                                COMMENT '사용가능 과정 ID 목록(JSON,NULL=전체)',
  `status`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '상태(Y:사용가능,N:중단)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '생성 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`coupon_id`),
  UNIQUE KEY `uk_coupon_code` (`coupon_code`),
  KEY `idx_status`             (`status`),
  KEY `idx_dates`              (`start_date`, `end_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='쿠폰 정보';

-- K-5. lms_coupon_use (쿠폰 사용이력)
CREATE TABLE IF NOT EXISTS `lms_coupon_use` (
  `use_id`             INT(10) NOT NULL AUTO_INCREMENT          COMMENT '사용이력 고유번호',
  `coupon_id`          INT(10) NOT NULL                         COMMENT '쿠폰 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `payment_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '결제 ID',
  `discount_price`     INT(10) NOT NULL DEFAULT 0               COMMENT '실제 할인금액',
  `used_at`            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '사용일시',
  PRIMARY KEY (`use_id`),
  KEY `idx_coupon_id`  (`coupon_id`),
  KEY `idx_member_id`  (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='쿠폰 사용 이력';


-- ============================================================
-- [그룹 L] 게시판/커뮤니티 - 5개
-- ============================================================

-- L-1. lms_board (게시판 설정)
CREATE TABLE IF NOT EXISTS `lms_board` (
  `board_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '게시판 고유번호',
  `board_code`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '게시판 코드(notice/faq/qna/free)',
  `board_name`         VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '게시판명',
  `board_type`         VARCHAR(10) NOT NULL DEFAULT 'normal'    COMMENT '유형(normal:일반,faq:FAQ,qna:1:1문의)',
  `write_level`        TINYINT(1) NOT NULL DEFAULT 1            COMMENT '글쓰기 권한(0:비회원,1:회원,2:관리자)',
  `reply_level`        TINYINT(1) NOT NULL DEFAULT 2            COMMENT '댓글 권한(0:비회원,1:회원,2:관리자)',
  `file_upload_yn`     CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '첨부파일 허용(Y/N)',
  `file_max_size`      INT(10) NOT NULL DEFAULT 5               COMMENT '첨부파일 최대크기(MB)',
  `file_ext_allow`     VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '허용 확장자(쉼표구분)',
  `page_per_list`      INT(3) NOT NULL DEFAULT 15               COMMENT '목록 페이지당 글수',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `sort_order`         INT(5) NOT NULL DEFAULT 0                COMMENT '정렬순서',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`board_id`),
  UNIQUE KEY `uk_board_code` (`board_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='게시판 설정';

-- 기본 게시판 데이터
INSERT INTO `lms_board` (`board_code`, `board_name`, `board_type`, `write_level`, `reply_level`, `file_upload_yn`, `sort_order`)
VALUES
  ('notice', '공지사항', 'normal', 2, 2, 'Y', 1),
  ('faq', 'FAQ', 'faq', 2, 2, 'N', 2),
  ('qna', '1:1 문의', 'qna', 1, 2, 'Y', 3)
ON DUPLICATE KEY UPDATE `board_id` = `board_id`;

-- L-3. lms_board_comment (댓글)
CREATE TABLE IF NOT EXISTS `lms_board_comment` (
  `comment_id`         INT(10) NOT NULL AUTO_INCREMENT          COMMENT '댓글 고유번호',
  `post_id`            INT(10) NOT NULL                         COMMENT '게시글 ID',
  `writer_type`        CHAR(1) NOT NULL DEFAULT 'M'             COMMENT '작성자유형(M:회원,A:관리자)',
  `writer_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '작성자 ID',
  `writer_name`        VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '작성자명(스냅샷)',
  `comment_content`    TEXT NOT NULL                            COMMENT '댓글 내용',
  `del_yn`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '삭제여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '작성일시',
  PRIMARY KEY (`comment_id`),
  KEY `idx_post_id`    (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='게시판 댓글';

-- L-5. lms_note (쪽지)
CREATE TABLE IF NOT EXISTS `lms_note` (
  `note_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '쪽지 고유번호',
  `sender_type`        CHAR(1) NOT NULL DEFAULT 'A'             COMMENT '발신자유형(A:관리자,T:강사,M:회원)',
  `sender_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '발신자 ID',
  `receiver_type`      CHAR(1) NOT NULL DEFAULT 'M'             COMMENT '수신자유형',
  `receiver_id`        INT(10) NOT NULL DEFAULT 0               COMMENT '수신자 ID',
  `note_title`         VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '제목',
  `note_content`       TEXT NOT NULL                            COMMENT '내용',
  `read_yn`            CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '읽음여부(Y/N)',
  `read_at`            DATETIME NULL DEFAULT NULL               COMMENT '읽은 일시',
  `del_yn_sender`      CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '발신자 삭제여부(Y/N)',
  `del_yn_receiver`    CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '수신자 삭제여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '발송일시',
  PRIMARY KEY (`note_id`),
  KEY `idx_receiver`   (`receiver_type`, `receiver_id`),
  KEY `idx_sender`     (`sender_type`, `sender_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='쪽지';


-- ============================================================
-- [그룹 M] 설문 - 3개
-- ============================================================

-- M-1. lms_survey (설문조사)
CREATE TABLE IF NOT EXISTS `lms_survey` (
  `survey_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '설문 고유번호',
  `class_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '차수 ID(0=전체공통)',
  `survey_title`       VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '설문 제목',
  `survey_desc`        TEXT NULL                                COMMENT '설문 설명',
  `start_date`         DATE NULL DEFAULT NULL                   COMMENT '설문 시작일',
  `end_date`           DATE NULL DEFAULT NULL                   COMMENT '설문 종료일',
  `is_required`        CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '수료 전 필수완료(Y/N)',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  PRIMARY KEY (`survey_id`),
  KEY `idx_class_id`   (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='설문조사 기본정보';

-- M-2. lms_survey_question (설문 문항)
CREATE TABLE IF NOT EXISTS `lms_survey_question` (
  `sq_id`              INT(10) NOT NULL AUTO_INCREMENT          COMMENT '문항 고유번호',
  `survey_id`          INT(10) NOT NULL                         COMMENT '설문 ID',
  `sq_order`           INT(5) NOT NULL DEFAULT 0                COMMENT '문항 순서',
  `sq_type`            VARCHAR(10) NOT NULL DEFAULT 'CHOICE'    COMMENT '문항유형(CHOICE:선택,TEXT:서술,RATING:5점척도)',
  `sq_text`            TEXT NOT NULL                            COMMENT '문항 내용',
  `sq_options`         TEXT NULL                                COMMENT '선택지 목록(JSON 배열, 선택형)',
  `sq_required`        CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '필수응답(Y/N)',
  PRIMARY KEY (`sq_id`),
  KEY `idx_survey_id`  (`survey_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='설문 문항';

-- M-3. lms_survey_answer (설문 응답)
CREATE TABLE IF NOT EXISTS `lms_survey_answer` (
  `answer_id`          BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '응답 고유번호',
  `survey_id`          INT(10) NOT NULL                         COMMENT '설문 ID',
  `enroll_id`          INT(10) NOT NULL                         COMMENT '수강신청 ID',
  `member_id`          INT(10) NOT NULL                         COMMENT '회원 ID',
  `sq_id`              INT(10) NOT NULL                         COMMENT '문항 ID',
  `answer_value`       TEXT NULL                                COMMENT '응답값(선택형:번호, 서술형:텍스트, 척도:숫자)',
  `answered_at`        DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '응답일시',
  PRIMARY KEY (`answer_id`),
  KEY `idx_survey_enroll` (`survey_id`, `enroll_id`),
  KEY `idx_member_id`     (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='설문 응답 데이터';


-- ============================================================
-- [그룹 N] 알림/발송 - 4개
-- ============================================================

-- N-1. lms_notification_tpl (발송 템플릿)
CREATE TABLE IF NOT EXISTS `lms_notification_tpl` (
  `tpl_id`             INT(10) NOT NULL AUTO_INCREMENT          COMMENT '템플릿 고유번호',
  `tpl_code`           VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '템플릿 코드(ENROLL_DONE/BEFORE_START 등)',
  `tpl_name`           VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '템플릿명',
  `send_type`          VARCHAR(10) NOT NULL DEFAULT 'SMS'       COMMENT '발송유형(SMS/KAKAO/EMAIL)',
  `kakao_tpl_code`     VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '카카오 알림톡 템플릿코드',
  `sms_content`        TEXT NULL                                COMMENT 'SMS 내용(치환자 사용)',
  `kakao_content`      TEXT NULL                                COMMENT '알림톡 내용',
  `email_subject`      VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '이메일 제목',
  `email_content`      LONGTEXT NULL                            COMMENT '이메일 내용(HTML)',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '등록 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`tpl_id`),
  UNIQUE KEY `uk_tpl_code_type` (`tpl_code`, `send_type`),
  KEY `idx_use_yn`     (`use_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='알림 발송 템플릿 (SMS/알림톡/이메일)';

-- N-2. lms_notification_config (발송 설정 - lms_site와 연계)
CREATE TABLE IF NOT EXISTS `lms_notification_config` (
  `config_id`          INT(10) NOT NULL AUTO_INCREMENT          COMMENT '설정 고유번호',
  `config_type`        VARCHAR(10) NOT NULL DEFAULT 'SMS'       COMMENT '발송유형(SMS/KAKAO/EMAIL)',
  `config_key`         VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '설정키',
  `config_value`       TEXT NULL                                COMMENT '설정값(암호화 필요시 암호화)',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`config_id`),
  UNIQUE KEY `uk_type_key` (`config_type`, `config_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='알림 발송 API 설정';

-- N-3. lms_notification_queue (발송 대기열)
CREATE TABLE IF NOT EXISTS `lms_notification_queue` (
  `queue_id`           BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '대기열 고유번호',
  `tpl_id`             INT(10) NOT NULL DEFAULT 0               COMMENT '템플릿 ID',
  `send_type`          VARCHAR(10) NOT NULL DEFAULT 'SMS'       COMMENT '발송유형(SMS/KAKAO/EMAIL)',
  `receiver_type`      CHAR(1) NOT NULL DEFAULT 'M'             COMMENT '수신자유형(M:회원,C:기업)',
  `receiver_id`        INT(10) NOT NULL DEFAULT 0               COMMENT '수신자 ID',
  `receiver_mobile`    VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '수신 휴대폰번호',
  `receiver_email`     VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '수신 이메일',
  `receiver_name`      VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '수신자명',
  `send_content`       TEXT NULL                                COMMENT '최종 발송 내용(치환 완료)',
  `send_title`         VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '제목(이메일용)',
  `reserved_at`        DATETIME NULL DEFAULT NULL               COMMENT '예약 발송 일시(NULL=즉시)',
  `status`             VARCHAR(10) NOT NULL DEFAULT 'WAIT'      COMMENT '상태(WAIT/SENDING/DONE/FAIL)',
  `retry_count`        INT(3) NOT NULL DEFAULT 0                COMMENT '재시도 횟수',
  `fail_reason`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '실패 사유',
  `enroll_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '관련 수강신청 ID(참고용)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '큐 등록일시',
  `sent_at`            DATETIME NULL DEFAULT NULL               COMMENT '발송 처리일시',
  PRIMARY KEY (`queue_id`),
  KEY `idx_status`     (`status`, `reserved_at`),
  KEY `idx_receiver`   (`receiver_type`, `receiver_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='알림 발송 대기열';

-- N-4. lms_notification_log (발송 결과로그)
CREATE TABLE IF NOT EXISTS `lms_notification_log` (
  `log_id`             BIGINT(20) NOT NULL AUTO_INCREMENT       COMMENT '로그 고유번호',
  `queue_id`           BIGINT(20) NOT NULL DEFAULT 0            COMMENT '대기열 ID',
  `send_type`          VARCHAR(10) NOT NULL DEFAULT 'SMS'       COMMENT '발송유형',
  `receiver_id`        INT(10) NOT NULL DEFAULT 0               COMMENT '수신자 ID',
  `receiver_mobile`    VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '수신 휴대폰번호',
  `receiver_email`     VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '수신 이메일',
  `send_content`       TEXT NULL                                COMMENT '발송 내용',
  `api_response`       TEXT NULL                                COMMENT 'API 응답 원본',
  `result`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '발송결과(Y:성공,N:실패)',
  `fail_reason`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '실패 사유',
  `sent_at`            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '발송일시',
  PRIMARY KEY (`log_id`),
  KEY `idx_queue_id`   (`queue_id`),
  KEY `idx_result`     (`result`),
  KEY `idx_sent_at`    (`sent_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='알림 발송 결과 로그';


-- ============================================================
-- [그룹 O] 기타 - 2개
-- ============================================================

-- O-1. lms_goods (교재/교구 상품)
CREATE TABLE IF NOT EXISTS `lms_goods` (
  `goods_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '상품 고유번호',
  `goods_name`         VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '상품명',
  `goods_desc`         LONGTEXT NULL                            COMMENT '상품 설명',
  `goods_image`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '상품 이미지',
  `price`              INT(10) NOT NULL DEFAULT 0               COMMENT '판매가',
  `stock`              INT(10) NOT NULL DEFAULT 0               COMMENT '재고수량(-1=무제한)',
  `course_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '연관 과정 ID(0=독립상품)',
  `display_yn`         CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '노출여부(Y/N)',
  `del_yn`             CHAR(1) NOT NULL DEFAULT 'N'             COMMENT '삭제여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`goods_id`),
  KEY `idx_display`    (`display_yn`, `del_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='교재/교구 상품';

-- O-2. lms_goods_order (상품 주문)
CREATE TABLE IF NOT EXISTS `lms_goods_order` (
  `order_id`           INT(10) NOT NULL AUTO_INCREMENT          COMMENT '주문 고유번호',
  `member_id`          INT(10) NOT NULL                         COMMENT '주문 회원 ID',
  `goods_id`           INT(10) NOT NULL                         COMMENT '상품 ID',
  `payment_id`         INT(10) NOT NULL DEFAULT 0               COMMENT '결제 ID',
  `quantity`           INT(5) NOT NULL DEFAULT 1                COMMENT '주문 수량',
  `unit_price`         INT(10) NOT NULL DEFAULT 0               COMMENT '단가(주문 시점)',
  `total_price`        INT(10) NOT NULL DEFAULT 0               COMMENT '합계금액',
  `delivery_name`      VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '수령인',
  `delivery_mobile`    VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '수령인 연락처',
  `delivery_post_code` VARCHAR(10) NOT NULL DEFAULT ''          COMMENT '배송지 우편번호',
  `delivery_addr1`     VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '배송지 주소',
  `delivery_addr2`     VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '배송지 상세주소',
  `delivery_memo`      VARCHAR(200) NOT NULL DEFAULT ''         COMMENT '배송 메모',
  `invoice_no`         VARCHAR(50) NOT NULL DEFAULT ''          COMMENT '운송장 번호',
  `status`             CHAR(1) NOT NULL DEFAULT 'O'             COMMENT '상태(O:주문,P:결제완료,S:배송중,D:배송완료,C:취소,R:반품)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '주문일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`order_id`),
  KEY `idx_member_id`  (`member_id`),
  KEY `idx_status`     (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='교재/교구 주문';


-- ============================================================
-- [GAP 분석 추가] 4개 테이블 (총 52→56개)
-- ============================================================

-- ADD-1. lms_notification_rule (알림 자동발송 규칙)
CREATE TABLE IF NOT EXISTS `lms_notification_rule` (
  `rule_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '규칙 고유번호',
  `rule_name`          VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '규칙명(예:개강안내문자)',
  `send_type`          VARCHAR(10) NOT NULL DEFAULT 'SMS'       COMMENT '발송유형(SMS/KAKAO/EMAIL/ALL)',
  `trigger_type`       VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '발송시점유형(BEFORE_START/AFTER_START/PROGRESS_UNDER/BEFORE_END/AFTER_END/PASS_DONE/ENROLL_DONE/PAY_DONE)',
  `trigger_value`      INT(5) NOT NULL DEFAULT 0                COMMENT '시점값(일수 또는 진도율%)',
  `trigger_time`       VARCHAR(5) NOT NULL DEFAULT '09:00'      COMMENT '발송 시각(HH:MM)',
  `course_type_filter` VARCHAR(20) NOT NULL DEFAULT 'ALL'       COMMENT '적용과정유형(ALL/HRD/LEGAL/NORMAL)',
  `template_id`        INT(10) NOT NULL DEFAULT 0               COMMENT '사용할 발송템플릿 ID',
  `use_yn`             CHAR(1) NOT NULL DEFAULT 'Y'             COMMENT '사용여부(Y/N)',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`rule_id`),
  KEY `idx_trigger`    (`trigger_type`, `use_yn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='자동 알림발송 규칙 (개강안내/독려/수료안내 등)';

-- 기본 자동발송 규칙 데이터 삽입
INSERT INTO `lms_notification_rule` (`rule_name`, `send_type`, `trigger_type`, `trigger_value`, `trigger_time`, `course_type_filter`, `use_yn`) VALUES
  ('수강신청 완료 안내', 'ALL', 'ENROLL_DONE', 0, '00:00', 'ALL', 'Y'),
  ('개강 3일 전 안내', 'ALL', 'BEFORE_START', 3, '09:00', 'ALL', 'Y'),
  ('개강 1일 전 안내', 'SMS', 'BEFORE_START', 1, '09:00', 'ALL', 'Y'),
  ('개강 당일 안내', 'KAKAO', 'AFTER_START', 0, '08:00', 'HRD', 'Y'),
  ('진도율 20% 미만 독려', 'SMS', 'PROGRESS_UNDER', 20, '10:00', 'ALL', 'Y'),
  ('진도율 50% 미만 독려', 'ALL', 'PROGRESS_UNDER', 50, '10:00', 'ALL', 'Y'),
  ('진도율 70% 미만 독려', 'KAKAO', 'PROGRESS_UNDER', 70, '10:00', 'ALL', 'Y'),
  ('수강종료 7일 전 알림', 'ALL', 'BEFORE_END', 7, '09:00', 'ALL', 'Y'),
  ('수강종료 3일 전 알림', 'SMS', 'BEFORE_END', 3, '09:00', 'ALL', 'Y'),
  ('수강종료 1일 전 알림', 'SMS', 'BEFORE_END', 1, '09:00', 'ALL', 'Y'),
  ('수료 완료 안내', 'ALL', 'PASS_DONE', 0, '00:00', 'ALL', 'Y'),
  ('미수료 안내', 'SMS', 'AFTER_END', 1, '09:00', 'ALL', 'Y')
ON DUPLICATE KEY UPDATE `rule_id` = `rule_id`;

-- ADD-2. lms_bulk_register (일괄등록 작업이력)
CREATE TABLE IF NOT EXISTS `lms_bulk_register` (
  `bulk_id`            INT(10) NOT NULL AUTO_INCREMENT          COMMENT '일괄등록 고유번호',
  `bulk_type`          VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '작업유형(MEMBER:회원일괄/ENROLL:수강일괄)',
  `class_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '대상 차수 ID',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '대상 기업 ID',
  `file_name`          VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '업로드 엑셀 파일명(원본)',
  `file_path`          VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '업로드 엑셀 파일 저장경로',
  `total_count`        INT(5) NOT NULL DEFAULT 0                COMMENT '전체 행수',
  `success_count`      INT(5) NOT NULL DEFAULT 0                COMMENT '성공 건수',
  `fail_count`         INT(5) NOT NULL DEFAULT 0                COMMENT '실패 건수',
  `fail_log`           LONGTEXT NULL                            COMMENT '실패 상세 내역(JSON)',
  `status`             TINYINT(1) NOT NULL DEFAULT 1            COMMENT '상태(1:대기,2:처리중,3:완료,4:오류)',
  `result_file`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '결과 파일 경로(다운로드용)',
  `created_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '처리 관리자 ID',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '작업시작일시',
  `completed_at`       DATETIME NULL DEFAULT NULL               COMMENT '작업완료일시',
  PRIMARY KEY (`bulk_id`),
  KEY `idx_bulk_type`  (`bulk_type`),
  KEY `idx_class_id`   (`class_id`),
  KEY `idx_company_id` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='일괄등록 작업이력 (회원/수강 엑셀 업로드)';

-- ADD-3. lms_company_request (사업주 교육신청 접수)
CREATE TABLE IF NOT EXISTS `lms_company_request` (
  `request_id`         INT(10) NOT NULL AUTO_INCREMENT          COMMENT '접수 고유번호',
  `company_id`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '기업 ID(미등록기업=공백)',
  `company_name`       VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '기업명',
  `manager_name`       VARCHAR(30) NOT NULL DEFAULT ''          COMMENT '담당자명',
  `manager_tel`        VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '담당자 전화',
  `manager_email`      VARCHAR(100) NOT NULL DEFAULT ''         COMMENT '담당자 이메일',
  `emp_count`          INT(5) NOT NULL DEFAULT 0                COMMENT '교육 신청 인원',
  `course_id`          INT(10) NOT NULL DEFAULT 0               COMMENT '희망 과정 ID',
  `class_id`           INT(10) NOT NULL DEFAULT 0               COMMENT '배정된 차수 ID(0=미배정)',
  `edu_type`           VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '교육유형(COMPANY:사업주/LEGAL:법정)',
  `legal_type`         VARCHAR(20) NOT NULL DEFAULT ''          COMMENT '법정교육 구분',
  `hope_start_date`    DATE NULL DEFAULT NULL                   COMMENT '희망 교육 시작일',
  `member_file`        VARCHAR(300) NOT NULL DEFAULT ''         COMMENT '훈련생 명단 파일 경로',
  `request_memo`       TEXT NULL                                COMMENT '요청 사항',
  `status`             CHAR(1) NOT NULL DEFAULT 'W'             COMMENT '처리상태(W:접수,R:검토중,A:승인,C:취소)',
  `process_memo`       TEXT NULL                                COMMENT '처리 메모(관리자)',
  `process_by`         INT(10) NOT NULL DEFAULT 0               COMMENT '처리 관리자 ID',
  `process_at`         DATETIME NULL DEFAULT NULL               COMMENT '처리일시',
  `created_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '접수일시',
  `updated_at`         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  PRIMARY KEY (`request_id`),
  KEY `idx_company_id` (`company_id`),
  KEY `idx_status`     (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='사업주/법정교육 신청 접수 (관리자 처리 전 단계)';

-- ADD-4. lms_certificate_tpl은 위 J-2에서 확장 버전으로 생성 완료
-- (GAP 분석 보완사항 반영: tpl_type 컬럼으로 PERSONAL/COMPANY/LEGAL 구분)



-- ============================================================
-- 최종 테이블 수 확인
-- [그룹A] EMON API 8개: API_USER_HIST, API_USER_LOGIN_HIST, API_COURSE_HIST, 
--         API_CLASS_HIST, API_ATTEND_HIST, API_ATTEND_RESULT_HIST, API_SCORE_HIST, API_PHONE_AUTH_HIST
-- [그룹B] 시스템 5개: lms_site, lms_admin, lms_admin_log, lms_popup, lms_banner
-- [그룹C] 사용자 4개: lms_member, lms_member_login_log, lms_phone_auth, lms_member_withdraw
-- [그룹D] 강사 3개: lms_tutor, lms_tutor_career, lms_tutor_log
-- [그룹E] 기업 5개: lms_company, lms_company_dept, lms_company_manager, lms_company_contract, lms_branch
-- [그룹F] 과정 5개: lms_category, lms_course, lms_course_type, lms_content, lms_course_tutor
-- [그룹G] 차수 3개: lms_class, lms_class_company, lms_class_schedule
-- [그룹H] 수강 4개: lms_enrollment, lms_enrollment_company, lms_content_progress, lms_learning_log
-- [그룹I] 시험 4개: lms_exam_question, lms_exam_paper, lms_exam_result, lms_task
-- [그룹J] 수료 2개: lms_certificate, lms_certificate_tpl
-- [그룹K] 결제 5개: lms_payment, lms_payment_vbank, lms_cart, lms_coupon, lms_coupon_use
-- [그룹L] 게시판 5개: lms_board, lms_board_post, lms_board_comment, lms_qna, lms_note
-- [그룹M] 설문 3개: lms_survey, lms_survey_question, lms_survey_answer
-- [그룹N] 알림 4개: lms_notification_tpl, lms_notification_config, lms_notification_queue, lms_notification_log
-- [그룹O] 기타 2개: lms_goods, lms_goods_order
-- [GAP추가] 3개: lms_notification_rule, lms_bulk_register, lms_company_request
-- 합계: 8 + 5+4+3+5+5+3+4+4+2+5+5+3+4+2+3 = 8 + 61 = 총 69개
-- (설계서의 56개에서 세분화하여 실제 운영 필요 테이블 추가 반영)
-- ============================================================
