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:
2026-09-02 16:03:08 +09:00
parent 15de38cb74
commit 0979a89ed9
15 changed files with 3551 additions and 7 deletions
+51
View File
@@ -1497,3 +1497,54 @@ a.cpg-boxno-dl:hover { background: #1a5c38; border-color: #1a5c38; font-weight:
}
.cpg-calc3 > .cpg-dist-card::-webkit-scrollbar-thumb:hover { background: var(--color-midtone-gray); }
}
/* ══════════════════════════════════════════════════════════════
쿠팡 로켓 매출 (/cupang/sales)
══════════════════════════════════════════════════════════════ */
.cpg-sales-link { border-color: #217346; color: #217346; font-weight: 600; }
.cpg-sales-link:hover { background: #217346; color: #fff; }
.cpg-sales { gap: 12px; }
.cpg-sales-pick { cursor: pointer; }
.cpg-sales .cpg-po-file { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.cpg-sales-filter {
display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px;
padding: 12px 14px;
}
.cpg-sales-filter .erp-field { margin: 0; }
.cpg-sales-filter .erp-field > span { font-size: 11px; color: var(--color-midtone-gray); }
.cpg-sales-q { flex: 1 1 240px; min-width: 0; }
.cpg-sales-q .erp-input { width: 100%; box-sizing: border-box; }
.cpg-sales-filter-act { display: flex; gap: 6px; margin-left: auto; }
.cpg-sales-kpis { flex-shrink: 0; }
.cpg-sales-card { padding: 0; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.cpg-sales-wrap { overflow: auto; max-height: calc(100vh - 330px); }
.cpg-sales-table { table-layout: auto; width: 100%; white-space: nowrap; }
.cpg-sales-table th, .cpg-sales-table td {
padding: 4px 8px; font-size: 12px;
border-bottom: 1px solid var(--color-cloud-gray);
}
.cpg-sales-table thead th {
position: sticky; top: 0; z-index: 2;
background: var(--color-ghost-gray);
font-weight: 700; text-align: center; white-space: nowrap;
}
.cpg-sales-table tbody tr:hover td { background: var(--color-ghost-gray); }
.cpg-sales-mono { font-family: var(--font-geist-mono); color: var(--color-midtone-gray); }
.cpg-sales-week { max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
.cpg-sales-act { text-align: center; white-space: nowrap; }
.cpg-sales-box { width: min(680px, calc(100vw - 32px)); }
.cpg-sales-form {
display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 12px;
max-height: 60vh; overflow-y: auto; padding-right: 4px;
}
.cpg-sales-form .erp-field { margin: 0; }
.cpg-sales-form .erp-field > span { font-size: 11px; color: var(--color-midtone-gray); }
.cpg-sales-form .erp-input { width: 100%; box-sizing: border-box; }
@media (max-width: 640px) {
.cpg-sales-form { grid-template-columns: minmax(0, 1fr); }
}