0979a89ed9
- 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>
83 lines
5.1 KiB
SQL
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;
|