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>
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
-- ════════════════════════════════════════════════════════════
|
||||
-- 쿠팡 로켓 매출 (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;
|
||||
Reference in New Issue
Block a user