출고 처리
cp /volume1/web/RSJ_BIZ/index.html.bak /volume1/web/RSJ_BIZ/index.html
# apply_all에서 8,9번 제거하고 실행
cat > /tmp/apply_simple.py << 'PYEOF'
content = open('/volume1/web/RSJ_BIZ/index.html', encoding='utf-8').read()
# 1. 파비콘
content = content.replace('
', '
\n
', 1)
# 2. 필터 CSS
content = content.replace('::-webkit-scrollbar{width:5px;}', '.filter-option{padding:9px 14px;font-size:13px;cursor:pointer;color:var(--text);transition:background .1s;}\n.filter-option:hover{background:var(--bg3);}\n.filter-option.selected{background:rgba(26,86,219,.08);color:var(--accent);font-weight:700;}\n::-webkit-scrollbar{width:5px;}', 1)
// === 세트 관리 ===
async function loadProductSets() {
const sets = await api('product-sets');
const tb = document.getElementById('productSetsTable');
if(!sets.length) { tb.innerHTML=emptyRow(6,'📦','등록된 세트가 없습니다'); return; }
tb.innerHTML = sets.map(s=>'
' +
'| '+(s.set_code||'-')+' | ' +
''+s.set_name+' | ' +
'' +
(s.items||[]).map(i=>''+i.product_name+' x'+i.quantity+'').join('') +
' | ' +
''+Number(s.unit_price||0).toLocaleString()+'원 | ' +
''+(s.note||'-')+' | ' +
' | ' +
'
').join('');
}
async function deleteProductSet(id) {
if(!confirm('삭제하시겠습니까?')) return;
await api('product-sets/'+id,'DELETE');
toast('삭제되었습니다');
loadProductSets();
}
checkSession();', new_js + '\ncheckSession();', 1)
# 6. 이름수정 버튼 (한번만)
old_btn = '
'
new_btn = '
\n
'
content = content.replace(old_btn, new_btn, 1)
open('/volume1/web/RSJ_BIZ/index.html', 'w', encoding='utf-8').write(content)
print('done')
PYEOF
# 출고모달 파일 먼저 생성
cat > /tmp/ship_modal.html << 'MEOF'