Files
sam-api/public/tenant/order/manage.php
hskwon cc206fdbed style: Laravel Pint 코드 포맷팅 적용
- PSR-12 스타일 가이드 준수
- 302개 파일 스타일 이슈 자동 수정
- 코드 로직 변경 없음 (포맷팅만)
2025-11-06 17:45:49 +09:00

175 lines
9.4 KiB
PHP

<?php
$CURRENT_SECTION = 'order';
include '../inc/header.php';
?>
<div class="container" style="max-width:1280px; margin-top:18px;">
<!-- 상단 툴바 -->
<div class="sam-toolbar mb-2">
<div class="sam-title">수주 리스트</div>
<div class="sam-actions">
<select class="form-select form-select-sm" id="selStatus">
<option value="">상태(전체)</option>
<option>접수</option><option>견적</option><option>발주</option>
<option>생산</option><option>출고</option>
</select>
<select class="form-select form-select-sm" id="selType">
<option value="">구분(전체)</option>
<option>스크린</option><option>철재</option>
</select>
<input type="date" class="form-control form-control-sm" id="fromDate" />
<span class="text-muted">~</span>
<input type="date" class="form-control form-control-sm" id="toDate" />
<input type="text" class="form-control form-control-sm" id="keyword" placeholder="발주처/현장/모델 등" />
<button class="btn btn-sm btn-outline-secondary" id="btnSearch">검색</button>
<button class="btn btn-sm btn-primary" id="btnNew">+ 신규 생산</button>
</div>
</div>
<div class="card">
<div class="card-body p-2">
<div class="table-responsive">
<table class="table table-hover table-sam m-0" id="estTable">
<thead>
<tr>
<th style="width:60px;">NO</th>
<th style="width:110px;">접수일</th>
<th style="width:80px;">상태</th>
<th style="width:160px;">생산로트</th>
<th style="width:80px;">구분</th>
<th style="width:140px;">발주처</th>
<th style="width:110px;">제품모델명</th>
<th>현장명</th>
<th style="width:80px;">수량</th>
<th style="width:110px;">출고일</th>
<th style="width:90px;">운송현황</th>
</tr>
</thead>
<tbody id="estTbody"><!-- JS 렌더 --></tbody>
</table>
</div>
<!-- 페이지네이션 -->
<div class="d-flex justify-content-between align-items-center mt-2">
<div class="text-muted small" id="resultInfo"></div>
<nav aria-label="pagination">
<ul class="pagination pagination-sm mb-0" id="pager"><!-- JS --></ul>
</nav>
</div>
</div>
</div>
</div>
<style>
/* 상태 배지 */
.q-badge{display:inline-block; padding:.25rem .45rem; border-radius:.5rem; font-weight:600;}
.q-접수{background:#e8f0ff; color:#204a9a;}
.q-견적{background:#fff1bf; color:#6a5300;}
.q-대기{background:#d7f5e6; color:#0b6b3e;}
/* 현장명 말줄임 */
#estTable td:nth-child(8){max-width:320px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
</style>
<script>
$(function(){
// ---- 샘플 데이터 ----
const rows = [
{no:1, recv:'2025-07-15', status:'대기', lot:'KD-PR-250715-11', type:'철재', buyer:'SK텔레콤', model:'KWE01', site:'판교센터', qty:3, ship:'2025-07-25', shipstat:'택배'},
{no:2, recv:'2025-07-14', status:'견적', lot:'KD-PR-250714-12', type:'스크린', buyer:'현대건설', model:'KQTS01', site:'서울현장', qty:2, ship:'2025-07-28', shipstat:'화물차'},
{no:3, recv:'2025-07-13', status:'견적', lot:'KD-PR-250713-13', type:'철재', buyer:'KT', model:'KTE01', site:'강남센터', qty:5, ship:'2025-07-30', shipstat:'트럭'},
{no:4, recv:'2025-07-12', status:'견적', lot:'KD-PR-250712-14', type:'스크린', buyer:'LG전자', model:'KDSS01', site:'평택공장', qty:1, ship:'2025-08-01', shipstat:'택배'},
{no:5, recv:'2025-07-11', status:'대기', lot:'KD-PR-250711-15', type:'철재', buyer:'삼성SDI', model:'KSS01', site:'천안사업장', qty:5, ship:'2025-08-01', shipstat:'화물차'},
{no:6, recv:'2025-07-10', status:'대기', lot:'KD-PR-250710-01', type:'스크린', buyer:'롯데쇼핑', model:'KSS01', site:'서울물류센터', qty:3, ship:'2025-08-02', shipstat:'택배'},
{no:7, recv:'2025-07-09', status:'대기', lot:'KD-PR-250709-02', type:'스크린', buyer:'두산중공업',model:'KSS02', site:'울산공장', qty:1, ship:'2025-08-05', shipstat:'트럭'},
{no:8, recv:'2025-07-08', status:'견적', lot:'KD-PR-250708-03', type:'철재', buyer:'CJ대한통운',model:'KSS02', site:'인천사업장', qty:3, ship:'2025-08-02', shipstat:'화물차'},
{no:9, recv:'2025-07-07', status:'대기', lot:'KD-PR-250707-04', type:'스크린', buyer:'포스코', model:'KSS01', site:'포항공장', qty:2, ship:'2025-07-28', shipstat:'택배'},
{no:10, recv:'2025-07-06', status:'견적', lot:'KD-PR-250706-05', type:'철재', buyer:'현대자동차',model:'KSS02', site:'울산공장', qty:8, ship:'2025-08-03', shipstat:'화물차'},
{no:6, recv:'2025-07-10', status:'대기', lot:'KD-PR-250710-01', type:'스크린', buyer:'롯데쇼핑', model:'KSS01', site:'서울물류센터', qty:3, ship:'2025-08-02', shipstat:'택배'},
{no:7, recv:'2025-07-09', status:'대기', lot:'KD-PR-250709-02', type:'스크린', buyer:'두산중공업',model:'KSS02', site:'울산공장', qty:1, ship:'2025-08-05', shipstat:'트럭'},
{no:8, recv:'2025-07-08', status:'견적', lot:'KD-PR-250708-03', type:'철재', buyer:'CJ대한통운',model:'KSS02', site:'인천사업장', qty:3, ship:'2025-08-02', shipstat:'화물차'},
{no:9, recv:'2025-07-07', status:'견적', lot:'KD-PR-250707-04', type:'스크린', buyer:'포스코', model:'KSS01', site:'포항공장', qty:2, ship:'2025-07-28', shipstat:'택배'},
{no:10, recv:'2025-07-06', status:'견적', lot:'KD-PR-250706-05', type:'철재', buyer:'현대자동차',model:'KSS02', site:'울산공장', qty:8, ship:'2025-08-03', shipstat:'화물차'},
];
// ---- 상태 배지 ----
const badge = s => `<span class="q-badge q-${s}">${s}</span>`;
// ---- 페이징 ----
const pageSize = 10;
let curPage = 1, filtered = [...rows];
function render(){
const start = (curPage-1)*pageSize;
const slice = filtered.slice(start, start+pageSize);
$('#estTbody').html(slice.map(r=>`
<tr data-no="${r.no}" class="row-open">
<td>${r.no}</td>
<td>${r.recv}</td>
<td>${badge(r.status)}</td>
<td>${r.lot}</td>
<td>${r.type}</td>
<td>${r.buyer}</td>
<td>${r.model}</td>
<td title="${r.site}">${r.site}</td>
<td>${r.qty}</td>
<td>${r.ship}</td>
<td>${r.shipstat}</td>
</tr>
`).join(''));
const total = Math.max(1, Math.ceil(filtered.length/pageSize));
let p = `
<li class="page-item ${curPage===1?'disabled':''}"><a class="page-link" href="#" data-p="prev">«</a></li>`;
for(let i=1;i<=total;i++){
p += `<li class="page-item ${i===curPage?'active':''}"><a class="page-link" href="#" data-p="${i}">${i}</a></li>`;
}
p += `<li class="page-item ${curPage===total?'disabled':''}"><a class="page-link" href="#" data-p="next">»</a></li>`;
$('#pager').html(p);
$('#resultInfo').text(`총 ${filtered.length.toLocaleString()}건`);
}
// 검색
$('#btnSearch').on('click', function(){
const st = $('#selStatus').val();
const tp = $('#selType').val();
const kw = ($('#keyword').val()||'').toLowerCase();
const from = $('#fromDate').val();
const to = $('#toDate').val();
filtered = rows.filter(r=>{
const okSt = !st || r.status===st;
const okTp = !tp || r.type===tp;
const okKw = !kw || [r.buyer,r.site,r.model,r.lot].some(v=>String(v).toLowerCase().includes(kw));
const okDt = (!from || r.recv>=from) && (!to || r.recv<=to);
return okSt && okTp && okKw && okDt;
});
curPage=1; render();
});
// 페이징
$(document).on('click', '#pager .page-link', function(e){
e.preventDefault();
const v = $(this).data('p');
const total = Math.max(1, Math.ceil(filtered.length/pageSize));
if(v==='prev'){ if(curPage>1) curPage--; }
else if(v==='next'){ if(curPage<total) curPage++; }
else curPage = parseInt(v,10);
render();
});
// 행 클릭 (상세로 이동/모달 호출 등)
$(document).on('click', 'tr.row-open', function(){
const no = $(this).data('no');
// 예시: 상세 페이지로 이동
// location.href = '/tenant/estimate/estimate_view.php?no='+no;
alert('견적 상세 열기 (NO: '+no+')');
});
// 버튼
$('#btnNew').on('click', ()=>location.href='estimate_form.php');
render();
});
</script>
<?php include '../inc/footer.php'; ?>