-- ════════════════════════════════════════════════════════════ -- 쿠팡 로켓 매출 (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;