Files
dbx-main/scripts/sql/cupang_db_006_sales.sql
T
king 0979a89ed9 feat(cupang): 쿠팡 로켓 매출 화면 + cupang_sales 테이블
- scripts/sql/cupang_db_006_sales.sql: cupang_sales(발주 라인) / cupang_sales_weekly(광고비·할인·장려금) 생성
- scripts/sql/cupang_sales_seed.sql: 구글 시트 초기 데이터 2,218행 + 주차비용 100건
  (공급가 합계가 시트 2024/2025 총계와 일치)
- /cupang/sales: 기간·센터·발주유형·검색 조회, 합계 KPI(공급가/원가/물류비/마진/순마진),
  행 추가·수정·삭제, 시트(xlsx·csv) 업로드 일괄 등록, 조회 조건 그대로 엑셀 다운로드
- 달력 상단에 "쿠팡 로켓 매출" 버튼 추가
- sales_import.py: 병합 머리글 3행 건너뛰고 라인/주차 소계 분리, 월계·총계는 저장하지 않음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:03:08 +09:00

83 lines
5.1 KiB
SQL

-- ════════════════════════════════════════════════════════════
-- 쿠팡 로켓 매출 (cupang_sales / cupang_sales_weekly)
-- 구글 시트 "쿠팡 로켓 매출" 양식을 그대로 담는다.
-- · cupang_sales : 발주 라인 1건 = 1행
-- · cupang_sales_weekly : 주차 단위로만 있는 값(광고비/할인 프로모션/장려금)
-- 주차·월 소계는 저장하지 않고 화면에서 합산한다.
-- 멱등 — 여러 번 실행해도 안전.
-- 적용: docker exec -i postgres-db psql -U postgres -d cupang_db < scripts/sql/cupang_db_006_sales.sql
-- ════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS cupang_sales (
id BIGSERIAL PRIMARY KEY,
week_label TEXT NOT NULL DEFAULT '', -- 예: 8월2주차(8/11~8/17)
seq INTEGER, -- 시트의 순번
po_no TEXT NOT NULL DEFAULT '', -- 발주번호
po_type TEXT NOT NULL DEFAULT '일반',-- 발주유형(일반/벤더플렉스 등)
order_date DATE, -- 발주일
ship_date DATE, -- 핫프렌즈 출고일
center_arrival_date DATE, -- 쿠팡FC센터 입고일
sku_id TEXT NOT NULL DEFAULT '', -- SKUID
barcode TEXT NOT NULL DEFAULT '',
item_name TEXT NOT NULL DEFAULT '', -- 품목
quantity INTEGER NOT NULL DEFAULT 0,
center_name TEXT NOT NULL DEFAULT '', -- 입고센터
supply_unit_price NUMERIC(14,2) NOT NULL DEFAULT 0, -- 공급단가
supply_amount NUMERIC(16,2) NOT NULL DEFAULT 0, -- 공급가
cost_unit_price NUMERIC(14,2) NOT NULL DEFAULT 0, -- 원가(단가)
cost_amount NUMERIC(16,2) NOT NULL DEFAULT 0, -- 원가(발주량)
picking_unit_price NUMERIC(14,2) NOT NULL DEFAULT 0, -- 물류비 피킹비 단가
picking_amount NUMERIC(16,2) NOT NULL DEFAULT 0, -- 물류비 피킹비 합계
milkrun_amount NUMERIC(16,2) NOT NULL DEFAULT 0, -- 밀크런/쉽먼트
logistics_total NUMERIC(16,2) NOT NULL DEFAULT 0, -- 물류비 합계
logistics_ratio NUMERIC(9,4) NOT NULL DEFAULT 0, -- 물류비중(%)
margin NUMERIC(16,2) NOT NULL DEFAULT 0, -- 마진
margin_rate NUMERIC(9,4) NOT NULL DEFAULT 0, -- 마진율(%)
stock_deduct_memo TEXT NOT NULL DEFAULT '', -- 사방넷 재고차감일(메모형)
memo TEXT NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_ship_date ON cupang_sales (ship_date);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_order_date ON cupang_sales (order_date);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_po_no ON cupang_sales (po_no);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_center ON cupang_sales (center_name);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_sku ON cupang_sales (sku_id);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_week ON cupang_sales (week_label);
-- 같은 발주번호 + SKU + 출고일 조합은 한 번만 (업로드 재실행 시 중복 방지)
CREATE UNIQUE INDEX IF NOT EXISTS uq_cupang_sales_line
ON cupang_sales (po_no, sku_id, ship_date, center_name, quantity);
-- 주차 단위 비용 — 라인이 아니라 주차에만 붙는 값
CREATE TABLE IF NOT EXISTS cupang_sales_weekly (
id BIGSERIAL PRIMARY KEY,
week_label TEXT NOT NULL UNIQUE, -- 예: 8월2주차(8/11~8/17)
week_from DATE,
week_to DATE,
ad_cost NUMERIC(16,2) NOT NULL DEFAULT 0, -- 광고비(CPC)
promo_discount NUMERIC(16,2) NOT NULL DEFAULT 0, -- 할인 프로모션
incentive NUMERIC(16,2) NOT NULL DEFAULT 0, -- 장려금
memo TEXT NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_cupang_sales_weekly_from ON cupang_sales_weekly (week_from);
DROP TRIGGER IF EXISTS trg_cupang_sales_updated ON cupang_sales;
CREATE TRIGGER trg_cupang_sales_updated
BEFORE UPDATE ON cupang_sales
FOR EACH ROW EXECUTE FUNCTION cupang_set_updated_at();
DROP TRIGGER IF EXISTS trg_cupang_sales_weekly_updated ON cupang_sales_weekly;
CREATE TRIGGER trg_cupang_sales_weekly_updated
BEFORE UPDATE ON cupang_sales_weekly
FOR EACH ROW EXECUTE FUNCTION cupang_set_updated_at();
GRANT SELECT, INSERT, UPDATE, DELETE ON cupang_sales, cupang_sales_weekly TO cupang_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO cupang_app;
SELECT 'cupang_sales ready' AS status;