Files
sam-kd/output/list_deliveryfee.php
hskwon aca1767eb9 초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
2025-12-10 20:14:31 +09:00

546 lines
20 KiB
PHP

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '배차 차량 일지';
?>
<title> <?=$title_message?> </title>
</head>
<body>
<?php require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php'); ?>
<?php require_once($_SERVER['DOCUMENT_ROOT'] . '/mymodal.php'); ?>
<?php
$tablename = 'output';
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
// 검색 조건 설정
$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
$fromdate = isset($_REQUEST['fromdate']) ? $_REQUEST['fromdate'] : '';
$todate = isset($_REQUEST['todate']) ? $_REQUEST['todate'] : '';
$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
$SettingDate = isset($_REQUEST['SettingDate']) ? $_REQUEST['SettingDate'] : " regist_day ";
if (isset($_REQUEST["separate_date"])) {
$separate_date = $_REQUEST["separate_date"];
} else {
$separate_date = "";
}
require_once("../lib/mydb.php");
$pdo = db_connect();
$separate_date = "1";
// 현재 날짜
$currentDate = date("Y-m-d");
// fromdate 또는 todate가 빈 문자열이거나 null인 경우
if ($fromdate === "" || $fromdate === null || $todate === "" || $todate === null) {
// 이번 달의 첫째 날
$fromdate = date("Y-m-01", strtotime($currentDate));
// 이번 달의 마지막 날
$todate = date("Y-m-t", strtotime($currentDate)); // t는 해당 월의 마지막 날을 반환
$Transtodate = $todate;
} else {
// fromdate와 todate가 모두 설정된 경우 (기존 로직 유지)
$Transtodate = $todate;
}
if ($separate_date == "1") {
$SettingDate = "outdate";
} else {
$SettingDate = "indate";
}
// 진행상태에 대한 검색
$orderby = " ORDER BY " . $SettingDate . " DESC, num DESC"; // 내림차순 정렬
$where = " WHERE " . $SettingDate . " BETWEEN date('$fromdate') AND date('$Transtodate') AND is_deleted = '0' and (devMode <> '1' OR devMode IS NULL) AND deliveryfeeList IS NOT NULL AND deliveryfeeList != '' AND deliveryfeeList != '[]' " . $orderby;
$searchwhere = " WHERE is_deleted = '0' AND deliveryfeeList IS NOT NULL and (devMode <> '1' OR devMode IS NULL) AND deliveryfeeList != '' AND deliveryfeeList != '[]' AND searchtag LIKE '%$search%'" . $orderby;
// 수정된 쿼리: COD이 존재하고 is_deleted가 0인 자료만 선택
if ($search == "") {
$sql = "SELECT * FROM $DB.$tablename " . $where;
} else {
$sql = "SELECT * FROM $DB.$tablename " . $searchwhere;
}
// 현재일자 변수지정
$today = date("Y-m-d");
// SQL 실행 및 데이터 처리
// print $sql;
?>
<form id="board_form" name="board_form" method="post" >
<input type="hidden" id="mode" name="mode" value="<?=$mode?>">
<input type="hidden" id="num" name="num">
<input type="hidden" id="tablename" name="tablename" value="<?=$tablename?>">
<input type="hidden" id="header" name="header" value="<?=$header?>">
<div class="container">
<div class="card mb-2 mt-2">
<div class="card-body">
<div class="row">
<div class="col-sm-7">
<div class="d-flex p-1 m-1 mt-1 justify-content-end align-items-center ">
<h5> <?=$title_message?> </h5> &nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-dark btn-sm mx-2" onclick='location.reload();' > <i class="bi bi-arrow-clockwise"></i> </button>
<button type="button" class="btn btn-outline-dark btn-sm downloadExcel"> <i class="bi bi-floppy"></i> 엑셀 다운로드</button>
</div>
</div>
<div class="col-sm-5">
<div class="d-flex justify-content-end align-items-center ">
</div>
</div>
</div>
<div class="row">
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
<?php
/********************************************************
* 1) 전체 데이터를 가져오면서, 요약 계산을 동시에 수행
********************************************************/
// (A) 합계를 저장할 배열·변수 준비
$companySums = []; // 예: [ '25시물류' => 500000, '조운물류' => 300000, ... ]
$prepaidSum = 0; // 선불 합계
$collectSum = 0; // 착불 합계
$totalSum = 0; // 총합 (모든 합계)
$resultRows = []; // 실제 목록 표시에 사용할 모든 레코드+deliveryfeeList 데이터를 담아둘 배열
try {
$stmh = $pdo->query($sql); // PDOStatement
$total_row = $stmh->rowCount();
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
// deliveryfeeList를 JSON -> 배열 디코딩
$deliveryfeeListData = json_decode($row['deliveryfeeList'], true);
if (!is_array($deliveryfeeListData) || count($deliveryfeeListData) === 0) {
$deliveryfeeListData = [[]];
}
// (B) 각 행을 순회하면서 합계 계산
foreach ($deliveryfeeListData as $feeRow) {
// col1 : 물류업체명, col5 : 합계(숫자), col6 : 착불/선불
$company = $feeRow['col1'] ?? ''; // 예: '25시물류'
$sumText = $feeRow['col5'] ?? ''; // 예: '12,345' (콤마가 있을 수도 있으므로)
$payType = $feeRow['col6'] ?? ''; // 예: '착불' or '선불'
// 숫자 변환 (콤마 제거 후 float/int 변환)
$sumValue = floatval(str_replace(',', '', $sumText));
// 물류업체명별 합계
if (!isset($companySums[$company])) {
$companySums[$company] = 0;
}
$companySums[$company] += $sumValue;
// 착불/선불 합계
if ($payType === '선불') {
$prepaidSum += $sumValue;
} elseif ($payType === '착불') {
$collectSum += $sumValue;
}
// 총합
$totalSum += $sumValue;
}
// (C) 화면에 출력할 수 있도록, 원본 $row + deliveryfeeListData를 저장
$resultRows[] = $row;
}
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
// (D) 합계 테이블을 출력하기 전에, 물류업체명 배열을 정렬(필요 시)
ksort($companySums); // 키(물류업체명)로 정렬 - 사용 여부는 선택
// echo '<pre>';
// print_r($deliveryfeeListData);
// echo '</pre>';
?>
<!-- *********************************************** -->
<!-- 2) 배송업체별 합계금액/선불 합계/착불 합계 테이블 -->
<!-- *********************************************** -->
<style>
/* 예시 스타일 - 필요에 따라 조정 */
.summary-table {
margin-bottom: 1rem;
border: 2px solid #333;
border-collapse: collapse;
width: auto; /* 상황에 맞춰 조정 */
}
.summary-table th, .summary-table td {
border: 1px solid #333;
padding: 8px;
text-align: center;
vertical-align: middle;
}
.text-green { color: green; }
.text-red { color: red; }
</style>
<table class="summary-table mx-4">
<thead>
<tr>
<?php
// 동적으로 물류업체명 컬럼 생성
foreach ($companySums as $companyName => $amount) {
echo "<th>" . htmlspecialchars($companyName) . "</th>";
}
?>
<th class="text-green">선불</th>
<th class="text-red">착불</th>
<th>합계</th>
</tr>
</thead>
<tbody>
<tr>
<?php
// 물류업체명별 합계 표시
foreach ($companySums as $companyName => $amount) {
// 3자리 콤마
$formatted = number_format($amount);
echo "<td>{$formatted}</td>";
}
// 선불, 착불, 전체 합계
$formattedPrepaid = number_format($prepaidSum);
$formattedCollect = number_format($collectSum);
$formattedTotal = number_format($totalSum);
echo "<td class='text-green'>{$formattedPrepaid}</td>";
echo "<td class='text-red'>{$formattedCollect}</td>";
echo "<td>{$formattedTotal}</td>";
?>
</tr>
</tbody>
</table>
▷ <?= $total_row ?> &nbsp;
<button type="button" class="btn btn-danger btn-sm mx-1" onclick='pre_month()' > 전월 </button>
<button type="button" class="btn btn-primary btn-sm mx-1" onclick='this_month()' > 당월 </button>
<button type="button" class="btn btn-dark btn-sm mx-1" onclick='yesterday()' > 전일 </button>
<button type="button" class="btn btn-outline-dark btn-sm mx-1" onclick='this_today()' > 금일 </button>
<button type="button" class="btn btn-dark btn-sm mx-1" onclick='this_tomorrow()' > 익일 </button>
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?=$fromdate?>" > &nbsp; ~ &nbsp;
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" > &nbsp;
</span>
<div class="inputWrap">
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control" style="width:150px;" > &nbsp;
<button class="btnClear"></button>
</div>
<div id="autocomplete-list">
</div>
&nbsp;
<button id="searchBtn" type="button" class="btn btn-dark btn-sm" > <i class="bi bi-search"></i> 검색 </button>
</div>
</div>
</div> <!--card-body-->
</div> <!--card -->
</div> <!--container-fluid -->
<div class="container-fluid">
<div class="d-flex justify-content-center align-items-center">
<table class="table table-hover" id="myTable">
<thead class="table-primary">
<tr>
<!-- 1,2,3열 : 기존 컬럼(번호, 출고일, 현장명) -->
<th class="text-center" style="width:30px;">번호</th>
<th class="text-center" style="width:100px;">출고일</th>
<th class="text-center" style="width:300px;">현장명</th>
<!-- 4열부터 col1~col11 (배송비 내역) -->
<th class="text-center">하차업체명</th>
<th class="text-center">상차지</th>
<th class="text-center">물류업체명</th>
<th class="text-center">차량톤수</th>
<th class="text-center">금 액</th>
<th class="text-center">부가세</th>
<th class="text-center">합계</th>
<th class="text-center">착/선불</th>
<th class="text-center">차량번호</th>
<th class="text-center">기사 연락처</th>
<th class="text-center">비고</th>
</tr>
</thead>
<tbody>
<?php
try {
$stmh = $pdo->query($sql); // 검색조건에 맞는글 stmh
$total_row = $stmh->rowCount();
$start_num = 1; // 페이지당 표시되는 첫 번째 글 순번
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
// (예) DB 필드에서 출고일, 현장명, 오늘 날짜 비교 등에 사용
$outdate = $row['outdate'] ?? '';
$outworkplace = $row['outworkplace'] ?? '';
$num = $row['num'] ?? '';
$tablename = $tablename ?? '';
// 오늘 날짜와 출고일 비교해 색상 지정 (선택 사항)
$date_font = ($today == $outdate) ? "text-danger" : "text-dark";
// 요일 표기
if ($outdate !== "") {
$week = ["(일)", "(월)", "(화)", "(수)", "(목)", "(금)", "(토)"];
$outdate .= $week[ date('w', strtotime($outdate)) ];
}
// deliveryfeeList를 JSON -> 배열 디코딩 (여러 개 행이 있을 수 있음)
$deliveryfeeListData = json_decode($row['deliveryfeeList'], true);
// 만약 데이터가 없거나 파싱 실패하면, 1개짜리 빈 배열로 처리 (빈 화면 대신)
if (!is_array($deliveryfeeListData) || count($deliveryfeeListData) === 0) {
$deliveryfeeListData = [[]];
}
// deliveryfeeList의 각 행마다 <tr> 생성
foreach ($deliveryfeeListData as $index => $feeRow) {
// 첫 번째 행($index===0)일 때만 번호/출고일/현장명 표시
// $tdNumber = ($index === 0) ? $start_num : '';
// $tdOutdate = ($index === 0) ? "<span class='{$date_font}'>{$outdate}</span>" : '';
// $tdWork = ($index === 0) ? $outworkplace : '';
$tdNumber = $start_num ;
$tdOutdate = "<span class='{$date_font}'>{$outdate}</span>" ;
$tdWork = $outworkplace ;
// col1 ~ col11
$col1 = $feeRow['col1'] ?? '';
$col2 = $feeRow['col2'] ?? '';
$col3 = $feeRow['col3'] ?? '';
$col4 = $feeRow['col4'] ?? '';
$col5 = $feeRow['col5'] ?? '';
$col6 = $feeRow['col6'] ?? ''; // 체크할 컬럼 (선불/착불)
$col7 = $feeRow['col7'] ?? '';
$col8 = $feeRow['col8'] ?? '';
$col9 = $feeRow['col9'] ?? '';
$col10 = $feeRow['col10'] ?? '';
$col11 = $feeRow['col11'] ?? '';
// col6이 비어있으면 blink 클래스 추가 (선불/착불)
$blinkClass = ($col6 === '') ? 'blink-row' : '';
?>
<tr class="<?= $blinkClass ?>" data-col6="<?= $col6 ?>" onclick="redirectToView('<?= $num ?>','<?= $tablename ?>')">
<!-- 1,2,3열: 첫 행이면 표시, 아니면 빈 칸 -->
<td class="text-center"><?= $tdNumber ?></td>
<td class="text-center"><?= $tdOutdate ?></td>
<td class="text-start"><?= $tdWork ?></td>
<!-- 4열부터 col1~col11 -->
<td class="text-center"><?= htmlspecialchars($col10) ?></td>
<td class="text-center "><?= htmlspecialchars($col9) ?></td>
<td class="text-center"><?= htmlspecialchars($col1) ?></td>
<td class="text-center"><?= htmlspecialchars($col2) ?></td>
<td class="text-center"><?= htmlspecialchars($col3) ?></td>
<td class="text-center"><?= htmlspecialchars($col4) ?></td>
<td class="text-center blink-target"><?= htmlspecialchars($col5) ?></td>
<td class="text-center col6-cell"><?= htmlspecialchars($col6) ?></td>
<td class="text-center"><?= htmlspecialchars($col7) ?></td>
<td class="text-center"><?= htmlspecialchars($col8) ?></td>
<td class="text-center"><?= htmlspecialchars($col11) ?></td>
</tr>
<?php
$start_num++;
}
// DB 1행 처리 끝 -> 다음 레코드
} // while($row)
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
?>
</tbody>
</table>
</div>
</div> <!--container-->
</form>
<script>
// 페이지 로딩
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
</script>
<script>
var dataTable; // DataTables 인스턴스 전역 변수
var outputpageNumber; // 현재 페이지 번호 저장을 위한 전역 변수
$(document).ready(function() {
// DataTables 초기 설정
dataTable = $('#myTable').DataTable({
"paging": true,
"ordering": true,
"searching": false,
"pageLength": 100,
"lengthMenu": [100, 200, 500, 1000],
"language": {
"lengthMenu": "Show _MENU_ entries"
},
"order": [[1, 'desc']] // 출고예정기준 내림정렬
});
// 페이지 번호 복원 (초기 로드 시)
var savedPageNumber = getCookie('outputpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
// 페이지 변경 이벤트 리스너
dataTable.on('page.dt', function() {
var outputpageNumber = dataTable.page.info().page + 1;
setCookie('outputpageNumber', outputpageNumber, 10); // 쿠키에 페이지 번호 저장
});
// 페이지 길이 셀렉트 박스 변경 이벤트 처리
$('#myTable_length select').on('change', function() {
var selectedValue = $(this).val();
dataTable.page.len(selectedValue).draw(); // 페이지 길이 변경 (DataTable 파괴 및 재초기화 없이)
// 변경 후 현재 페이지 번호 복원
savedPageNumber = getCookie('outputpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
});
});
function restorePageNumber() {
var savedPageNumber = getCookie('outputpageNumber');
// if (savedPageNumber) {
// dataTable.page(parseInt(savedPageNumber) - 1).draw('page');
// }
location.reload(true);
}
function redirectToView(num, tablename) {
var url = "write_form.php?mode=view&num=" + num + "&tablename=" + tablename;
customPopup(url, '수주 내역', 1900, 920);
}
function submitForm(status) {
$('input[name=status_option]').val(status);
document.getElementById('board_form').submit();
}
$(document).ready(function(){
// 엑셀 다운로드 버튼 클릭 이벤트
$('.downloadExcel').on('click', function() {
var data = [];
var rows = $('#myTable tbody tr'); // 모달 내의 테이블 선택
// 각 행의 데이터를 수집
rows.each(function() {
var rowData = {};
rowData['번호'] = $(this).find('td').eq(0).text().trim();
rowData['출고일'] = $(this).find('td').eq(1).text().trim();
rowData['현장명'] = $(this).find('td').eq(2).text().trim();
rowData['하차업체명'] = $(this).find('td').eq(3).text().trim();
rowData['상차지'] = $(this).find('td').eq(4).text().trim();
rowData['물류업체명'] = $(this).find('td').eq(5).text().trim();
rowData['차량톤수'] = $(this).find('td').eq(6).text().trim();
rowData['금 액'] = $(this).find('td').eq(7).text().trim();
rowData['부가세'] = $(this).find('td').eq(8).text().trim();
rowData['합계'] = $(this).find('td').eq(9).text().trim();
rowData['착/선불'] = $(this).find('td').eq(10).text().trim();
rowData['차량번호'] = $(this).find('td').eq(11).text().trim();
rowData['기사 연락처'] = $(this).find('td').eq(12).text().trim();
rowData['비고'] = $(this).find('td').eq(13).text().trim();
data.push(rowData);
});
// 엑셀 파일 생성 요청
$.ajax({
url: '/output/dl_ex_deliveryfee.php',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(data),
success: function(response) {
// 응답이 문자열인 경우 JSON으로 파싱 시도
if (typeof response === 'string') {
try {
response = JSON.parse(response);
} catch(e) {
alert('서버에서 유효하지 않은 응답을 받았습니다.');
console.error("응답 파싱 오류:", e);
return;
}
}
if(response.success){
// 다운로드 URL 조정 (파일 경로에 맞게 수정)
var filename = response.filename.split('/').pop();
var downloadUrl = '/excelsave/' + encodeURIComponent(filename);
window.location.href = downloadUrl;
} else {
alert('엑셀 파일 생성에 실패했습니다: ' + response.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error("AJAX 오류:", textStatus, errorThrown);
alert('엑셀 파일 생성 중 오류가 발생했습니다.');
}
});
});
});
$(document).ready(function(){
// 방문기록 남김
var title = '<?php echo $title_message; ?>';
saveMenuLog(title);
});
// jQuery로 깜빡이는(blink) 효과 추가
$(document).ready(function () {
setInterval(function () {
$(".blink-row").each(function () {
let col6Cell = $(this).find('.col6-cell');
let originalText = $(this).attr('data-col6'); // 원래의 col6 값
if (originalText.trim() === '') {
if (col6Cell.text().trim() === '선불/착불 기록 남겨주세요') {
col6Cell.text(''); // 공백으로 변경
} else {
col6Cell.text('선불/착불 기록 남겨주세요'); // 경고 문구 표시
}
}
});
}, 1000); // 1초마다 변경
});
</script>
</body>
</html>