Files
sam-kd/output/viewOrder_UA.php

644 lines
24 KiB
PHP
Raw Normal View History

<?php
// 비인정 발주서
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$title_message = '스크린 발주서';
$tablename = 'output';
$item ='발주서';
$emailTitle ='발주서';
$QCadmin = false ;
if($user_name=='이세희' || $user_name=='개발자' || $user_name=='함신옥')
$QCadmin = true ;
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
?>
<title> <?=$title_message?> </title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<?php
// JavaScript에서 전달된 변수들 받기
$num = isset($_REQUEST['num']) ? $_REQUEST['num'] : '';
require_once($_SERVER['DOCUMENT_ROOT'] . "/estimate/fetch_unitprice.php");
try {
$sql = "select * from {$DB}.{$tablename} where num = ? ";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_STR);
$stmh->execute();
$count = $stmh->rowCount();
if ($count < 1) {
print "검색결과가 없습니다.<br>";
} else {
$row = $stmh->fetch(PDO::FETCH_ASSOC);
include "_row.php";
// output_extra 테이블에서 데이터 불러오기
require_once $_SERVER['DOCUMENT_ROOT'] . '/output/load_output_extraTable.php';
}
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
// JSON 문자열을 PHP 배열로 디코딩합니다.
//스크린발주서 읽기
$eList = json_decode($estimateList, true);
// 행의 수는 배열의 크기와 동일하므로, count() 함수를 사용하여 구합니다.
$surang = count($eList);
// 행의 수를 출력하거나 활용할 수 있습니다.
// echo "행의 수: " . $surang . "<br>";
$THscreenSu = $surang + 2 ;
// 데이터베이스에서 ordersheet 컬럼 값을 가져온 후 디코딩
$ordersheet = isset($ordersheet) ? json_decode($ordersheet, true) : [];
// print_r($ordersheet);
// JSON 데이터를 JavaScript 변수로 변환
echo "<script>";
echo "var ordersheetData = " . json_encode($ordersheet) . ";";
echo "</script>";
// 디코딩된 데이터가 배열인지 확인합니다.
if (!is_array($eList)) {
echo "데이터가 정상적이지 않습니다. 확인바랍니다.";
exit;
}
$indateStr = date("m/d", strtotime($indate));
$todayStr = date("m/d");
// print '거래처 번호 : ';
// print_r($secondordnum);
?>
<div class="container mt-2">
<div class="d-flex align-items-center justify-content-end mt-1 m-1">
<div class="d-flex align-items-center">
<span class="me-5">(<?php echo isset($warranty) && $warranty === '인정' ? '인정' : ''; ?><?php echo isset($slatcheck) && $slatcheck === '1' ? ', 스크린' : ''; ?><?php echo isset($motor) && $motor === '1' ? ', 모터' : ''; ?><?php echo isset($steel) && $steel === '1' ? ', 절곡' : ''; ?><?php echo isset($partscheck) && $partscheck === '1' ? ', 부자재' : ''; ?>)</span>
</div>
<button type="button" class="btn btn-dark btn-sm mx-3" onclick='location.reload();' title="새로고침"> <i class="bi bi-arrow-clockwise"></i> </button>
<button class="btn btn-dark btn-sm me-1 ms-1 saveData" > <i class="bi bi-floppy2-fill"></i> 서버 저장 </button>
<button type="button" class="btn btn-dark btn-sm ms-1 me-1" onclick="generatePDF()"> PDF 저장 </button>
<button type="button" class="btn btn-dark btn-sm ms-1 me-1" onclick="sendmail();"> <i class="bi bi-envelope-arrow-up"></i> 전송 </button>
<button type="button" class="btn btn-secondary btn-sm ms-5 " onclick="self.close();"> <i class="bi bi-x-lg"></i> 닫기 </button>
</div>
</div>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data" onkeydown="return captureReturnKey(event)" >
<input type="hidden" id="mode" name="mode" value="<?= isset($mode) ? $mode : '' ?>">
<input type="hidden" id="num" name="num" value="<?= isset($num) ? $num : '' ?>">
<input type="hidden" id="user_name" name="user_name" value="<?= isset($user_name) ? $user_name : '' ?>">
<input type="hidden" id="update_log" name="update_log" value="<?= isset($update_log) ? $update_log : NULL ?>">
<input type="hidden" id="tablename" name="tablename" value="<?= isset($tablename) ? $tablename : '' ?>">
<input type="hidden" id="item_name" name="item_name" value="<?= isset($item_name) ? $item_name : '' ?>">
<input type="hidden" id="ordersheet" name="ordersheet">
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="row">
<div class="d-flex align-items-center justify-content-center">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th colspan="5" rowspan="4" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-2 me-2 fs-1" > &nbsp; </span>
<span class="text-dark ms-2 me-2 fs-1" > &nbsp; </span>
<span class="text-dark ms-2 fs-1" > &nbsp; </span>
</div>
<br>
<div class="d-flex align-items-center justify-content-center mt-2">
<span class="text-dark ms-2 " style="font-size:10px;" > 전화 : 031-983-5130 | 팩스 : 02-6911-6315 | 이메일 : kd5130@naver.com </span>
</div>
</div>
</div>
</th>
<th class="text-center " style="width:5%;">로트번호</th>
<th colspan="3" class="text-center text-danger fw-bold fs-6" style="width:30%; background-color:yellow;"> <?=$lotNum?> </th>
</tr>
<tr>
<th rowspan="3" class="text-center fw-bold" style="height:100px;"> </th>
<th class="text-center p-1 clickable" style="width : 70px; height:22px; padding:2px; cursor:pointer;" id="writer">작성</th>
<th class="text-center p-1 clickable" style="width : 70px; height:22px; padding:2px; cursor:pointer;" id="reviewer">검토</th>
<th class="text-center p-1 clickable approval-only" style="width : 90px; height:22px; padding:2px; cursor:pointer;" id="approver">승인</th>
</tr>
<tr style="height:40px;">
<th class="text-center" id="writerDisplay"></th>
<th class="text-center" id="reviewerDisplay"></th>
<th class="text-center" id="approvalDisplay"></th>
</tr>
<tr>
<th class="text-center" style="height:22px; padding:2px;">판매/<?=$orderman?></th>
<th class="text-center" style="height:22px; padding:2px;">회계</th>
<th class="text-center" style="height:22px; padding:2px;">생산관리</th>
</tr>
</thead>
</table>
</div>
</div>
<div class="row">
<div class="d-flex align-items-center justify-content-start ">
<table class="table table-bordered" style="border-collapse: collapse;">
<thead>
<tr>
<th colspan="2" class="text-center align-middle lightgray" style="width:33%;"> </th>
<th colspan="2" class="text-center align-middle lightgray" style="width:33%;"> </th>
<th colspan="2" class="text-center align-middle lightgray" style="width:33%;"> </th>
</tr>
<tr>
<th class="text-center align-middle lightgray">발주일</th>
<th class="text-center"><?=specialDate($orderdate)?></th>
<th class="text-center align-middle lightgray"> </th>
<th colspan="3" class="text-center text-primary fw-bold"><?=$outworkplace?> </th>
</tr>
<tr>
<th class="text-center align-middle lightgray">발주처</th>
<th class="text-center"><?=$secondord?> </th>
<th class="text-center align-middle lightgray">납기요청일</th>
<th colspan="1" class="text-center text-primary fw-bold"><?=specialDate($outdateplusone)?> </th>
<th class="text-center align-middle lightgray">인수담당자</th>
<th colspan="1" class="text-center text-primary fw-bold"><?=$orderman?> </th>
</tr>
<tr>
<th class="text-center align-middle lightgray">발주 담당자</th>
<th class="text-center"><?=$orderman?></th>
<th class="text-center align-middle lightgray">출고일</th>
<th colspan="1" class="text-center text-primary fw-bold"><?=specialDate($outdate)?> </th>
<th class="text-center align-middle lightgray">인수자연락처</th>
<th class="text-center text-primary fw-bold"><?=$_SESSION['hp']?> </th>
</tr>
<tr>
<th class="text-center align-middle lightgray">담당자 연락처</th>
<th class="text-center text-dark fw-bold"><?=$_SESSION['hp']?> </th>
<th class="text-center align-middle lightgray"></th>
<th class="text-center"> </th>
<th class="text-center align-middle lightgray"> </th>
<th class="text-center"> <?=$delivery ?> </th>
</tr>
<tr>
<th class="text-center align-middle lightgray">배송지 주소</th>
<th colspan="5" class="text-center"><?=$outputplace?></th>
</tr>
</thead>
</table>
</div>
</div>
<div class="row">
<div class="d-flex align-items-center justify-content-start ">
<table class="table" style="border-collapse: collapse; padding:5;">
<tbody>
<tr>
<td class="text-center fw-bold w120px" >
* 별도 추가사항
</td>
<td class="text-center fw-bold fs-6" style="background-color:yellow; padding:15!important;" >
<?=$displayText?>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="d-flex align-items-center justify-content-start ">
<table class="table" style="border-collapse: collapse; padding:15;">
<tbody>
<tr>
<td class="text-center fw-bold fs-6" style="padding:15!important;" >
아래와 같이 주문하오니 품질 납기일을 준수하여 주시기 바랍니다.
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row mt-2 ">
<div class="orderlist_UA">
</div>
</div>
</div>
</div> <!-- end of container -->
</form>
<!-- 페이지로딩 -->
<script>
$(document).on('click', '.saveData', function() {
saveData();
});
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 승인자 정보를 지우고 화면에서 숨김
$('#approvalDisplay').html('').hide();
// JSON 데이터에서 승인자의 정보 제거
let formData = JSON.parse($('#ordersheet').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#ordersheet').val(JSON.stringify(formData));
Toastify({
text: "승인 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
// 삽입/수정하는 모듈
function saveData() {
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#writerDisplay').html().split('<br>')[0] || '',
date: $('#writerDisplay').html().split('<br>')[1] || ''
},
reviewer: {
name: $('#reviewerDisplay').html().split('<br>')[0] || '',
date: $('#reviewerDisplay').html().split('<br>')[1] || ''
},
approver: {
name: $('#approvalDisplay').clone().children('i').remove().end().html().split('<br>')[0] || '',
date: $('#approvalDisplay').clone().children('i').remove().end().html().split('<br>')[1] || ''
}
};
let formData = [];
formData.push({ approval: approvalData });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ tablename: $('#tablename').val() });
formData.push({ update_log: $('#update_log').val() });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#ordersheet').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_ordersheet.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
// console.log(data);
setTimeout(function() {
$("button").prop("disabled", false); // 모든 버튼 활성화
hideMsgModal();
$("#overlay").hide(); // 오버레이 숨김
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
}, 1000);
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 결재부분 클릭처리
$(document).on('click', '.clickable', function() {
const isQCadmin = <?= json_encode($QCadmin); ?>; // 관리자인 경우 true
const userName = <?= json_encode($user_name); ?>; // 현재 사용자 이름
const todayStr = <?= json_encode($todayStr); ?>; // 오늘 날짜
let targetId = $(this).attr('id') + 'Display';
// 작성과 검토는 누구나 가능
if ($(this).attr('id') === 'writer' ) {
$('#' + targetId).html(userName + '<br>' + todayStr);
}
else if ($(this).attr('id') === 'reviewer') {
$('#' + targetId).html(userName + '<br>' + todayStr);
$('#reviewer_sub').val(userName );
}
// 승인 버튼은 관리자만 가능
else if ($(this).attr('id') === 'approver') {
if (!isQCadmin) {
alert('승인 권한이 없습니다.');
return;
}
// 승인자의 이름과 오늘 날짜 표시
$('#approvalDisplay').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDisplay').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData(); // 저장까지 실행하기
}
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
let approvalData = {
writer: {
name: $('#writerDisplay').text().split('<br>')[0] || '',
date: $('#writerDisplay').text().split('<br>')[1] || ''
},
reviewer: {
name: $('#reviewerDisplay').text().split('<br>')[0] || '',
date: $('#reviewerDisplay').text().split('<br>')[1] || ''
},
approver: {
name: $('#approvalDisplay').text().split('<br>')[0] || '',
date: $('#approvalDisplay').text().split('<br>')[1] || ''
}
};
let formData = JSON.parse($('#ordersheet').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
$('#ordersheet').val(JSON.stringify(formData));
}
$(document).ready(function() {
if (ordersheetData.length > 0) {
console.log(ordersheetData);
// 결재 부분 정보 설정
const approval = ordersheetData.find(item => item.approval);
if (approval) {
$('#writerDisplay').html((approval.approval.writer.name || '') + '<br>' + (approval.approval.writer.date || ''));
$('#reviewerDisplay').html((approval.approval.reviewer.name || '') + '<br>' + (approval.approval.reviewer.date || ''));
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDisplay').show();
$('#approvalDisplay').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDisplay').hide().html('');
}
}
}
});
// 수주내역의 후반부 자바스크립트
$(document).ready(function() {
// 서버에서 전달된 estimateList 데이터
var mode = '<?php echo $mode; ?>' ;
let estimateList = <?php echo json_encode($estimateList ?? []); ?>; // 스크린견적서에서 불러온 발주내용
let estimateList_auto = <?php echo json_encode($estimateList_auto ?? []); ?>;
let estimateSlatList = <?php echo json_encode($estimateSlatList ?? []); ?>; // 철재견적서에서 불러온 발주내용
let estimateSlatList_auto = <?php echo json_encode($estimateSlatList_auto ?? []); ?>;
var etcList = <?php echo json_encode($etcList ?? []); ?>;
let screen_unapprovedList = <?php echo json_encode($screen_unapprovedList ?? []); ?>;
let slat_unapprovedList = <?php echo json_encode($slat_unapprovedList ?? []); ?>;
let motorList = <?php echo json_encode($motorList ?? []); ?>;
let bendList = <?php echo json_encode($bendList ?? []); ?>;
let controllerList = <?php echo json_encode($controllerList ?? []); ?>;
let accountList = <?php echo json_encode($accountList ?? []); ?>;
/**
* 입력값(raw) 안전하게 배열로 변환합니다.
* - raw가 문자열이면 JSON.parse
* - raw가 객체/배열이면 JSON.stringify JSON.parse
* - 파싱 실패하거나 최종 결과가 배열이 아니면 배열 반환
*/
function parseJsonList(raw) {
let str;
// 1) raw를 JSON 문자열로 확보
if (typeof raw === 'string') {
str = raw;
} else {
try {
str = JSON.stringify(raw);
} catch (e) {
console.error('parseJsonList: 데이터를 문자열로 변환 실패', e);
return [];
}
}
// 2) 문자열을 JSON으로 파싱
try {
const parsed = JSON.parse(str);
if (!Array.isArray(parsed)) {
console.warn('parseJsonList: 파싱 결과가 배열이 아님, 빈 배열로 초기화');
return [];
}
return parsed;
} catch (e) {
console.error('parseJsonList: JSON 파싱 오류', e);
return [];
}
}
// 각각 리스트 파싱하고 전역 변수로 설정
window.screen_unapprovedList = parseJsonList(screen_unapprovedList);
window.slat_unapprovedList = parseJsonList(slat_unapprovedList);
window.motorList = parseJsonList(motorList);
window.bendList = parseJsonList(bendList);
window.controllerList = parseJsonList(controllerList);
window.etcList = parseJsonList(etcList);
window.accountList = parseJsonList(accountList);
/*************************************************
* 거래명세표 비인정 데이터 렌더링(모달창) UA는 비인정약자임 unapproved 의미
*/
function renderViewUATable(containerSelector, title, tableId, tbodyId, columns, dataList) {
if (!Array.isArray(dataList) || dataList.length === 0) return;
// tableId 별로 꺼낼 프로퍼티명 매핑
const fieldMap = {
// 비인정 스크린
screen_unapprovedList_view: [
'item_type', // 품명
'floors', // 층
'text1', // 부호
'cutwidth', // 가로
'cutheight', // 세로
'number' // 수량
],
// 비인정 철재-슬랫
slat_unapprovedList_view: [
'item_type', // 품목
'floors', // 층
'text1', // 부호
'memo', // 재질
'cutwidth', // 가로
'cutheight', // 세로
'number', // 수량
'exititem', // 비상문
'hinge', // 힌지종류
'hinge_direction' // 힌지방향
],
// 절곡품
bend_list_view:[
'col1', // 품목
'col2', // 두께
'col3', // 길이(mm)
'col7', // 수량
'col8', // 비고
],
};
const keys = fieldMap[tableId];
// 1) 제목
let html = `<div class="fw-bold mt-3">${title}</div>`;
// 2) thead
html += `<table class="table table-bordered table-sm text-center" id="${tableId}">`;
html += `<thead class="table-light"><tr><th>번호</th>`;
columns.forEach(h => html += `<th>${h}</th>`);
html += `</tr></thead>`;
// 3) tbody
html += `<tbody id="${tbodyId}">`;
dataList.forEach((row, idx) => {
html += `<tr><td>${idx+1}</td>`;
if (tableId === 'screen_unapprovedList_view') {
// 스크린 비인정: [품명, 층+부호, 가로, 세로, 수량]
const vals = [
row.item_type || '',
`${row.floors||''} ${row.text1||''}`,
row.cutwidth || '',
row.cutheight|| '',
row.number || ''
];
vals.forEach(v => html += `<td>${v}</td>`);
} else if (tableId === 'slat_unapprovedList_view') {
// 비인정 철재-슬랫 [품명, 층+부호, 가로, 세로, 수량]
const vals = [
row.item_type || '',
`${row.floors||''} ${row.text1||''}`,
row.cutwidth || '',
row.cutheight|| '',
row.number || '',
row.exititem === '0' ? '(없음)' : '(있음)',
row.hinge || '',
row.hinge_direction || '',
];
vals.forEach(v => html += `<td>${v}</td>`);
} else if (tableId === 'bend_list_view') {
const vals = [
row.col1 || '',
row.col2 || '',
row.col3 || '',
row.col7 || '',
row.col8 || '',
];
vals.forEach(v => html += `<td>${v}</td>`);
} else {
// 그 외: col1, col2, …
columns.forEach((_, i) => {
const col = `col${i+1}`;
html += `<td>${row[col]||''}</td>`;
});
}
html += `</tr>`;
});
html += `</tbody></table>`;
$(containerSelector).append(html);
}
const container = '.orderlist_UA'; // 테이블을 렌더링할 부모 div 선택자
renderViewUATable(container, '스크린', 'screen_unapprovedList_view', 'screen_unapprovedListBody_view',
['품명', '층부호','가로', '세로', '수량'], window.screen_unapprovedList);
renderViewUATable(container, '철재-슬랫', 'slat_unapprovedList_view', 'slat_unapprovedListBody_view',
['품명', '층부호','가로', '세로', '수량', '비상문', '힌지종류', '힌지방향'], window.slat_unapprovedList);
renderViewUATable(container, '전동 개폐기 & 베어링부(브라켓트)', 'motor_list_view', 'motor_listBody_view',
['품명', '용량', '브라켓', '샤프트', '수량', '형태', '리미트', '비고'], window.motorList);
renderViewUATable(container, '연동 폐쇄기구(제어기) & 방범스위치', 'controller_list_view', 'controller_listBody_view',
['품명', '수량', '형태', '비고'], window.controllerList);
renderViewUATable(container, '절곡품 (규격 및 타입은 도면 참조)', 'bend_list_view', 'bend_listBody_view',
['품명', '두께', '길이(mm)', '수량', '비고'], window.bendList);
renderViewUATable(container, '부자재', 'etc_list_view', 'etc_listBody_view',
['품명', '규격', '길이', '수량', '비고'], window.etcList);
});
</script>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/pdfEmailJS.php'; ?> <!-- pdf저장 및 Email 전송 모듈 JS 불러오기 -->
</body>
</html>