Initial project import for team collaboration.

Exclude local docs, MCP, and secrets via gitignore.

Made-with: Cursor
This commit is contained in:
taekyoungc
2026-03-25 12:05:33 +09:00
commit 4e557d4be1
153 changed files with 16198 additions and 0 deletions

6
writable/.htaccess Executable file
View File

@@ -0,0 +1,6 @@
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

11
writable/cache/index.html vendored Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View File

@@ -0,0 +1,371 @@
-- 대구광역시(특히 북구) 기준 기본코드 초기 데이터 스크립트
-- 실행 순서:
-- 1) code_kind / code_detail 테이블 생성
-- 2) code_kind 데이터 입력
-- 3) code_detail 데이터 입력
/* =========================================================
* 1. 테이블 생성 (이미 존재하면 생략 가능)
* =======================================================*/
CREATE TABLE IF NOT EXISTS `code_kind` (
`ck_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '코드종류 PK',
`ck_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '종류 코드(A~Y 등)',
`ck_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '종류 명칭',
`ck_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=사용, 0=미사용',
`ck_regdate` DATETIME NOT NULL COMMENT '등록일시',
PRIMARY KEY (`ck_idx`),
UNIQUE KEY `uk_ck_code` (`ck_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기본코드 종류';
CREATE TABLE IF NOT EXISTS `code_detail` (
`cd_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '세부코드 PK',
`cd_ck_idx` INT UNSIGNED NOT NULL COMMENT 'code_kind FK',
`cd_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '세부 코드',
`cd_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '세부 명칭',
`cd_sort` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '정렬 순서',
`cd_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=사용, 0=미사용',
`cd_regdate` DATETIME NOT NULL COMMENT '등록일시',
PRIMARY KEY (`cd_idx`),
KEY `idx_cd_ck_idx` (`cd_ck_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='세부 기본코드';
/* =========================================================
* 2. code_kind 초기 데이터
* (중복 실행 시 uk_ck_code 제약 때문에 에러 가능)
* =======================================================*/
INSERT INTO `code_kind` (`ck_code`, `ck_name`, `ck_state`, `ck_regdate`) VALUES
('A', '도/특별시/광역시 구분', 1, NOW()),
('B', '특별시/광역시/시/군 코드', 1, NOW()),
('C', '구 코드', 1, NOW()),
('D', '동 코드', 1, NOW()),
('E', '봉투구분', 1, NOW()),
('F', '봉투재질', 1, NOW()),
('G', '용량별', 1, NOW()),
('H', '무상지급 구분', 1, NOW()),
('I', '판매형태', 1, NOW()),
('J', '반품형태', 1, NOW()),
('K', '반품사유', 1, NOW()),
('L', '지정판매소 변경사유', 1, NOW()),
('M', '수불구분', 1, NOW()),
('N', '동판종류', 1, NOW()),
('O', '봉투명', 1, NOW()),
('P', '작업권한', 1, NOW()),
('Q', '예산과목', 1, NOW()),
('R', '은행목록', 1, NOW()),
('S', '소속', 1, NOW()),
('T', '직위', 1, NOW());
/* =========================================================
* 3. code_detail 초기 데이터
* 3-1. 행정구역 관련 (대구광역시, 북구 및 북구 동)
* =======================================================*/
-- A: 도/특별시/광역시 구분 대구는 광역시만 사용
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, '11', '광역시', 10, 1, NOW()
FROM code_kind WHERE ck_code = 'A';
-- B: 특별시/광역시/시/군 코드 대구광역시
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, '1102', '대구광역시', 10, 1, NOW()
FROM code_kind WHERE ck_code = 'B';
-- C: 구코드 북구 (CSV: 110209, 북구)
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, '110209', '북구', 10, 1, NOW()
FROM code_kind WHERE ck_code = 'C';
-- D: 동코드 대구 북구의 동들 (11020901~11020928)
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '11020901' AS cd_code, '검단동' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '11020902', '고성동1가', 20 UNION ALL
SELECT '11020903', '고성동2가', 30 UNION ALL
SELECT '11020904', '고성동3가', 40 UNION ALL
SELECT '11020905', '관음동', 50 UNION ALL
SELECT '11020906', '구암동', 60 UNION ALL
SELECT '11020907', '국우동', 70 UNION ALL
SELECT '11020908', '금호동', 80 UNION ALL
SELECT '11020909', '노곡동', 90 UNION ALL
SELECT '11020910', '노원동1가', 100 UNION ALL
SELECT '11020911', '노원동2가', 110 UNION ALL
SELECT '11020912', '노원동3가', 120 UNION ALL
SELECT '11020913', '대현동', 130 UNION ALL
SELECT '11020914', '도남동', 140 UNION ALL
SELECT '11020915', '동변동', 150 UNION ALL
SELECT '11020916', '동천동', 160 UNION ALL
SELECT '11020917', '동호동', 170 UNION ALL
SELECT '11020918', '매천동', 180 UNION ALL
SELECT '11020919', '복현동', 190 UNION ALL
SELECT '11020920', '사수동', 200 UNION ALL
SELECT '11020921', '산격동', 210 UNION ALL
SELECT '11020922', '서변동', 220 UNION ALL
SELECT '11020923', '연경동', 230 UNION ALL
SELECT '11020924', '읍내동', 240 UNION ALL
SELECT '11020925', '조야동', 250 UNION ALL
SELECT '11020926', '칠성동1가', 260 UNION ALL
SELECT '11020927', '칠성동2가', 270 UNION ALL
SELECT '11020928', '침산동', 280
) AS v
ON code_kind.ck_code = 'D';
/* =========================================================
* 3-2. 봉투·재질·용량·무상·판매형태 (E~I)
* =======================================================*/
-- E: 봉투구분
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '10' AS cd_code, '일반용' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '20' AS cd_code, '공공용' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '30' AS cd_code, '무료용' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '40' AS cd_code, '공동주택용' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '50' AS cd_code, '재사용' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '60' AS cd_code, '음식물 봉투' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '61' AS cd_code, '음식물 스티커' AS cd_name, 70 AS cd_sort UNION ALL
SELECT '62' AS cd_code, '음식물 용기' AS cd_name, 80 AS cd_sort UNION ALL
SELECT '70' AS cd_code, '대형폐기물 스티커' AS cd_name, 90 AS cd_sort
) AS v
ON code_kind.ck_code = 'E';
-- F: 봉투재질
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '2' AS cd_code, '고밀도' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '6' AS cd_code, 'PP마대' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '7' AS cd_code, '스티커' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '8' AS cd_code, '용기' AS cd_name, 40 AS cd_sort
) AS v
ON code_kind.ck_code = 'F';
-- G: 용량별
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '10' AS cd_code, '2L' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '11' AS cd_code, '3L' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '12' AS cd_code, '5L' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '13' AS cd_code, '10L' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '15' AS cd_code, '20L' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '16' AS cd_code, '30L' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '17' AS cd_code, '50L' AS cd_name, 70 AS cd_sort UNION ALL
SELECT '18' AS cd_code, '60L' AS cd_name, 80 AS cd_sort UNION ALL
SELECT '19' AS cd_code, '75L' AS cd_name, 90 AS cd_sort UNION ALL
SELECT '20' AS cd_code, '100L' AS cd_name, 100 AS cd_sort UNION ALL
SELECT '21' AS cd_code, '120L' AS cd_name, 110 AS cd_sort
) AS v
ON code_kind.ck_code = 'G';
-- H: 무상지급 구분
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '시설보호대상자' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '10' AS cd_code, '생보자' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '3' AS cd_code, '대한민국무공수훈자' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '4' AS cd_code, '사회복지시설' AS cd_name, 40 AS cd_sort
) AS v
ON code_kind.ck_code = 'H';
-- I: 판매형태
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '무상지급' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '일반판매' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '3' AS cd_code, '관내판매' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '4' AS cd_code, '교환판매' AS cd_name, 40 AS cd_sort
) AS v
ON code_kind.ck_code = 'I';
/* =========================================================
* 3-3. 반품·수불·동판·봉투명·작업권한·예산·은행 (J~R)
* =======================================================*/
-- J: 반품형태
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '일반반품' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '관내반품' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '3' AS cd_code, '반품' AS cd_name, 30 AS cd_sort
) AS v
ON code_kind.ck_code = 'J';
-- K: 반품사유
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '봉투훼손' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '지정판매소 폐업' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '4' AS cd_code, '스티커 미사용' AS cd_name, 30 AS cd_sort
) AS v
ON code_kind.ck_code = 'K';
-- L: 지정판매소 변경사유
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '지정판매소변경사유1' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '지정판매소변경사유2' AS cd_name, 20 AS cd_sort
) AS v
ON code_kind.ck_code = 'L';
-- M: 수불구분
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '10' AS cd_code, '실사입고' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '11' AS cd_code, '신청입고' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '12' AS cd_code, '무료입고' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '13' AS cd_code, '발주입고' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '16' AS cd_code, '반품입고(정상)' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '17' AS cd_code, '반품입고(불용)' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '18' AS cd_code, '이동입고' AS cd_name, 70 AS cd_sort UNION ALL
SELECT '1A' AS cd_code, '교환입고' AS cd_name, 80 AS cd_sort UNION ALL
SELECT '1B' AS cd_code, '기타입고' AS cd_name, 90 AS cd_sort UNION ALL
SELECT '20' AS cd_code, '실사출고' AS cd_name, 100 AS cd_sort UNION ALL
SELECT '21' AS cd_code, '신청불출' AS cd_name, 110 AS cd_sort UNION ALL
SELECT '22' AS cd_code, '무료불출' AS cd_name, 120 AS cd_sort UNION ALL
SELECT '23' AS cd_code, '일반판매' AS cd_name, 130 AS cd_sort UNION ALL
SELECT '24' AS cd_code, '공공출고' AS cd_name, 140 AS cd_sort UNION ALL
SELECT '26' AS cd_code, '반품출고(정상)' AS cd_name, 150 AS cd_sort UNION ALL
SELECT '27' AS cd_code, '반품출고(불용)' AS cd_name, 160 AS cd_sort UNION ALL
SELECT '28' AS cd_code, '이동출고' AS cd_name, 170 AS cd_sort UNION ALL
SELECT '29' AS cd_code, '파기처리' AS cd_name, 180 AS cd_sort UNION ALL
SELECT '2A' AS cd_code, '교환출고' AS cd_name, 190 AS cd_sort UNION ALL
SELECT '2B' AS cd_code, '기타출고' AS cd_name, 200 AS cd_sort UNION ALL
SELECT '99' AS cd_code, '시찰' AS cd_name, 210 AS cd_sort
) AS v
ON code_kind.ck_code = 'M';
-- N: 동판종류
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '10' AS cd_code, '동판 종류1' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '20' AS cd_code, '동판 종류2' AS cd_name, 20 AS cd_sort
) AS v
ON code_kind.ck_code = 'N';
-- O: 봉투명 (상세 봉투 코드)
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '10112' AS cd_code, '일반용 3L' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '10122' AS cd_code, '일반용 5L' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '10132' AS cd_code, '일반용 10L' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '10152' AS cd_code, '일반용 20L' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '10162' AS cd_code, '일반용 30L' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '10172' AS cd_code, '일반용 50L' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '10192' AS cd_code, '일반용 75L' AS cd_name, 70 AS cd_sort UNION ALL
SELECT '10202' AS cd_code, '일반용 100L' AS cd_name, 80 AS cd_sort UNION ALL
SELECT '20172' AS cd_code, '공공용 50L' AS cd_name, 90 AS cd_sort UNION ALL
SELECT '40152' AS cd_code, '공동주택용 20L' AS cd_name, 100 AS cd_sort UNION ALL
SELECT '40182' AS cd_code, '공동주택용 60L' AS cd_name, 110 AS cd_sort UNION ALL
SELECT '40212' AS cd_code, '공동주택용 120L' AS cd_name, 120 AS cd_sort UNION ALL
SELECT '50122' AS cd_code, '재사용 5L' AS cd_name, 130 AS cd_sort UNION ALL
SELECT '60102' AS cd_code, '음식물 2L' AS cd_name, 140 AS cd_sort UNION ALL
SELECT '60132' AS cd_code, '음식물 10L' AS cd_name, 150 AS cd_sort UNION ALL
SELECT '61107' AS cd_code, '음식물 스티커 2L' AS cd_name, 160 AS cd_sort UNION ALL
SELECT '61117' AS cd_code, '음식물 스티커 3L' AS cd_name, 170 AS cd_sort UNION ALL
SELECT '61127' AS cd_code, '음식물 스티커 5L' AS cd_name, 180 AS cd_sort UNION ALL
SELECT '61157' AS cd_code, '음식물 스티커 20L' AS cd_name, 190 AS cd_sort UNION ALL
SELECT '61187' AS cd_code, '음식물 스티커 60L' AS cd_name, 200 AS cd_sort UNION ALL
SELECT '61217' AS cd_code, '음식물 스티커 120L' AS cd_name, 210 AS cd_sort UNION ALL
SELECT '62128' AS cd_code, '음식물용기 5L' AS cd_name, 220 AS cd_sort UNION ALL
SELECT '62158' AS cd_code, '음식물용기 20L' AS cd_name, 230 AS cd_sort UNION ALL
SELECT '70707' AS cd_code, '폐기물 스티커 1,000원' AS cd_name, 240 AS cd_sort UNION ALL
SELECT '70727' AS cd_code, '폐기물 스티커 3,000원' AS cd_name, 250 AS cd_sort UNION ALL
SELECT '70747' AS cd_code, '폐기물 스티커 5,000원' AS cd_name, 260 AS cd_sort UNION ALL
SELECT '70787' AS cd_code, '폐기물 스티커 10,000원'AS cd_name, 270 AS cd_sort
) AS v
ON code_kind.ck_code = 'O';
-- P: 작업권한 (예시 실제 운영 정책에 맞게 확장 가능)
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, '111', '등록-다시', 10, 1, NOW()
FROM code_kind WHERE ck_code = 'P';
-- Q: 예산과목 (대표 코드만 선행 입력)
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1000' AS cd_code, '' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '1001' AS cd_code, '보건및생활환경개선비' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '2000' AS cd_code, '' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '2010' AS cd_code, '환경관리' AS cd_name, 40 AS cd_sort
) AS v
ON code_kind.ck_code = 'Q';
-- R: 은행목록
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '4' AS cd_code, '국민은행' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '7' AS cd_code, '수협' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '20' AS cd_code, '우리은행' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '32' AS cd_code, '부산은행' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '99' AS cd_code, '새마을금고' AS cd_name, 50 AS cd_sort
) AS v
ON code_kind.ck_code = 'R';
/* =========================================================
* 3-4. 소속(S), 직위(T)
* =======================================================*/
-- S: 소속
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '청소과' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '청소행정과' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '3' AS cd_code, '자원순환과' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '4' AS cd_code, '도시미화과' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '5' AS cd_code, '영업부' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '6' AS cd_code, '관리부' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '7' AS cd_code, '기술부' AS cd_name, 70 AS cd_sort
) AS v
ON code_kind.ck_code = 'S';
-- T: 직위
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_regdate`)
SELECT ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, NOW()
FROM code_kind
JOIN (
SELECT '1' AS cd_code, '7급' AS cd_name, 10 AS cd_sort UNION ALL
SELECT '2' AS cd_code, '8급' AS cd_name, 20 AS cd_sort UNION ALL
SELECT '3' AS cd_code, '9급' AS cd_name, 30 AS cd_sort UNION ALL
SELECT '4' AS cd_code, '기능' AS cd_name, 40 AS cd_sort UNION ALL
SELECT '5' AS cd_code, '계장' AS cd_name, 50 AS cd_sort UNION ALL
SELECT '6' AS cd_code, '과장' AS cd_name, 60 AS cd_sort UNION ALL
SELECT '7' AS cd_code, '사장' AS cd_name, 70 AS cd_sort UNION ALL
SELECT '8' AS cd_code, '상무' AS cd_name, 80 AS cd_sort
) AS v
ON code_kind.ck_code = 'T';

View File

@@ -0,0 +1,15 @@
-- 종량제 로컬 개발 DB 초기화
-- 실행: mariadb -u root < writable/database/init_jongryangje_dev.sql
-- 또는: mysql -u root < writable/database/init_jongryangje_dev.sql
CREATE DATABASE IF NOT EXISTS jongryangje_dev
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'jongryangje'@'localhost'
IDENTIFIED BY 'jongryangje_dev';
GRANT ALL PRIVILEGES ON jongryangje_dev.* TO 'jongryangje'@'localhost';
FLUSH PRIVILEGES;
SELECT 'jongryangje_dev DB and user ready.' AS result;

View File

@@ -0,0 +1,21 @@
-- 대구광역시 전체 구·군 지자체 초기 데이터
-- 코드 설계: 코드 B(1102) = 대구광역시, 코드 C = 1102 + 구 순번 2자리 (기본코드 종류 CSV 규칙)
-- 실행 전 local_government 테이블이 생성되어 있어야 함.
-- 중복 실행 시 uk_lg_code 제약으로 인해 에러 가능 → 기존 데이터 삭제 후 실행하거나, INSERT IGNORE 사용
/* =========================================================
* 지자체 코드 (lg_code) 규칙
* - 110201 ~ 110209: 대구광역시 구·군 (1102 + 순번 01~09, 08 제외)
* - 110201 중구, 110202 동구, 110203 서구, 110204 남구,
* 110205 수성구, 110206 달서구, 110207 달성군, 110209 북구
* =======================================================*/
INSERT INTO `local_government` (`lg_name`, `lg_code`, `lg_sido`, `lg_gugun`, `lg_addr`, `lg_state`, `lg_regdate`) VALUES
('중구청', '110201', '대구광역시', '중구', '대구광역시 중구 중앙대로 394', 1, NOW()),
('동구청', '110202', '대구광역시', '동구', '대구광역시 동구 동대구로 205', 1, NOW()),
('서구청', '110203', '대구광역시', '서구', '대구광역시 서구 달서로 250', 1, NOW()),
('남구청', '110204', '대구광역시', '남구', '대구광역시 남구 대명로 215', 1, NOW()),
('수성구청', '110205', '대구광역시', '수성구', '대구광역시 수성구 달구벌대로 2450', 1, NOW()),
('달서구청', '110206', '대구광역시', '달서구', '대구광역시 달서구 달서대로 600', 1, NOW()),
('달성군청', '110207', '대구광역시', '달성군', '대구광역시 달성군 화원읍 비슬로 2350', 1, NOW()),
('북구청', '110209', '대구광역시', '북구', '대구광역시 북구 옥산로 65', 1, NOW());

View File

@@ -0,0 +1,122 @@
-- 로그인 기능용 테이블 (docs/11-login-logout-development-guide.md 기준)
-- 실행: mysql -h 127.0.0.1 -P 3306 -u jongryangje -p jongryangje_dev < writable/database/login_tables.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ---------------------------------------------------------------------------
-- member: 로그인·권한용 회원 테이블
-- mb_state: 1=정상, 2=정지, 0=탈퇴
-- mb_level: app/Config/Roles.php 참고
-- 1=일반 사용자, 2=지정판매소, 3=지자체관리자, 4=super admin
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `member` (
`mb_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '회원 PK',
`mb_id` VARCHAR(50) NOT NULL COMMENT '로그인 아이디',
`mb_passwd` VARCHAR(255) NOT NULL COMMENT '비밀번호 해시(password_hash)',
`mb_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '이름',
`mb_email` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '이메일',
`mb_phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '연락처',
`mb_lang` VARCHAR(10) NOT NULL DEFAULT 'ko' COMMENT '언어',
`mb_level` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=일반, 2=지정판매소, 3=지자체관리자, 4=super admin (Roles.php)',
`mb_group` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '권한 그룹 코드(Phase 2)',
`mb_lg_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '소속 지자체 PK(지자체관리자만 사용)',
`mb_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 2=정지, 0=탈퇴',
`mb_regdate` DATETIME NOT NULL COMMENT '가입일시',
`mb_latestdate` DATETIME NULL DEFAULT NULL COMMENT '최근 로그인 일시',
`mb_leavedate` DATETIME NULL DEFAULT NULL COMMENT '탈퇴일시',
PRIMARY KEY (`mb_idx`),
UNIQUE KEY `uk_mb_id` (`mb_id`),
KEY `idx_mb_state` (`mb_state`),
KEY `idx_mb_lg_idx` (`mb_lg_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원(로그인·권한)';
-- ---------------------------------------------------------------------------
-- member_log: 로그인/로그아웃 이력 전용
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `member_log` (
`mll_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '로그 PK',
`mll_success` TINYINT(1) NOT NULL COMMENT '1=성공, 0=실패',
`mb_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '회원 PK(실패 시 NULL 가능)',
`mb_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '로그인 시도 아이디',
`mll_regdate` DATETIME NOT NULL COMMENT '로그 일시',
`mll_ip` VARCHAR(45) NOT NULL DEFAULT '' COMMENT 'IP',
`mll_msg` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '메시지(실패 사유 등)',
`mll_useragent` VARCHAR(500) NOT NULL DEFAULT '' COMMENT 'User-Agent',
`mll_logout_date` DATETIME NULL DEFAULT NULL COMMENT '로그아웃 일시',
`mll_url` VARCHAR(500) NULL DEFAULT NULL COMMENT '요청 URL(선택)',
`mll_referer` VARCHAR(500) NULL DEFAULT NULL COMMENT 'Referer(선택)',
`mll_country` VARCHAR(10) NULL DEFAULT NULL COMMENT '국가 코드(선택)',
`at_token` VARCHAR(100) NULL DEFAULT NULL COMMENT '세션/토큰 식별(선택)',
PRIMARY KEY (`mll_idx`),
KEY `idx_mll_mb_idx` (`mb_idx`),
KEY `idx_mll_regdate` (`mll_regdate`),
KEY `idx_mll_success` (`mll_success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='로그인/로그아웃 이력';
-- ---------------------------------------------------------------------------
-- member_approval_request: 회원가입 역할 승인 요청 이력
-- 공개 회원가입 시 생성되며, 승인 후에만 requested_level이 member.mb_level로 반영됨
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `member_approval_request` (
`mar_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '승인요청 PK',
`mb_idx` INT UNSIGNED NOT NULL COMMENT '회원 FK(member.mb_idx)',
`mar_requested_level` TINYINT UNSIGNED NOT NULL COMMENT '요청 역할(1,2,3)',
`mar_status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending|approved|rejected',
`mar_request_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '요청 메모',
`mar_reject_reason` VARCHAR(255) NULL DEFAULT NULL COMMENT '반려 사유',
`mar_requested_at` DATETIME NOT NULL COMMENT '요청일시',
`mar_requested_by` INT UNSIGNED NULL DEFAULT NULL COMMENT '요청자 mb_idx',
`mar_processed_at` DATETIME NULL DEFAULT NULL COMMENT '처리일시',
`mar_processed_by` INT UNSIGNED NULL DEFAULT NULL COMMENT '처리자 mb_idx',
PRIMARY KEY (`mar_idx`),
KEY `idx_mar_mb_idx` (`mb_idx`),
KEY `idx_mar_status_requested` (`mar_status`, `mar_requested_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원가입 역할 승인 요청';
-- ---------------------------------------------------------------------------
-- local_government: 지자체 마스터 (테넌트 루트)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `local_government` (
`lg_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '지자체 PK',
`lg_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '지자체명(예: OO구청)',
`lg_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '지자체/구군 코드(행정코드)',
`lg_sido` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '시/도',
`lg_gugun` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '구/군',
`lg_addr` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '주소',
`lg_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=사용, 0=미사용',
`lg_regdate` DATETIME NOT NULL COMMENT '등록일시',
PRIMARY KEY (`lg_idx`),
UNIQUE KEY `uk_lg_code` (`lg_code`),
KEY `idx_lg_state` (`lg_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='지자체(테넌트 루트)';
-- ---------------------------------------------------------------------------
-- designated_shop: 지정판매소
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `designated_shop` (
`ds_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '지정판매소 PK',
`ds_lg_idx` INT UNSIGNED NOT NULL COMMENT '소속 지자체 FK',
`ds_mb_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '로그인 회원 FK(1:1)',
`ds_shop_no` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '판매소번호',
`ds_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '상호명',
`ds_biz_no` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '사업자번호',
`ds_rep_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대표자명',
`ds_va_number` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '고정 가상계좌 번호',
`ds_zip` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '우편번호',
`ds_addr` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '도로명주소',
`ds_addr_jibun` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '지번주소',
`ds_tel` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '일반전화',
`ds_rep_phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '개인전화',
`ds_email` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '이메일',
`ds_gugun_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '구코드',
`ds_designated_at` DATE NULL DEFAULT NULL COMMENT '지정일자',
`ds_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 2=폐업, 3=직권해지',
`ds_regdate` DATETIME NOT NULL COMMENT '등록일시',
PRIMARY KEY (`ds_idx`),
KEY `idx_ds_lg_idx` (`ds_lg_idx`),
KEY `idx_ds_mb_idx` (`ds_mb_idx`),
UNIQUE KEY `uk_ds_shop_no` (`ds_shop_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='지정판매소';
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,22 @@
-- 기존 DB에 회원가입 역할 승인 요청 테이블 추가
-- 실행 예:
-- mysql -h 127.0.0.1 -P 3306 -u jongryangje -p jongryangje_dev < writable/database/member_approval_request_add.sql
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `member_approval_request` (
`mar_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '승인요청 PK',
`mb_idx` INT UNSIGNED NOT NULL COMMENT '회원 FK(member.mb_idx)',
`mar_requested_level` TINYINT UNSIGNED NOT NULL COMMENT '요청 역할(1,2,3)',
`mar_status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending|approved|rejected',
`mar_request_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '요청 메모',
`mar_reject_reason` VARCHAR(255) NULL DEFAULT NULL COMMENT '반려 사유',
`mar_requested_at` DATETIME NOT NULL COMMENT '요청일시',
`mar_requested_by` INT UNSIGNED NULL DEFAULT NULL COMMENT '요청자 mb_idx',
`mar_processed_at` DATETIME NULL DEFAULT NULL COMMENT '처리일시',
`mar_processed_by` INT UNSIGNED NULL DEFAULT NULL COMMENT '처리자 mb_idx',
PRIMARY KEY (`mar_idx`),
KEY `idx_mar_mb_idx` (`mb_idx`),
KEY `idx_mar_status_requested` (`mar_status`, `mar_requested_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원가입 역할 승인 요청';

View File

@@ -0,0 +1,3 @@
-- 기존 menu 테이블에 지자체(lg_idx) 컬럼 추가 (이미 컬럼이 있으면 에러 무시하고 스킵)
ALTER TABLE `menu` ADD COLUMN `lg_idx` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '지자체 FK' AFTER `mt_idx`;
ALTER TABLE `menu` ADD KEY `idx_mt_lg` (`mt_idx`, `lg_idx`);

View File

@@ -0,0 +1,292 @@
-- CSV "종량제_개발목록_20260127(전체 메뉴 - 1차정리).csv" 기반으로
-- site 타입(menu_type.mt_code='site')의 1차/2차 메뉴를 초기 시드하는 SQL 뼈대입니다.
--
-- 1행: 1차 메뉴명 리스트
-- 2행 이후: 각 열이 해당 1차 메뉴의 2차 메뉴명에 해당.
--
-- 실제 운영 시에는 CSV를 파싱해서 INSERT를 생성하는 스크립트를 사용하는 편이 낫고,
-- 아래 SQL은 구조 이해 및 수동 시드를 위한 참고용입니다.
-- 1) site용 mt_idx 조회 (예: @mt_site)
SET @mt_site := (SELECT mt_idx FROM menu_type WHERE mt_code = 'site' LIMIT 1);
-- 3) 2차 메뉴 예시
-- CSV의 2행 이후를 바탕으로, 각 1차 메뉴 아래에 2차 메뉴를 추가하는 방식의 예시입니다.
-- 아래 예시는 구조를 보여주기 위한 샘플이며, 실제 라우트(mm_link)는 구현 후에 맞게 수정해야 합니다.
-- 예: "기본정보관리" 하위 2차 메뉴들 (PWB-030100~ 등)
SET @parent_basic := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '기본정보관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_basic, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '기본 코드 관리' AS mm_name UNION ALL
SELECT 1, '단가 관리' UNION ALL
SELECT 2, '포장 단위 관리' UNION ALL
SELECT 3, '판매 대행소 관리' UNION ALL
SELECT 4, '담당자 관리' UNION ALL
SELECT 5, '업체 관리' UNION ALL
SELECT 6, '무료용 대상자 관리' UNION ALL
SELECT 7, '지정 판매소 관리' UNION ALL
SELECT 8, '지정 판매소 조회' UNION ALL
SELECT 9, '지정 판매소 신규/취소 현황' UNION ALL
SELECT 10, '지정판매소 바코드 출력' UNION ALL
SELECT 11, 'PC -> PDA로 자료 전송' UNION ALL
SELECT 12, 'PDA -> PC로 자료 전송' UNION ALL
SELECT 13, '올린 자료 처리' UNION ALL
SELECT 14, '시찰 처리' UNION ALL
SELECT 15, 'PASSWORD 변경' UNION ALL
SELECT 16, '환경 설정' UNION ALL
SELECT 17, '지정 판매소 현황'
) AS t
WHERE @parent_basic IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_basic
AND m.mm_name = t.mm_name
);
-- 2) 1차: 발주 입고 관리 하위 메뉴
SET @parent_order := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '발주 입고 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_order, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '발주 등록' AS mm_name UNION ALL
SELECT 1, '발주 변경' UNION ALL
SELECT 2, 'LOT-No 디스켓 불출' UNION ALL
SELECT 3, '발주 현황' UNION ALL
SELECT 4, '발주 입고[스캐너]' UNION ALL
SELECT 5, '일괄입고' UNION ALL
SELECT 6, '입고 현황'
) AS t
WHERE @parent_order IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_order
AND m.mm_name = t.mm_name
);
-- 3) 1차: 불출 관리 하위 메뉴
SET @parent_issue := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '불출 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_issue, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '무료 불출 현황' AS mm_name UNION ALL
SELECT 1, '무료용 불출 처리' UNION ALL
SELECT 2, '무료용 불출 취소'
) AS t
WHERE @parent_issue IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_issue
AND m.mm_name = t.mm_name
);
-- 4) 1차: 재고 관리 하위 메뉴
SET @parent_inventory := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '재고 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_inventory, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '재고 현황' AS mm_name UNION ALL
SELECT 1, '실사 관리' UNION ALL
SELECT 2, '실사 선별' UNION ALL
SELECT 3, '실사 선별 조회' UNION ALL
SELECT 4, '실사 등록' UNION ALL
SELECT 5, '실사 재고 조회' UNION ALL
SELECT 6, '실사 오류 조회' UNION ALL
SELECT 7, '실사 선별 취소' UNION ALL
SELECT 8, '실사 등록 취소'
) AS t
WHERE @parent_inventory IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_inventory
AND m.mm_name = t.mm_name
);
-- 5) 1차: 판매 관리 하위 메뉴
SET @parent_sales := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '판매 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_sales, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '전화 접수' AS mm_name UNION ALL
SELECT 1, '전화 접수 관리' UNION ALL
SELECT 2, '지정 판매소 판매' UNION ALL
SELECT 3, '지정 판매소 반품' UNION ALL
SELECT 4, '지정 판매소 판매 취소' UNION ALL
SELECT 5, '지정 판매소 반품 취소'
) AS t
WHERE @parent_sales IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_sales
AND m.mm_name = t.mm_name
);
-- 6) 1차: 판매 현황 하위 메뉴
SET @parent_sales_stats := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '판매 현황'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_sales_stats, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '지정 판매소 일 판매대장' AS mm_name UNION ALL
SELECT 1, '지정 판매소 기간별 판매대장' UNION ALL
SELECT 2, '일계표' UNION ALL
SELECT 3, '기간별 판매현황[일집계]' UNION ALL
SELECT 4, '기간별 판매현황[기간집계]' UNION ALL
SELECT 5, '년 판매 현황' UNION ALL
SELECT 6, '지정 판매소 별 판매현황(수량)' UNION ALL
SELECT 7, '지정 판매소 별 판매현황(금액)' UNION ALL
SELECT 8, '지정판매소별 거래현황' UNION ALL
SELECT 9, '홈텍스 처리'
) AS t
WHERE @parent_sales_stats IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_sales_stats
AND m.mm_name = t.mm_name
);
-- 7) 1차: 봉투 수불 관리 하위 메뉴
SET @parent_flow := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '봉투 수불 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_flow, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '기타 입출고' AS mm_name UNION ALL
SELECT 1, '기간별 봉투 수불 현황' UNION ALL
SELECT 2, '일일 봉투 수불 현황' UNION ALL
SELECT 3, '반품/파기 현황' UNION ALL
SELECT 4, '쓰레기 봉투 수급 계획' UNION ALL
SELECT 5, 'LOT 수불 조회'
) AS t
WHERE @parent_flow IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_flow
AND m.mm_name = t.mm_name
);
-- 8) 1차: 통계 분석 관리 하위 메뉴
SET @parent_analytics := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '통계 분석 관리'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_analytics, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '전년 대비 판매 분석' AS mm_name UNION ALL
SELECT 1, '월별 판매 추이 분석' UNION ALL
SELECT 2, '계절별 판매 추이 분석'
) AS t
WHERE @parent_analytics IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_analytics
AND m.mm_name = t.mm_name
);
-- 9) 1차: 창 하위 메뉴
SET @parent_window := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = ''
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_window, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, 'PDA 수정' AS mm_name UNION ALL
SELECT 1, '바둑판식 배열' UNION ALL
SELECT 2, '계단식 배열' UNION ALL
SELECT 3, '계층식 배열'
) AS t
WHERE @parent_window IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_window
AND m.mm_name = t.mm_name
);
-- 10) 1차: 도움말 하위 메뉴
SET @parent_help := (
SELECT mm_idx FROM menu
WHERE mt_idx = @mt_site AND lg_idx = 1 AND mm_pidx = 0 AND mm_name = '도움말'
LIMIT 1
);
INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_cnode, mm_level, mm_is_view)
SELECT @mt_site, 1, t.mm_name, '', @parent_help, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '도움말 항목' AS mm_name UNION ALL
SELECT 1, '원격 요청' UNION ALL
SELECT 2, 'pda 리셋' UNION ALL
SELECT 3, '번호알기' UNION ALL
SELECT 4, 'Data Backup' UNION ALL
SELECT 5, '컴포트 설정' UNION ALL
SELECT 6, 'Version 정보' UNION ALL
SELECT 7, '종료' UNION ALL
SELECT 8, '1GBMS'
) AS t
WHERE @parent_help IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM menu m
WHERE m.mt_idx = @mt_site
AND m.lg_idx = 1
AND m.mm_pidx = @parent_help
AND m.mm_name = t.mm_name
);

View File

@@ -0,0 +1,58 @@
-- 메뉴 종류 (admin=관리자 상단 메뉴, site=사이트 첫페이지 등)
CREATE TABLE IF NOT EXISTS `menu_type` (
`mt_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '메뉴종류 PK',
`mt_code` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '코드(admin, site 등)',
`mt_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '표시명',
`mt_sort` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '정렬',
PRIMARY KEY (`mt_idx`),
UNIQUE KEY `uk_mt_code` (`mt_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='메뉴 종류';
-- 메뉴 항목 (지자체별 관리, 트리: mm_pidx=0 최상위, mm_dep 깊이, mm_num 형제순서)
CREATE TABLE IF NOT EXISTS `menu` (
`mm_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '메뉴 PK',
`mt_idx` INT UNSIGNED NOT NULL COMMENT '메뉴종류 FK',
`lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`mm_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '메뉴명',
`mm_link` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '링크(예: admin/users)',
`mm_pidx` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '부모 메뉴 PK(0=최상위)',
`mm_dep` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '깊이(0,1,2)',
`mm_num` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '형제 내 순서',
`mm_cnode` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '자식 개수',
`mm_level` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '노출 허용 mb_level 쉼표구분(빈값=전체)',
`mm_is_view` CHAR(1) NOT NULL DEFAULT 'Y' COMMENT 'Y=노출, N=숨김',
PRIMARY KEY (`mm_idx`),
KEY `idx_mt_lg` (`mt_idx`, `lg_idx`),
KEY `idx_mm_pidx` (`mm_pidx`),
KEY `idx_mm_dep_num` (`mm_dep`, `mm_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='메뉴';
-- 초기 데이터: 메뉴 종류 (admin, site) + lg_idx=1 지자체용 기본 1차 메뉴
INSERT INTO `menu_type` (`mt_code`, `mt_name`, `mt_sort`) VALUES
('admin', '관리자 메뉴', 10),
('site', '사이트 메뉴', 20);
-- admin 타입, lg_idx=1 기본 1차 관리자 메뉴
INSERT INTO `menu` (`mt_idx`, `lg_idx`, `mm_name`, `mm_link`, `mm_pidx`, `mm_dep`, `mm_num`, `mm_cnode`, `mm_level`, `mm_is_view`) VALUES
-- mt_idx=1 (admin)
(1, 1, '대시보드', 'admin', 0, 0, 0, 0, '3', 'Y'),
(1, 1, '회원 관리', 'admin/users', 0, 0, 1, 0, '', 'Y'),
(1, 1, '로그인 이력', 'admin/access/login-history', 0, 0, 2, 0, '', 'Y'),
(1, 1, '승인 대기', 'admin/access/approvals', 0, 0, 3, 0, '', 'Y'),
(1, 1, '역할', 'admin/roles', 0, 0, 4, 0, '', 'Y'),
(1, 1, '메뉴', 'admin/menus', 0, 0, 5, 0, '', 'Y'),
(1, 1, '지자체 전환', 'admin/select-local-government', 0, 0, 6, 0, '', 'Y'),
(1, 1, '지자체', 'admin/local-governments', 0, 0, 7, 0, '', 'Y'),
(1, 1, '지정판매소', 'admin/designated-shops', 0, 0, 8, 0, '3', 'Y'),
-- mt_idx=2 (site) 기본 1차 사이트 메뉴 (링크는 추후 실제 라우트로 변경)
(2, 1, '기본정보관리', 'bag/basic-info', 0, 0, 0, 0, '', 'Y'),
(2, 1, '발주 입고 관리', 'bag/purchase-inbound', 0, 0, 1, 0, '', 'Y'),
(2, 1, '불출 관리', 'bag/issue', 0, 0, 2, 0, '', 'Y'),
(2, 1, '재고 관리', 'bag/inventory', 0, 0, 3, 0, '', 'Y'),
(2, 1, '판매 관리', 'bag/sales', 0, 0, 4, 0, '', 'Y'),
(2, 1, '판매 현황', 'bag/sales-stats', 0, 0, 5, 0, '', 'Y'),
(2, 1, '봉투 수불 관리', 'bag/flow', 0, 0, 6, 0, '', 'Y'),
(2, 1, '통계 분석 관리', 'bag/analytics', 0, 0, 7, 0, '', 'Y'),
(2, 1, '', 'bag/window', 0, 0, 8, 0, '', 'Y'),
(2, 1, '도움말', 'bag/help', 0, 0, 9, 0, '', 'Y');

View File

@@ -0,0 +1,34 @@
-- 기존 DB에 menu_type.site 및 기본 site 1차 메뉴 추가용 스크립트
-- 주의: mt_idx 값은 실제 DB 상태에 따라 다를 수 있으므로,
-- 아래에서 site용 mt_idx는 서브쿼리로 조회하여 사용한다.
-- 1) menu_type에 site 타입 추가 (이미 있으면 무시)
INSERT IGNORE INTO `menu_type` (`mt_code`, `mt_name`, `mt_sort`)
VALUES ('site', '사이트 메뉴', 20);
-- 2) lg_idx=1 기준 기본 1차 사이트 메뉴 추가
-- (이미 같은 이름/링크가 있으면 중복 INSERT를 피하기 위해 WHERE NOT EXISTS 사용)
INSERT INTO `menu` (`mt_idx`, `lg_idx`, `mm_name`, `mm_link`, `mm_pidx`, `mm_dep`, `mm_num`, `mm_cnode`, `mm_level`, `mm_is_view`)
SELECT mt.mt_idx, 1 AS lg_idx, t.mm_name, t.mm_link, 0 AS mm_pidx, 0 AS mm_dep, t.mm_num, 0 AS mm_cnode, '' AS mm_level, 'Y' AS mm_is_view
FROM (
SELECT 0 AS mm_num, '기본정보관리' AS mm_name, 'bag/basic-info' AS mm_link UNION ALL
SELECT 1, '발주 입고 관리', 'bag/purchase-inbound' UNION ALL
SELECT 2, '불출 관리', 'bag/issue' UNION ALL
SELECT 3, '재고 관리', 'bag/inventory' UNION ALL
SELECT 4, '판매 관리', 'bag/sales' UNION ALL
SELECT 5, '판매 현황', 'bag/sales-stats' UNION ALL
SELECT 6, '봉투 수불 관리', 'bag/flow' UNION ALL
SELECT 7, '통계 분석 관리', 'bag/analytics' UNION ALL
SELECT 8, '', 'bag/window' UNION ALL
SELECT 9, '도움말', 'bag/help'
) AS t
JOIN `menu_type` mt ON mt.mt_code = 'site'
WHERE NOT EXISTS (
SELECT 1 FROM `menu` m
WHERE m.mt_idx = mt.mt_idx
AND m.lg_idx = 1
AND m.mm_pidx = 0
AND m.mm_name = t.mm_name
AND m.mm_link = t.mm_link
);

11
writable/debugbar/index.html Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

11
writable/index.html Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

11
writable/logs/index.html Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

11
writable/session/index.html Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

11
writable/uploads/index.html Executable file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>