사이트·관리자 봉투 물류 기능(수불·통계·레포트·재고·발주)과 DB·메뉴·E2E를 운영 반영한다.

통계 분석(전년대비·월별·계절별), 수급계획·LOT 수불, 지정판매소·실사·메뉴 링크 등을 포함한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
taekyoungc
2026-06-01 16:15:15 +09:00
parent 21e7b91871
commit 0f1d414f37
129 changed files with 18068 additions and 1585 deletions

View File

@@ -189,13 +189,18 @@ CREATE TABLE IF NOT EXISTS `bag_order` (
`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_bag_types` TEXT NULL COMMENT '봉투 종류 목록(JSON)',
`bo_unit_prices` TEXT NULL COMMENT '발주 단가 목록(JSON)',
`bo_qty_boxes` TEXT NULL COMMENT '발주 박스 수량 목록(JSON)',
`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`),
`bo_regdate` DATETIME NOT NULL COMMENT '등록일시',
`bo_moddate` DATETIME NULL DEFAULT NULL COMMENT '수정일시',
PRIMARY KEY (`bo_uuid`, `bo_version`),
-- 코드/화면 로직은 bo_idx(숫자 PK)로 조회/취소/삭제하고 있어, bo_idx도 유니크로 유지한다.
UNIQUE KEY `uk_bo_idx` (`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`),
@@ -255,6 +260,7 @@ CREATE TABLE IF NOT EXISTS `shop_order` (
`so_order_date` DATE NOT NULL COMMENT '접수일',
`so_delivery_date` DATE NULL COMMENT '배달일',
`so_payment_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '이체/가상계좌',
`so_channel` VARCHAR(20) NOT NULL DEFAULT 'phone' COMMENT '접수채널 phone/web/app/counter',
`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,
@@ -264,7 +270,8 @@ CREATE TABLE IF NOT EXISTS `shop_order` (
`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`)
KEY `idx_so_ds_idx` (`so_ds_idx`),
KEY `idx_so_lg_order_channel` (`so_lg_idx`, `so_order_date`, `so_channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='주문 접수';
CREATE TABLE IF NOT EXISTS `shop_order_item` (
@@ -321,6 +328,22 @@ CREATE TABLE IF NOT EXISTS `bag_issue` (
KEY `idx_bi2_date` (`bi2_issue_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 불출';
CREATE TABLE IF NOT EXISTS `bag_issue_item_code` (
`bic_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`bic_lg_idx` INT UNSIGNED NOT NULL,
`bic_bi2_idx` INT UNSIGNED NOT NULL COMMENT 'bag_issue.bi2_idx',
`bic_bag_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '봉투 종류 코드',
`bic_issue_code` VARCHAR(80) NOT NULL DEFAULT '' COMMENT '불출 품목 코드',
`bic_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '원수량(낱장)',
`bic_cancel_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '취소수량(낱장)',
`bic_state` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled',
`bic_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bic_idx`),
KEY `idx_bic_lg_idx` (`bic_lg_idx`),
KEY `idx_bic_bi2_idx` (`bic_bi2_idx`),
KEY `idx_bic_issue_code` (`bic_issue_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 불출 품목코드 상세';
-- ---------------------------------------------------------------------------
-- 감사 로그 (activity_log_tables.sql) — audit_helper.php
-- ---------------------------------------------------------------------------
@@ -340,6 +363,26 @@ CREATE TABLE IF NOT EXISTS `activity_log` (
KEY `idx_al_regdate` (`al_regdate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRUD 활동 로그';
-- 블록체인 원장 (폐쇄형 SQL Ledger)
CREATE TABLE IF NOT EXISTS `blockchain_ledger` (
`bl_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '블록 인덱스(Height)',
`bl_created_at` DATETIME NOT NULL COMMENT '블록 생성 시각',
`bl_tx_type` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '트랜잭션 타입(ORDER_CREATE/ORDER_UPDATE/...)',
`bl_entity_uuid` CHAR(36) NULL COMMENT '업무 엔티티 UUID',
`bl_entity_version` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '엔티티 버전',
`bl_payload` JSON NOT NULL COMMENT '블록 payload(JSON)',
`bl_previous_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '이전 블록 해시',
`bl_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '현재 블록 해시',
`bl_nonce` INT NOT NULL DEFAULT 0 COMMENT '논스(폐쇄형 체인에서 기본 0)',
`bl_actor_idx` INT UNSIGNED NULL COMMENT '수행자 mb_idx',
`bl_lg_idx` INT UNSIGNED NULL COMMENT '지자체 lg_idx',
PRIMARY KEY (`bl_idx`),
KEY `idx_bl_entity_uuid` (`bl_entity_uuid`),
KEY `idx_bl_tx_type` (`bl_tx_type`),
KEY `idx_bl_lg_idx` (`bl_lg_idx`),
UNIQUE KEY `uk_bl_hash` (`bl_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='블록체인 원장';
-- ---------------------------------------------------------------------------
-- 기타 입출고 리포트 (bag_misc_flow_tables.sql)
-- ---------------------------------------------------------------------------

View File

@@ -0,0 +1,22 @@
-- 무료용 불출 취소 화면 고도화용 상세 테이블
-- 실행:
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/bag_issue_item_code_table.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET CHARACTER_SET_CLIENT = utf8mb4;
CREATE TABLE IF NOT EXISTS `bag_issue_item_code` (
`bic_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`bic_lg_idx` INT UNSIGNED NOT NULL,
`bic_bi2_idx` INT UNSIGNED NOT NULL COMMENT 'bag_issue.bi2_idx',
`bic_bag_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '봉투 종류 코드',
`bic_issue_code` VARCHAR(80) NOT NULL DEFAULT '' COMMENT '불출 품목 코드',
`bic_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '원수량(낱장)',
`bic_cancel_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '취소수량(낱장)',
`bic_state` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled',
`bic_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bic_idx`),
KEY `idx_bic_lg_idx` (`bic_lg_idx`),
KEY `idx_bic_bi2_idx` (`bic_bi2_idx`),
KEY `idx_bic_issue_code` (`bic_issue_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 불출 품목코드 상세';

View File

@@ -1,4 +1,5 @@
-- 봉투 단가 테스트 데이터 (/bag/bag-prices — 적용 시작·종료 다양)
-- 가격 기준: 대구시 공식 판매가 2024.7.1 (https://www.daegu.go.kr/env/index.do?menu_id=00001325)
-- 전제: bag_price 테이블 존재, code_master O종 봉투코드와 맞춤(화면에서 선택 가능한 코드)
-- 대상 지자체: 활성 지자체 중 최소 lg_idx + lg_code 110204(남구), UNION 중복 제거
-- 재실행: 동일 (지자체, 봉투코드, 적용시작일) 이 이미 있으면 삽입 안 함
@@ -24,21 +25,21 @@ SELECT
NOW()
FROM `target_lg` t
CROSS JOIN (
SELECT '10112' AS c, '일반용 3L' AS n, 22.00 AS o, 58.00 AS w, 78.00 AS co, DATE '2023-01-01' AS s, DATE '2023-12-31' AS e, 0 AS st
UNION ALL SELECT '10112', '일반용 3L', 24.00, 59.00, 79.00, '2024-07-01', '2024-12-31', 0
UNION ALL SELECT '10122', '일반용 5L', 33.00, 98.00, 128.00, '2024-01-01', '2024-08-31', 0
UNION ALL SELECT '10122', '일반용 5L', 36.00, 102.00, 132.00, '2025-09-01', NULL, 1
UNION ALL SELECT '10132', '일반용 10L', 55.00, 180.00, 240.00, '2025-11-01', '2025-12-31', 1
UNION ALL SELECT '10132', '일반용 10L', 62.00, 192.00, 252.00, '2026-01-15', NULL, 1
UNION ALL SELECT '10152', '일반용 20L', 88.00, 340.00, 450.00, '2022-05-01', '2022-12-31', 0
UNION ALL SELECT '10152', '일반용 20L', 102.00, 375.00, 495.00, '2026-04-01', NULL, 1
UNION ALL SELECT '60102', '음식물 2L', 17.00, 48.00, 58.00, '2025-01-01', NULL, 1
UNION ALL SELECT '60132', '음식물 10L', 68.00, 205.00, 275.00, '2025-06-01', '2025-12-31', 0
UNION ALL SELECT '60132', '음식물 10L', 72.00, 212.00, 282.00, '2026-03-01', NULL, 1
UNION ALL SELECT '20172', '공공용 50L', 175.00, 680.00, 0.00, '2020-01-01', '2020-12-31', 0
UNION ALL SELECT '40152', '공동주택용 20L', 85.00, 330.00, 440.00, '2025-12-01', '2026-02-28', 1
UNION ALL SELECT '10172', '일반용 50L', 205.00, 850.00, 1120.00, '2026-06-01', NULL, 1
UNION ALL SELECT '10192', '일반용 75L', 295.00, 1260.00, 1660.00, '2026-12-01', NULL, 1
SELECT '10112' AS c, '일반용 3L' AS n, 24.00 AS o, 112.00 AS w, 120.00 AS co, DATE '2023-01-01' AS s, DATE '2023-12-31' AS e, 0 AS st
UNION ALL SELECT '10112', '일반용 3L', 24.00, 112.00, 120.00, '2024-07-01', '2024-12-31', 0
UNION ALL SELECT '10122', '일반용 5L', 36.00, 167.00, 180.00, '2024-01-01', '2024-08-31', 0
UNION ALL SELECT '10122', '일반용 5L', 36.00, 167.00, 180.00, '2025-09-01', NULL, 1
UNION ALL SELECT '10132', '일반용 10L', 68.00, 316.00, 340.00, '2025-11-01', '2025-12-31', 1
UNION ALL SELECT '10132', '일반용 10L', 68.00, 316.00, 340.00, '2026-01-15', NULL, 1
UNION ALL SELECT '10152', '일반용 20L', 120.00, 560.00, 600.00, '2022-05-01', '2024-06-30', 0
UNION ALL SELECT '10152', '일반용 20L', 134.00, 623.00, 670.00, '2026-04-01', NULL, 1
UNION ALL SELECT '60102', '음식물 2L', 22.00, 102.00, 110.00, '2025-01-01', NULL, 1
UNION ALL SELECT '60132', '음식물 10L', 116.00, 539.00, 580.00, '2025-06-01', '2025-12-31', 0
UNION ALL SELECT '60132', '음식물 10L', 116.00, 539.00, 580.00, '2026-03-01', NULL, 1
UNION ALL SELECT '20172', '공공용 50L', 332.00, 1544.00, 1660.00, '2020-01-01', '2020-12-31', 0
UNION ALL SELECT '40152', '공동주택용 20L', 128.00, 596.00, 640.00, '2025-12-01', '2026-02-28', 1
UNION ALL SELECT '10172', '일반용 50L', 332.00, 1544.00, 1660.00, '2026-06-01', NULL, 1
UNION ALL SELECT '10192', '일반용 75L', 494.00, 2297.00, 2470.00, '2026-12-01', NULL, 1
) v
WHERE NOT EXISTS (
SELECT 1 FROM `bag_price` b

View File

@@ -0,0 +1,20 @@
-- blockchain_ledger 테이블/컬럼 COMMENT가 latin1 등으로 잘못 저장된 경우 복구
-- 실행: mysql --default-character-set=utf8mb4 -u ... -p ... 데이터베이스명 < blockchain_ledger_fix_comments_utf8mb4.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET CHARACTER SET utf8mb4;
ALTER TABLE `blockchain_ledger` COMMENT = '블록체인 원장';
ALTER TABLE `blockchain_ledger`
MODIFY `bl_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '블록 인덱스(Height)',
MODIFY `bl_created_at` DATETIME NOT NULL COMMENT '블록 생성 시각',
MODIFY `bl_tx_type` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '트랜잭션 타입(ORDER_CREATE/ORDER_UPDATE/...)',
MODIFY `bl_entity_uuid` CHAR(36) NULL COMMENT '업무 엔티티 UUID',
MODIFY `bl_entity_version` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '엔티티 버전',
MODIFY `bl_payload` JSON NOT NULL COMMENT '블록 payload(JSON)',
MODIFY `bl_previous_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '이전 블록 해시',
MODIFY `bl_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '현재 블록 해시',
MODIFY `bl_nonce` INT NOT NULL DEFAULT 0 COMMENT '논스(폐쇄형 체인에서 기본 0)',
MODIFY `bl_actor_idx` INT UNSIGNED NULL COMMENT '수행자 mb_idx',
MODIFY `bl_lg_idx` INT UNSIGNED NULL COMMENT '지자체 lg_idx';

View File

@@ -0,0 +1,24 @@
-- ============================================
-- 블록체인 원장 테이블 (폐쇄형 SQL Ledger)
-- ============================================
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `blockchain_ledger` (
`bl_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '블록 인덱스(Height)',
`bl_created_at` DATETIME NOT NULL COMMENT '블록 생성 시각',
`bl_tx_type` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '트랜잭션 타입(ORDER_CREATE/ORDER_UPDATE/...)',
`bl_entity_uuid` CHAR(36) NULL COMMENT '업무 엔티티 UUID',
`bl_entity_version` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '엔티티 버전',
`bl_payload` JSON NOT NULL COMMENT '블록 payload(JSON)',
`bl_previous_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '이전 블록 해시',
`bl_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '현재 블록 해시',
`bl_nonce` INT NOT NULL DEFAULT 0 COMMENT '논스(폐쇄형 체인에서 기본 0)',
`bl_actor_idx` INT UNSIGNED NULL COMMENT '수행자 mb_idx',
`bl_lg_idx` INT UNSIGNED NULL COMMENT '지자체 lg_idx',
PRIMARY KEY (`bl_idx`),
KEY `idx_bl_entity_uuid` (`bl_entity_uuid`),
KEY `idx_bl_tx_type` (`bl_tx_type`),
KEY `idx_bl_lg_idx` (`bl_lg_idx`),
UNIQUE KEY `uk_bl_hash` (`bl_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='블록체인 원장';

View File

@@ -0,0 +1,38 @@
-- 봉투구분(E)별 봉투명(O) 코드 보강 — 기타 입출고·단가 등에서 구분 선택 시 품목 표시
-- 코드 규칙: E(2자) + 용량 G(2자) + 재질 F(1자, 고밀도=2) — 일반용 10122 = 10+12+2
-- 플랫폼 공통(cd_lg_idx=0). 이미 있으면 건너뜀.
INSERT INTO `code_detail` (`cd_ck_idx`, `cd_code`, `cd_name`, `cd_sort`, `cd_state`, `cd_lg_idx`, `cd_regdate`)
SELECT k.ck_idx, v.cd_code, v.cd_name, v.cd_sort, 1, 0, NOW()
FROM `code_kind` k
JOIN (
/* 20 공공용 */
SELECT '20112' AS cd_code, '공공용 3L' AS cd_name, 85 AS cd_sort UNION ALL
SELECT '20122', '공공용 5L', 86 UNION ALL
SELECT '20132', '공공용 10L', 87 UNION ALL
SELECT '20152', '공공용 20L', 88 UNION ALL
SELECT '20162', '공공용 30L', 89 UNION ALL
/* 20172 공공용 50L — 기존 */
SELECT '20192', '공공용 75L', 91 UNION ALL
SELECT '20202', '공공용 100L', 92 UNION ALL
/* 30 무료용 */
SELECT '30112', '무료용 3L', 125 UNION ALL
SELECT '30122', '무료용 5L', 126 UNION ALL
SELECT '30132', '무료용 10L', 127 UNION ALL
SELECT '30152', '무료용 20L', 128 UNION ALL
SELECT '30162', '무료용 30L', 129 UNION ALL
SELECT '30172', '무료용 50L', 130 UNION ALL
SELECT '30192', '무료용 75L', 131 UNION ALL
SELECT '30202', '무료용 100L', 132 UNION ALL
/* 50 재사용 — 50122 외 용량 */
SELECT '50112', '재사용 3L', 133 UNION ALL
SELECT '50132', '재사용 10L', 135 UNION ALL
SELECT '50152', '재사용 20L', 136 UNION ALL
SELECT '50162', '재사용 30L', 137 UNION ALL
SELECT '50172', '재사용 50L', 138
) AS v
WHERE k.ck_code = 'O'
AND NOT EXISTS (
SELECT 1 FROM `code_detail` d
WHERE d.cd_ck_idx = k.ck_idx AND d.cd_code = v.cd_code AND d.cd_lg_idx = 0
);

View File

@@ -285,11 +285,31 @@ JOIN (
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 '20112' AS cd_code, '공공용 3L' AS cd_name, 85 AS cd_sort UNION ALL
SELECT '20122' AS cd_code, '공공용 5L' AS cd_name, 86 AS cd_sort UNION ALL
SELECT '20132' AS cd_code, '공공용 10L' AS cd_name, 87 AS cd_sort UNION ALL
SELECT '20152' AS cd_code, '공공용 20L' AS cd_name, 88 AS cd_sort UNION ALL
SELECT '20162' AS cd_code, '공공용 30L' AS cd_name, 89 AS cd_sort UNION ALL
SELECT '20172' AS cd_code, '공공용 50L' AS cd_name, 90 AS cd_sort UNION ALL
SELECT '20192' AS cd_code, '공공용 75L' AS cd_name, 91 AS cd_sort UNION ALL
SELECT '20202' AS cd_code, '공공용 100L' AS cd_name, 92 AS cd_sort UNION ALL
SELECT '30112' AS cd_code, '무료용 3L' AS cd_name, 125 AS cd_sort UNION ALL
SELECT '30122' AS cd_code, '무료용 5L' AS cd_name, 126 AS cd_sort UNION ALL
SELECT '30132' AS cd_code, '무료용 10L' AS cd_name, 127 AS cd_sort UNION ALL
SELECT '30152' AS cd_code, '무료용 20L' AS cd_name, 128 AS cd_sort UNION ALL
SELECT '30162' AS cd_code, '무료용 30L' AS cd_name, 129 AS cd_sort UNION ALL
SELECT '30172' AS cd_code, '무료용 50L' AS cd_name, 130 AS cd_sort UNION ALL
SELECT '30192' AS cd_code, '무료용 75L' AS cd_name, 131 AS cd_sort UNION ALL
SELECT '30202' AS cd_code, '무료용 100L' AS cd_name, 132 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 '50112' AS cd_code, '재사용 3L' AS cd_name, 133 AS cd_sort UNION ALL
SELECT '50122' AS cd_code, '재사용 5L' AS cd_name, 134 AS cd_sort UNION ALL
SELECT '50132' AS cd_code, '재사용 10L' AS cd_name, 135 AS cd_sort UNION ALL
SELECT '50152' AS cd_code, '재사용 20L' AS cd_name, 136 AS cd_sort UNION ALL
SELECT '50162' AS cd_code, '재사용 30L' AS cd_name, 137 AS cd_sort UNION ALL
SELECT '50172' AS cd_code, '재사용 50L' AS cd_name, 138 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

View File

@@ -0,0 +1,3 @@
-- 지정판매소 ↔ 판매 대행소 FK
-- 적용: designated_shop_ds_sa_idx_apply.sql
-- 매핑: designated_shop_ds_sa_idx_backfill.sql (구·군별 발주 대행소 추정)

View File

@@ -0,0 +1,16 @@
-- 지정판매소 ↔ 판매 대행소 FK (통계·판매대장 필터용)
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/designated_shop_ds_sa_idx_apply.sql
SET NAMES utf8mb4;
SET @db = DATABASE();
SET @s = (SELECT IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'designated_shop' AND COLUMN_NAME = 'ds_sa_idx') > 0,
'SELECT 1',
'ALTER TABLE `designated_shop`
ADD COLUMN `ds_sa_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT ''소속 판매 대행소 FK'' AFTER `ds_lg_idx`,
ADD KEY `idx_ds_sa_idx` (`ds_sa_idx`)'
));
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;

View File

@@ -0,0 +1,29 @@
-- ds_sa_idx 가 NULL 인 지정판매소에 구·군(bo_gugun_code)별 최다 발주 대행소를 매핑
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/designated_shop_ds_sa_idx_backfill.sql
SET NAMES utf8mb4;
UPDATE `designated_shop` ds
INNER JOIN (
SELECT bo.bo_lg_idx, bo.bo_gugun_code, bo.bo_agency_idx
FROM `bag_order` bo
INNER JOIN (
SELECT bo_lg_idx, bo_gugun_code, bo_agency_idx, COUNT(*) AS cnt,
ROW_NUMBER() OVER (
PARTITION BY bo_lg_idx, bo_gugun_code
ORDER BY COUNT(*) DESC, bo_agency_idx DESC
) AS rn
FROM `bag_order`
WHERE bo_status = 'normal'
AND bo_agency_idx IS NOT NULL
AND TRIM(bo_gugun_code) != ''
GROUP BY bo_lg_idx, bo_gugun_code, bo_agency_idx
) ranked ON ranked.bo_lg_idx = bo.bo_lg_idx
AND ranked.bo_gugun_code = bo.bo_gugun_code
AND ranked.bo_agency_idx = bo.bo_agency_idx
AND ranked.rn = 1
WHERE bo.bo_status = 'normal'
GROUP BY bo.bo_lg_idx, bo.bo_gugun_code, bo.bo_agency_idx
) map ON map.bo_lg_idx = ds.ds_lg_idx AND map.bo_gugun_code = ds.ds_gugun_code
SET ds.ds_sa_idx = map.bo_agency_idx
WHERE ds.ds_sa_idx IS NULL;

View File

@@ -0,0 +1,156 @@
-- ================================================================
-- 대구광역시 공식 종량제·음식물 납부필증 가격(2024.7.1~) 및 포장단위 현실값 반영
-- 출처: https://www.daegu.go.kr/env/index.do?menu_id=00001325 (최근수정 2026.01.27)
--
-- bp_consumer : 시 판매가(장/매)
-- bp_wholesale : 지정판매소 매입가 ≈ 판매가의 93% (도매 마진)
-- bp_order_price: 제작 발주단가(장) ≈ 판매가의 20% (제조 원가 수준)
--
-- 포장: 대구 동구청 가격표(묶음·박스 매수) — dong.daegu.kr/reserve/contents.do?mid=0302000000
-- 일반 3L: 20매/팩 × 150팩/박스 = 3,000매
-- 일반 5L: 20매/팩 × 150팩/박스 = 3,000매 (표 미기재, 3L 동일 계열)
-- 일반 10L: 10매/팩 × 200팩/박스 = 2,000매
-- 일반 20L: 50매/팩 × 20팩/박스 = 1,000매
-- 일반 30L: 50매/팩 × 6팩/박스 = 300매 (표 미기재)
-- 일반 50L: 20매/팩 × 25팩/박스 = 500매
-- 일반 75L: 10매/팩 × 30팩/박스 = 300매
-- 음식물·스티커: 필증/스티커는 100매/팩 등 별도 (본 스크립트 일반·공공·공동주택·재사용만)
--
-- 실행: mysql ... jongryangje < writable/database/fix_bag_price_packaging_daegu_realistic.sql
-- 이어서 O종 전체(27코드): fix_bag_price_packaging_daegu_realistic_all_codes.sql
-- ================================================================
SET NAMES utf8mb4;
-- ---------- 현행 단가 (적용 중인 행) ----------
UPDATE `bag_price` SET
`bp_order_price` = CASE `bp_bag_code`
WHEN '10112' THEN 24.00
WHEN '10122' THEN 36.00
WHEN '10132' THEN 68.00
WHEN '10152' THEN 134.00
WHEN '10162' THEN 216.00
WHEN '10172' THEN 332.00
WHEN '10192' THEN 494.00
WHEN '10202' THEN 0.00
WHEN '40152' THEN 128.00
WHEN '20172' THEN 332.00
WHEN '60102' THEN 22.00
WHEN '60132' THEN 116.00
ELSE `bp_order_price`
END,
`bp_wholesale` = CASE `bp_bag_code`
WHEN '10112' THEN 112.00
WHEN '10122' THEN 167.00
WHEN '10132' THEN 316.00
WHEN '10152' THEN 623.00
WHEN '10162' THEN 1004.00
WHEN '10172' THEN 1544.00
WHEN '10192' THEN 2297.00
WHEN '10202' THEN 0.00
WHEN '40152' THEN 596.00
WHEN '20172' THEN 1544.00
WHEN '60102' THEN 102.00
WHEN '60132' THEN 539.00
ELSE `bp_wholesale`
END,
`bp_consumer` = CASE `bp_bag_code`
WHEN '10112' THEN 120.00
WHEN '10122' THEN 180.00
WHEN '10132' THEN 340.00
WHEN '10152' THEN 670.00
WHEN '10162' THEN 1080.00
WHEN '10172' THEN 1660.00
WHEN '10192' THEN 2470.00
WHEN '10202' THEN 0.00
WHEN '40152' THEN 640.00
WHEN '20172' THEN 1660.00
WHEN '60102' THEN 110.00
WHEN '60132' THEN 580.00
ELSE `bp_consumer`
END
WHERE `bp_bag_code` IN (
'10112','10122','10132','10152','10162','10172','10192','10202',
'40152','20172','60102','60132'
)
AND `bp_state` = 1
AND (`bp_end_date` IS NULL OR `bp_end_date` >= CURDATE());
-- ---------- 포장 단위 ----------
UPDATE `packaging_unit` SET
`pu_pack_per_sheet` = CASE `pu_bag_code`
WHEN '10112' THEN 20
WHEN '10122' THEN 20
WHEN '10132' THEN 10
WHEN '10152' THEN 50
WHEN '10162' THEN 50
WHEN '10172' THEN 20
WHEN '10192' THEN 10
WHEN '10202' THEN 10
WHEN '40152' THEN 50
WHEN '20172' THEN 20
WHEN '60102' THEN 100
WHEN '60132' THEN 50
ELSE `pu_pack_per_sheet`
END,
`pu_box_per_pack` = CASE `pu_bag_code`
WHEN '10112' THEN 150
WHEN '10122' THEN 150
WHEN '10132' THEN 200
WHEN '10152' THEN 20
WHEN '10162' THEN 6
WHEN '10172' THEN 25
WHEN '10192' THEN 30
WHEN '10202' THEN 5
WHEN '40152' THEN 20
WHEN '20172' THEN 25
WHEN '60102' THEN 10
WHEN '60132' THEN 10
ELSE `pu_box_per_pack`
END,
`pu_total_per_box` = CASE `pu_bag_code`
WHEN '10112' THEN 3000
WHEN '10122' THEN 3000
WHEN '10132' THEN 2000
WHEN '10152' THEN 1000
WHEN '10162' THEN 300
WHEN '10172' THEN 500
WHEN '10192' THEN 300
WHEN '10202' THEN 50
WHEN '40152' THEN 1000
WHEN '20172' THEN 500
WHEN '60102' THEN 1000
WHEN '60132' THEN 500
ELSE `pu_total_per_box`
END
WHERE `pu_bag_code` IN (
'10112','10122','10132','10152','10162','10172','10192','10202',
'40152','20172','60102','60132'
)
AND `pu_state` = 1
AND (`pu_end_date` IS NULL OR `pu_end_date` >= CURDATE());
-- ---------- 판매·주문 단가를 현행 소비자가에 맞춤(선택적 정합) ----------
UPDATE `bag_sale` bs
INNER JOIN `bag_price` bp
ON bp.`bp_lg_idx` = bs.`bs_lg_idx`
AND bp.`bp_bag_code` = bs.`bs_bag_code`
AND bp.`bp_state` = 1
AND (bp.`bp_end_date` IS NULL OR bp.`bp_end_date` >= CURDATE())
SET
bs.`bs_unit_price` = bp.`bp_consumer`,
bs.`bs_amount` = bs.`bs_qty` * bp.`bp_consumer`
WHERE bs.`bs_type` = 'sale'
AND bp.`bp_consumer` > 0;
UPDATE `shop_order_item` soi
INNER JOIN `shop_order` so ON so.`so_idx` = soi.`soi_so_idx`
INNER JOIN `bag_price` bp
ON bp.`bp_lg_idx` = so.`so_lg_idx`
AND bp.`bp_bag_code` = soi.`soi_bag_code`
AND bp.`bp_state` = 1
AND (bp.`bp_end_date` IS NULL OR bp.`bp_end_date` >= CURDATE())
SET
soi.`soi_unit_price` = bp.`bp_consumer`,
soi.`soi_amount` = soi.`soi_qty` * bp.`bp_consumer`
WHERE bp.`bp_consumer` > 0;

View File

@@ -0,0 +1,296 @@
-- ================================================================
-- [Part 2] O종 봉투 코드 전체 — 단가·포장단위 INSERT(누락분) + 일괄 UPDATE
-- Part 1: fix_bag_price_packaging_daegu_realistic.sql 실행 후 이어서 실행
-- 출처: 대구시 공식가 2024.7.1 + 동일 용량·스티커/용기·정액 스티커 합리 추정
-- https://www.daegu.go.kr/env/index.do?menu_id=00001325
--
-- 대상 코드 27종 (code_master O종 전체)
-- 일반 10112~10202, 공공 20172, 공동주택 40152/40182/40212, 재사용 50122
-- 음식물 60102/60132, 음식물스티커 61107~61217, 음식물용기 62128/62158
-- 폐기물정액스티커 70707/70727/70747/70787
-- ================================================================
SET NAMES utf8mb4;
-- ----------------------------------------------------------------
-- 1) 현행 단가가 없는 (지자체 × 봉투코드) INSERT
-- ----------------------------------------------------------------
INSERT INTO `bag_price` (
`bp_lg_idx`, `bp_bag_code`, `bp_bag_name`,
`bp_order_price`, `bp_wholesale`, `bp_consumer`,
`bp_start_date`, `bp_end_date`, `bp_state`, `bp_regdate`
)
SELECT
lg.`lg_idx`,
v.`bag_code`,
v.`bag_name`,
v.`order_price`,
v.`wholesale`,
v.`consumer`,
DATE '2024-07-01',
NULL,
v.`bp_state`,
NOW()
FROM `local_government` lg
CROSS JOIN (
SELECT '10112' AS bag_code, '일반용 3L' AS bag_name, 24.00 AS order_price, 112.00 AS wholesale, 120.00 AS consumer, 1 AS bp_state UNION ALL
SELECT '10122', '일반용 5L', 36.00, 167.00, 180.00, 1 UNION ALL
SELECT '10132', '일반용 10L', 68.00, 316.00, 340.00, 1 UNION ALL
SELECT '10152', '일반용 20L', 134.00, 623.00, 670.00, 1 UNION ALL
SELECT '10162', '일반용 30L', 216.00, 1004.00, 1080.00, 1 UNION ALL
SELECT '10172', '일반용 50L', 332.00, 1544.00, 1660.00, 1 UNION ALL
SELECT '10192', '일반용 75L', 494.00, 2297.00, 2470.00, 1 UNION ALL
SELECT '10202', '일반용 100L', 0.00, 0.00, 0.00, 0 UNION ALL
SELECT '20172', '공공용 50L', 332.00, 1544.00, 1660.00, 1 UNION ALL
SELECT '40152', '공동주택용 20L', 128.00, 596.00, 640.00, 1 UNION ALL
SELECT '40182', '공동주택용 60L', 396.00, 1841.00, 1980.00, 1 UNION ALL
SELECT '40212', '공동주택용 120L', 1360.00, 6324.00, 6800.00, 1 UNION ALL
SELECT '50122', '재사용 5L', 30.00, 140.00, 150.00, 1 UNION ALL
SELECT '60102', '음식물 2L', 22.00, 102.00, 110.00, 1 UNION ALL
SELECT '60132', '음식물 10L', 116.00, 539.00, 580.00, 1 UNION ALL
SELECT '61107', '음식물 스티커 2L', 22.00, 102.00, 110.00, 1 UNION ALL
SELECT '61117', '음식물 스티커 3L', 34.00, 158.00, 170.00, 1 UNION ALL
SELECT '61127', '음식물 스티커 5L', 58.00, 270.00, 290.00, 1 UNION ALL
SELECT '61157', '음식물 스티커 20L', 232.00, 1079.00, 1160.00, 1 UNION ALL
SELECT '61187', '음식물 스티커 60L', 696.00, 3236.00, 3480.00, 1 UNION ALL
SELECT '61217', '음식물 스티커 120L', 1392.00, 6473.00, 6960.00, 1 UNION ALL
SELECT '62128', '음식물용기 5L', 64.00, 298.00, 320.00, 1 UNION ALL
SELECT '62158', '음식물용기 20L', 240.00, 1116.00, 1200.00, 1 UNION ALL
SELECT '70707', '폐기물 스티커 1,000원', 200.00, 930.00, 1000.00, 1 UNION ALL
SELECT '70727', '폐기물 스티커 3,000원', 600.00, 2790.00, 3000.00, 1 UNION ALL
SELECT '70747', '폐기물 스티커 5,000원', 1000.00, 4650.00, 5000.00, 1 UNION ALL
SELECT '70787', '폐기물 스티커 10,000원', 2000.00, 9300.00, 10000.00, 1
) v
WHERE lg.`lg_state` = 1
AND NOT EXISTS (
SELECT 1 FROM `bag_price` b
WHERE b.`bp_lg_idx` = lg.`lg_idx`
AND b.`bp_bag_code` = v.`bag_code`
AND b.`bp_state` = 1
AND (b.`bp_end_date` IS NULL OR b.`bp_end_date` >= CURDATE())
);
-- ----------------------------------------------------------------
-- 2) 포장 단위 없는 (지자체 × 봉투코드) INSERT
-- ----------------------------------------------------------------
INSERT INTO `packaging_unit` (
`pu_lg_idx`, `pu_bag_code`, `pu_bag_name`,
`pu_box_per_pack`, `pu_pack_per_sheet`, `pu_total_per_box`,
`pu_start_date`, `pu_end_date`, `pu_state`, `pu_regdate`
)
SELECT
lg.`lg_idx`,
v.`bag_code`,
v.`bag_name`,
v.`box_per_pack`,
v.`pack_per_sheet`,
v.`total_per_box`,
DATE '2024-07-01',
NULL,
v.`pu_state`,
NOW()
FROM `local_government` lg
CROSS JOIN (
SELECT '10112' AS bag_code, '일반용 3L' AS bag_name, 150 AS box_per_pack, 20 AS pack_per_sheet, 3000 AS total_per_box, 1 AS pu_state UNION ALL
SELECT '10122', '일반용 5L', 150, 20, 3000, 1 UNION ALL
SELECT '10132', '일반용 10L', 200, 10, 2000, 1 UNION ALL
SELECT '10152', '일반용 20L', 20, 50, 1000, 1 UNION ALL
SELECT '10162', '일반용 30L', 6, 50, 300, 1 UNION ALL
SELECT '10172', '일반용 50L', 25, 20, 500, 1 UNION ALL
SELECT '10192', '일반용 75L', 30, 10, 300, 1 UNION ALL
SELECT '10202', '일반용 100L', 5, 10, 50, 0 UNION ALL
SELECT '20172', '공공용 50L', 25, 20, 500, 1 UNION ALL
SELECT '40152', '공동주택용 20L', 20, 50, 1000, 1 UNION ALL
SELECT '40182', '공동주택용 60L', 10, 20, 200, 1 UNION ALL
SELECT '40212', '공동주택용 120L', 5, 10, 50, 1 UNION ALL
SELECT '50122', '재사용 5L', 150, 20, 3000, 1 UNION ALL
SELECT '60102', '음식물 2L', 10, 100, 1000, 1 UNION ALL
SELECT '60132', '음식물 10L', 10, 50, 500, 1 UNION ALL
SELECT '61107', '음식물 스티커 2L', 10, 100, 1000, 1 UNION ALL
SELECT '61117', '음식물 스티커 3L', 10, 100, 1000, 1 UNION ALL
SELECT '61127', '음식물 스티커 5L', 10, 100, 1000, 1 UNION ALL
SELECT '61157', '음식물 스티커 20L', 10, 50, 500, 1 UNION ALL
SELECT '61187', '음식물 스티커 60L', 5, 20, 100, 1 UNION ALL
SELECT '61217', '음식물 스티커 120L', 5, 10, 50, 1 UNION ALL
SELECT '62128', '음식물용기 5L', 10, 100, 1000, 1 UNION ALL
SELECT '62158', '음식물용기 20L', 10, 50, 500, 1 UNION ALL
SELECT '70707', '폐기물 스티커 1,000원', 10, 100, 1000, 1 UNION ALL
SELECT '70727', '폐기물 스티커 3,000원', 10, 50, 500, 1 UNION ALL
SELECT '70747', '폐기물 스티커 5,000원', 10, 20, 200, 1 UNION ALL
SELECT '70787', '폐기물 스티커 10,000원', 10, 10, 100, 1
) v
WHERE lg.`lg_state` = 1
AND NOT EXISTS (
SELECT 1 FROM `packaging_unit` p
WHERE p.`pu_lg_idx` = lg.`lg_idx`
AND p.`pu_bag_code` = v.`bag_code`
AND p.`pu_state` = 1
AND (p.`pu_end_date` IS NULL OR p.`pu_end_date` >= CURDATE())
);
-- ----------------------------------------------------------------
-- 3) 전체 O종 코드 — 현행 단가 일괄 UPDATE
-- ----------------------------------------------------------------
UPDATE `bag_price` SET
`bp_bag_name` = CASE `bp_bag_code`
WHEN '10112' THEN '일반용 3L'
WHEN '10122' THEN '일반용 5L'
WHEN '10132' THEN '일반용 10L'
WHEN '10152' THEN '일반용 20L'
WHEN '10162' THEN '일반용 30L'
WHEN '10172' THEN '일반용 50L'
WHEN '10192' THEN '일반용 75L'
WHEN '10202' THEN '일반용 100L'
WHEN '20172' THEN '공공용 50L'
WHEN '40152' THEN '공동주택용 20L'
WHEN '40182' THEN '공동주택용 60L'
WHEN '40212' THEN '공동주택용 120L'
WHEN '50122' THEN '재사용 5L'
WHEN '60102' THEN '음식물 2L'
WHEN '60132' THEN '음식물 10L'
WHEN '61107' THEN '음식물 스티커 2L'
WHEN '61117' THEN '음식물 스티커 3L'
WHEN '61127' THEN '음식물 스티커 5L'
WHEN '61157' THEN '음식물 스티커 20L'
WHEN '61187' THEN '음식물 스티커 60L'
WHEN '61217' THEN '음식물 스티커 120L'
WHEN '62128' THEN '음식물용기 5L'
WHEN '62158' THEN '음식물용기 20L'
WHEN '70707' THEN '폐기물 스티커 1,000원'
WHEN '70727' THEN '폐기물 스티커 3,000원'
WHEN '70747' THEN '폐기물 스티커 5,000원'
WHEN '70787' THEN '폐기물 스티커 10,000원'
ELSE `bp_bag_name`
END,
`bp_order_price` = CASE `bp_bag_code`
WHEN '10112' THEN 24.00 WHEN '10122' THEN 36.00 WHEN '10132' THEN 68.00
WHEN '10152' THEN 134.00 WHEN '10162' THEN 216.00 WHEN '10172' THEN 332.00
WHEN '10192' THEN 494.00 WHEN '10202' THEN 0.00
WHEN '20172' THEN 332.00
WHEN '40152' THEN 128.00 WHEN '40182' THEN 396.00 WHEN '40212' THEN 1360.00
WHEN '50122' THEN 30.00
WHEN '60102' THEN 22.00 WHEN '60132' THEN 116.00
WHEN '61107' THEN 22.00 WHEN '61117' THEN 34.00 WHEN '61127' THEN 58.00
WHEN '61157' THEN 232.00 WHEN '61187' THEN 696.00 WHEN '61217' THEN 1392.00
WHEN '62128' THEN 64.00 WHEN '62158' THEN 240.00
WHEN '70707' THEN 200.00 WHEN '70727' THEN 600.00 WHEN '70747' THEN 1000.00 WHEN '70787' THEN 2000.00
ELSE `bp_order_price`
END,
`bp_wholesale` = CASE `bp_bag_code`
WHEN '10112' THEN 112.00 WHEN '10122' THEN 167.00 WHEN '10132' THEN 316.00
WHEN '10152' THEN 623.00 WHEN '10162' THEN 1004.00 WHEN '10172' THEN 1544.00
WHEN '10192' THEN 2297.00 WHEN '10202' THEN 0.00
WHEN '20172' THEN 1544.00
WHEN '40152' THEN 596.00 WHEN '40182' THEN 1841.00 WHEN '40212' THEN 6324.00
WHEN '50122' THEN 140.00
WHEN '60102' THEN 102.00 WHEN '60132' THEN 539.00
WHEN '61107' THEN 102.00 WHEN '61117' THEN 158.00 WHEN '61127' THEN 270.00
WHEN '61157' THEN 1079.00 WHEN '61187' THEN 3236.00 WHEN '61217' THEN 6473.00
WHEN '62128' THEN 298.00 WHEN '62158' THEN 1116.00
WHEN '70707' THEN 930.00 WHEN '70727' THEN 2790.00 WHEN '70747' THEN 4650.00 WHEN '70787' THEN 9300.00
ELSE `bp_wholesale`
END,
`bp_consumer` = CASE `bp_bag_code`
WHEN '10112' THEN 120.00 WHEN '10122' THEN 180.00 WHEN '10132' THEN 340.00
WHEN '10152' THEN 670.00 WHEN '10162' THEN 1080.00 WHEN '10172' THEN 1660.00
WHEN '10192' THEN 2470.00 WHEN '10202' THEN 0.00
WHEN '20172' THEN 1660.00
WHEN '40152' THEN 640.00 WHEN '40182' THEN 1980.00 WHEN '40212' THEN 6800.00
WHEN '50122' THEN 150.00
WHEN '60102' THEN 110.00 WHEN '60132' THEN 580.00
WHEN '61107' THEN 110.00 WHEN '61117' THEN 170.00 WHEN '61127' THEN 290.00
WHEN '61157' THEN 1160.00 WHEN '61187' THEN 3480.00 WHEN '61217' THEN 6960.00
WHEN '62128' THEN 320.00 WHEN '62158' THEN 1200.00
WHEN '70707' THEN 1000.00 WHEN '70727' THEN 3000.00 WHEN '70747' THEN 5000.00 WHEN '70787' THEN 10000.00
ELSE `bp_consumer`
END,
`bp_state` = CASE `bp_bag_code`
WHEN '10202' THEN 0
ELSE 1
END
WHERE `bp_bag_code` IN (
'10112','10122','10132','10152','10162','10172','10192','10202',
'20172','40152','40182','40212','50122',
'60102','60132',
'61107','61117','61127','61157','61187','61217',
'62128','62158',
'70707','70727','70747','70787'
)
AND `bp_state` = 1
AND (`bp_end_date` IS NULL OR `bp_end_date` >= CURDATE());
-- ----------------------------------------------------------------
-- 4) 전체 O종 코드 — 포장 단위 일괄 UPDATE
-- ----------------------------------------------------------------
UPDATE `packaging_unit` SET
`pu_bag_name` = CASE `pu_bag_code`
WHEN '10112' THEN '일반용 3L' WHEN '10122' THEN '일반용 5L' WHEN '10132' THEN '일반용 10L'
WHEN '10152' THEN '일반용 20L' WHEN '10162' THEN '일반용 30L' WHEN '10172' THEN '일반용 50L'
WHEN '10192' THEN '일반용 75L' WHEN '10202' THEN '일반용 100L'
WHEN '20172' THEN '공공용 50L'
WHEN '40152' THEN '공동주택용 20L' WHEN '40182' THEN '공동주택용 60L' WHEN '40212' THEN '공동주택용 120L'
WHEN '50122' THEN '재사용 5L'
WHEN '60102' THEN '음식물 2L' WHEN '60132' THEN '음식물 10L'
WHEN '61107' THEN '음식물 스티커 2L' WHEN '61117' THEN '음식물 스티커 3L' WHEN '61127' THEN '음식물 스티커 5L'
WHEN '61157' THEN '음식물 스티커 20L' WHEN '61187' THEN '음식물 스티커 60L' WHEN '61217' THEN '음식물 스티커 120L'
WHEN '62128' THEN '음식물용기 5L' WHEN '62158' THEN '음식물용기 20L'
WHEN '70707' THEN '폐기물 스티커 1,000원' WHEN '70727' THEN '폐기물 스티커 3,000원'
WHEN '70747' THEN '폐기물 스티커 5,000원' WHEN '70787' THEN '폐기물 스티커 10,000원'
ELSE `pu_bag_name`
END,
`pu_pack_per_sheet` = CASE `pu_bag_code`
WHEN '10112' THEN 20 WHEN '10122' THEN 20 WHEN '10132' THEN 10
WHEN '10152' THEN 50 WHEN '10162' THEN 50 WHEN '10172' THEN 20
WHEN '10192' THEN 10 WHEN '10202' THEN 10
WHEN '20172' THEN 20
WHEN '40152' THEN 50 WHEN '40182' THEN 20 WHEN '40212' THEN 10
WHEN '50122' THEN 20
WHEN '60102' THEN 100 WHEN '60132' THEN 50
WHEN '61107' THEN 100 WHEN '61117' THEN 100 WHEN '61127' THEN 100
WHEN '61157' THEN 50 WHEN '61187' THEN 20 WHEN '61217' THEN 10
WHEN '62128' THEN 100 WHEN '62158' THEN 50
WHEN '70707' THEN 100 WHEN '70727' THEN 50 WHEN '70747' THEN 20 WHEN '70787' THEN 10
ELSE `pu_pack_per_sheet`
END,
`pu_box_per_pack` = CASE `pu_bag_code`
WHEN '10112' THEN 150 WHEN '10122' THEN 150 WHEN '10132' THEN 200
WHEN '10152' THEN 20 WHEN '10162' THEN 6 WHEN '10172' THEN 25
WHEN '10192' THEN 30 WHEN '10202' THEN 5
WHEN '20172' THEN 25
WHEN '40152' THEN 20 WHEN '40182' THEN 10 WHEN '40212' THEN 5
WHEN '50122' THEN 150
WHEN '60102' THEN 10 WHEN '60132' THEN 10
WHEN '61107' THEN 10 WHEN '61117' THEN 10 WHEN '61127' THEN 10
WHEN '61157' THEN 10 WHEN '61187' THEN 5 WHEN '61217' THEN 5
WHEN '62128' THEN 10 WHEN '62158' THEN 10
WHEN '70707' THEN 10 WHEN '70727' THEN 10 WHEN '70747' THEN 10 WHEN '70787' THEN 10
ELSE `pu_box_per_pack`
END,
`pu_total_per_box` = CASE `pu_bag_code`
WHEN '10112' THEN 3000 WHEN '10122' THEN 3000 WHEN '10132' THEN 2000
WHEN '10152' THEN 1000 WHEN '10162' THEN 300 WHEN '10172' THEN 500
WHEN '10192' THEN 300 WHEN '10202' THEN 50
WHEN '20172' THEN 500
WHEN '40152' THEN 1000 WHEN '40182' THEN 200 WHEN '40212' THEN 50
WHEN '50122' THEN 3000
WHEN '60102' THEN 1000 WHEN '60132' THEN 500
WHEN '61107' THEN 1000 WHEN '61117' THEN 1000 WHEN '61127' THEN 1000
WHEN '61157' THEN 500 WHEN '61187' THEN 100 WHEN '61217' THEN 50
WHEN '62128' THEN 1000 WHEN '62158' THEN 500
WHEN '70707' THEN 1000 WHEN '70727' THEN 500 WHEN '70747' THEN 200 WHEN '70787' THEN 100
ELSE `pu_total_per_box`
END,
`pu_state` = CASE `pu_bag_code`
WHEN '10202' THEN 0
ELSE 1
END
WHERE `pu_bag_code` IN (
'10112','10122','10132','10152','10162','10172','10192','10202',
'20172','40152','40182','40212','50122',
'60102','60132',
'61107','61117','61127','61157','61187','61217',
'62128','62158',
'70707','70727','70747','70787'
)
AND `pu_state` = 1
AND (`pu_end_date` IS NULL OR `pu_end_date` >= CURDATE());

View File

@@ -0,0 +1,13 @@
-- 사이트 메뉴(mm_link): admin/reports/* → bag/reports/*
-- 라우트는 app/Config/Routes.php 의 bag 그룹(bag/reports/...)만 존재.
-- 메뉴 관리(/admin/menus)에는 DB 원문(admin/...)이 보이고,
-- 상단 사이트 메뉴는 menu_link_preferred_href_path()가 bag/ 로 바꿔 열어서 불일치가 났음.
--
-- 실행: mysql ... jongryangje_dev < writable/database/fix_menu_site_reports_links_bag_prefix.sql
SET NAMES 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` = REPLACE(m.`mm_link`, 'admin/reports/', 'bag/reports/')
WHERE m.`mm_link` LIKE 'admin/reports/%';

View File

@@ -0,0 +1,72 @@
-- ================================================================
-- 대구 동구청 공식 종량제봉투 포장단위 반영 (가격표 묶음·박스 매수)
-- 출처: https://dong.daegu.kr/reserve/contents.do?mid=0302000000
--
-- | 규격 | 묶음(팩)당 | 박스당 | 박스당 팩 수 (=박스÷묶음) |
-- | 3L | 20 | 3,000 | 150 |
-- | 10L | 10 | 2,000 | 200 |
-- | 20L | (표 미기재) | 1,000 | 50매×20팩 추정 |
-- | 50L | (표 미기재) | 500 | 20매×25팩 추정 |
-- | 75L | (표 미기재) | 300 | 10매×30팩 추정 |
-- 5L·30L: 동구 표에 묶음/박스 미기재 → 3L·20L·50L와 동일 계열로 20매·박스 3,000/300 유지
--
-- 실행: mysql -u jongryangje -p jongryangje_dev < writable/database/fix_packaging_unit_daegu_donggu_official.sql
-- ================================================================
SET NAMES utf8mb4;
UPDATE `packaging_unit` SET
`pu_pack_per_sheet` = CASE `pu_bag_code`
WHEN '10112' THEN 20
WHEN '10122' THEN 20
WHEN '10132' THEN 10
WHEN '10152' THEN 50
WHEN '10162' THEN 50
WHEN '10172' THEN 20
WHEN '10192' THEN 10
WHEN '10202' THEN 10
WHEN '20172' THEN 20
WHEN '40152' THEN 50
WHEN '40182' THEN 20
WHEN '40212' THEN 10
WHEN '50122' THEN 20
ELSE `pu_pack_per_sheet`
END,
`pu_box_per_pack` = CASE `pu_bag_code`
WHEN '10112' THEN 150
WHEN '10122' THEN 150
WHEN '10132' THEN 200
WHEN '10152' THEN 20
WHEN '10162' THEN 6
WHEN '10172' THEN 25
WHEN '10192' THEN 30
WHEN '10202' THEN 5
WHEN '20172' THEN 25
WHEN '40152' THEN 20
WHEN '40182' THEN 10
WHEN '40212' THEN 5
WHEN '50122' THEN 150
ELSE `pu_box_per_pack`
END,
`pu_total_per_box` = CASE `pu_bag_code`
WHEN '10112' THEN 3000
WHEN '10122' THEN 3000
WHEN '10132' THEN 2000
WHEN '10152' THEN 1000
WHEN '10162' THEN 300
WHEN '10172' THEN 500
WHEN '10192' THEN 300
WHEN '10202' THEN 50
WHEN '20172' THEN 500
WHEN '40152' THEN 1000
WHEN '40182' THEN 200
WHEN '40212' THEN 50
WHEN '50122' THEN 3000
ELSE `pu_total_per_box`
END
WHERE `pu_bag_code` IN (
'10112','10122','10132','10152','10162','10172','10192','10202',
'20172','40152','40182','40212','50122'
)
AND `pu_state` = 1
AND (`pu_end_date` IS NULL OR `pu_end_date` >= CURDATE());

View File

@@ -0,0 +1,70 @@
-- 무료용 대상자 관리 데이터를 스크린샷 형식으로 재구성
-- 대상: 대구 북구(lg_code=110209) 우선, 없으면 활성 지자체 최소값
-- 실행:
-- mysql --default-character-set=utf8mb4 -h 116.122.157.166 -u jongryangje -p jongryangje_dev < writable/database/free_recipient_reset_to_screenshot.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET CHARACTER_SET_CLIENT = utf8mb4;
SET @lg_idx := COALESCE(
(SELECT lg_idx FROM local_government WHERE lg_code = '110209' AND lg_state = 1 LIMIT 1),
(SELECT lg_idx FROM local_government WHERE lg_state = 1 ORDER BY lg_idx ASC LIMIT 1)
);
-- 기존 데이터 전체 삭제(해당 지자체)
DELETE FROM free_recipient
WHERE fr_lg_idx = @lg_idx;
-- 1) 읍.면.동 사무소 대상(동별 1건)
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
@lg_idx,
'office',
d.cd_name,
'',
'',
d.cd_code,
'',
'9999-12-31',
1,
NOW()
FROM code_detail d
INNER JOIN code_kind k ON k.ck_idx = d.cd_ck_idx
WHERE k.ck_code = 'D'
AND d.cd_state = 1
AND (d.cd_lg_idx IS NULL OR d.cd_lg_idx = 0 OR d.cd_lg_idx = @lg_idx)
AND d.cd_code <> ''
ORDER BY d.cd_code;
-- 2) 무료 대상자(스크린샷 하단 항목)
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
@lg_idx,
'target',
t.fr_name,
'',
'',
'',
'',
'9999-12-31',
1,
NOW()
FROM (
SELECT '한강관리과' AS fr_name
UNION ALL SELECT '항무과'
UNION ALL SELECT '도시시설기획과'
UNION ALL SELECT '국민복지과'
UNION ALL SELECT '자원순환과'
UNION ALL SELECT '교통과'
UNION ALL SELECT '대구시설과'
UNION ALL SELECT '공지인격과'
UNION ALL SELECT '재무과'
) t;

View File

@@ -0,0 +1,79 @@
-- 무료용 대상자 관리(스크린샷형) 데이터 반영
-- 실행 예:
-- mysql --default-character-set=utf8mb4 -h 116.122.157.166 -u jongryangje -p jongryangje_dev < writable/database/free_recipient_seed_from_screenshot.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET CHARACTER_SET_CLIENT = utf8mb4;
-- 대상 지자체: 대구 북구(lg_code=110209) 우선, 없으면 최소 활성 lg_idx
SET @lg_idx := COALESCE(
(SELECT lg_idx FROM local_government WHERE lg_code = '110209' AND lg_state = 1 LIMIT 1),
(SELECT lg_idx FROM local_government WHERE lg_state = 1 ORDER BY lg_idx ASC LIMIT 1)
);
-- 1) 동사무소(기관) 대상: 해당 지자체 동코드(D) 전체를 기본 등록
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
@lg_idx,
'office',
'읍.면.동 사무소',
'',
'',
d.cd_code,
d.cd_name,
'9999-12-31',
1,
NOW()
FROM code_detail d
INNER JOIN code_kind k ON k.ck_idx = d.cd_ck_idx
WHERE k.ck_code = 'D'
AND d.cd_state = 1
AND (d.cd_lg_idx IS NULL OR d.cd_lg_idx = @lg_idx)
AND d.cd_code <> ''
AND NOT EXISTS (
SELECT 1
FROM free_recipient f
WHERE f.fr_lg_idx = @lg_idx
AND f.fr_type_code = 'office'
AND f.fr_dong_code = d.cd_code
);
-- 2) 무료 대상자(기관/부서) 샘플: 스크린샷 하단 형태 반영
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
@lg_idx,
'target',
t.fr_name,
'',
'',
'',
'스크린샷형 기본 데이터',
'9999-12-31',
1,
NOW()
FROM (
SELECT '한강관리과' AS fr_name
UNION ALL SELECT '항무과'
UNION ALL SELECT '도시시설기획과'
UNION ALL SELECT '국민복지과'
UNION ALL SELECT '자원순환과'
UNION ALL SELECT '교통과'
UNION ALL SELECT '대구시설과'
UNION ALL SELECT '공지인격과'
UNION ALL SELECT '재무과'
) t
WHERE NOT EXISTS (
SELECT 1
FROM free_recipient f
WHERE f.fr_lg_idx = @lg_idx
AND f.fr_type_code = 'target'
AND f.fr_name = t.fr_name
);

View File

@@ -0,0 +1,22 @@
-- ============================================
-- 실사 팩 스냅샷 테이블
-- ============================================
CREATE TABLE IF NOT EXISTS `bag_inventory_inspection_pack_snapshot` (
`bisp_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bisp_bisi_idx` INT UNSIGNED NOT NULL COMMENT 'bag_inventory_inspection_item FK',
`bisp_lg_idx` INT UNSIGNED NOT NULL,
`bisp_bag_code` VARCHAR(50) NOT NULL,
`bisp_box_code` VARCHAR(80) NOT NULL DEFAULT '',
`bisp_pack_code` VARCHAR(80) NOT NULL,
`bisp_sheet_start_code` VARCHAR(120) NOT NULL,
`bisp_sheet_end_code` VARCHAR(120) NOT NULL,
`bisp_sheet_qty` INT UNSIGNED NOT NULL DEFAULT 0,
`bisp_actual_qty` INT UNSIGNED NULL DEFAULT NULL,
`bisp_diff_qty` INT NOT NULL DEFAULT 0,
`bisp_checked_yn` CHAR(1) NOT NULL DEFAULT 'N',
`bisp_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bisp_idx`),
UNIQUE KEY `uk_bisp_item_pack` (`bisp_bisi_idx`, `bisp_pack_code`),
KEY `idx_bisp_item` (`bisp_bisi_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='실사 팩 스냅샷';

View File

@@ -0,0 +1,19 @@
-- ============================================
-- 실사 낱장 스냅샷 테이블
-- ============================================
CREATE TABLE IF NOT EXISTS `bag_inventory_inspection_sheet_snapshot` (
`biss_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`biss_bisi_idx` INT UNSIGNED NOT NULL COMMENT 'bag_inventory_inspection_item FK',
`biss_lg_idx` INT UNSIGNED NOT NULL,
`biss_pack_code` VARCHAR(80) NOT NULL,
`biss_sheet_code` VARCHAR(120) NOT NULL,
`biss_system_qty` INT UNSIGNED NOT NULL DEFAULT 1,
`biss_actual_qty` INT UNSIGNED NULL DEFAULT NULL,
`biss_diff_qty` INT NOT NULL DEFAULT 0,
`biss_checked_yn` CHAR(1) NOT NULL DEFAULT 'N',
`biss_regdate` DATETIME NOT NULL,
PRIMARY KEY (`biss_idx`),
UNIQUE KEY `uk_biss_item_sheet` (`biss_bisi_idx`,`biss_sheet_code`),
KEY `idx_biss_item_pack` (`biss_bisi_idx`,`biss_pack_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='실사 낱장 스냅샷';

View File

@@ -0,0 +1,29 @@
-- ============================================
-- 실사(재고 실물조사) 테이블
-- ============================================
CREATE TABLE IF NOT EXISTS `bag_inventory_inspection` (
`bis_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bis_lg_idx` INT UNSIGNED NOT NULL,
`bis_work_date` DATE NOT NULL,
`bis_status` VARCHAR(20) NOT NULL DEFAULT 'selected' COMMENT 'selected/counted/applied',
`bis_reg_mb_idx` INT UNSIGNED NOT NULL DEFAULT 0,
`bis_regdate` DATETIME NOT NULL,
`bis_moddate` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`bis_idx`),
KEY `idx_bis_lg_work` (`bis_lg_idx`, `bis_work_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='실사 작업 헤더';
CREATE TABLE IF NOT EXISTS `bag_inventory_inspection_item` (
`bisi_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`bisi_bis_idx` INT UNSIGNED NOT NULL,
`bisi_bag_code` VARCHAR(50) NOT NULL,
`bisi_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`bisi_system_qty` INT NOT NULL DEFAULT 0,
`bisi_actual_qty` INT NULL DEFAULT NULL,
`bisi_diff_qty` INT NOT NULL DEFAULT 0,
`bisi_has_barcode` CHAR(1) NOT NULL DEFAULT 'Y',
`bisi_apply_yn` CHAR(1) NOT NULL DEFAULT 'N',
PRIMARY KEY (`bisi_idx`),
KEY `idx_bisi_bis` (`bisi_bis_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='실사 작업 품목';

View File

@@ -0,0 +1,66 @@
-- =============================================================================
-- 담당자(manager) 원격/운영 DB 보정 스크립트
-- =============================================================================
-- 목적
-- - 앱에서 사용하는 담당자 구분값(mg_dept_code): company | district | agency
-- - 테스트용처럼 보이지 않도록 성명·전화·이메일·직위코드를 현실적인 형태로 정리
--
-- 실행 전
-- 1) 반드시 백업(또는 스테이징 DB에서 먼저 검증)
-- 2) 아래 @LG_IDX 를 운영 지자체 PK로 맞추거나, 전체 지자체에 적용하려면 NULL 로 둠
--
-- 사용 예 (MySQL 클라이언트)
-- mysql -h HOST -u USER -p DBNAME < writable/database/manager_remote_realistic_update.sql
--
-- 주의
-- - 이 스크립트는 **기존 manager 행을 UPDATE** 합니다(INSERT 아님).
-- - mg_position_code 는 기존 시드에서 쓰던 직위 코드(1,2,3,5,6)를 순환 배정합니다.
-- 운영 DB에 해당 code_detail(T) 코드가 없다면 직위 셀렉트가 비어 보일 수 있으니, 그 경우 직위 UPDATE 블록만 주석 처리하세요.
-- =============================================================================
SET NAMES utf8mb4;
-- 적용 대상 지자체: 예) 대구 시범 lg_idx=1 이면 1 / 전체 적용이면 NULL
SET @LG_IDX := NULL;
-- ---------------------------------------------------------------------------
-- 1) 카테고리(담당자 구분) 부여: mg_idx 기준으로 3종 순환
-- ---------------------------------------------------------------------------
UPDATE `manager` m
SET m.`mg_dept_code` = ELT(MOD(m.`mg_idx`, 3) + 1, 'company', 'district', 'agency')
WHERE m.`mg_state` = 1
AND (@LG_IDX IS NULL OR m.`mg_lg_idx` = @LG_IDX);
-- ---------------------------------------------------------------------------
-- 2) 성명/전화/이메일/직위: mg_idx 기반으로 일관되게 생성(완전 난수 아님)
-- ---------------------------------------------------------------------------
UPDATE `manager` m
SET
m.`mg_name` = ELT(
MOD(m.`mg_idx`, 18) + 1,
'김민환', '이서연', '박지훈', '최유진', '정다운', '한채원',
'오승우', '윤가람', '강도현', '임하늘', '조은별', '배시현',
'문태영', '신재원', '홍수진', '권도영', '안예린', '유재혁'
),
m.`mg_tel` = CONCAT(
'053-661-',
LPAD(300 + MOD(m.`mg_idx`, 700), 4, '0')
),
m.`mg_phone` = CONCAT(
'010-',
LPAD(2000 + MOD(m.`mg_idx` * 7, 7999), 4, '0'),
'-',
LPAD(3000 + MOD(m.`mg_idx` * 11, 7999), 4, '0')
),
m.`mg_email` = CONCAT('waste.mgr.', m.`mg_idx`, '@daegu.go.kr'),
m.`mg_position_code` = ELT(MOD(m.`mg_idx`, 5) + 1, '1', '2', '3', '5', '6')
WHERE m.`mg_state` = 1
AND (@LG_IDX IS NULL OR m.`mg_lg_idx` = @LG_IDX);
-- ---------------------------------------------------------------------------
-- 3) 확인용 SELECT (실행 후 결과 점검)
-- ---------------------------------------------------------------------------
-- SELECT mg_idx, mg_lg_idx, mg_dept_code, mg_name, mg_position_code, mg_tel, mg_phone, mg_email
-- FROM manager
-- WHERE mg_state = 1 AND (@LG_IDX IS NULL OR mg_lg_idx = @LG_IDX)
-- ORDER BY mg_lg_idx, mg_idx;

View File

@@ -0,0 +1,14 @@
-- 통계 분석 관리 하위 메뉴 링크 (스크린샷 3종)
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/menu_analytics_links.sql
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
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/analytics/year-over-year'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics/monthly-trend'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics/seasonal-trend'
ELSE m.mm_link
END
WHERE m.mm_name IN ('전년 대비 판매 분석', '월별 판매 추이 분석', '계절별 판매 추이 분석');

View File

@@ -0,0 +1,11 @@
-- LOT-No 디스켓 불출 소메뉴 링크 보정
-- 실행:
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/menu_link_lot_seed_issue.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 = 'bag/order/lot-seed'
WHERE m.mm_name = 'LOT-No 디스켓 불출';

View File

@@ -26,7 +26,8 @@ SET m.mm_link = CASE m.mm_name
WHEN '환경 설정' THEN 'dashboard'
WHEN '지정 판매소 현황' THEN 'bag/designated-shops/district-new-cancel'
WHEN '발주 등록' THEN 'bag/order/create'
WHEN '발주 변경' THEN 'bag/bag-orders'
WHEN '발주 변경' THEN 'bag/order/change'
WHEN 'LOT-No 디스켓 불출' THEN 'bag/order/lot-seed'
WHEN '발주 현황' THEN 'bag/bag-orders'
WHEN '발주 입고[스캐너]' THEN 'bag/receiving/create'
WHEN '입고 현황' THEN 'bag/bag-receivings'
@@ -34,7 +35,7 @@ SET m.mm_link = CASE m.mm_name
WHEN '무료용 불출 처리' THEN 'bag/issue/create'
WHEN '무료용 불출 취소' THEN 'bag/issue'
WHEN '재고 현황' THEN 'bag/inventory'
WHEN '실사 관리' THEN 'bag/inventory/adjust'
WHEN '실사 선별 조회' THEN 'bag/inventory/inspection-select'
WHEN '전화 접수' THEN 'bag/shop-orders'
WHEN '전화 접수 관리' THEN 'bag/shop-orders'
WHEN '지정 판매소 판매' THEN 'bag/sale/create'
@@ -57,9 +58,9 @@ SET m.mm_link = CASE m.mm_name
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/analytics/year-over-year'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics/monthly-trend'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics/seasonal-trend'
WHEN '도움말 항목' THEN 'bag/help'
WHEN '원격 요청' THEN 'bag/help'
WHEN 'pda 리셋' THEN 'bag/help'

View File

@@ -0,0 +1,20 @@
-- 재고 관리 하위 메뉴 정리:
-- "재고 현황", "실사 선별 조회"를 제외한 항목 제거
--
-- 실행:
-- mysql --default-character-set=utf8mb4 -u ... -p DBNAME < writable/database/menu_site_prune_inventory_submenus.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DELETE m
FROM menu m
INNER JOIN menu p
ON p.mm_idx = m.mm_pidx
INNER JOIN menu_type t
ON t.mt_idx = m.mt_idx
WHERE t.mt_code = 'site'
AND p.mm_name IN ('재고 관리', '재고관리')
AND m.mm_link NOT IN ('bag/inventory', 'bag/inventory/inspection-select');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -82,7 +82,8 @@ INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '발주 등록' THEN 'bag/order/create'
WHEN '발주 변경' THEN 'bag/bag-orders'
WHEN '발주 변경' THEN 'bag/order/change'
WHEN 'LOT-No 디스켓 불출' THEN 'bag/order/lot-seed'
WHEN '발주 현황' THEN 'bag/bag-orders'
WHEN '발주 입고[스캐너]' THEN 'bag/receiving/create'
WHEN '입고 현황' THEN 'bag/bag-receivings'
@@ -148,20 +149,13 @@ INSERT INTO menu (mt_idx, lg_idx, mm_name, mm_link, mm_pidx, mm_dep, mm_num, mm_
SELECT @mt_site, 1, t.mm_name,
CASE t.mm_name
WHEN '재고 현황' THEN 'bag/inventory'
WHEN '실사 관리' THEN 'bag/inventory/adjust'
WHEN '실사 선별 조회' THEN 'bag/inventory/inspection-select'
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
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, '실사 등록 취소'
SELECT 1, '실사 선별 조회'
) AS t
WHERE @parent_inventory IS NOT NULL
AND NOT EXISTS (
@@ -298,9 +292,9 @@ 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,
CASE t.mm_name
WHEN '전년 대비 판매 분석' THEN 'bag/analytics'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics'
WHEN '전년 대비 판매 분석' THEN 'bag/analytics/year-over-year'
WHEN '월별 판매 추이 분석' THEN 'bag/analytics/monthly-trend'
WHEN '계절별 판매 추이 분석' THEN 'bag/analytics/seasonal-trend'
ELSE ''
END,
@parent_analytics, 1, t.mm_num, 0, '', 'Y'

View File

@@ -18,7 +18,7 @@ FROM (
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 7, '통계 분석 관리', 'bag/analytics/year-over-year' UNION ALL
SELECT 8, '', 'bag/window' UNION ALL
SELECT 9, '도움말', 'bag/help'
) AS t

View File

@@ -14,13 +14,18 @@ CREATE TABLE IF NOT EXISTS `bag_order` (
`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_bag_types` TEXT NULL COMMENT '봉투 종류 목록(JSON)',
`bo_unit_prices` TEXT NULL COMMENT '발주 단가 목록(JSON)',
`bo_qty_boxes` TEXT NULL COMMENT '발주 박스 수량 목록(JSON)',
`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`),
`bo_regdate` DATETIME NOT NULL COMMENT '등록일시',
`bo_moddate` DATETIME NULL DEFAULT NULL COMMENT '수정일시',
PRIMARY KEY (`bo_uuid`, `bo_version`),
-- 코드/화면 로직은 bo_idx(숫자 PK)로 조회/취소/삭제하고 있어, bo_idx도 유니크로 유지한다.
UNIQUE KEY `uk_bo_idx` (`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`),

View File

@@ -0,0 +1,23 @@
-- ============================================
-- 입고 팩/낱장 코드 테이블
-- ============================================
CREATE TABLE IF NOT EXISTS `bag_receiving_pack_code` (
`brpc_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`brpc_br_idx` INT UNSIGNED NOT NULL COMMENT 'bag_receiving FK',
`brpc_lg_idx` INT UNSIGNED NOT NULL,
`brpc_bag_code` VARCHAR(50) NOT NULL,
`brpc_bag_name` VARCHAR(100) NOT NULL DEFAULT '',
`brpc_lot_no` VARCHAR(50) NOT NULL DEFAULT '',
`brpc_box_code` VARCHAR(80) NOT NULL DEFAULT '',
`brpc_pack_code` VARCHAR(80) NOT NULL,
`brpc_sheet_start_code` VARCHAR(120) NOT NULL,
`brpc_sheet_end_code` VARCHAR(120) NOT NULL,
`brpc_sheet_qty` INT UNSIGNED NOT NULL DEFAULT 0,
`brpc_state` VARCHAR(20) NOT NULL DEFAULT 'in_stock',
`brpc_regdate` DATETIME NOT NULL,
PRIMARY KEY (`brpc_idx`),
UNIQUE KEY `uk_brpc_pack_code` (`brpc_pack_code`),
KEY `idx_brpc_br_idx` (`brpc_br_idx`),
KEY `idx_brpc_lg_bag` (`brpc_lg_idx`, `brpc_bag_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='입고 팩/낱장 코드';

View File

@@ -11,6 +11,7 @@ CREATE TABLE IF NOT EXISTS `shop_order` (
`so_order_date` DATE NOT NULL COMMENT '접수일',
`so_delivery_date` DATE NULL COMMENT '배달일',
`so_payment_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '이체/가상계좌',
`so_channel` VARCHAR(20) NOT NULL DEFAULT 'phone' COMMENT '접수채널 phone/web/app/counter',
`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,
@@ -20,7 +21,8 @@ CREATE TABLE IF NOT EXISTS `shop_order` (
`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`)
KEY `idx_so_ds_idx` (`so_ds_idx`),
KEY `idx_so_lg_order_channel` (`so_lg_idx`, `so_order_date`, `so_channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='주문 접수';
-- 주문 상세
@@ -79,3 +81,19 @@ CREATE TABLE IF NOT EXISTS `bag_issue` (
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='무료용 불출';
CREATE TABLE IF NOT EXISTS `bag_issue_item_code` (
`bic_idx` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`bic_lg_idx` INT UNSIGNED NOT NULL,
`bic_bi2_idx` INT UNSIGNED NOT NULL COMMENT 'bag_issue.bi2_idx',
`bic_bag_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '봉투 종류 코드',
`bic_issue_code` VARCHAR(80) NOT NULL DEFAULT '' COMMENT '불출 품목 코드',
`bic_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '원수량(낱장)',
`bic_cancel_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '취소수량(낱장)',
`bic_state` VARCHAR(10) NOT NULL DEFAULT 'normal' COMMENT 'normal/cancelled',
`bic_regdate` DATETIME NOT NULL,
PRIMARY KEY (`bic_idx`),
KEY `idx_bic_lg_idx` (`bic_lg_idx`),
KEY `idx_bic_bi2_idx` (`bic_bi2_idx`),
KEY `idx_bic_issue_code` (`bic_issue_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 불출 품목코드 상세';

View File

@@ -62,43 +62,45 @@ INSERT INTO `free_recipient` (`fr_lg_idx`, `fr_type_code`, `fr_name`, `fr_phone`
(@LG_IDX, '4', '봉덕종합사회복지관', '053-664-7000', '대구 남구 봉덕로 120', '11020403', '복지시설 30L 150매/월', NULL, 1, NOW());
-- ================================================================
-- 6. 봉투 단가 (bag_price) — 남구 주요 봉투 현행 단가
-- 6. 봉투 단가 (bag_price) — 대구시 공식 판매가 2024.7.1 기준
-- https://www.daegu.go.kr/env/index.do?menu_id=00001325
-- 발주단가≈판매가20%, 도매가≈판매가93%
-- ================================================================
INSERT INTO `bag_price` (`bp_lg_idx`, `bp_bag_code`, `bp_bag_name`, `bp_order_price`, `bp_wholesale`, `bp_consumer`, `bp_start_date`, `bp_end_date`, `bp_state`, `bp_regdate`) VALUES
(@LG_IDX, '10112', '일반용 3L', 25.00, 60.00, 80.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10122', '일반용 5L', 35.00, 100.00, 130.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10132', '일반용 10L', 60.00, 190.00, 250.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10152', '일반용 20L', 100.00, 370.00, 490.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10162', '일반용 30L', 140.00, 540.00, 710.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10172', '일반용 50L', 210.00, 860.00, 1130.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10192', '일반용 75L', 300.00, 1280.00, 1690.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10202', '일반용 100L', 380.00, 1700.00, 2250.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '60102', '음식물 2L', 18.00, 50.00, 60.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '60132', '음식물 10L', 70.00, 210.00, 280.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '40152', '공동주택용 20L', 90.00, 350.00, 460.00, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '20172', '공공용 50L', 180.00, 700.00, 0.00, '2025-01-01', NULL, 1, NOW());
(@LG_IDX, '10112', '일반용 3L', 24.00, 112.00, 120.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10122', '일반용 5L', 36.00, 167.00, 180.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10132', '일반용 10L', 68.00, 316.00, 340.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10152', '일반용 20L', 134.00, 623.00, 670.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10162', '일반용 30L', 216.00, 1004.00, 1080.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10172', '일반용 50L', 332.00, 1544.00, 1660.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10192', '일반용 75L', 494.00, 2297.00, 2470.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10202', '일반용 100L', 0.00, 0.00, 0.00, '2024-07-01', NULL, 0, NOW()),
(@LG_IDX, '60102', '음식물 2L', 22.00, 102.00, 110.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '60132', '음식물 10L', 116.00, 539.00, 580.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '40152', '공동주택용 20L', 128.00, 596.00, 640.00, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '20172', '공공용 50L', 332.00, 1544.00, 1660.00, '2024-07-01', NULL, 1, NOW());
-- 이전 단가 (2024, 만료)
-- 이전 단가 (2024.7.1 인상 전, 만료)
INSERT INTO `bag_price` (`bp_lg_idx`, `bp_bag_code`, `bp_bag_name`, `bp_order_price`, `bp_wholesale`, `bp_consumer`, `bp_start_date`, `bp_end_date`, `bp_state`, `bp_regdate`) VALUES
(@LG_IDX, '10152', '일반용 20L', 95.00, 350.00, 460.00, '2024-01-01', '2024-12-31', 0, '2024-01-01'),
(@LG_IDX, '10172', '일반용 50L', 200.00, 820.00, 1080.00, '2024-01-01', '2024-12-31', 0, '2024-01-01');
(@LG_IDX, '10152', '일반용 20L', 120.00, 560.00, 600.00, '2023-01-01', '2024-06-30', 0, '2023-01-01'),
(@LG_IDX, '10172', '일반용 50L', 300.00, 1400.00, 1500.00, '2023-01-01', '2024-06-30', 0, '2023-01-01');
-- ================================================================
-- 7. 포장 단위 (packaging_unit) — 주요 봉투
-- 7. 포장 단위 (packaging_unit) — 대구 동구청 가격표 묶음·박스 매수 (일반 3L=20매/팩·3000매/박스 등)
-- ================================================================
INSERT INTO `packaging_unit` (`pu_lg_idx`, `pu_bag_code`, `pu_bag_name`, `pu_box_per_pack`, `pu_pack_per_sheet`, `pu_total_per_box`, `pu_start_date`, `pu_end_date`, `pu_state`, `pu_regdate`) VALUES
(@LG_IDX, '10112', '일반용 3L', 20, 50, 1000, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10122', '일반용 5L', 20, 50, 1000, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10132', '일반용 10L', 10, 50, 500, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10152', '일반용 20L', 10, 50, 500, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10162', '일반용 30L', 10, 30, 300, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10172', '일반용 50L', 10, 20, 200, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10192', '일반용 75L', 5, 20, 100, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '10202', '일반용 100L', 5, 10, 50, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '60102', '음식물 2L', 20, 50, 1000, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '60132', '음식물 10L', 10, 50, 500, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '40152', '공동주택용 20L', 10, 50, 500, '2025-01-01', NULL, 1, NOW()),
(@LG_IDX, '20172', '공공용 50L', 10, 20, 200, '2025-01-01', NULL, 1, NOW());
(@LG_IDX, '10112', '일반용 3L', 150, 20, 3000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10122', '일반용 5L', 150, 20, 3000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10132', '일반용 10L', 200, 10, 2000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10152', '일반용 20L', 20, 50, 1000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10162', '일반용 30L', 6, 50, 300, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10172', '일반용 50L', 25, 20, 500, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10192', '일반용 75L', 30, 10, 300, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '10202', '일반용 100L', 5, 10, 50, '2024-07-01', NULL, 0, NOW()),
(@LG_IDX, '60102', '음식물 2L', 10, 100, 1000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '60132', '음식물 10L', 10, 50, 500, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '40152', '공동주택용 20L', 20, 50, 1000, '2024-07-01', NULL, 1, NOW()),
(@LG_IDX, '20172', '공공용 50L', 25, 20, 500, '2024-07-01', NULL, 1, NOW());
-- ================================================================
-- 8. 발주 (bag_order + bag_order_item) — 2025~2026 분기별 발주
@@ -111,39 +113,39 @@ INSERT INTO `bag_order` (`bo_uuid`, `bo_version`, `bo_lg_idx`, `bo_gugun_code`,
(UUID(), 1, @LG_IDX, '110204', '', @CO1, @AG1, 3.50, '2025-01-15', 'LOT-2025-Q1-001', SHA2(UUID(), 256), 'normal', '2025-01-15 09:00:00');
SET @BO1 = LAST_INSERT_ID();
INSERT INTO `bag_order_item` (`boi_bo_idx`, `boi_bag_code`, `boi_bag_name`, `boi_unit_price`, `boi_qty_box`, `boi_qty_sheet`, `boi_amount`) VALUES
(@BO1, '10152', '일반용 20L', 100.00, 200, 100000, 10000000.00),
(@BO1, '10172', '일반용 50L', 210.00, 80, 16000, 3360000.00),
(@BO1, '10132', '일반용 10L', 60.00, 100, 50000, 3000000.00),
(@BO1, '60102', '음식물 2L', 18.00, 150, 150000, 2700000.00);
(@BO1, '10152', '일반용 20L', 134.00, 200, 100000, 13400000.00),
(@BO1, '10172', '일반용 50L', 332.00, 80, 16000, 5312000.00),
(@BO1, '10132', '일반용 10L', 68.00, 100, 50000, 3400000.00),
(@BO1, '60102', '음식물 2L', 22.00, 150, 150000, 3300000.00);
-- 2025 Q2 발주
INSERT INTO `bag_order` (`bo_uuid`, `bo_version`, `bo_lg_idx`, `bo_gugun_code`, `bo_dong_code`, `bo_company_idx`, `bo_agency_idx`, `bo_fee_rate`, `bo_order_date`, `bo_lot_no`, `bo_hash`, `bo_status`, `bo_regdate`) VALUES
(UUID(), 1, @LG_IDX, '110204', '', @CO1, @AG1, 3.50, '2025-04-10', 'LOT-2025-Q2-001', SHA2(UUID(), 256), 'normal', '2025-04-10 09:00:00');
SET @BO2 = LAST_INSERT_ID();
INSERT INTO `bag_order_item` (`boi_bo_idx`, `boi_bag_code`, `boi_bag_name`, `boi_unit_price`, `boi_qty_box`, `boi_qty_sheet`, `boi_amount`) VALUES
(@BO2, '10152', '일반용 20L', 100.00, 250, 125000, 12500000.00),
(@BO2, '10172', '일반용 50L', 210.00, 100, 20000, 4200000.00),
(@BO2, '10162', '일반용 30L', 140.00, 60, 18000, 2520000.00);
(@BO2, '10152', '일반용 20L', 134.00, 340, 125000, 16750000.00),
(@BO2, '10172', '일반용 50L', 332.00, 100, 20000, 6640000.00),
(@BO2, '10162', '일반용 30L', 216.00, 60, 18000, 3888000.00);
-- 2025 Q3 발주
INSERT INTO `bag_order` (`bo_uuid`, `bo_version`, `bo_lg_idx`, `bo_gugun_code`, `bo_dong_code`, `bo_company_idx`, `bo_agency_idx`, `bo_fee_rate`, `bo_order_date`, `bo_lot_no`, `bo_hash`, `bo_status`, `bo_regdate`) VALUES
(UUID(), 1, @LG_IDX, '110204', '', @CO1, @AG1, 3.50, '2025-07-15', 'LOT-2025-Q3-001', SHA2(UUID(), 256), 'normal', '2025-07-15 09:00:00');
SET @BO3 = LAST_INSERT_ID();
INSERT INTO `bag_order_item` (`boi_bo_idx`, `boi_bag_code`, `boi_bag_name`, `boi_unit_price`, `boi_qty_box`, `boi_qty_sheet`, `boi_amount`) VALUES
(@BO3, '10152', '일반용 20L', 100.00, 220, 110000, 11000000.00),
(@BO3, '10132', '일반용 10L', 60.00, 120, 60000, 3600000.00),
(@BO3, '60132', '음식물 10L', 70.00, 80, 40000, 2800000.00);
(@BO3, '10152', '일반용 20L', 134.00, 220, 110000, 14740000.00),
(@BO3, '10132', '일반용 10L', 68.00, 120, 60000, 4080000.00),
(@BO3, '60132', '음식물 10L', 116.00, 80, 40000, 4640000.00);
-- 2026 Q1 발주 (최근)
INSERT INTO `bag_order` (`bo_uuid`, `bo_version`, `bo_lg_idx`, `bo_gugun_code`, `bo_dong_code`, `bo_company_idx`, `bo_agency_idx`, `bo_fee_rate`, `bo_order_date`, `bo_lot_no`, `bo_hash`, `bo_status`, `bo_regdate`) VALUES
(UUID(), 1, @LG_IDX, '110204', '', @CO1, @AG1, 3.50, '2026-01-20', 'LOT-2026-Q1-001', SHA2(UUID(), 256), 'normal', '2026-01-20 09:00:00');
SET @BO4 = LAST_INSERT_ID();
INSERT INTO `bag_order_item` (`boi_bo_idx`, `boi_bag_code`, `boi_bag_name`, `boi_unit_price`, `boi_qty_box`, `boi_qty_sheet`, `boi_amount`) VALUES
(@BO4, '10152', '일반용 20L', 100.00, 300, 150000, 15000000.00),
(@BO4, '10172', '일반용 50L', 210.00, 120, 24000, 5040000.00),
(@BO4, '10132', '일반용 10L', 60.00, 150, 75000, 4500000.00),
(@BO4, '60102', '음식물 2L', 18.00, 200, 200000, 3600000.00),
(@BO4, '10162', '일반용 30L', 140.00, 50, 15000, 2100000.00);
(@BO4, '10152', '일반용 20L', 134.00, 300, 150000, 20100000.00),
(@BO4, '10172', '일반용 50L', 332.00, 120, 24000, 7968000.00),
(@BO4, '10132', '일반용 10L', 68.00, 150, 75000, 5100000.00),
(@BO4, '60102', '음식물 2L', 22.00, 200, 200000, 4400000.00),
(@BO4, '10162', '일반용 30L', 216.00, 50, 15000, 3240000.00);
-- 취소된 발주 1건
INSERT INTO `bag_order` (`bo_uuid`, `bo_version`, `bo_lg_idx`, `bo_gugun_code`, `bo_dong_code`, `bo_company_idx`, `bo_agency_idx`, `bo_fee_rate`, `bo_order_date`, `bo_lot_no`, `bo_hash`, `bo_status`, `bo_regdate`) VALUES
@@ -157,7 +159,7 @@ INSERT INTO `bag_receiving` (`br_bo_idx`, `br_lg_idx`, `br_bag_code`, `br_bag_na
(@BO1, @LG_IDX, '10172', '일반용 50L', 80, 16000, '2025-02-01', '(주)대구폴리머', 'scanner', '2025-02-01 10:30:00'),
(@BO1, @LG_IDX, '10132', '일반용 10L', 100, 50000, '2025-02-03', '(주)대구폴리머', 'scanner', '2025-02-03 09:00:00'),
(@BO1, @LG_IDX, '60102', '음식물 2L', 150, 150000, '2025-02-03', '(주)대구폴리머', 'scanner', '2025-02-03 09:30:00'),
(@BO2, @LG_IDX, '10152', '일반용 20L', 250, 125000, '2025-04-25', '(주)대구폴리머', 'scanner', '2025-04-25 10:00:00'),
(@BO2, @LG_IDX, '10152', '일반용 20L', 340, 125000, '2025-04-25', '(주)대구폴리머', 'scanner', '2025-04-25 10:00:00'),
(@BO2, @LG_IDX, '10172', '일반용 50L', 100, 20000, '2025-04-25', '(주)대구폴리머', 'scanner', '2025-04-25 10:30:00'),
(@BO2, @LG_IDX, '10162', '일반용 30L', 60, 18000, '2025-04-28', '(주)영남포장', 'scanner', '2025-04-28 09:00:00'),
(@BO3, @LG_IDX, '10152', '일반용 20L', 220, 110000, '2025-08-01', '(주)대구폴리머', 'scanner', '2025-08-01 10:00:00'),
@@ -206,41 +208,41 @@ INSERT INTO `shop_order` (`so_lg_idx`, `so_ds_idx`, `so_ds_name`, `so_order_date
-- 주문 품목
SET @SO1 = (SELECT so_idx FROM shop_order WHERE so_lg_idx = @LG_IDX ORDER BY so_idx ASC LIMIT 1);
INSERT INTO `shop_order_item` (`soi_so_idx`, `soi_bag_code`, `soi_bag_name`, `soi_unit_price`, `soi_qty`, `soi_amount`, `soi_box_count`, `soi_pack_count`, `soi_sheet_count`) VALUES
(@SO1, '10152', '일반용 20L', 490.00, 300, 147000, 0, 6, 300),
(@SO1, '10132', '일반용 10L', 250.00, 200, 50000, 0, 4, 200);
(@SO1, '10152', '일반용 20L', 670.00, 300, 201000, 0, 6, 300),
(@SO1, '10132', '일반용 10L', 340.00, 200, 68000, 0, 4, 200);
SET @SO2 = @SO1 + 1;
INSERT INTO `shop_order_item` (`soi_so_idx`, `soi_bag_code`, `soi_bag_name`, `soi_unit_price`, `soi_qty`, `soi_amount`, `soi_box_count`, `soi_pack_count`, `soi_sheet_count`) VALUES
(@SO2, '10152', '일반용 20L', 490.00, 300, 147000, 0, 6, 300);
(@SO2, '10152', '일반용 20L', 670.00, 300, 201000, 0, 6, 300);
-- ================================================================
-- 12. 판매/반품 (bag_sale) — 2026년 1~3월 판매 데이터
-- ================================================================
INSERT INTO `bag_sale` (`bs_lg_idx`, `bs_ds_idx`, `bs_ds_name`, `bs_sale_date`, `bs_bag_code`, `bs_bag_name`, `bs_qty`, `bs_unit_price`, `bs_amount`, `bs_type`, `bs_regdate`) VALUES
-- 3월
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-02', '10152', '일반용 20L', 150, 490, 73500, 'sale', '2026-03-02 10:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-02', '10132', '일반용 10L', 100, 250, 25000, 'sale', '2026-03-02 10:05:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-05', '10152', '일반용 20L', 200, 490, 98000, 'sale', '2026-03-05 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-08', '10172', '일반용 50L', 80, 1130, 90400, 'sale', '2026-03-08 09:30:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-08', '10152', '일반용 20L', 300, 490, 147000, 'sale', '2026-03-08 09:35:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-03-12', '10132', '일반용 10L', 200, 250, 50000, 'sale', '2026-03-12 10:00:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-03-12', '60102', '음식물 2L', 300, 60, 18000, 'sale', '2026-03-12 10:05:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-18', '10152', '일반용 20L', 250, 490, 122500, 'sale', '2026-03-18 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-22', '10162', '일반용 30L', 100, 710, 71000, 'sale', '2026-03-22 11:30:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-25', '10152', '일반용 20L', 400, 490, 196000, 'sale', '2026-03-25 09:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-02', '10152', '일반용 20L', 150, 670, 100500, 'sale', '2026-03-02 10:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-02', '10132', '일반용 10L', 100, 340, 34000, 'sale', '2026-03-02 10:05:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-05', '10152', '일반용 20L', 200, 670, 134000, 'sale', '2026-03-05 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-08', '10172', '일반용 50L', 80, 1660, 132800, 'sale', '2026-03-08 09:30:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-08', '10152', '일반용 20L', 300, 670, 201000, 'sale', '2026-03-08 09:35:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-03-12', '10132', '일반용 10L', 200, 340, 68000, 'sale', '2026-03-12 10:00:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-03-12', '60102', '음식물 2L', 300, 110, 33000, 'sale', '2026-03-12 10:05:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-03-18', '10152', '일반용 20L', 250, 670, 167500, 'sale', '2026-03-18 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-22', '10162', '일반용 30L', 100, 1080, 108000, 'sale', '2026-03-22 11:30:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-03-25', '10152', '일반용 20L', 400, 670, 268000, 'sale', '2026-03-25 09:00:00'),
-- 2월
(@LG_IDX, @DS1, 'CU 대명점', '2026-02-05', '10152', '일반용 20L', 180, 490, 88200, 'sale', '2026-02-05 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-02-10', '10152', '일반용 20L', 220, 490, 107800, 'sale', '2026-02-10 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-02-15', '10172', '일반용 50L', 60, 1130, 67800, 'sale', '2026-02-15 09:30:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-02-20', '60102', '음식물 2L', 500, 60, 30000, 'sale', '2026-02-20 10:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-02-25', '10132', '일반용 10L', 300, 250, 75000, 'sale', '2026-02-25 10:30:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-02-05', '10152', '일반용 20L', 180, 670, 120600, 'sale', '2026-02-05 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-02-10', '10152', '일반용 20L', 220, 670, 147400, 'sale', '2026-02-10 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-02-15', '10172', '일반용 50L', 60, 1660, 99600, 'sale', '2026-02-15 09:30:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-02-20', '60102', '음식물 2L', 500, 110, 55000, 'sale', '2026-02-20 10:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-02-25', '10132', '일반용 10L', 300, 340, 102000, 'sale', '2026-02-25 10:30:00'),
-- 1월
(@LG_IDX, @DS1, 'CU 대명점', '2026-01-08', '10152', '일반용 20L', 200, 490, 98000, 'sale', '2026-01-08 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-01-15', '10172', '일반용 50L', 50, 1130, 56500, 'sale', '2026-01-15 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-01-22', '10152', '일반용 20L', 350, 490, 171500, 'sale', '2026-01-22 09:30:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-01-28', '10132', '일반용 10L', 150, 250, 37500, 'sale', '2026-01-28 10:00:00'),
(@LG_IDX, @DS1, 'CU 대명점', '2026-01-08', '10152', '일반용 20L', 200, 670, 134000, 'sale', '2026-01-08 10:00:00'),
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-01-15', '10172', '일반용 50L', 50, 1660, 83000, 'sale', '2026-01-15 11:00:00'),
(@LG_IDX, @DS3, '세븐일레븐 남구청점', '2026-01-22', '10152', '일반용 20L', 350, 670, 234500, 'sale', '2026-01-22 09:30:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-01-28', '10132', '일반용 10L', 150, 340, 51000, 'sale', '2026-01-28 10:00:00'),
-- 반품 2건
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-10', '10152', '일반용 20L', 50, 490, 24500, 'return', '2026-03-10 14:00:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-02-28', '10132', '일반용 10L', 30, 250, 7500, 'return', '2026-02-28 15:00:00');
(@LG_IDX, @DS2, 'GS25 앞산점', '2026-03-10', '10152', '일반용 20L', 50, 670, 33500, 'return', '2026-03-10 14:00:00'),
(@LG_IDX, @DS4, '봉덕슈퍼', '2026-02-28', '10132', '일반용 10L', 30, 340, 10200, 'return', '2026-02-28 15:00:00');
-- ================================================================
-- 13. 무료용 불출 (bag_issue)

View File

@@ -0,0 +1,10 @@
-- shop_order 접수채널 컬럼 추가
-- 실행 대상: 이미 운영/개발 DB가 생성된 환경
ALTER TABLE `shop_order`
ADD COLUMN `so_channel` VARCHAR(20) NOT NULL DEFAULT 'phone' COMMENT '접수채널 phone/web/app/counter'
AFTER `so_payment_type`;
ALTER TABLE `shop_order`
ADD KEY `idx_so_lg_order_channel` (`so_lg_idx`, `so_order_date`, `so_channel`);