docs: add project docs and test updates

This commit is contained in:
taekyoungc
2026-04-08 00:23:55 +09:00
parent 06fedc866a
commit 06aa401048
238 changed files with 8373 additions and 148 deletions

View File

@@ -0,0 +1,351 @@
-- =============================================================================
-- 업체(company) 이후 업무 메뉴용 테이블 일괄 생성
-- =============================================================================
-- 선행 조건: local_government, code_kind, code_detail, company
-- (및 회원/로그인 흐름이 있으면 login_tables.sql 로 member, member_log 등)
--
-- 이미 login_tables.sql 을 실행했다면 designated_shop 은 건너뜁니다(CREATE IF NOT EXISTS).
--
-- 실행 예:
-- mysql --default-character-set=utf8mb4 -h 127.0.0.1 -u USER -p DB_NAME < writable/database/after_company_feature_tables.sql
--
-- 원본 분할 스크립트(동일 정의): bag_price_tables.sql, packaging_unit_tables.sql,
-- sales_agency_tables.sql, manager_tables.sql, free_recipient_tables.sql,
-- order_tables.sql, sales_tables.sql, activity_log_tables.sql, bag_misc_flow_tables.sql,
-- login_tables.sql (designated_shop 부분만 아래에 포함)
-- =============================================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ---------------------------------------------------------------------------
-- 지정판매소 (주문/판매 메뉴 FK) — login_tables.sql 과 동일
-- ---------------------------------------------------------------------------
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='지정판매소';
-- ---------------------------------------------------------------------------
-- 판매 대행소 (sales_agency_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `sales_agency` (
`sa_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`sa_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`sa_kind` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대행소 구분',
`sa_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대행소 코드',
`sa_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '대행소 명',
`sa_regdate` DATETIME NOT NULL,
PRIMARY KEY (`sa_idx`),
UNIQUE KEY `uk_sa_lg_code` (`sa_lg_idx`, `sa_code`),
KEY `idx_sa_lg_idx` (`sa_lg_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='판매 대행소';
-- ---------------------------------------------------------------------------
-- 담당자 (manager_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `manager` (
`mg_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`mg_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`mg_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '담당자명',
`mg_dept_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '소속 code_detail(S)',
`mg_position_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '직위 code_detail(T)',
`mg_tel` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '전화번호',
`mg_phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '휴대전화',
`mg_email` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '이메일',
`mg_state` TINYINT UNSIGNED NOT NULL DEFAULT 1,
`mg_regdate` DATETIME NOT NULL,
PRIMARY KEY (`mg_idx`),
KEY `idx_mg_lg_idx` (`mg_lg_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='담당자';
-- ---------------------------------------------------------------------------
-- 무료용 대상자 (free_recipient_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `free_recipient` (
`fr_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`fr_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`fr_type_code` VARCHAR(20) NOT NULL COMMENT '무상지급구분 code_detail(H)',
`fr_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '대상자/기관명',
`fr_phone` VARCHAR(20) NOT NULL DEFAULT '',
`fr_addr` VARCHAR(255) NOT NULL DEFAULT '',
`fr_dong_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '동코드 code_detail(D)',
`fr_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '비고',
`fr_end_date` DATE NULL DEFAULT NULL COMMENT '종료일자',
`fr_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 0=삭제',
`fr_regdate` DATETIME NOT NULL,
PRIMARY KEY (`fr_idx`),
KEY `idx_fr_lg_idx` (`fr_lg_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 대상자';
-- ---------------------------------------------------------------------------
-- 봉투 단가 (bag_price_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bag_price` (
`bp_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bp_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`bp_bag_code` VARCHAR(50) NOT NULL COMMENT '봉투코드(code_detail cd_code, ck=O)',
`bp_bag_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '봉투명(등록시점 스냅샷)',
`bp_order_price` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '발주단가',
`bp_wholesale` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '도매가',
`bp_consumer` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '소비자가',
`bp_start_date` DATE NOT NULL COMMENT '적용 시작일',
`bp_end_date` DATE NULL DEFAULT NULL COMMENT '적용 종료일(NULL=현재 적용중)',
`bp_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=사용, 0=미사용',
`bp_regdate` DATETIME NOT NULL,
`bp_moddate` DATETIME NULL DEFAULT NULL,
`bp_reg_mb_idx` INT UNSIGNED NULL COMMENT '등록자',
PRIMARY KEY (`bp_idx`),
KEY `idx_bp_lg_bag` (`bp_lg_idx`, `bp_bag_code`),
KEY `idx_bp_dates` (`bp_start_date`, `bp_end_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='지자체별 봉투 단가';
CREATE TABLE IF NOT EXISTS `bag_price_history` (
`bph_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bph_bp_idx` INT UNSIGNED NOT NULL COMMENT 'bag_price FK',
`bph_field` VARCHAR(30) NOT NULL COMMENT '변경 필드명',
`bph_old_value` VARCHAR(100) NOT NULL DEFAULT '',
`bph_new_value` VARCHAR(100) NOT NULL DEFAULT '',
`bph_changed_at` DATETIME NOT NULL,
`bph_changed_by` INT UNSIGNED NULL COMMENT '변경자 mb_idx',
PRIMARY KEY (`bph_idx`),
KEY `idx_bph_bp_idx` (`bph_bp_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='봉투 단가 변경 이력';
-- ---------------------------------------------------------------------------
-- 포장 단위 (packaging_unit_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `packaging_unit` (
`pu_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`pu_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`pu_bag_code` VARCHAR(50) NOT NULL COMMENT '봉투코드(code_detail cd_code, ck=O)',
`pu_bag_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '봉투명(스냅샷)',
`pu_box_per_pack` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '박스당 팩 수',
`pu_pack_per_sheet` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '팩당 낱장 수',
`pu_total_per_box` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '1박스당 총 낱장 수',
`pu_start_date` DATE NOT NULL,
`pu_end_date` DATE NULL DEFAULT NULL,
`pu_state` TINYINT UNSIGNED NOT NULL DEFAULT 1,
`pu_regdate` DATETIME NOT NULL,
`pu_moddate` DATETIME NULL DEFAULT NULL,
`pu_reg_mb_idx` INT UNSIGNED NULL,
PRIMARY KEY (`pu_idx`),
KEY `idx_pu_lg_bag` (`pu_lg_idx`, `pu_bag_code`),
KEY `idx_pu_dates` (`pu_start_date`, `pu_end_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='포장 단위';
CREATE TABLE IF NOT EXISTS `packaging_unit_history` (
`puh_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`puh_pu_idx` INT UNSIGNED NOT NULL,
`puh_field` VARCHAR(30) NOT NULL,
`puh_old_value` VARCHAR(100) NOT NULL DEFAULT '',
`puh_new_value` VARCHAR(100) NOT NULL DEFAULT '',
`puh_changed_at` DATETIME NOT NULL,
`puh_changed_by` INT UNSIGNED NULL,
PRIMARY KEY (`puh_idx`),
KEY `idx_puh_pu_idx` (`puh_pu_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='포장 단위 변경 이력';
-- ---------------------------------------------------------------------------
-- 발주 / 입고 / 재고 (order_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bag_order` (
`bo_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bo_uuid` CHAR(36) NOT NULL COMMENT 'UUID v4',
`bo_version` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '발주 버전',
`bo_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
`bo_gugun_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '구/군 코드',
`bo_dong_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '동 코드',
`bo_company_idx` INT UNSIGNED NULL COMMENT '제작업체 FK (company)',
`bo_agency_idx` INT UNSIGNED NULL COMMENT '입고처(대행소) FK (sales_agency)',
`bo_fee_rate` DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '수수료율(%)',
`bo_order_date` DATE NOT NULL COMMENT '발주일',
`bo_lot_no` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'LOT 번호',
`bo_hash` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'SHA-256 해시',
`bo_status` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled/deleted',
`bo_orderer_idx` INT UNSIGNED NULL COMMENT '발주자 mb_idx',
`bo_regdate` DATETIME NOT NULL,
`bo_moddate` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`bo_idx`),
UNIQUE KEY `uk_bo_uuid_ver` (`bo_uuid`, `bo_version`),
KEY `idx_bo_lg_idx` (`bo_lg_idx`),
KEY `idx_bo_status` (`bo_status`),
KEY `idx_bo_order_date` (`bo_order_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='발주';
CREATE TABLE IF NOT EXISTS `bag_order_item` (
`boi_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`boi_bo_idx` INT UNSIGNED NOT NULL COMMENT 'bag_order FK',
`boi_bag_code` VARCHAR(50) NOT NULL COMMENT '봉투코드(code_detail O)',
`boi_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`boi_unit_price` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '발주 단가',
`boi_qty_box` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '발주 박스 수',
`boi_qty_sheet` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '낱장 환산 수량',
`boi_amount` DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT '금액(단가*낱장수)',
PRIMARY KEY (`boi_idx`),
KEY `idx_boi_bo_idx` (`boi_bo_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='발주 상세';
CREATE TABLE IF NOT EXISTS `bag_receiving` (
`br_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`br_bo_idx` INT UNSIGNED NOT NULL COMMENT 'bag_order FK',
`br_lg_idx` INT UNSIGNED NOT NULL,
`br_bag_code` VARCHAR(50) NOT NULL,
`br_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`br_qty_box` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '입고 박스 수',
`br_qty_sheet` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '입고 낱장 수',
`br_receive_date` DATE NOT NULL,
`br_receiver_idx` INT UNSIGNED NULL COMMENT '인수자 mb_idx',
`br_sender_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '인계자명',
`br_type` VARCHAR(20) NOT NULL DEFAULT 'scanner' COMMENT 'scanner/batch',
`br_regdate` DATETIME NOT NULL,
PRIMARY KEY (`br_idx`),
KEY `idx_br_bo_idx` (`br_bo_idx`),
KEY `idx_br_lg_idx` (`br_lg_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='발주 입고';
CREATE TABLE IF NOT EXISTS `bag_inventory` (
`bi_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bi_lg_idx` INT UNSIGNED NOT NULL,
`bi_bag_code` VARCHAR(50) NOT NULL,
`bi_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`bi_qty` INT NOT NULL DEFAULT 0 COMMENT '현재 재고(낱장)',
`bi_updated_at` DATETIME NOT NULL,
PRIMARY KEY (`bi_idx`),
UNIQUE KEY `uk_bi_lg_bag` (`bi_lg_idx`, `bi_bag_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='봉투 재고';
-- ---------------------------------------------------------------------------
-- 주문 / 판매 / 불출 (sales_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `shop_order` (
`so_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`so_lg_idx` INT UNSIGNED NOT NULL,
`so_ds_idx` INT UNSIGNED NULL COMMENT '지정판매소 FK',
`so_ds_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '판매소명(스냅샷)',
`so_order_date` DATE NOT NULL COMMENT '접수일',
`so_delivery_date` DATE NULL COMMENT '배달일',
`so_payment_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '이체/가상계좌',
`so_paid` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '입금여부 1=예',
`so_received` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '수령여부 1=예',
`so_total_qty` INT UNSIGNED NOT NULL DEFAULT 0,
`so_total_amount` DECIMAL(14,2) NOT NULL DEFAULT 0,
`so_status` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled',
`so_orderer_idx` INT UNSIGNED NULL,
`so_regdate` DATETIME NOT NULL,
PRIMARY KEY (`so_idx`),
KEY `idx_so_lg_idx` (`so_lg_idx`),
KEY `idx_so_ds_idx` (`so_ds_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='주문 접수';
CREATE TABLE IF NOT EXISTS `shop_order_item` (
`soi_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`soi_so_idx` INT UNSIGNED NOT NULL,
`soi_bag_code` VARCHAR(50) NOT NULL,
`soi_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`soi_unit_price` DECIMAL(12,2) NOT NULL DEFAULT 0,
`soi_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '접수량(낱장)',
`soi_amount` DECIMAL(14,2) NOT NULL DEFAULT 0,
`soi_box_count` INT UNSIGNED NOT NULL DEFAULT 0,
`soi_pack_count` INT UNSIGNED NOT NULL DEFAULT 0,
`soi_sheet_count` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`soi_idx`),
KEY `idx_soi_so_idx` (`soi_so_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='주문 상세';
CREATE TABLE IF NOT EXISTS `bag_sale` (
`bs_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bs_lg_idx` INT UNSIGNED NOT NULL,
`bs_so_idx` INT UNSIGNED NULL COMMENT '주문 FK (NULL=직접판매)',
`bs_ds_idx` INT UNSIGNED NULL COMMENT '지정판매소 FK',
`bs_ds_name` VARCHAR(100) NOT NULL DEFAULT '',
`bs_sale_date` DATE NOT NULL,
`bs_bag_code` VARCHAR(50) NOT NULL,
`bs_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`bs_qty` INT NOT NULL DEFAULT 0 COMMENT '판매수량(낱장, 음수=반품)',
`bs_unit_price` DECIMAL(12,2) NOT NULL DEFAULT 0,
`bs_amount` DECIMAL(14,2) NOT NULL DEFAULT 0,
`bs_type` VARCHAR(20) NOT NULL DEFAULT 'sale' COMMENT 'sale/return/cancel',
`bs_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bs_idx`),
KEY `idx_bs_lg_idx` (`bs_lg_idx`),
KEY `idx_bs_ds_idx` (`bs_ds_idx`),
KEY `idx_bs_sale_date` (`bs_sale_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='판매/반품';
CREATE TABLE IF NOT EXISTS `bag_issue` (
`bi2_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bi2_lg_idx` INT UNSIGNED NOT NULL,
`bi2_year` YEAR NOT NULL,
`bi2_quarter` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '분기(1~4)',
`bi2_issue_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '무료용/공공용',
`bi2_issue_date` DATE NOT NULL,
`bi2_dest_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '불출처 구분(동사무소 등)',
`bi2_dest_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '불출처명',
`bi2_bag_code` VARCHAR(50) NOT NULL,
`bi2_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`bi2_qty` INT NOT NULL DEFAULT 0 COMMENT '불출수량(낱장, 음수=취소)',
`bi2_status` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled',
`bi2_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bi2_idx`),
KEY `idx_bi2_lg_idx` (`bi2_lg_idx`),
KEY `idx_bi2_date` (`bi2_issue_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 불출';
-- ---------------------------------------------------------------------------
-- 감사 로그 (activity_log_tables.sql) — audit_helper.php
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `activity_log` (
`al_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`al_mb_idx` INT UNSIGNED DEFAULT NULL COMMENT '회원 PK',
`al_action` VARCHAR(20) NOT NULL COMMENT 'create/update/delete',
`al_table` VARCHAR(100) NOT NULL COMMENT '대상 테이블명',
`al_record_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '대상 레코드 PK',
`al_data_before` JSON DEFAULT NULL COMMENT '변경 전 데이터',
`al_data_after` JSON DEFAULT NULL COMMENT '변경 후 데이터',
`al_ip` VARCHAR(45) NOT NULL DEFAULT '' COMMENT 'IP 주소',
`al_regdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '기록일시',
PRIMARY KEY (`al_idx`),
KEY `idx_al_table_record` (`al_table`, `al_record_id`),
KEY `idx_al_mb` (`al_mb_idx`),
KEY `idx_al_regdate` (`al_regdate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRUD 활동 로그';
-- ---------------------------------------------------------------------------
-- 기타 입출고 리포트 (bag_misc_flow_tables.sql)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bag_misc_flow` (
`bmf_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bmf_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 PK',
`bmf_type` ENUM('in','out') NOT NULL COMMENT '입고/출고',
`bmf_bag_code` VARCHAR(50) NOT NULL COMMENT '봉투 코드',
`bmf_bag_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '봉투명',
`bmf_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '수량',
`bmf_date` DATE NOT NULL COMMENT '입출고 일자',
`bmf_reason` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '사유',
`bmf_regdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일',
PRIMARY KEY (`bmf_idx`),
KEY `idx_bmf_lg_date` (`bmf_lg_idx`, `bmf_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='기타 입출고';
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,59 @@
-- code_detail: 플랫폼 공통 vs 지자체 전용 (cd_source, cd_lg_idx)
-- 여러 번 실행해도 이미 있으면 스킵 (MySQL / MariaDB)
--
-- 적용 예:
-- mysql -h 127.0.0.1 -u USER -p DBNAME < writable/database/code_detail_source_lg_add.sql
SET @schema = DATABASE();
-- cd_source
SET @col := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'code_detail' AND COLUMN_NAME = 'cd_source'
);
SET @sql := IF(@col = 0,
'ALTER TABLE `code_detail` ADD COLUMN `cd_source` ENUM(''platform'', ''local'') NOT NULL DEFAULT ''platform'' COMMENT ''platform=CSV/시드 등 전역, local=지자체 관리자 등록'' AFTER `cd_ck_idx`',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- cd_lg_idx
SET @col := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'code_detail' AND COLUMN_NAME = 'cd_lg_idx'
);
SET @sql := IF(@col = 0,
'ALTER TABLE `code_detail` ADD COLUMN `cd_lg_idx` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''0=전 지자체 공통, >0=해당 지자체 전용'' AFTER `cd_source`',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 보조 인덱스
SET @idx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'code_detail' AND INDEX_NAME = 'idx_cd_lg_idx'
);
SET @sql := IF(@idx = 0,
'ALTER TABLE `code_detail` ADD KEY `idx_cd_lg_idx` (`cd_lg_idx`)',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 테넌트별 코드 유일
SET @idx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'code_detail' AND INDEX_NAME = 'uk_cd_tenant'
);
SET @sql := IF(@idx = 0,
'ALTER TABLE `code_detail` ADD UNIQUE KEY `uk_cd_tenant` (`cd_ck_idx`, `cd_code`, `cd_lg_idx`)',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

View File

@@ -0,0 +1,28 @@
-- 무료용 대상자 테스트 데이터 (/bag/free-recipients 목록 확인용)
-- 전제: free_recipient 테이블 존재, code_master_init_daegu.sql 로 H(무상지급) 코드 적용됨
--
-- 넣는 지자체 (둘 다 있으면 각각에 삽입, UNION 으로 중복 lg_idx 제거):
-- 1) lg_state=1 인 지자체 중 가장 작은 lg_idx (tester_local mb_lg_idx=1·메뉴 기본값과 맞추기)
-- 2) lg_code = '110204' 대구 남구
--
-- 목록이 비면: Super Admin 은 상단에서 지자체 선택, 지자체관리자는 member.mb_lg_idx 와 일치하는지 확인.
SET NAMES utf8mb4;
INSERT INTO `free_recipient` (`fr_lg_idx`, `fr_type_code`, `fr_name`, `fr_phone`, `fr_addr`, `fr_dong_code`, `fr_note`, `fr_end_date`, `fr_state`, `fr_regdate`)
SELECT t.lg_idx, v.tp, v.nm, v.ph, v.ad, '', v.nt, v.ed, 1, NOW()
FROM (
(SELECT lg_idx FROM local_government WHERE lg_state = 1 ORDER BY lg_idx ASC LIMIT 1)
UNION
(SELECT lg_idx FROM local_government WHERE lg_code = '110204' LIMIT 1)
) t
CROSS JOIN (
SELECT '10' AS tp, '테스트생보_홍길동' AS nm, '010-9001-0001' AS ph, '대구 남구 대명로 1 (테스트)' AS ad, '개발/테스트 시드' AS nt, NULL AS ed
UNION ALL SELECT '4', '테스트복지관_남구', '053-900-0002', '대구 남구 봉덕로 100 (테스트)', '시설 테스트용', NULL
UNION ALL SELECT '3', '테스트무공수훈_김국가', '010-9001-0003', '대구 남구 이천로 50 (테스트)', '무공수훈자 테스트', '2027-12-31'
) v
WHERE NOT EXISTS (
SELECT 1 FROM `free_recipient` f WHERE f.fr_lg_idx = t.lg_idx AND f.fr_name = v.nm
);
-- fr_type_code: H 종류 — 1 시설보호, 10 생보자, 3 무공수훈자, 4 사회복지시설

View File

@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# Downloads/sql 의 jibun_rnaddrkor_*.sql 를 jongryangje_dev.kr_address 에 넣을 때 사용
# UTF-8 한글 깨짐 방지: mysql 에 --default-character-set=utf8mb4 필수
#
# 사용 예:
# export MYSQL_PWD='...'
# DB=jongryangje_dev USER=jongryangje HOST=127.0.0.1 PORT=3306
# DOWNLOADS_SQL="$HOME/Downloads/sql"
# ./writable/database/import_kr_address_jongryangje_dev.sh
set -euo pipefail
MYSQL_BIN="${MYSQL_BIN:-mysql}"
HOST="${HOST:-127.0.0.1}"
PORT="${PORT:-3306}"
USER="${USER:-jongryangje}"
DB="${DB:-jongryangje_dev}"
DOWNLOADS_SQL="${DOWNLOADS_SQL:-$HOME/Downloads/sql}"
MYSQL_BASE_OPTS=( -h"$HOST" -P"$PORT" -u"$USER" --default-character-set=utf8mb4 )
if [[ -n "${MYSQL_PWD:-}" ]]; then
MYSQL_BASE_OPTS+=( -p"$MYSQL_PWD" )
else
MYSQL_BASE_OPTS+=( -p )
fi
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
INIT_SQL="$ROOT/writable/database/kr_address_init_jongryangje_dev.sql"
ALTER_SQL="$ROOT/writable/database/kr_address_alter_widen.sql"
echo "=== TRUNCATE kr_address ==="
printf 'TRUNCATE TABLE `kr_address`;\n' | "$MYSQL_BIN" "${MYSQL_BASE_OPTS[@]}" "$DB"
echo "=== CREATE (if needed) + widen columns ==="
"$MYSQL_BIN" "${MYSQL_BASE_OPTS[@]}" "$DB" < "$INIT_SQL"
"$MYSQL_BIN" "${MYSQL_BASE_OPTS[@]}" "$DB" < "$ALTER_SQL"
shopt -s nullglob
files=( "$DOWNLOADS_SQL"/jibun_rnaddrkor_*.sql )
if [[ ${#files[@]} -eq 0 ]]; then
echo "No jibun_rnaddrkor_*.sql in $DOWNLOADS_SQL" >&2
exit 1
fi
for f in "${files[@]}"; do
echo "=== $(basename "$f") ==="
tail -n +3 "$f" | "$MYSQL_BIN" "${MYSQL_BASE_OPTS[@]}" "$DB"
done
echo "OK. Row count:"
"$MYSQL_BIN" "${MYSQL_BASE_OPTS[@]}" "$DB" -e "SELECT COUNT(*) AS cnt FROM kr_address;"

View File

@@ -0,0 +1,7 @@
-- 기존 kr_address 테이블 컬럼 확장 (특별자치도 등 긴 명칭 대응)
ALTER TABLE `kr_address`
MODIFY `address_code` VARCHAR(40) DEFAULT NULL COMMENT '주소코드',
MODIFY `admin_code` VARCHAR(30) DEFAULT NULL COMMENT '행정구역코드',
MODIFY `sido` VARCHAR(50) DEFAULT NULL COMMENT '시도',
MODIFY `sigungu` VARCHAR(80) DEFAULT NULL COMMENT '시군구',
MODIFY `eupmyeondong` VARCHAR(120) DEFAULT NULL COMMENT '읍면동';

View File

@@ -0,0 +1,20 @@
-- kr_address: 도로명/지번 연계 주소 참조 테이블 (jongryangje_dev 내 생성)
-- Downloads/sql 의 00_init_table.sql 대신 사용 — 별도 DB(kr_address_db) 미사용
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `kr_address` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`address_code` VARCHAR(40) DEFAULT NULL COMMENT '주소코드',
`admin_code` VARCHAR(30) DEFAULT NULL COMMENT '행정구역코드',
`sido` VARCHAR(50) DEFAULT NULL COMMENT '시도',
`sigungu` VARCHAR(80) DEFAULT NULL COMMENT '시군구',
`eupmyeondong` VARCHAR(120) DEFAULT NULL COMMENT '읍면동',
PRIMARY KEY (`id`),
KEY `idx_sido` (`sido`),
KEY `idx_sigungu` (`sigungu`),
KEY `idx_address_code` (`address_code`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
COMMENT='대한민국 도로명주소(참조)';

View File

@@ -0,0 +1,8 @@
-- PII 암호화(ENC:base64...) 저장 시 mb_email/mb_phone 길이 부족으로 잘림 → 복호화 실패 방지
-- 실행 예: mysql -h 127.0.0.1 -P 3306 -u jongryangje -p jongryangje_dev < writable/database/member_pii_column_widen.sql
SET NAMES utf8mb4;
ALTER TABLE `member`
MODIFY COLUMN `mb_email` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '이메일(암호화 시 pii_encrypt, ENC: 접두)',
MODIFY COLUMN `mb_phone` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '연락처(암호화 시 pii_encrypt, ENC: 접두)';

View File

@@ -0,0 +1,79 @@
-- site 메뉴 2차 항목 중 mm_link가 비어 있을 때, 앱에 존재하는 경로로 채웁니다.
-- (이미 링크가 있는 행은 WHERE 조건에서 제외됩니다.)
--
-- 반드시 UTF-8로 실행하세요 (한글 메뉴명 매칭):
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/menu_site_fill_empty_second_level_links.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET CHARACTER_SET_CLIENT = utf8mb4;
UPDATE `menu` m
INNER JOIN `menu_type` t ON t.mt_idx = m.mt_idx AND t.mt_code = 'site'
SET m.mm_link = CASE m.mm_name
WHEN '기본 코드 관리' THEN 'bag/code-kinds'
WHEN '기본코드관리' THEN 'bag/code-kinds'
WHEN '단가 관리' THEN 'bag/bag-prices'
WHEN '포장 단위 관리' THEN 'bag/packaging-units/manage'
WHEN '판매 대행소 관리' THEN 'bag/sales-agencies'
WHEN '담당자 관리' THEN 'bag/managers'
WHEN '업체 관리' THEN 'bag/companies'
WHEN '무료용 대상자 관리' THEN 'bag/free-recipients'
WHEN '지정 판매소 관리' THEN 'bag/designated-shops'
WHEN '지정 판매소 조회' THEN 'bag/designated-shops'
WHEN '지정 판매소 신규/취소 현황' THEN 'bag/designated-shops/status'
WHEN '지정판매소 바코드 출력' THEN 'bag/designated-shops'
WHEN 'PASSWORD 변경' THEN 'bag/password-change'
WHEN '환경 설정' THEN 'dashboard'
WHEN '지정 판매소 현황' THEN 'bag/designated-shops/status'
WHEN '발주 등록' THEN 'bag/order/create'
WHEN '발주 변경' THEN 'bag/bag-orders'
WHEN '발주 현황' THEN 'bag/bag-orders'
WHEN '발주 입고[스캐너]' THEN 'bag/receiving/create'
WHEN '입고 현황' THEN 'bag/bag-receivings'
WHEN '무료 불출 현황' THEN 'bag/bag-issues'
WHEN '무료용 불출 처리' THEN 'bag/issue/create'
WHEN '무료용 불출 취소' THEN 'bag/issue'
WHEN '재고 현황' THEN 'bag/inventory'
WHEN '실사 관리' THEN 'bag/inventory/adjust'
WHEN '전화 접수' THEN 'bag/shop-orders'
WHEN '전화 접수 관리' THEN 'bag/shop-orders'
WHEN '지정 판매소 판매' THEN 'bag/sale/create'
WHEN '지정 판매소 반품' THEN 'bag/bag-sales'
WHEN '지정 판매소 판매 취소' THEN 'bag/bag-sales'
WHEN '지정 판매소 반품 취소' THEN 'bag/bag-sales'
WHEN '지정 판매소 일 판매대장' THEN 'bag/reports/sales-ledger'
WHEN '지정 판매소 기간별 판매대장' THEN 'bag/reports/sales-ledger'
WHEN '일계표' THEN 'bag/reports/daily-summary'
WHEN '기간별 판매현황[일집계]' THEN 'bag/reports/period-sales'
WHEN '기간별 판매현황[기간집계]' THEN 'bag/reports/period-sales'
WHEN '년 판매 현황' THEN 'bag/reports/yearly-sales'
WHEN '지정 판매소 별 판매현황(수량)' THEN 'bag/reports/shop-sales'
WHEN '지정 판매소 별 판매현황(금액)' THEN 'bag/reports/shop-sales'
WHEN '지정판매소별 거래현황' THEN 'bag/reports/shop-sales'
WHEN '홈텍스 처리' THEN 'bag/reports/hometax-export'
WHEN '기타 입출고' THEN 'bag/reports/misc-flow'
WHEN '기간별 봉투 수불 현황' THEN 'bag/flow'
WHEN '일일 봉투 수불 현황' THEN 'bag/waste-suibal-enterprise'
WHEN '반품/파기 현황' THEN 'bag/reports/returns'
WHEN '쓰레기 봉투 수급 계획' THEN 'bag/reports/supply-demand'
WHEN 'LOT 수불 조회' THEN 'bag/reports/lot-flow'
WHEN '전년 대비 판매 분석' THEN 'bag/analytics'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics'
WHEN '도움말 항목' THEN 'bag/help'
WHEN '원격 요청' THEN 'bag/help'
WHEN 'pda 리셋' THEN 'bag/help'
WHEN '번호알기' THEN 'bag/help'
WHEN 'Data Backup' THEN 'bag/help'
WHEN '컴포트 설정' THEN 'bag/help'
WHEN 'Version 정보' THEN 'bag/help'
WHEN '종료' THEN 'bag/help'
WHEN '1GBMS' THEN 'bag/help'
WHEN 'PDA 수정' THEN 'bag/window'
WHEN '바둑판식 배열' THEN 'bag/window'
WHEN '계단식 배열' THEN 'bag/window'
WHEN '계층식 배열' THEN 'bag/window'
ELSE m.mm_link
END
WHERE m.mm_dep >= 1
AND TRIM(COALESCE(m.mm_link, '')) = '';

View File

@@ -0,0 +1,26 @@
-- 기존 DB: 메뉴(mm_link)의 admin/* 업무 URL 을 bag/* 로 일괄 변경
-- site·admin 타입 모두 대상. 실행 전 백업 권장.
-- 포장 단위 CRUD 는 bag/packaging-units/manage 로 통일.
SET NAMES utf8mb4;
UPDATE `menu` m
INNER JOIN `menu_type` mt ON m.mt_idx = mt.mt_idx AND mt.mt_code = 'site'
SET m.mm_link = CASE
WHEN m.mm_link LIKE 'admin/packaging-units%' THEN REPLACE(m.mm_link, 'admin/packaging-units', 'bag/packaging-units/manage')
WHEN m.mm_link LIKE 'admin/%' THEN REPLACE(m.mm_link, 'admin/', 'bag/')
ELSE m.mm_link
END
WHERE m.mm_link LIKE 'admin/%';
-- 관리자 상단 메뉴: 순수 관리(회원·역할 등)는 유지하고, 업무 모듈 링크만 bag 으로 이동
UPDATE `menu` m
INNER JOIN `menu_type` mt ON m.mt_idx = mt.mt_idx AND mt.mt_code = 'admin'
SET m.mm_link = CASE
WHEN m.mm_link LIKE 'admin/packaging-units%' THEN REPLACE(m.mm_link, 'admin/packaging-units', 'bag/packaging-units/manage')
WHEN m.mm_link REGEXP '^admin/(managers|sales-agencies|companies|free-recipients|designated-shops|bag-prices|bag-orders|bag-receivings|bag-inventory|shop-orders|bag-sales|bag-issues|reports|password-change)(/|$)'
THEN REPLACE(m.mm_link, 'admin/', 'bag/')
ELSE m.mm_link
END
WHERE m.mm_link LIKE 'admin/packaging-units%'
OR m.mm_link REGEXP '^admin/(managers|sales-agencies|companies|free-recipients|designated-shops|bag-prices|bag-orders|bag-receivings|bag-inventory|shop-orders|bag-sales|bag-issues|reports|password-change)(/|$)';

View File

@@ -23,7 +23,25 @@ SET @parent_basic := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '기본 코드 관리' THEN 'bag/code-kinds'
WHEN '단가 관리' THEN 'bag/bag-prices'
WHEN '포장 단위 관리' THEN 'bag/packaging-units/manage'
WHEN '판매 대행소 관리' THEN 'bag/sales-agencies'
WHEN '담당자 관리' THEN 'bag/managers'
WHEN '업체 관리' THEN 'bag/companies'
WHEN '무료용 대상자 관리' THEN 'bag/free-recipients'
WHEN '지정 판매소 관리' THEN 'bag/designated-shops'
WHEN '지정 판매소 조회' THEN 'bag/designated-shops'
WHEN '지정 판매소 신규/취소 현황' THEN 'bag/designated-shops/status'
WHEN '지정판매소 바코드 출력' THEN 'bag/designated-shops'
WHEN 'PASSWORD 변경' THEN 'bag/password-change'
WHEN '환경 설정' THEN 'dashboard'
WHEN '지정 판매소 현황' THEN 'bag/designated-shops/status'
ELSE ''
END,
@parent_basic, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '기본 코드 관리' AS mm_name UNION ALL
SELECT 1, '단가 관리' UNION ALL
@@ -61,7 +79,16 @@ SET @parent_order := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '발주 등록' THEN 'bag/order/create'
WHEN '발주 변경' THEN 'bag/bag-orders'
WHEN '발주 현황' THEN 'bag/bag-orders'
WHEN '발주 입고[스캐너]' THEN 'bag/receiving/create'
WHEN '입고 현황' THEN 'bag/bag-receivings'
ELSE ''
END,
@parent_order, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '발주 등록' AS mm_name UNION ALL
SELECT 1, '발주 변경' UNION ALL
@@ -88,7 +115,14 @@ SET @parent_issue := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '무료 불출 현황' THEN 'bag/bag-issues'
WHEN '무료용 불출 처리' THEN 'bag/issue/create'
WHEN '무료용 불출 취소' THEN 'bag/issue'
ELSE ''
END,
@parent_issue, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '무료 불출 현황' AS mm_name UNION ALL
SELECT 1, '무료용 불출 처리' UNION ALL
@@ -111,7 +145,13 @@ SET @parent_inventory := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '재고 현황' THEN 'bag/inventory'
WHEN '실사 관리' THEN 'bag/inventory/adjust'
ELSE ''
END,
@parent_inventory, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '재고 현황' AS mm_name UNION ALL
SELECT 1, '실사 관리' UNION ALL
@@ -140,7 +180,17 @@ SET @parent_sales := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '전화 접수' THEN 'bag/shop-orders'
WHEN '전화 접수 관리' THEN 'bag/shop-orders'
WHEN '지정 판매소 판매' THEN 'bag/sale/create'
WHEN '지정 판매소 반품' THEN 'bag/bag-sales'
WHEN '지정 판매소 판매 취소' THEN 'bag/bag-sales'
WHEN '지정 판매소 반품 취소' THEN 'bag/bag-sales'
ELSE ''
END,
@parent_sales, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '전화 접수' AS mm_name UNION ALL
SELECT 1, '전화 접수 관리' UNION ALL
@@ -166,7 +216,21 @@ SET @parent_sales_stats := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '지정 판매소 일 판매대장' THEN 'bag/reports/sales-ledger'
WHEN '지정 판매소 기간별 판매대장' THEN 'bag/reports/sales-ledger'
WHEN '일계표' THEN 'bag/reports/daily-summary'
WHEN '기간별 판매현황[일집계]' THEN 'bag/reports/period-sales'
WHEN '기간별 판매현황[기간집계]' THEN 'bag/reports/period-sales'
WHEN '년 판매 현황' THEN 'bag/reports/yearly-sales'
WHEN '지정 판매소 별 판매현황(수량)' THEN 'bag/reports/shop-sales'
WHEN '지정 판매소 별 판매현황(금액)' THEN 'bag/reports/shop-sales'
WHEN '지정판매소별 거래현황' THEN 'bag/reports/shop-sales'
WHEN '홈텍스 처리' THEN 'bag/reports/hometax-export'
ELSE ''
END,
@parent_sales_stats, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '지정 판매소 일 판매대장' AS mm_name UNION ALL
SELECT 1, '지정 판매소 기간별 판매대장' UNION ALL
@@ -196,7 +260,17 @@ SET @parent_flow := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '기타 입출고' THEN 'bag/reports/misc-flow'
WHEN '기간별 봉투 수불 현황' THEN 'bag/flow'
WHEN '일일 봉투 수불 현황' THEN 'bag/waste-suibal-enterprise'
WHEN '반품/파기 현황' THEN 'bag/reports/returns'
WHEN '쓰레기 봉투 수급 계획' THEN 'bag/reports/supply-demand'
WHEN 'LOT 수불 조회' THEN 'bag/reports/lot-flow'
ELSE ''
END,
@parent_flow, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '기타 입출고' AS mm_name UNION ALL
SELECT 1, '기간별 봉투 수불 현황' UNION ALL
@@ -222,7 +296,14 @@ SET @parent_analytics := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '전년 대비 판매 분석' THEN 'bag/analytics'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics'
ELSE ''
END,
@parent_analytics, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '전년 대비 판매 분석' AS mm_name UNION ALL
SELECT 1, '월별 판매 추이 분석' UNION ALL
@@ -245,7 +326,7 @@ SET @parent_window := (
);
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'
SELECT @mt_site, 1, t.mm_name, 'bag/window', @parent_window, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, 'PDA 수정' AS mm_name UNION ALL
SELECT 1, '바둑판식 배열' UNION ALL
@@ -269,7 +350,20 @@ SET @parent_help := (
);
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'
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '도움말 항목' THEN 'bag/help'
WHEN '원격 요청' THEN 'bag/help'
WHEN 'pda 리셋' THEN 'bag/help'
WHEN '번호알기' THEN 'bag/help'
WHEN 'Data Backup' THEN 'bag/help'
WHEN '컴포트 설정' THEN 'bag/help'
WHEN 'Version 정보' THEN 'bag/help'
WHEN '종료' THEN 'bag/help'
WHEN '1GBMS' THEN 'bag/help'
ELSE ''
END,
@parent_help, 1, t.mm_num, 0, '', 'Y'
FROM (
SELECT 0 AS mm_num, '도움말 항목' AS mm_name UNION ALL
SELECT 1, '원격 요청' UNION ALL

View File

@@ -0,0 +1,39 @@
-- 기존 sales_agency(사업자번호·대표자 등) → 구분·코드·명 스키마로 변경
-- (이미 신규 스키마면 건너뛰거나 에러 날 수 있음 — 실행 전 백업 권장)
-- 1) 신규 컬럼
ALTER TABLE `sales_agency`
ADD COLUMN `sa_kind` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대행소 구분' AFTER `sa_lg_idx`,
ADD COLUMN `sa_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대행소 코드' AFTER `sa_kind`;
-- 2) 코드·구분 채우기 (사업자번호 → 코드, 없으면 SA+번호)
UPDATE `sales_agency`
SET `sa_code` = CASE
WHEN `sa_biz_no` IS NOT NULL AND TRIM(`sa_biz_no`) <> '' THEN LEFT(TRIM(`sa_biz_no`), 50)
ELSE CONCAT('SA', `sa_idx`)
END
WHERE `sa_code` = '';
UPDATE `sales_agency` SET `sa_kind` = '기타' WHERE `sa_kind` = '' OR `sa_kind` IS NULL;
-- 3) 동일 지자체 내 코드 중복 제거 (있으면 두 번째부터 접미사)
-- (간단 처리: sa_idx 붙이기)
UPDATE `sales_agency` s1
INNER JOIN (
SELECT `sa_lg_idx`, `sa_code`, MIN(`sa_idx`) AS keep_idx, COUNT(*) AS cnt
FROM `sales_agency`
GROUP BY `sa_lg_idx`, `sa_code`
HAVING cnt > 1
) d ON d.sa_lg_idx = s1.sa_lg_idx AND d.sa_code = s1.sa_code AND s1.sa_idx > d.keep_idx
SET s1.sa_code = LEFT(CONCAT(s1.sa_code, '_', s1.sa_idx), 50);
-- 4) 불필요 컬럼 제거
ALTER TABLE `sales_agency`
DROP COLUMN `sa_biz_no`,
DROP COLUMN `sa_rep_name`,
DROP COLUMN `sa_tel`,
DROP COLUMN `sa_addr`,
DROP COLUMN `sa_state`;
-- 5) 유니크 인덱스
ALTER TABLE `sales_agency` ADD UNIQUE KEY `uk_sa_lg_code` (`sa_lg_idx`, `sa_code`);