# 물류·판매 테이블 DDL > 품목·단가·포장단위·발주·입고·주문·수불. 노션 ERD(Product, InboundReceipt, SalesOrder, StockTransaction) 반영. --- ## 1. product (지자체별 취급 품목) 지자체별 봉투 규격·용량. 단가는 `product_price`에서 적용일자별 관리. ```sql CREATE TABLE IF NOT EXISTS `product` ( `pr_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '품목 PK', `pr_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `pr_code` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '봉투/규격 코드', `pr_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '일반,음식물,재사용', `pr_capacity` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '3L,5L,10L 등', `pr_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '품목 명칭', `pr_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=사용, 0=미사용', `pr_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`pr_idx`), KEY `idx_pr_lg_idx` (`pr_lg_idx`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='지자체별 취급 품목'; ``` --- ## 2. product_price (적용일자별 단가) F-MD-02: 발주 단가, 도매가, 소비자가. 시계열 이력(적용일자 변경 시 이전 구간 보존). ```sql CREATE TABLE IF NOT EXISTS `product_price` ( `pp_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '단가 PK', `pp_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `pp_pr_idx` INT UNSIGNED NOT NULL COMMENT 'product FK', `pp_apply_from` DATE NOT NULL COMMENT '적용 시작일', `pp_apply_to` DATE NULL DEFAULT NULL COMMENT '적용 종료일(NULL=현재 유효)', `pp_purchase` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '발주 단가', `pp_wholesale` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '도매가', `pp_retail` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '소비자가', `pp_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`pp_idx`), KEY `idx_pp_lg_idx` (`pp_lg_idx`), KEY `idx_pp_pr_idx` (`pp_pr_idx`), KEY `idx_pp_apply` (`pp_apply_from`, `pp_apply_to`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='품목별 단가(적용일자)'; ``` --- ## 3. packaging_unit (포장 단위) F-MD-03: 박스당 팩 수, 팩당 낱장 수, 총 수량. 적용일자 이력 관리. ```sql CREATE TABLE IF NOT EXISTS `packaging_unit` ( `pu_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '포장단위 PK', `pu_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `pu_pr_idx` INT UNSIGNED NOT NULL COMMENT 'product FK', `pu_apply_from` DATE NOT NULL COMMENT '적용 시작일', `pu_apply_to` DATE NULL DEFAULT NULL COMMENT '적용 종료일', `pu_box_to_pack` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '박스당 팩 수', `pu_pack_to_sheet` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '팩당 낱장 수', `pu_total` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '총 수량(박스당 낱장)', `pu_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`pu_idx`), KEY `idx_pu_lg_idx` (`pu_lg_idx`), KEY `idx_pu_pr_idx` (`pu_pr_idx`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='포장 단위'; ``` --- ## 4. purchase_order (발주) 지자체 → 제작업체 발주. 구/군·동 코드, 제작업체, 봉투 종류, 수량, LOT·버전·상태. ```sql CREATE TABLE IF NOT EXISTS `purchase_order` ( `po_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '발주 PK', `po_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `po_uuid` CHAR(36) NOT NULL DEFAULT '' COMMENT '버전 관리용 UUID', `po_version` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '버전(수정 시 +1 insert)', `po_gugun_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '구/군 코드', `po_dong_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '동 코드', `po_co_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '제작업체 company FK', `po_pr_idx` INT UNSIGNED NOT NULL COMMENT '품목 FK', `po_unit_price` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '발주 단가', `po_box_qty` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '발주 박스 수량', `po_order_date` DATE NOT NULL COMMENT '발주일', `po_mb_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '발주자 member FK', `po_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 2=취소, 0=삭제', `po_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`po_idx`), KEY `idx_po_lg_idx` (`po_lg_idx`), KEY `idx_po_uuid_version` (`po_uuid`, `po_version`), KEY `idx_po_order_date` (`po_order_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='발주'; ``` --- ## 5. inbound_receipt (입고 내역) 노션 ERD InboundReceipt. LOT 번호·PDF417 바코드 연동. 발주(purchase_order) 단위 입고. ```sql CREATE TABLE IF NOT EXISTS `inbound_receipt` ( `ir_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '입고 PK', `ir_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `ir_po_idx` INT UNSIGNED NOT NULL COMMENT '발주 FK(LOT 단위)', `ir_pr_idx` INT UNSIGNED NOT NULL COMMENT '품목 FK', `ir_lot_number` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'LOT 번호(PDF417 연동)', `ir_quantity` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '입고 수량', `ir_unit` VARCHAR(10) NOT NULL DEFAULT 'BOX' COMMENT 'BOX,PACK,SHEET', `ir_receipt_date` DATETIME NOT NULL COMMENT '입고일시', `ir_mb_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '인수자 member FK', `ir_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`ir_idx`), KEY `idx_ir_lg_idx` (`ir_lg_idx`), KEY `idx_ir_po_idx` (`ir_po_idx`), KEY `idx_ir_lot_number` (`ir_lot_number`), KEY `idx_ir_receipt_date` (`ir_receipt_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='입고 내역'; ``` --- ## 6. sales_order (판매소 주문) 노션 ERD SalesOrder. 지정판매소 주문, 결제상태. `so_lg_idx` = 데이터 격리용. ```sql CREATE TABLE IF NOT EXISTS `sales_order` ( `so_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '주문 PK', `so_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK(데이터 격리)', `so_ds_idx` INT UNSIGNED NOT NULL COMMENT '지정판매소 FK', `so_order_no` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '접수/주문 번호', `so_order_date` DATETIME NOT NULL COMMENT '주문일시', `so_delivery_date` DATE NULL DEFAULT NULL COMMENT '배달일', `so_total_amount` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '총 금액', `so_payment_status` VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '입금대기,완료,취소', `so_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 0=취소', `so_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`so_idx`), KEY `idx_so_lg_idx` (`so_lg_idx`), KEY `idx_so_ds_idx` (`so_ds_idx`), KEY `idx_so_order_date` (`so_order_date`), KEY `idx_so_payment_status` (`so_payment_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='판매소 주문'; ``` - 주문 상세(품목·수량·금액)는 별도 `sales_order_item` 테이블로 확장 가능. --- ## 7. stock_transaction (수불) 노션 ERD StockTransaction. 입고(IN), 판매(OUT), 불출(FREE), 파기(DISCARD). reference로 주문/입고 연결. ```sql CREATE TABLE IF NOT EXISTS `stock_transaction` ( `st_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '수불 PK', `st_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK', `st_pr_idx` INT UNSIGNED NOT NULL COMMENT '품목 FK', `st_trans_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT 'IN,OUT,FREE,DISCARD', `st_quantity` INT NOT NULL DEFAULT 0 COMMENT '수량(+입고/-출고)', `st_ref_table` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '참조 테이블: inbound_receipt,sales_order 등', `st_ref_id` INT UNSIGNED NULL DEFAULT NULL COMMENT '참조 PK', `st_trans_date` DATETIME NOT NULL COMMENT '수불 일시', `st_mb_idx` INT UNSIGNED NULL DEFAULT NULL COMMENT '처리자 member FK', `st_regdate` DATETIME NOT NULL COMMENT '등록일시', PRIMARY KEY (`st_idx`), KEY `idx_st_lg_idx` (`st_lg_idx`), KEY `idx_st_pr_idx` (`st_pr_idx`), KEY `idx_st_trans_type` (`st_trans_type`), KEY `idx_st_trans_date` (`st_trans_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='수불 내역'; ```