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

2232 lines
92 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;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
$num = isset($_REQUEST["num"]) ? $_REQUEST["num"] : "";
$tablename = isset($_REQUEST["tablename"]) ? $_REQUEST["tablename"] : "";
if($mode === 'copy')
$title_message = "(데이터복사) 공사 수주";
else
$title_message = "공사 수주 " ;
?>
<title> <?=$title_message?> </title>
<style>
textarea {
overflow: hidden;
resize: none; /* 사용자 크기 조절을 방지 */
}
.custom-file-upload {
display: inline-block;
cursor: pointer;
color: #007bff;
font-size: 1.2rem;
}
.custom-file-upload input[type="file"] {
display: none;
}
input[type="checkbox"] {
margin-right: 10px;
cursor: pointer;
}
#equipmentListTable {
width: 100%; /* 테이블의 전체 폭 */
table-layout: auto; /* 테이블의 폭이 내용에 맞게 자동 조절되도록 설정 */
word-wrap: break-word; /* 너무 긴 단어를 자동으로 줄바꿈 */
}
#equipmentListTable th, #equipmentListTable td {
white-space: nowrap; /* 텍스트가 셀에서 줄바꿈되지 않도록 설정 */
padding: 3px; /* 셀 안쪽 여백 추가 */
}
/* 작은 화면에서 테이블이 깨지지 않도록 */
.table-responsive {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
/* 입력 필드 크기 조정 */
input.form-control {
min-width: 80px; /* 최소 너비 설정 */
}
/* 미디어 쿼리: 모바일 화면에서 자동 조정 */
@media (max-width: 768px) {
.table th, .table td {
font-size: 14px; /* 글자 크기 조정 */
white-space: nowrap; /* 자동 줄바꿈 방지 */
}
input.form-control {
font-size: 14px;
width: 100%;
}
}
</style>
</head>
<?php
include $_SERVER['DOCUMENT_ROOT'] . '/mymodal.php';
// 첨부 이미지에 대한 부분
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
$today = date("Y-m-d"); // 현재일자 변수지정
if ($mode=="modify" || $mode=="view"){
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";
// handover 테이블에서 현재 work num에 해당하는 데이터 존재 여부 확인
$handover_exists = false;
$last_estimate_amount = 0; // 마지막 차수의 견적 금액
if (!empty($num) && is_numeric($num)) {
try {
$handover_sql = "SELECT COUNT(*) as count, num FROM {$DB}.work_handover WHERE parentnum = ? AND is_deleted = 'N'";
$handover_stmt = $pdo->prepare($handover_sql);
$handover_stmt->execute([$num]);
$handover_result = $handover_stmt->fetch(PDO::FETCH_ASSOC);
$handover_exists = ($handover_result['count'] > 0);
$handover_num = $handover_result['num']; // 인수인계번호
} catch (PDOException $e) {
error_log("Handover 존재 확인 오류: " . $e->getMessage());
}
// estimateList JSON에서 마지막 견적 금액(col4) 추출
if (!empty($estimateList)) {
try {
$estimates = is_string($estimateList) ? json_decode($estimateList, true) : $estimateList;
if (is_array($estimates) && !empty($estimates)) {
// 마지막 견적의 금액(col4) 가져오기
$lastEstimate = end($estimates);
if (isset($lastEstimate['col4']) && !empty($lastEstimate['col4'])) {
$last_estimate_amount = $lastEstimate['col4'];
}
}
} catch (Exception $e) {
error_log("estimateList JSON 파싱 오류: " . $e->getMessage());
// JSON 파싱 실패 시 기존 방식으로 폴백
if (!empty($row['estimate4_supply'])) {
$last_estimate_amount = $row['estimate4_supply'];
} elseif (!empty($row['estimate3_supply'])) {
$last_estimate_amount = $row['estimate3_supply'];
} elseif (!empty($row['estimate2_supply'])) {
$last_estimate_amount = $row['estimate2_supply'];
} elseif (!empty($row['estimate1_supply'])) {
$last_estimate_amount = $row['estimate1_supply'];
}
}
} else {
// estimateList가 비어있을 때 기존 방식으로 폴백
if (!empty($row['estimate4_supply'])) {
$last_estimate_amount = $row['estimate4_supply'];
} elseif (!empty($row['estimate3_supply'])) {
$last_estimate_amount = $row['estimate3_supply'];
} elseif (!empty($row['estimate2_supply'])) {
$last_estimate_amount = $row['estimate2_supply'];
} elseif (!empty($row['estimate1_supply'])) {
$last_estimate_amount = $row['estimate1_supply'];
}
}
}
function formatDate($date) {
return ($date != "0000-00-00" && !empty($date)) ? date("Y-m-d", strtotime($date)) : "";
}
$workday = formatDate($row["workday"]);
$cableday = formatDate($row["cableday"]);
$asday = formatDate($row["asday"]);
$endworkday = formatDate($row["endworkday"]);
$endcableday = formatDate($row["endcableday"]);
$asproday = formatDate($row["asproday"]);
$asendday = formatDate($row["asendday"]);
$promiseday = formatDate($row["promiseday"]);
$setdate = formatDate($row["setdate"]);
// 3자리마다 콤마를 추가하는 함수
function formatNumberWithCommas($number) {
if (is_numeric($number)) {
return number_format($number);
}
return $number;
}
// 변수를 선언하고 3자리마다 콤마를 추가
$estimate1_supply = isset($row['estimate1_supply']) ? formatNumberWithCommas($row['estimate1_supply']) : '';
$estimate1_vat = isset($row['estimate1_vat']) ? formatNumberWithCommas($row['estimate1_vat']) : '';
$estimate2_supply = isset($row['estimate2_supply']) ? formatNumberWithCommas($row['estimate2_supply']) : '';
$estimate2_vat = isset($row['estimate2_vat']) ? formatNumberWithCommas($row['estimate2_vat']) : '';
$estimate3_supply = isset($row['estimate3_supply']) ? formatNumberWithCommas($row['estimate3_supply']) : '';
$estimate3_vat = isset($row['estimate3_vat']) ? formatNumberWithCommas($row['estimate3_vat']) : '';
$estimate4_supply = isset($row['estimate4_supply']) ? formatNumberWithCommas($row['estimate4_supply']) : '';
$estimate4_vat = isset($row['estimate4_vat']) ? formatNumberWithCommas($row['estimate4_vat']) : '';
$bill1_supply = isset($row['bill1_supply']) ? formatNumberWithCommas($row['bill1_supply']) : '';
$bill1_vat = isset($row['bill1_vat']) ? formatNumberWithCommas($row['bill1_vat']) : '';
$bill2_supply = isset($row['bill2_supply']) ? formatNumberWithCommas($row['bill2_supply']) : '';
$bill2_vat = isset($row['bill2_vat']) ? formatNumberWithCommas($row['bill2_vat']) : '';
$bill3_supply = isset($row['bill3_supply']) ? formatNumberWithCommas($row['bill3_supply']) : '';
$bill3_vat = isset($row['bill3_vat']) ? formatNumberWithCommas($row['bill3_vat']) : '';
$bill4_supply = isset($row['bill4_supply']) ? formatNumberWithCommas($row['bill4_supply']) : '';
$bill4_vat = isset($row['bill4_vat']) ? formatNumberWithCommas($row['bill4_vat']) : '';
$bill5_supply = isset($row['bill5_supply']) ? formatNumberWithCommas($row['bill5_supply']) : '';
$bill5_vat = isset($row['bill5_vat']) ? formatNumberWithCommas($row['bill5_vat']) : '';
$bill6_supply = isset($row['bill6_supply']) ? formatNumberWithCommas($row['bill6_supply']) : '';
$bill6_vat = isset($row['bill6_vat']) ? formatNumberWithCommas($row['bill6_vat']) : '';
}
}catch (PDOException $Exception) {
print "오류: ".$Exception->getMessage();
}
}
if ($mode !== "modify" and $mode !== "copy" and $mode !== "view" ) {
include '_request.php';
$regist_day =$today;
}
if ($mode=="copy" ){
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';
$regist_day =$today;
}catch (PDOException $Exception) {
print "오류: ".$Exception->getMessage();
}
// 자료번호 초기화
$num = 0;
}
?>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data" >
<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="level" name="level" value="<?= isset($level) ? $level : '' ?>">
<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 : '' ?>">
<input type="hidden" id="tablename" name="tablename" value="<?= isset($tablename) ? $tablename : '' ?>">
<input type="hidden" id="price" name="price" value="<?= isset($price) ? $price : '' ?>">
<input type="hidden" id="originalcost" name="originalcost" value="<?= isset($originalcost) ? $originalcost : '' ?>">
<input type="hidden" id="item" name="item" value="<?= isset($item) ? $item : '' ?>">
<input type="hidden" id="sum_bill" name="sum_bill" value="<?= isset($sum_bill) ? $sum_bill : 0 ?>">
<input type="hidden" id="sum_deposit" name="sum_deposit" value="<?= isset($sum_deposit) ? $sum_deposit : 0 ?>">
<input type="hidden" id="sum_receivable" name="sum_receivable" value="<?= isset($sum_receivable) ? $sum_receivable : 0 ?>">
<input type="hidden" id="accountList" name="accountList" >
<input type="hidden" id="estimateList" name="estimateList" >
<input type="hidden" id="claimList" name="claimList" >
<input type="hidden" id="equipmentList" name="equipmentList" >
<input type="hidden" id="checkstep" name="checkstep"> <!-- 요청들을 문자열로 저장하기 -->
<input type="hidden" id="checkreceivable" name="checkreceivable"> <!-- 체크박스형태를 저장하려면 두개의 변수가 필요하다. -->
<input type="hidden" id="checkbond" name="checkbond"> <!-- 체크박스형태를 저장하려면 두개의 변수가 필요하다. 채권추심 -->
<div class="container">
<div class="row justify-content-center align-items-center ">
<div class="card align-middle " style="width: 65rem;">
<div class="card-body text-center">
<div class="row d-flex justify-content-center align-items-center mb-3" >
<div class="col-sm-10" >
<div class="d-flex p-1 mb-1 justify-content-center align-items-center ">
<h5> <?=$title_message?> </h5>
<?php if($mode == 'view') { ?>
<button type="button" class="btn btn-dark btn-sm mx-3" onclick="location.href='write_form.php?mode=modify&num=<?= $num ?>&tablename=<?= $tablename ?>';">
<i class="bi bi-pencil-square"></i> 수정
</button>
<?php } ?>
<?php if($mode!=='view') { ?>
<button id="saveBtn" class="btn btn-dark btn-sm mx-1 " type="button">
<? if((int)$num>0) print ' <i class="bi bi-hdd-fill"></i> 저장'; else print ' <i class="bi bi-hdd-fill"></i> 저장'; ?></button>
<? } ?>
<?php if($mode!=='copy' && $mode!=='modify') { ?>
<button id="copyBtn" class="btn btn-primary btn-sm me-1" type="button"><i class="bi bi-copy"></i> 복사</button>
<button id="deleteBtn" class="btn btn-danger btn-sm me-1" type="button"><i class="bi bi-trash2"></i> 삭제</button>
<? } ?>
<button type="button" class="btn btn-outline-dark btn-sm me-2" id="showlogBtn"> H
</div>
</div>
<div class="col-sm-2" >
<button type="button" class="btn btn-outline-dark btn-sm " onclick="self.close();" > <i class="bi bi-box-arrow-left"></i> 창닫기 </button> &nbsp;
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center align-items-center ">
<div class="card align-middle " style="width: 65rem;">
<div class="col-sm-12 rounded" >
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center">
<span class="text-center badge bg-warning fs-6 me-3"> 장비사용</span>
<button type='button' class='btn btn-outline-dark btn-sm viewNoBtn add-row-equipment me-2' data-table='equipmentListTable' style='margin-right: 5px; border:0px;'>+</button>
</div>
<div class="row p-1 mb-1 justify-content-center align-items-center">
<table id="equipmentListTable" class="table table-hover table-bordered">
<thead>
<tr>
<th class="text-center" >No</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 id="equipmentListBody">
<!-- JavaScript에서 동적으로 생성된 행이 여기에 추가됩니다 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid" >
<div class="row" >
<?php if ($chkMobile): ?>
<div class="col-sm-12 rounded" >
<?php else: ?>
<div class="col-lg-6 col-sm-6 rounded" >
<?php endif; ?>
<div class="card">
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center">
<span class="text-center badge bg-primary fs-6 me-3"> 견적 </span>
<button type='button' class='btn btn-outline-dark btn-sm viewNoBtn add-row-estimate me-2' data-table='estimateListTable' style='margin-right: 5px; border:0px;'>+</button>
</div>
<div class="row p-1 mb-1 justify-content-center align-items-center">
<div class="table-responsive">
<table id="estimateListTable" class="table table-hover table-bordered">
<thead>
<tr>
<th class="text-center" style="width:8%;">차수</th>
<th class="text-center" style="width:8%;">계약일</th>
<th class="text-center" style="width:15%;">공급가액</th>
<th class="text-center" style="width:12%;">부가세</th>
<th class="text-center" style="width:15%;">합계</th>
<th class="text-center" style="width:40%;"><i class="bi bi-paperclip"></i> 첨부</th>
</tr>
</thead>
<tbody id="estimateLB">
<!-- JavaScript에서 동적으로 생성된 행이 여기에 추가됩니다 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center">
<span class="text-center badge bg-success fs-6 me-3">계산서/입금</span>
<button type='button' class='btn btn btn-outline-dark btn-sm viewNoBtn add-row me-2' data-table='accountListTable' style='margin-right: 5px; border:0px;'>+</button>
<span class="text-center text-danger fs-6 ms-2 me-3">
<?php
$checkstep_options = ["악성미수금"];
foreach ($checkstep_options as $option) {
echo '<span class=" text-danger ms-5">' . $option . '</span> &nbsp; <input type="checkbox" name="checkbox_receivable[]" value="' . $option . '" ' . (in_array($option, explode(", ", $checkreceivable)) ? 'checked' : '') . '> ';
}
?>
</span>
<span class="text-center text-primary fs-6 ms-3 me-3">
<?php
$checkbond_options = ["채권추심"];
foreach ($checkbond_options as $option) {
echo '<span class=" text-primary ms-5">' . $option . '</span> &nbsp; <input type="checkbox" name="checkbox_bond[]" value="' . $option . '" ' . (in_array($option, explode(", ", $checkbond)) ? 'checked' : '') . '> ';
}
?>
</span>
</div>
<div class="row p-1 mb-1 justify-content-center align-items-center">
<div class="table-responsive">
<table id="accountListTable" class="table table-hover table-bordered">
<thead>
<tr>
<th class="text-center" style="width:10%;">차수</th>
<th class="text-center" style="width:15%;">세금계산서발행</th>
<th class="text-center" style="width:15%;">공급가액</th>
<th class="text-center" style="width:15%;">부가세</th>
<th class="text-center" style="width:15%;">발행합계</th>
<th class="text-center" style="width:15%;">입금일자</th>
<th class="text-center" style="width:15%;">입금액</th>
</tr>
</thead>
<tbody id="accountListBody">
<!-- JavaScript에서 동적으로 생성된 행이 여기에 추가됩니다 -->
</tbody>
<tfoot>
<!-- 합계 행 추가 -->
<tr>
<td class="text-center fw-bold"> <h6> <span class="badge bg-secondary"> 합계 </span> </h6> </td>
<td></td> <!-- 빈 셀 -->
<td><input type="text" id="total_supply" name="total_supply" class="form-control text-end" placeholder="공급가액 합계" readonly /></td>
<td><input type="text" id="total_vat" name="total_vat" class="form-control text-end" placeholder="부가세 합계" readonly /></td>
<td><input type="text" id="total_bill" name="total_bill" class="form-control text-end" placeholder="발행금액 합계" readonly /></td>
<td></td>
<td><input type="text" id="total_deposit" name="total_deposit" class="form-control text-end" placeholder="입금액 합계" readonly /></td>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="row d-flex mb-1 justify-content-center align-items-center">
<!-- 발행 미수금 & 총 미수금 테이블 -->
<div class="col-lg-5 col-md-6 col-sm-12">
<div class="table-responsive">
<table class="table table-hover table-bordered" style="border: 1px solid blue;">
<thead>
<tr>
<th class="text-center"> 발행 미수금 </th>
<th class="text-center"> 총 미수금 </th>
<th class="text-center">입금약속일</th>
</tr>
</thead>
<tbody>
<tr>
<td style="display:none;">
<input type="text" id="decided_estimate" name="decided_estimate" class="form-control text-end" value="<?=$decided_estimate?>" readonly />
</td>
<td style="display:none;">
<input type="text" id="issued_amount" name="issued_amount" class="form-control text-end" value="<?=$issued_amount?>" readonly />
</td>
<td class="text-danger fw-bold text-end">
<input type="text" id="issued_receivable" name="issued_receivable" class="form-control text-end text-primary" value="<?=$issued_receivable?>" readonly />
</td>
<td class="text-danger fw-bold text-end">
<input type="text" id="total_receivable" name="total_receivable" class="form-control text-end text-danger " value="<?=$total_receivable?>" readonly />
</td>
<td>
<input type="date" id="promiseday" name="promiseday" value="<?=$promiseday?>" class="form-control" placeholder="입금약속일" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 하자보증기간 테이블 -->
<div class="col-lg-7 col-md-6 col-sm-12">
<div class="table-responsive">
<table class="table table-hover table-bordered" style="border: 1px solid orange;">
<thead>
<tr>
<th colspan="4" class="text-center">하자보증기간</th>
</tr>
<tr>
<th class="text-center">시작일</th>
<th class="text-center">종료일</th>
<th class="text-center">기간</th>
<th class="text-center">메모</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="date" id="warrantyFromDate" name="warrantyFromDate" value="<?=$warrantyFromDate?>" class="form-control text-end" onchange="calculateWarrantyPeriod()" />
</td>
<td>
<input type="date" id="warrantyToDate" name="warrantyToDate" value="<?=$warrantyToDate?>" class="form-control text-end" onchange="calculateWarrantyPeriod()" />
</td>
<td>
<input type="text" id="warrantyPeriod" name="warrantyPeriod" value="<?=$warrantyPeriod?>" class="form-control text-end" readonly />
</td>
<td>
<input type="text" id="warrantyMemo" name="warrantyMemo" value="<?=$warrantyMemo?>" class="form-control text-start" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="d-flex p-1 mb-1 justify-content-center align-items-center">
<table class="table table-hover table-bordered">
<thead>
<tr>
<th class="text-center" >경리부 수금관련 기록</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="3"><textarea rows="5" cols="32" id="accountnote" name="accountnote" class="form-control" placeholder="경리부 기록"><?=$accountnote?></textarea></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<?php if ($chkMobile): ?>
<div class="col-sm-12 rounded" >
<?php else: ?>
<div class="col-lg-6 col-sm-6 rounded" >
<?php endif; ?>
<div class="card align-middle">
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<span class="text-center badge bg-primary fs-6 me-3" > 공사진행 </span>
<span class="text-center text-primary fs-6 me-5">
<?php
$checkstep_options = ["방문요청", "실측요청", "발주요청", "결선요청", "인정라벨부착요청", "AS요청"];
foreach ($checkstep_options as $option) {
echo $option . ' <input type="checkbox" name="checkbox_step[]" value="' . $option . '" ' . (in_array($option, explode(", ", $checkstep)) ? 'checked' : '') . '> ';
}
?>
</span>
</div>
<div class="d-flex p-2 mb-1 justify-content-center align-items-center">
<table class="table table-hover table-bordered ms-2 me-5 table-sm " style="border: 2px solid brown; width:40%">
<thead>
<tr>
<th colspan="3" class="text-center">인정검사</th>
</tr>
<tr>
<th class="text-center">인정검사자</th>
<th class="text-center">인정라벨부착일</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="text" id="certifiedInspector" name="certifiedInspector" value="<?=$certifiedInspector?>" class="form-control text-center" />
</td>
<td>
<input type="date" id="certifiedLabelAttachedDate" name="certifiedLabelAttachedDate" value="<?=$certifiedLabelAttachedDate?>" class="form-control text-center" />
</td>
</tr>
</tbody>
</table>
<table class="table table-hover table-bordered table-sm" style="border: 2px solid dark; width:40%;">
<thead>
<tr>
<th colspan="2" class="text-center">공사 진행 상태</th>
</tr>
<tr>
<th class="text-center">시공</th>
<th class="text-center">결선</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">
<?php
$state_work = 0;
if ($row["checkbox"] == 0) $state_work = 1;
if (substr($row["workday"], 0, 2) == "20") $state_work = 2;
if (substr($row["endworkday"], 0, 2) == "20") $state_work = 3;
switch ($state_work) {
case 1: $state_str = "착공전"; $badge_class = "badge bg-dark"; break; // 검정색
case 2: $state_str = "시공중"; $badge_class = "badge bg-primary"; break; // 파란색
case 3: $state_str = "시공완료"; $badge_class = "badge bg-danger"; break; // 빨간색
default: $state_str = "계약전"; $badge_class = "badge bg-secondary"; break; // 회색
}
?>
<span class="<?= $badge_class ?>"><?= $state_str ?></span>
</td>
<td class="text-center">
<?php
$state_work = 0;
if ($row["checkbox"] == 0) $state_work = 1;
if (substr($row["cableday"], 0, 2) == "20") $state_work = 2;
if (substr($row["endcableday"], 0, 2) == "20") $state_work = 3;
switch ($state_work) {
case 1: $state_str = ""; $badge_class = "badge bg-secondary"; break; // 검정색
case 2: $state_str = "결선중"; $badge_class = "badge bg-success"; break;
case 3: $state_str = "결선완료"; $badge_class = "badge bg-danger"; break; // 빨간색
default: $state_str = ""; $badge_class = "badge bg-secondary"; break; // 회색
}
?>
<span class="<?= $badge_class ?>"><?= $state_str ?></span>
</td>
</tr>
</tbody>
</table>
<table class="table table-hover table-bordered table-sm p-2 ms-2" style="border: 2px solid dark; width:40%;">
<tbody>
<tr>
<td class="text-end w-50 fw-bold ">현장 대리인</td>
<td>
<input type="text" name="site_agent" value="<?= isset($site_agent) ? htmlspecialchars($site_agent) : '' ?>" class="form-control" placeholder="현장 대리인">
</td>
</tr>
<tr>
<td class="text-end w-50 fw-bold ">인수인계서</td>
<td>
<?php if ($handover_exists): ?>
<span class="badge bg-success">자료있음</span>
<button type="button" class="btn btn-sm btn-outline-primary ms-2" onclick="openHandoverView()">
<i class="bi bi-eye"></i> 보기
</button>
<?php else: ?>
<span class="badge bg-secondary">자료없음</span>
<button type="button" class="btn btn-sm btn-outline-success ms-2" onclick="openHandoverCreate()">
<i class="bi bi-plus"></i> 작성
</button>
<?php endif; ?>
</td>
</tr>
</tbody>
</table>
</div>
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<table class="table table-bordered">
<tbody>
<tr>
<td class="text-end" style="width:10%;">현장명 </td>
<td colspan="3" style="width:30%;"><input type="text" name="workplacename" value="<?= $workplacename ?>" class="form-control text-start" placeholder="현장명" required></td>
<td class="text-end" style="width:10%;">공사담당 </td>
<td style="width:20%;"><input type="text" name="chargedperson" value="<?= $chargedperson ?>" class="form-control" placeholder="공사담당"></td>
</tr>
<tr>
<td class="text-end" style="width:10%;">현장주소 </td>
<td colspan="3" ><input type="text" name="address" value="<?= $address ?>" class="form-control text-start" placeholder="현장주소"></td>
<td class="text-end" style="width:10%;">등록일 </td>
<td style="width:20%;"><input type="date" id="regist_day" name="regist_day" value="<?= $regist_day ?>" class="form-control" ></td>
</tr>
<tr>
<td class="text-end">건설사 </td>
<td><input type="text" name="firstord" value="<?= $firstord ?>" class="form-control" placeholder="건설사"></td>
<td class="text-end" >담당 </td>
<td style="width:16%;"><input type="text" name="firstordman" value="<?= $firstordman ?>" class="form-control" placeholder="원청담당"></td>
<td class="text-end">연락처 </td>
<td><input type="text" name="firstordmantel" value="<?= $firstordmantel ?>" class="form-control" placeholder="연락번호"></td>
</tr>
<tr>
<td class="text-end">발주처 </td>
<td><input type="text" name="secondord" value="<?= $secondord ?>" class="form-control" placeholder="발주처"></td>
<td class="text-end">담당 </td>
<td><input type="text" name="secondordman" value="<?= $secondordman ?>" class="form-control" placeholder="발주처 담당자"></td>
<td class="text-end">연락처 </td>
<td><input type="text" name="secondordmantel" value="<?= $secondordmantel ?>" class="form-control" placeholder="연락번호"></td>
</tr>
<tr>
<td colspan="3" class="text-end" style="width:35%;">발주처 결재 공무담당 </td>
<td><input type="text" id="claimperson" name="claimperson" value="<?= $claimperson ?>" class="form-control" placeholder="공무담당"></td>
<td class="text-end">연락처 </td>
<td><input type="text" name="claimtel" value="<?= $claimtel ?>" class="form-control" placeholder="공무전화"></td>
</tr>
<tr>
<td class="text-end">시공투입일 </td>
<td><input type="date" name="workday" value="<?= $workday ?>" class="form-control" placeholder="투입일" ></td>
<td class="text-end">시공팀 </td>
<td><input type="text" name="worker" value="<?= $worker ?>" class="form-control" placeholder="시공팀"></td>
<td class="text-end">시공완료일 </td>
<td><input type="date" name="endworkday" value="<?= $endworkday ?>" class="form-control" placeholder="시공완료일" ></td>
</tr>
<tr>
<td class="text-end">결선작업일 </td>
<td><input type="date" name="cableday" value="<?= $cableday ?>" class="form-control" placeholder="투입일" ></td>
<td class="text-end">결선팀 </td>
<td><input type="text" name="cablestaff" value="<?= $cablestaff ?>" class="form-control" placeholder="결선팀"></td>
<td class="text-end">결선완료일 </td>
<td><input type="date" name="endcableday" value="<?= $endcableday ?>" class="form-control" placeholder="결선완료일" ></td>
</tr>
<tr>
<td class="text-end">모터회사/용량 </td>
<td><input type="text" name="motormaker" value="<?= $motormaker ?>" class="form-control" placeholder="경동/인성/KST 등"></td>
<td class="text-end">M 전원 </td>
<td><input type="text" name="power" value="<?= $power ?>" class="form-control" placeholder="220v,380v"></td>
<td class="text-end">M 유선/무선 </td>
<td>
<select name="motorwirestatus" class="form-select text-center viewmode d-block w-auto" style="font-size: 0.8rem; height: 32px;">
<option value="" <?= $motorwirestatus == '' ? 'selected' : '' ?>>선택</option>
<option value="유선" <?= $motorwirestatus == '유선' ? 'selected' : '' ?>>유선</option>
<option value="무선" <?= $motorwirestatus == '무선' ? 'selected' : '' ?>>무선</option>
</select>
</td>
</tr>
<tr>
<td class="text-end">시공내역 및 수량 </td>
<td colspan="5"><textarea rows="3" id="worklist" name="worklist" class="form-control fw-bold" placeholder="셔터종류,수량 등 구체적 기술"><?= $worklist ?></textarea></td>
</tr>
<tr style="color:red;">
<td colspan="1" class="text-center text-danger fw-bold"> 설계변경 내역 </td>
<td colspan="5" class="text-center">
<textarea rows="3" id="change_worklist" name="change_worklist" class="form-control fw-bold" placeholder="설계변경 내역 기록" ><?=$change_worklist?></textarea>
</td>
</tr>
<?php if((int)$num>0) { ?>
<tr>
<td colspan="6" class="text-start text-secondary">
<span class="text-center badge bg-secondary fs-6 me-5 mb-2" > 경동기업 출고List </span>
<?php
try {
$sqloutput = "select * from $DB.output where con_num =" . $num;
$stmh = $pdo->query($sqloutput);
$temp = $stmh->rowCount();
?>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th class="text-center">공사번호</th>
<th class="text-center">출고일자</th>
<th class="text-center">접수일</th>
<th class="text-center">내역/코멘트</th>
</tr>
</thead>
<tbody>
<?php
while ($rowtmp = $stmh->fetch(PDO::FETCH_ASSOC)) {
$item_num = $rowtmp["num"];
$con_num = $rowtmp["con_num"];
$outdate = $rowtmp["outdate"];
$item_indate = $rowtmp["indate"];
$item_comment = $rowtmp["comment"];
if ($outdate != "") {
$week = array("(일)", "(월)", "(화)", "(수)", "(목)", "(금)", "(토)");
$outdate = $outdate . $week[date('w', strtotime($outdate))];
}
?>
<tr>
<td class="text-center"><a href="outputview.php?num=<?= $item_num ?>" target="_blank"><b><?= $con_num ?></b></a></td>
<td class="text-center" style="color: <?= $font ?>;"><b><?= substr($outdate, 0, 15) ?></b></td>
<td class="text-center"><b><?= substr($item_indate, 0, 10) ?></b></td>
<td class="text-center"><b><?= substr($item_comment, 0, 100) ?></b></td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<table class="table table-bordered">
<tbody>
<tr>
<td class="text-end" style="width:15%;" >공사메모 </td>
<td colspan="8" >
<textarea rows="3" id="comment" name="comment" class="form-control" placeholder="공사관련 메모를 남겨주세요."><?=$comment?></textarea>
</td>
</tr>
<tr>
<td class="text-end" >자재출고 내역 정리</td>
<td colspan="8" >
<textarea rows="3" id="outputmemo" name="outputmemo" class="form-control" placeholder="자재 출고내역"><?=$outputmemo?></textarea>
</td>
</tr>
</tbody>
</table>
</div>
</div> <!-- end of card-body -->
</div> <!-- end of card -->
<div class="card align-middle">
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<span class="text-center badge bg-danger fs-6 me-1">기성청구</span>
<button type="button" id="claim_viewBtn" class="btn btn-danger btn-sm me-2"><i class="bi bi-chevron-down"></i></button>
<button type='button' class='btn btn btn-outline-dark btn-sm viewNoBtn add-row-claimList me-2' data-table='claimListTable' style='margin-right: 5px; border:0px;'>+</button>
</div>
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<div id="claim_view" style="display: none;"> <!-- 최초에는 보이지 않도록 설정 -->
<table id="claimListTable" class="table table-hover table-bordered">
<thead>
<tr>
<th class="text-center" style="width:8%;">구분</th>
<th class="text-center" style="width:15%;">청구일</th>
<th class="text-center" style="width:15%;">청구금액</th>
<th class="text-center" style="width:15%;">확정금액</th>
<th class="text-center" style="width:15%;">잔액</th>
</tr>
</thead>
<tbody id="claimListBody">
<!-- 1차부터 6차까지의 기성청구 입력 -->
</tbody>
<tfoot>
<!-- 합계 행 추가 -->
<tr>
<td class="text-center fw-bold"> <h6> <span class="badge bg-secondary"> 합계 </span> </h6> </td>
<td></td> <!-- 빈 셀 -->
<td><input type="text" id="total_claimamount" name="total_claimamount" class="form-control text-end" placeholder="청구금액 합계" readonly /></td>
<td><input type="text" id="total_claimfix" name="total_claimfix" class="form-control text-end" placeholder="확정금액 합계" readonly /></td>
<td><input type="text" id="total_claimbalance" name="total_claimbalance" class="form-control text-end" placeholder="잔액 합계" readonly /></td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div> <!-- end of col-sm-8 -->
<div class="card align-middle">
<div class="card-body text-center">
<div class="d-flex p-1 mb-1 justify-content-start align-items-center ">
<span class="text-center badge bg-dark fs-6 me-2"> AS</span>
<button type="button" id="as_viewBtn" class="btn btn-dark btn-sm me-2">
<i class="bi bi-chevron-down"></i>
</button>
<div id="as_view" style="display: none;"> <!-- 처음에는 보이지 않도록 설정 -->
<table class="table table-bordered">
<tbody>
<tr>
<td class="text-start" colspan="6">
<?php if($as_check != "1") { ?>
<input type="checkbox" name="as_check" value="1"> AS 진행현황만 표시
<?php } else { ?>
<input type="checkbox" name="as_check" checked value="1"> AS 진행현황만 표시
<?php } ?>
<button type="button" class="btn btn-dark btn-sm me-3" onclick='copy_below()'> AS기록 복사 이관 </button>
<button type="button" class="btn btn-dark btn-sm" onclick='del_below()'> 입력란 초기화 </button>
</td>
</tr>
<tr>
<td>AS 접수일</td>
<td><input type="date" id="asday" name="asday" class="form-control" value="<?=$asday?>" ></td>
<td>접수자</td>
<td><input type="text" id="aswriter" name="aswriter" class="form-control" value="<?=$aswriter?>" size="10" placeholder="AS접수자"></td>
<td>요청인</td>
<td><input type="text" id="asorderman" name="asorderman" class="form-control" value="<?=$asorderman?>" size="10" placeholder="AS의뢰자"></td>
</tr>
<tr>
<td colspan="1">
요청사항 선택
</td>
<td colspan="3">
<?php if($as_step == Null) $as_step="없음"; ?>
<input type="radio" name="as_step" value="없음" <?=$as_step == "없음" ? 'checked' : ''?>> 없음
<input type="radio" name="as_step" value="AS" <?=$as_step == "AS" ? 'checked' : ''?>> AS
<input type="radio" name="as_step" value="결선" <?=$as_step == "결선" ? 'checked' : ''?>> 결선
<input type="radio" name="as_step" value="입결선" <?=$as_step == "입결선" ? 'checked' : ''?>> 입결선
<input type="radio" name="as_step" value="셔터시공" <?=$as_step == "셔터시공" ? 'checked' : ''?>> 셔터시공
</td>
<td>연락처</td>
<td colspan="1"><input type="text" id="asordermantel" class="form-control" name="asordermantel" value="<?=$asordermantel?>" size="14" placeholder="요청인 연락처"></td>
</tr>
<tr>
<td colspan="6">
<?php if($asfee == 0) { ?>
무상 <input type="radio" id="asfee" checked name="asfee" value="0">
유상 <input type="radio" id="asfee" name="asfee" value="1" style="color:red">
<?php } else { ?>
무상 <input type="radio" id="asfee" name="asfee" value="0">
유상 <input type="radio" id="asfee" checked name="asfee" value="1" style="color:red">
<?php } ?>
유상일 경우 견적금액 : <input type="text" id="asfee_estimate" name="asfee_estimate" value="<?=$asfee_estimate?>" size="10" onkeyup="inputNumberFormat(this)" placeholder="유상 금액">
</td>
</tr>
<tr>
<td>AS 증상(구체적)</td>
<td colspan="2"><textarea rows="2" class="form-control" id="aslist" name="aslist" placeholder="구체적 증상 설명"><?=$aslist?></textarea></td>
<td>작업자 참조사항</td>
<td colspan="2"><textarea rows="2" class="form-control" id="as_refer" name="as_refer" placeholder="작업자 참조사항 기록"><?=$as_refer?></textarea></td>
</tr>
<tr>
<td>처리 예정일</td>
<td><input type="date" id="asproday" name="asproday" class="form-control" value="<?=$asproday?>" size="10" placeholder="AS 예정일" ></td>
<td>세팅 예정일</td>
<td><input type="date" id="setdate" name="setdate" class="form-control" value="<?=$setdate?>" size="10" placeholder="세팅 예정일" ></td>
<td>AS담당</td>
<td><input type="text" id="asman" name="asman" class="form-control" value="<?=$asman?>" size="10" placeholder="AS 처리담당"></td>
</tr>
<tr>
<td>최종AS완료</td>
<td><input type="date" id="asendday" name="asendday" class="form-control" value="<?=$asendday?>" ></td>
<td>
처리결과
</td>
<td colspan="4">
<textarea rows="2" id="asresult" name="asresult" class="form-control" placeholder="처리결과 기록"><?=$asresult?></textarea>
</td>
</tr>
<tr>
<td colspan="1">
AS 기록
</td>
<td colspan="5">
<textarea id="ashistory" rows="3" name="ashistory" class="form-control" placeholder="지속적으로 기록을 남겨 보관"><?=$ashistory?></textarea>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
<script>
// 페이지 로딩
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
loader.style.display = 'none';
});
var dataTable; // DataTables 인스턴스 전역 변수
var workpageNumber; // 현재 페이지 번호 저장을 위한 전역 변수
var mode = '<?php echo $mode; ?>';
var ajaxRequest_write = null;
$(document).ready(function() {
// DataTables 초기 설정
dataTable = $('#myTable').DataTable({
"paging": true,
"ordering": true,
"searching": true,
"pageLength": 500,
"lengthMenu": [25, 50, 100, 200, 500, 1000],
"language": {
"lengthMenu": "Show _MENU_ entries",
"search": "Live Search:"
},
"order": [[0, 'asc']]
});
// 페이지 번호 복원 (초기 로드 시)
var savedPageNumber = getCookie('workpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
// 페이지 변경 이벤트 리스너
dataTable.on('page.dt', function() {
var workpageNumber = dataTable.page.info().page + 1;
setCookie('workpageNumber', workpageNumber, 10); // 쿠키에 페이지 번호 저장
});
// 페이지 길이 셀렉트 박스 변경 이벤트 처리
$('#myTable_length select').on('change', function() {
var selectedValue = $(this).val();
dataTable.page.len(selectedValue).draw(); // 페이지 길이 변경 (DataTable 파괴 및 재초기화 없이)
// 변경 후 현재 페이지 번호 복원
savedPageNumber = getCookie('workpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
});
});
function restorePageNumber() {
var savedPageNumber = getCookie('workpageNumber');
// if (savedPageNumber) {
// dataTable.page(parseInt(savedPageNumber) - 1).draw('page');
// }
location.reload(true);
}
$(document).ready(function(){
$("#copyBtn").click(function(){
location.href = 'write_form.php?mode=copy&num=' + $("#num").val() + "&tablename=" + $("#tablename").val() ;
}); // end of function
$("#saveBtn").click(function(){ // DATA 저장버튼 누름
var num = $("#num").val();
// 결재상신이 아닌경우 수정안됨
if(Number(num)>0)
$("#mode").val('modify');
else
$("#mode").val('insert');
// 자료 삽입/수정하는 모듈
saveData();
});
// 삭제버튼
$("#deleteBtn").click( function() {
var update_log = $("#update_log").val();
var user_name = $("#user_name").val();
var level = $("#level").val();
if (!update_log.includes(user_name) && level !== '1')
{
Swal.fire({
title: '삭제불가',
text: "작성자와 관리자만 삭제가능합니다.",
icon: 'error',
confirmButtonText: '확인'
});
} else {
Swal.fire({
title: '자료 삭제',
text: "삭제는 신중! 정말 삭제하시겠습니까?",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '삭제',
cancelButtonText: '취소'
}).then((result) => {
if (result.isConfirmed) {
$("#mode").val('delete'); // `mode` 값을 설정
var form = $('#board_form')[0];
var formData = new FormData(form); // `formData`를 여기에서 정의합니다.
// `formData`에 필요한 추가 데이터를 수동으로 설정
formData.set('mode', $("#mode").val());
formData.set('num', $("#num").val());
if ( (typeof ajaxRequest_write !== 'undefined' && ajaxRequest_write) || ajaxRequest_write!==null ) {
ajaxRequest_write.abort();
}
ajaxRequest_write = $.ajax({
enctype: 'multipart/form-data', // file을 서버에 전송하려면 이렇게 해야 함 주의
processData: false,
contentType: false,
cache: false,
timeout: 1000000,
url: "insert.php",
type: "post",
data: formData,
dataType: "json",
success : function( data ){
// console.log(data);
Toastify({
text: "파일 삭제완료 ",
duration: 2000,
close:true,
gravity:"top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
setTimeout(function(){
if (window.opener && !window.opener.closed) {
// 부모 창에 restorePageNumber 함수가 있는지 확인
if (typeof window.opener.restorePageNumber === 'function') {
window.opener.restorePageNumber(); // 함수가 있으면 실행
}
// window.opener.location.reload(); // 부모 창 새로고침
window.close();
}
}, 2000);
},
error : function( jqxhr , status , error ){
console.log( jqxhr , status , error );
}
});
}
});
}
});
// 화면이 시작된 후
hideOverlay();
});
// 삽입/수정하는 모듈
function saveData() {
// FormData의 내용을 디버그로 출력
// console.log("FormData before sending:");
// for (var pair of data.entries()) {
// console.log(pair[0] + ': ' + pair[1]);
// }
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 체크된 체크박스 값을 배열로 수집
var selectedChecksteps = [];
$("input[name='checkbox_step[]']:checked").each(function(){
selectedChecksteps.push($(this).val());
});
// 선택된 체크박스 값을 콤마로 구분된 문자열로 변환
var checkstepValue = selectedChecksteps.join(", ");
// checkstep 값을 hidden input에 저장 (폼 제출 전에 이 값을 저장하는 방식)
$("#checkstep").val(checkstepValue);
// 체크된 악성미수금 체크박스 값을 배열로 수집
var selectedCheckreceivables = [];
$("input[name='checkbox_receivable[]']:checked").each(function(){
selectedCheckreceivables.push($(this).val());
});
// 선택된 체크박스 값을 콤마로 구분된 문자열로 변환
var checkreceivable = selectedCheckreceivables.join(", ");
// checkstep 값을 hidden input에 저장 (폼 제출 전에 이 값을 저장하는 방식)
$("#checkreceivable").val(checkreceivable);
// 체크된 채권추심 체크박스 값을 배열로 수집
var selectedCheckbond = [];
$("input[name='checkbox_bond[]']:checked").each(function(){
selectedCheckbond.push($(this).val());
});
// 선택된 체크박스 값을 콤마로 구분된 문자열로 변환
var checkbond = selectedCheckbond.join(", ");
$("#checkbond").val(checkbond);
var form = $('#board_form')[0];
var data = new FormData(form);
Toastify({
text: "저장중...",
duration: 2000,
close:true,
gravity:"top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
if ((typeof ajaxRequest_write !== 'undefined' && ajaxRequest_write) || ajaxRequest_write !== null) {
ajaxRequest_write.abort();
}
let accountList = [];
$('#accountListTable tbody tr').each(function() {
let rowData = {};
$(this).find('input').each(function() {
let name = $(this).attr('name').replace('[]', '');
rowData[name] = $(this).val();
});
accountList.push(rowData);
});
data.set('accountList', JSON.stringify(accountList));
let estimateList = [];
$('#estimateListTable tbody tr').each(function() {
let rowData = {};
let rowIndex = $(this).attr('data-index'); // 행의 인덱스 가져오기
rowData['row_index'] = rowIndex; // row_index 추가
$(this).find('input').each(function() {
let name = $(this).attr('name').replace('[]', '');
rowData[name] = $(this).val();
});
// 파일 처리
let fileInput = $(this).find('input[type="file"]');
if (fileInput.length > 0 && fileInput[0].files.length > 0) {
let file = fileInput[0].files[0];
data.append('upfile[]', file); // 파일을 FormData에 추가
data.append('row_index_for_upfile[]', rowIndex); // 해당 파일의 행 인덱스도 추가
rowData['col5'] = file.name; // col5에 파일 이름 추가
rowData['col6'] = ''; // col6은 서버에서 처리
// console.log("file.name:", file.name);
} else {
// 파일이 선택되지 않았을 경우 기존의 col5, col6 값을 유지
rowData['col5'] = rowData['col5'] || $(this).find('input[name="col5[]"]').val();
rowData['col6'] = rowData['col6'] || $(this).find('input[name="col6[]"]').val();
}
estimateList.push(rowData);
});
data.set('estimateList', JSON.stringify(estimateList));
// console.log("Estimate List:", estimateList);
let claimList = [];
$('#claimListTable tbody tr').each(function() {
let rowData = {};
$(this).find('input').each(function() {
let name = $(this).attr('name').replace('[]', '');
rowData[name] = $(this).val();
});
claimList.push(rowData);
});
data.set('claimList', JSON.stringify(claimList));
let equipmentList = [];
$('#equipmentListTable tbody tr').each(function() {
let rowData = {};
$(this).find('input, select').each(function() {
let name = $(this).attr('name').replace('[]', '');
rowData[name] = $(this).val();
});
equipmentList.push(rowData);
});
data.set('equipmentList', JSON.stringify(equipmentList));
ajaxRequest_write = $.ajax({
enctype: 'multipart/form-data', // file을 서버에 전송하려면 이렇게 해야 함 주의
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert.php",
type: "post",
data: data,
dataType:"json",
success : function(data){
// console.log('서버 응답:', data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close:true,
gravity:"top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
}, 1000);
setTimeout(function() {
if (data && data.num)
window.location.href = 'write_form.php?mode=view&tablename=' + $('#tablename').val() + '&num=' + data.num;
}, 1000);
hideOverlay();
},
error : function( jqxhr , status , error ){
console.log( jqxhr , status , error );
}
});
}
function displayFileName(input) {
var fileNameDisplay = $(input).closest('td').find('.file-name');
// 파일이 선택되었을 때 이름 표시
if (input.files && input.files.length > 0) {
var fileNames = Array.from(input.files).map(file => file.name).join(', ');
fileNameDisplay.text(fileNames);
} else {
fileNameDisplay.text(''); // 선택된 파일이 없으면 이름 표시 초기화
}
}
function updateEstimate() {
}
function adjustTextareaHeight(textarea) {
textarea.style.height = 'auto';
textarea.style.height = (textarea.scrollHeight) + 'px';
}
$(document).ready(function() {
var $accountnote = $('#accountnote');
if ($accountnote.length) {
adjustTextareaHeight($accountnote[0]); // 초기 높이 조정
$accountnote.on('input', function() {
adjustTextareaHeight(this);
});
}
var $comment = $('#comment');
if ($comment.length) {
adjustTextareaHeight($comment[0]); // 초기 높이 조정
$comment.on('input', function() {
adjustTextareaHeight(this);
});
}
var $outputmeno = $('#outputmeno');
if ($outputmeno.length) {
adjustTextareaHeight($outputmeno[0]); // 초기 높이 조정
$outputmeno.on('input', function() {
adjustTextareaHeight(this);
});
}
var $ashistory = $('#ashistory');
if ($ashistory.length) {
adjustTextareaHeight($ashistory[0]); // 초기 높이 조정
$ashistory.on('input', function() {
adjustTextareaHeight(this);
});
}
var $change_worklist = $('#change_worklist');
if ($change_worklist.length) {
adjustTextareaHeight($change_worklist[0]); // 초기 높이 조정
$change_worklist.on('input', function() {
adjustTextareaHeight(this);
});
}
var $worklist = $('#worklist');
if ($worklist.length) {
adjustTextareaHeight($worklist[0]); // 초기 높이 조정
$worklist.on('input', function() {
adjustTextareaHeight(this);
});
}
});
function calculateTotals() {
var totalSupply = 0;
var totalVAT = 0;
var totalBill = 0;
var totalDeposit = 0;
// accountListTable 테이블 내에서만 요소 선택 및 합계 계산
var table = document.getElementById('accountListTable');
table.querySelectorAll('input[name="col2[]"]').forEach(function(element) {
totalSupply += parseFloat(element.value.replace(/,/g, '') || 0);
});
table.querySelectorAll('input[name="col3[]"]').forEach(function(element) {
totalVAT += parseFloat(element.value.replace(/,/g, '') || 0);
});
table.querySelectorAll('input[name="col4[]"]').forEach(function(element) {
totalBill += parseFloat(element.value.replace(/,/g, '') || 0);
});
table.querySelectorAll('input[name="col6[]"]').forEach(function(element) {
totalDeposit += parseFloat(element.value.replace(/,/g, '') || 0);
});
var totalReceivable = totalBill - totalDeposit;
// 업데이트된 값을 합계 필드에 표시
document.getElementById('total_supply').value = numberWithCommas(totalSupply);
document.getElementById('total_vat').value = numberWithCommas(totalVAT);
document.getElementById('total_bill').value = numberWithCommas(totalBill);
document.getElementById('total_deposit').value = numberWithCommas(totalDeposit);
document.getElementById('total_receivable').textContent = numberWithCommas(totalReceivable);
// 숨겨진 필드에 계산된 합계 값을 설정
document.getElementById('sum_bill').value = totalBill.toFixed(2);
document.getElementById('sum_deposit').value = totalDeposit.toFixed(2);
document.getElementById('sum_receivable').value = totalReceivable.toFixed(2);
// 견적 테이블에서 마지막 견적 금액을 가져옴
var estimateTable = document.getElementById('estimateListTable');
var lastEstimateAmount = 0;
if (estimateTable) {
var estimateRows = estimateTable.querySelectorAll('input[name="col4[]"]');
if (estimateRows.length > 0) {
lastEstimateAmount = parseFloat(estimateRows[estimateRows.length - 1].value.replace(/,/g, '') || 0);
}
}
// 결정된 견적 업데이트
document.getElementById('decided_estimate').value = numberWithCommas(lastEstimateAmount);
// 발행합계(total_bill)의 값을 발행합계로 설정
var issuedAmount = totalBill;
document.getElementById('issued_amount').value = numberWithCommas(issuedAmount);
// 발행미수금 계산 및 업데이트 (decided_estimate - issued_amount)
var issuedReceivable = issuedAmount - totalDeposit;
document.getElementById('issued_receivable').value = numberWithCommas(issuedReceivable);
// 입금미수금 계산 및 업데이트 (issued_amount - total_deposit)
totalReceivable = lastEstimateAmount - totalDeposit;
document.getElementById('total_receivable').value = numberWithCommas(totalReceivable);
// 추가로 합계에 영향을 주는 항목이 있다면 여기에 추가
// 필요시 추가적인 숨겨진 필드 업데이트
document.getElementById('sum_receivable').value = totalReceivable.toFixed(2);
// 기성청구 부분
var totalClaimAmount = 0;
var totalClaimFix = 0;
var totalClaimBalance = 0;
var previousBalance = issuedAmount; // 발행합계를 초기 잔액으로 설정
// 모든 행을 순회하면서 col2, col3, col6의 합계를 계산
$('#claimListTable tbody tr').each(function(index) {
var claimAmount = parseFloat(($(this).find('input[name="col2[]"]').val() || '0').replace(/,/g, '')) || 0;
var claimFix = parseFloat(($(this).find('input[name="col3[]"]').val() || '0').replace(/,/g, '')) || 0;
var claimDeposit = parseFloat(($(this).find('input[name="col5[]"]').val() || '0').replace(/,/g, '')) || 0;
totalClaimAmount += claimAmount;
totalClaimFix += claimFix;
// 현재 행의 잔액 계산: 이전 행의 잔액에서 col5 (입금액)을 뺀 값
var currentBalance = previousBalance - claimDeposit;
$(this).find('input[name="col6[]"]').val(currentBalance.toLocaleString('en'));
// 다음 행의 잔액 계산을 위해 현재 잔액을 previousBalance로 설정
totalClaimBalance = previousBalance - totalClaimFix;
});
// 합계 필드에 값을 설정
$('#total_claimamount').val(totalClaimAmount.toLocaleString('en'));
$('#total_claimfix').val(totalClaimFix.toLocaleString('en'));
$('#total_claimbalance').val(totalClaimBalance.toLocaleString('en'));
}
// 숫자를 콤마 형식으로 표시하는 함수
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
// 페이지가 로드될 때 초기 계산 수행
document.addEventListener('DOMContentLoaded', function() {
calculateTotals();
});
// 특정 입력 필드 값이 변경될 때마다 합계를 다시 계산하도록 이벤트 리스너 추가
document.querySelectorAll('#decided_estimate, #issued_amount, #issued_receivable').forEach(function(element) {
element.addEventListener('input', calculateTotals);
});
// 입력값을 포맷하는 함수
function formatInput(input) {
var value = input.value.replace(/,/g, '');
if (!isNaN(value) && value !== '') {
input.value = numberWithCommas(parseFloat(value));
}
}
// 3자리마다 콤마를 추가하는 함수
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function inputNumberFormat(obj) {
// 숫자 및 - 이외의 문자는 제거
obj.value = obj.value.replace(/[^0-9-]/g, '');
// 콤마를 제거하고 숫자를 포맷팅
let value = obj.value.replace(/,/g, '');
// 부호가 앞에 오도록 함
if (value.startsWith('-')) {
value = '-' + value.slice(1).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
} else {
value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
obj.value = value;
}
</script>
<script>
$(document).ready(function() {
var accountList = <?php echo json_encode($accountList ?? []); ?>;
var estimateList = <?php echo json_encode($estimateList ?? []); ?>;
var claimList = <?php echo json_encode($claimList ?? []); ?>;
var equipmentList = <?php echo json_encode($equipmentList ?? []); ?>;
// 경리부 계산서발행 JSON이 배열인지 아닌지 여부를 확인하는 방법
if (typeof accountList === 'string') {
try {
accountList = JSON.parse(accountList);
} catch (e) {
console.error('JSON 파싱 오류:', e);
accountList = [];
}
}
if (Array.isArray(accountList)) {
console.log('accountList is an array:', accountList);
} else {
console.log('accountList is not an array, resetting to empty array');
accountList = [];
}
accountList.forEach(function(rowData, index) {
addRow_accountl($('#accountListBody'), rowData);
});
// 견적에 대한 JSON이 배열인지 아닌지 여부를 확인하는 방법
if (typeof estimateList === 'string') {
try {
estimateList = JSON.parse(estimateList);
} catch (e) {
console.error('JSON 파싱 오류:', e);
estimateList = [];
}
}
if (Array.isArray(estimateList)) {
console.log('estimateList is an array:', estimateList);
} else {
console.log('estimateList is not an array, resetting to empty array');
estimateList = [];
}
console.log('estimateList',estimateList);
estimateList.forEach(function(rowData, index) {
addRow_estimate($('#estimateLB'), rowData);
// console.log('Estimate rowData',rowData);
});
// `upfile` 속성을 모두 제거
estimateList.forEach(function(item) {
delete item.upfile;
});
// 아래 코드를 사용하여 console에서 확인할 수 있습니다.
console.log('upfile제거후 ', estimateList);
// console.log('php json : ', accountList);
// 기성청구에 대한 JSON이 배열인지 아닌지 여부를 확인하는 방법
if (typeof claimList === 'string') {
try {
claimList = JSON.parse(claimList);
} catch (e) {
console.error('JSON 파싱 오류:', e);
claimList = [];
}
}
if (Array.isArray(claimList)) {
console.log('claimList is an array:', claimList);
} else {
console.log('claimList is not an array, resetting to empty array');
claimList = [];
}
claimList.forEach(function(rowData, index) {
addRow_claim($('#claimListBody'), rowData);
});
// 장비리스트에 대한 JSON이 배열인지 아닌지 여부를 확인하는 방법
if (typeof equipmentList === 'string') {
try {
equipmentList = JSON.parse(equipmentList);
} catch (e) {
console.error('JSON 파싱 오류:', e);
equipmentList = [];
}
}
if (Array.isArray(equipmentList)) {
console.log('equipmentList is an array:', equipmentList);
} else {
console.log('equipmentList is not an array, resetting to empty array');
equipmentList = [];
}
equipmentList.forEach(function(rowData, index) {
addRow_equipment($('#equipmentListBody'), rowData);
});
// Log 파일보기
$("#showlogBtn").click( function() {
var num = '<?php echo $num; ?>'
// table 이름을 넣어야 함
var workitem = 'work' ;
// 버튼 비활성화
var btn = $(this);
popupCenter("../Showlog.php?num=" + num + "&workitem=" + workitem , '로그기록', 500, 500);
btn.prop('disabled', false);
});
// 행 추가 시에도 일련번호를 업데이트 (삭제 버튼 이벤트 예시)
$(document).on('click', '.add-row', function() {
var tableId = $(this).data('table');
var tableBody = $('#' + tableId).find('tbody');
addRow_accountl(tableBody, {}, tableId);
updateSerialNumbers($('#accountListBody'));
calculateTotals();
});
$(document).on('click', '.remove-row', function() {
$(this).closest('tr').remove();
updateSerialNumbers($('#accountListBody'));
calculateTotals();
});
// 견적서에 대한 이벤트 처리
$(document).on('click', '.add-row-estimate', function() {
// var tableBody = $('#' + $(this).data('table')).find('tbody');
// var tableBody = $('#' + $(this).data('table')).find('tbody');
// console.log('tableBody' ,tableBody);
// addRow_estimate(tableBody);
addRow_estimate($('#estimateLB'));
calculateTotals();
});
$(document).on('click', '.remove-row-estimate', function() {
$(this).closest('tr').remove();
updateSerialNumbers($('#estimateListTable').find('tbody'));
calculateTotals();
});
// 기성청구서에 대한 이벤트 처리
$(document).on('click', '.add-row-claimList', function() {
// 기성청구 보이게 하는 코드
const claimView = document.getElementById("claim_view");
if(claimView)
claimView.style.display = "block";
var tableBody = $('#' + $(this).data('table')).find('tbody');
addRow_claim(tableBody);
calculateTotals();
});
$(document).on('click', '.remove-row-claimList', function() {
$(this).closest('tr').remove();
updateSerialNumbers($('#claimListTable').find('tbody'));
calculateTotals();
});
calculateTotals(); // 초기 계산
});
function addRow_estimate(tableBody, rowData = {}, index = null) {
// console.log('tableBody',tableBody);
if (rowData.col2 !== undefined && rowData.col2 !== null) {
rowData.col2 = numberWithCommas(rowData.col2);
}
if (rowData.col3 !== undefined && rowData.col3 !== null) {
rowData.col3 = numberWithCommas(rowData.col3);
}
if (rowData.col4 !== undefined && rowData.col4 !== null) {
rowData.col4 = numberWithCommas(rowData.col4);
}
var newRowIndex = index !== null ? index : tableBody.find('tr').length; // 고유 인덱스
var newRow = $('<tr>').attr('data-index', newRowIndex); // 인덱스를 행에 할당
// 첫 번째 열: 일련번호 (자동 생성)
newRow.append('<td class="text-center" style="width:8%;">' +
'<div class="d-flex justify-content-center align-items-center"> <span class="serial-number me-2"></span>' +
'<button type="button" class="btn btn-outline-dark btn-sm viewNoBtn add-row-estimate me-1" style="border:0px;" data-table="' + tableBody.closest('table').attr('id') + '">+</button>' +
'<button type="button" class="btn btn-outline-danger btn-sm viewNoBtn remove-row-estimate" style="border:0px;" >-</button>' +
'</div></td>');
// col1 (견적일) - "0000-00-00"을 빈 문자열로 처리
var col1Value = (rowData.col1 === "0000-00-00") ? '' : rowData.col1;
newRow.append('<td class="text-center"><input type="date" name="col1[]" class="form-control text-center" value="' + col1Value + '"></td>');
// col2 (공급가액) 및 계산 아이콘
newRow.append('<td class="text-center">' +
'<div class="d-flex align-items-center">' +
'<input type="text" name="col2[]" class="form-control text-end number-format me-1" placeholder="공급가액" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col2 || '') + '">' +
'<span class="cursor-pointer" onclick="calculateBasedOnSupply($(this).closest(\'tr\'));">' +
'<i class="bi bi-calculator-fill"></i></span>' +
'</div></td>');
// col3 (부가세)
newRow.append('<td class="text-center"><input type="text" name="col3[]" class="form-control text-end number-format" autocomplete="off" placeholder="부가세" onkeyup="inputNumberFormat(this);" value="' + (rowData.col3 || '') + '"></td>');
// col4 (합계) 및 계산 아이콘
newRow.append('<td class="text-center">' +
'<div class="d-flex align-items-center">' +
'<input type="text" name="col4[]" class="form-control text-end number-format me-1" placeholder="합계" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col4 || '') + '">' +
'<span class="cursor-pointer" onclick="calculateBasedOnTotal($(this).closest(\'tr\'));">' +
'<i class="bi bi-calculator-fill"></i></span>' +
'</div></td>');
// col5 (첨부파일)
var fileColumnContent;
// 첨부파일 필드 생성 시 인덱스를 hidden input으로 추가
// 문자열이 20자를 넘으면 '20자 + ...'로 변환
// let fileName = rowData.col5.length > 15 ? rowData.col5.slice(0, 15) + '...' : rowData.col5;
rowData.col5 = rowData.col5 || '';
let fileName = rowData.col5.length > 15
? rowData.col5.slice(0, 15) + '...'
: rowData.col5;
if (rowData.col5) {
fileColumnContent = '<a href="../uploads/' + (rowData.col6 || '#') + '" onclick="window.open(this.href,\'파일보기\',\'width=1400,height=800\'); return false;" style="color:blue;" title="' + rowData.col5 + '">' + fileName + '</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
'<input type="hidden" name="row_index[]" value="' + newRowIndex + '">' +
'<input type="hidden" name="col5[]" value="' + (rowData.col5 || '') + '"> ' +
'<input type="hidden" name="col6[]" value="' + (rowData.col6 || '') + '"> ' +
'<span class="text-danger me-2"> <i class="bi bi-trash3 fs-6"></i> </span> ' +
'<input type="checkbox" name="del_file[]" value="' + newRowIndex + '" class="me-1"> ';
} else {
fileColumnContent = '<label class="custom-file-upload">' +
'<input type="file" name="upfile[]" onchange="displayFileName(this)" data-row-index="' + newRowIndex + '">' +
'<input type="hidden" name="row_index[]" value="' + newRowIndex + '">' +
'<input type="hidden" name="col5[]" value="' + (rowData.col5 || '') + '"> ' +
'<input type="hidden" name="col6[]" value="' + (rowData.col6 || '') + '"> ' +
'<i class="bi bi-paperclip"></i>' +
'</label>' +
'<span class="file-name ms-2"></span>';
}
newRow.append('<td class="text-start">' +
'<div class="d-flex justify-content-start">' +
fileColumnContent +
'</div></td>');
// console.log('Before appending row, tableBody:', $(tableBody).html());
tableBody.append(newRow);
// console.log('After appending row, tableBody:', $(tableBody).html());
// 일련번호를 업데이트
updateSerialNumbers(tableBody);
function updateSerialNumbers(tableBody) {
tableBody.find('tr').each(function(index) {
$(this).find('.serial-number').text(index + 1);
});
}
}
function addRow_accountl(tableBody, rowData = {}) {
var newRow = $('<tr>');
if (rowData.col2 !== undefined && rowData.col2 !== null) {
rowData.col2 = numberWithCommas(rowData.col2);
}
if (rowData.col3 !== undefined && rowData.col3 !== null) {
rowData.col3 = numberWithCommas(rowData.col3);
}
if (rowData.col4 !== undefined && rowData.col4 !== null) {
rowData.col4 = numberWithCommas(rowData.col4);
}
if (rowData.col6 !== undefined && rowData.col6 !== null) {
rowData.col6 = numberWithCommas(rowData.col6);
}
// 첫 번째 열: 일련번호 (자동 생성)
newRow.append('<td class="text-center" style="width:80px;">' +
'<div class="d-flex justify-content-center align-items-center "> <span class="serial-number me-2"></span>' +
'<button type="button" class="btn btn-outline-dark btn-sm viewNoBtn add-row me-1" style="border:0px;" data-table="' + tableBody.closest('table').attr('id') + '">+</button>' +
'<button type="button" class="btn btn-outline-danger btn-sm viewNoBtn remove-row" style="border:0px;" >-</button>' +
'</div></td>');
// col1 (발행일자) - "0000-00-00"을 빈 문자열로 처리
var col1Value = (rowData.col1 === "0000-00-00") ? '' : rowData.col1;
newRow.append('<td class="text-center"><input type="date" name="col1[]" class="form-control text-center" value="' + col1Value + '"></td>');
// col2 (공급가액) 및 계산 아이콘
newRow.append('<td class="text-center">' +
'<div class="d-flex align-items-center">' +
'<input type="text" name="col2[]" class="form-control text-end number-format me-1" placeholder="공급가액" onkeyup="inputNumberFormat(this);" autocomplete="off" value="' + (rowData.col2 || '') + '">' +
'<span class=" cursor-pointer" onclick="calculateBasedOnSupply($(this).closest(\'tr\'));">' +
'<i class="bi bi-calculator-fill"></i></span>' +
'</div></td>');
// col3 (부가세)
newRow.append('<td class="text-center"><input type="text" name="col3[]" class="form-control text-end number-format" placeholder="부가세" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col3 || '') + '"></td>');
// col4 (발행금액) 및 계산 아이콘
newRow.append('<td class="text-center">' +
'<div class="d-flex align-items-center">' +
'<input type="text" name="col4[]" class="form-control text-end number-format me-1" placeholder="발행금액" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col4 || '') + '">' +
'<span class="cursor-pointer" onclick="calculateBasedOnTotal($(this).closest(\'tr\'));">' +
'<i class="bi bi-calculator-fill"></i></span>' +
'</div></td>');
// col5 (입금일자) - "0000-00-00"을 빈 문자열로 처리
var col5Value = (rowData.col5 === "0000-00-00") ? '' : rowData.col5;
newRow.append('<td class="text-center"><input type="date" name="col5[]" class="form-control text-center" autocomplete="off" value="' + col5Value + '"></td>');
// col6 (입금액)
newRow.append('<td class="text-center"><input type="text" name="col6[]" class="form-control text-end number-format" autocomplete="off" placeholder="입금액" onkeyup="inputNumberFormat(this);" value="' + (rowData.col6 || '') + '"></td>');
tableBody.append(newRow);
// 일련번호를 업데이트
updateSerialNumbers(tableBody);
// 숫자 필드에 3자리마다 콤마 추가 (소수점 입력 가능)
newRow.find('.number-format').on('input change', function() {
let value = $(this).val().replace(/,/g, ''); // 기존의 콤마를 제거
// 소수점 포함 숫자 검사
if (!isNaN(value) && value !== '') {
// 정수와 소수 부분 분리
let parts = value.split('.');
parts[0] = Number(parts[0]).toLocaleString('en'); // 3자리마다 콤마 추가
// 소수점이 있는 경우
let formattedValue = parts.join('.');
$(this).val(formattedValue);
}
//계산 함수 호출
calculateTotals();
});
// 처음 로드될 때도 자동 계산 적용
calculateTotals();
}
function displayFileName(input) {
var fileNameDisplay = $(input).closest('td').find('.file-name');
// 파일이 선택되었을 때 이름 표시
if (input.files && input.files.length > 0) {
var fileNames = Array.from(input.files).map(file => file.name).join(', ');
fileNameDisplay.text(fileNames);
} else {
fileNameDisplay.text(''); // 선택된 파일이 없으면 이름 표시 초기화
}
}
function addRow_claim(tableBody, rowData = {}) {
var newRow = $('<tr>');
// 첫 번째 열: 일련번호 (자동 생성)
newRow.append('<td class="text-center" style="width:80px;">' +
'<div class="d-flex justify-content-center align-items-center "> <span class="serial-number me-2"></span>' +
'<button type="button" class="btn btn-outline-dark btn-sm viewNoBtn add-row-claimList me-1" style="border:0px;" data-table="' + tableBody.closest('table').attr('id') + '">+</button>' +
'<button type="button" class="btn btn-outline-danger btn-sm viewNoBtn remove-row-claimList" style="border:0px;" >-</button>' +
'</div></td>');
// col1 (청구일) - "0000-00-00"을 빈 문자열로 처리
var col1Value = (rowData.col1 === "0000-00-00") ? '' : (rowData.col1 || '');
newRow.append('<td class="text-center"><input type="date" name="col1[]" class="form-control text-center" value="' + col1Value + '"></td>');
// col2 (청구금액)
newRow.append('<td class="text-center"><input type="text" name="col2[]" class="form-control text-end number-format" placeholder="청구금액" onkeyup="inputNumberFormat(this);" autocomplete="off" value="' + (rowData.col2 || '') + '"></td>');
// col3 (확정금액)
newRow.append('<td class="text-center"><input type="text" name="col3[]" class="form-control text-end number-format" placeholder="확정금액" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col3 || '') + '"></td>');
// // col4 (비어있음, 필요 시 추가)
// newRow.append('<td class="text-center"><input type="text" name="col4[]" class="form-control text-end number-format" placeholder="비어있음" autocomplete="off" value="' + (rowData.col4 || '') + '" disabled></td>');
// // col5 (비어있음, 필요 시 추가)
// newRow.append('<td class="text-center"><input type="text" name="col5[]" class="form-control text-end number-format" placeholder="비어있음" autocomplete="off" value="' + (rowData.col5 || '') + '" disabled></td>');
// col6 (잔액)
newRow.append('<td class="text-center"><input type="text" name="col6[]" class="form-control text-end number-format" placeholder="잔액" autocomplete="off" onkeyup="inputNumberFormat(this);" value="' + (rowData.col6 || '') + '" disabled></td>');
tableBody.append(newRow);
// 일련번호를 업데이트
updateSerialNumbers(tableBody);
// 숫자 필드에 3자리마다 콤마 추가 (소수점 입력 가능)
newRow.find('.number-format').on('input change', function() {
let value = $(this).val().replace(/,/g, ''); // 기존의 콤마를 제거
// 소수점 포함 숫자 검사
if (!isNaN(value) && value !== '') {
// 정수와 소수 부분 분리
let parts = value.split('.');
parts[0] = Number(parts[0]).toLocaleString('en'); // 3자리마다 콤마 추가
// 소수점이 있는 경우
let formattedValue = parts.join('.');
$(this).val(formattedValue);
}
//계산 함수 호출
calculateTotals();
});
// 처음 로드될 때도 자동 계산 적용
calculateTotals();
}
function addRow_equipment(tableBody, rowData = {}) {
var newRow = $('<tr>');
// 첫 번째 열: 일련번호 및 추가/삭제 버튼
newRow.append('<td class="text-center" style="width:5%;">' +
'<div class="d-flex justify-content-center align-items-center">' +
'<span class="serial-number me-2"></span>' +
'<button type="button" class="btn btn-outline-dark btn-sm viewNoBtn add-row-equipment me-1" style="border:0px;" data-table="' + tableBody.closest('table').attr('id') + '">+</button>' +
'<button type="button" class="btn btn-outline-danger btn-sm viewNoBtn remove-row-equipment" style="border:0px;">-</button>' +
'</div></td>');
// 장비명 (select 요소, name=col1)
var selectedEquipment = rowData.col1 || ''; // 기존 데이터를 rowData로부터 받아서 설정
newRow.append('<td class="text-center" style="width:12%;"><select name="col1[]" class="form-select viewmode" style="font-size:0.7rem;height:28px;">'
+ '<option value="렌탈(TL)" ' + (selectedEquipment === '렌탈(TL)' ? 'selected' : '') + '>렌탈(TL)</option>'
+ '<option value="지게차" ' + (selectedEquipment === '지게차' ? 'selected' : '') + '>지게차</option>'
+ '</select></td>');
// 투입일 (name=col2)
var startDateValue = rowData.col2 || ''; // rowData로부터 투입일 값 설정
newRow.append('<td class="text-center"><input type="date" name="col2[]" class="form-control text-center" value="' + startDateValue + '"></td>');
// 회수일 (name=col3)
var endDateValue = rowData.col3 || ''; // rowData로부터 회수일 값 설정
newRow.append('<td class="text-center"><input type="date" name="col3[]" class="form-control text-center" value="' + endDateValue + '"></td>');
// 수량 (새로운 열, name=col4)
var quantityValue = rowData.col4 || ''; // rowData로부터 수량 값을 설정
newRow.append('<td class="text-center" ><input type="number" name="col4[]" class="form-control text-center" value="' + quantityValue + '"></td>');
// 업체명 (name=col5, 기존 col4)
var companyValue = rowData.col5 || ''; // rowData로부터 업체명 값 설정
newRow.append('<td class="text-center" ><input type="text" name="col5[]" class="form-control text-center" value="' + companyValue + '"></td>');
// 담당자 (name=col6, 기존 col5)
var personInChargeValue = rowData.col6 || ''; // rowData로부터 담당자 값 설정
newRow.append('<td class="text-center" ><input type="text" name="col6[]" class="form-control text-center" value="' + personInChargeValue + '"></td>');
// 연락처 (name=col7, 기존 col6)
var contactValue = rowData.col7 || ''; // rowData로부터 연락처 값 설정
newRow.append('<td class="text-center" ><input type="text" name="col7[]" class="form-control text-center" value="' + contactValue + '"></td>');
// 비고 (name=col8, 기존 col7)
var remarksValue = rowData.col8 || ''; // rowData로부터 비고 값 설정
newRow.append('<td class="text-center" ><input type="text" name="col8[]" class="form-control text-center" value="' + remarksValue + '"></td>');
// 행을 테이블에 추가
tableBody.append(newRow);
// 일련번호 갱신
updateSerialNumbers(tableBody);
}
$(document).ready(function() {
// 행 추가 버튼 클릭 시 새로운 장비 사용 행 추가
$('.add-row-equipment').on('click', function() {
addRow_equipment($('#equipmentListBody'));
});
// 동적으로 추가된 행에서
$('#equipmentListBody').on('click', '.add-row-equipment', function() {
addRow_equipment($('#equipmentListBody'));
});
// 동적으로 추가된 행에서 삭제/복사 버튼에 이벤트 바인딩
$('#equipmentListBody').on('click', '.remove-row-equipment', function() {
$(this).closest('tr').remove();
updateSerialNumbers($('#equipmentListBody')); // 일련번호 갱신
});
// 행 번호를 갱신하는 함수
function updateSerialNumbers(tableBody) {
tableBody.find('tr').each(function(index) {
$(this).find('.serial-number').text(index + 1);
});
}
});
// 공급가액을 기준으로 부가세와 발행금액 계산
function calculateBasedOnSupply(row) {
var supply = parseFloat(row.find('input[name="col2[]"]').val().replace(/,/g, '')) || 0;
var vat = supply * 0.1; // 부가세 10%
var total = supply + vat;
row.find('input[name="col3[]"]').val(numberWithCommas(vat.toFixed(0))); // 부가세
row.find('input[name="col4[]"]').val(numberWithCommas(total.toFixed(0))); // 발행금액
calculateTotals();
}
// 발행금액을 기준으로 공급가액과 부가세 계산
function calculateBasedOnTotal(row) {
var total = parseFloat(row.find('input[name="col4[]"]').val().replace(/,/g, '')) || 0;
var supply = total / 1.1; // 공급가액 = 발행금액 / 1.1
var vat = total - supply; // 부가세 = 발행금액 - 공급가액
row.find('input[name="col2[]"]').val(numberWithCommas(supply.toFixed(0))); // 공급가액
row.find('input[name="col3[]"]').val(numberWithCommas(vat.toFixed(0))); // 부가세
calculateTotals();
}
// 일련번호 업데이트 함수
function updateSerialNumbers(tableBody) {
tableBody.find('tr').each(function(index) {
$(this).find('.serial-number').text(index + 1);
});
}
document.addEventListener("DOMContentLoaded", function() {
viewClaim() ;
// as 토글
const asViewBtn = document.getElementById("as_viewBtn");
const asView = document.getElementById("as_view");
asViewBtn.addEventListener("click", function() {
if (asView.style.display === "none" || asView.style.display === "") {
asView.style.display = "block";
} else {
asView.style.display = "none";
}
});
});
// 기성청구 항목 보이게
function viewClaim() {
const claimViewBtn = document.getElementById("claim_viewBtn");
const claimView = document.getElementById("claim_view");
claimViewBtn.addEventListener("click", function() {
if (claimView.style.display === "none") {
claimView.style.display = "block";
} else {
claimView.style.display = "none";
}
});
}
function copy_below(){
var park = document.getElementsByName("asfee");
var history = document.getElementById("ashistory");
var feeType = park[1].checked ? "유상" : "무상";
var fields = [
"asday", "aswriter", "asorderman", "asordermantel", "asfee",
"asfee_estimate", "aslist", "as_refer", "asproday",
"setdate", "asman", "asendday", "asresult"
];
history.value += fields.slice(0, 4).map(id => document.getElementById(id).value).join(" ") + " ";
history.value += feeType + " " + document.getElementById("asfee").value + " ";
history.value += fields.slice(5).map(id => document.getElementById(id).value).join(" ") + " ";
}
function del_below() {
if(confirm("초기화한 자료는 복구할 방법이 없습니다.\n\n정말 초기화 하시겠습니까?")) {
const fields = [
"asday", "aswriter", "asorderman", "asordermantel", "asfee_estimate",
"aslist", "as_refer", "asproday", "setdate", "asman", "asendday", "asresult"
];
fields.forEach(id => document.getElementById(id).value = "");
}
}
function calculateWarrantyPeriod() {
const fromDate = new Date(document.getElementById('warrantyFromDate').value);
const toDate = new Date(document.getElementById('warrantyToDate').value);
if (!fromDate || !toDate || toDate < fromDate) {
document.getElementById('warrantyPeriod').value = '';
return;
}
let years = toDate.getFullYear() - fromDate.getFullYear();
let months = toDate.getMonth() - fromDate.getMonth();
if (months < 0) {
years--;
months += 12;
}
let period = '';
if (years > 0) period += years + '년';
if (months > 0) period += (years > 0 ? ' ' : '') + months + '개월';
if (period === '') period = ''; // 최소 1개월
document.getElementById('warrantyPeriod').value = period;
}
</script>
<!-- mode == 'view' 조회 화면일때 사용금지 시키는 구문 -->
<script>
$(document).ready(function(){
var mode = '<?php echo $mode; ?>';
// 마지막에 넣어줘야 전체를 적용할 수 있다.
if (mode === 'view') {
// 특정 요소는 예외 처리
$('input').prop('readonly', true); // 파일 업로드 input 예외
$('textarea').prop('readonly', true);
$('input[type=file]').prop('disabled', false); // 파일 업로드 input 예외
$('input[type=hidden]').prop('disabled', false); // hidden input 예외
$('input[type=checkbox]').prop('disabled', false); // 체크박스 예외 처리
$('.viewNoBtn').prop('disabled', true); // viewNoBtn 클래스 비활성화
$('.viewmode').prop('disabled', true);
// 요청설정 자동으로 서버에 저장하기 체크박스 변경 시 저장 (view 모드에서만)
$('input[name="checkbox_step[]"]').change(function() {
var selectedChecksteps = [];
// 체크된 체크박스 값을 배열로 수집
$("input[name='checkbox_step[]']:checked").each(function() {
selectedChecksteps.push($(this).val());
});
// 선택된 체크박스 값을 콤마로 구분된 문자열로 변환
var checkstepValue = selectedChecksteps.join(", ");
var update_log = $("#update_log").val();
// AJAX로 데이터를 insert.php로 전송하여 업데이트
$.ajax({
url: 'insert_check.php', // 기존 insert.php 사용
type: 'POST',
data: {
mode: 'modify', // 기존 로직에 맞게 mode를 modify로 설정
num: '<?php echo $num; ?>', // 작업 고유 번호 전달
checkstep: checkstepValue , // 체크된 항목을 전달
update_log : update_log
},
success: function(response) {
console.log("저장 성공:", response); // 성공 시 콘솔 출력
Toastify({
text: "요청사항이 변경되었습니다.",
duration: 2000,
close:true,
gravity:"top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
if (window.opener && !window.opener.closed) {
if (typeof window.opener.restoreFirstPage === 'function') {
window.opener.restoreFirstPage(); // 함수가 있으면 실행
}
}
},
error: function(xhr, status, error) {
console.error("저장 실패:", error); // 에러 처리
}
});
});
}
// var inputs = document.querySelectorAll('input');
// inputs.forEach(function(input) {
// input.setAttribute('autocomplete', 'off');
// });
// 페이지가 로드될 때 처음으로 실행
calculateWarrantyPeriod();
// 두 날짜 필드에 이벤트 리스너를 추가하여 값이 변경될 때마다 실행
document.getElementById('warrantyFromDate').addEventListener('change', calculateWarrantyPeriod);
document.getElementById('warrantyToDate').addEventListener('change', calculateWarrantyPeriod);
});
// 인수인계서 팝업 함수들
function openHandoverView() {
var workNum = '<?= $num ?>';
var url = 'handover_doc.php?num=' + workNum;
var handoverNum = <?= isset($handover_num) ? json_encode($handover_num) : '""' ?>;
if (handoverNum) {
url += '&handover_num=' + handoverNum;
}
customPopup(url, '인수인계 보고서 보기', 1000, 900);
}
function openHandoverCreate() {
var workNum = '<?= $num ?>';
var workplacename = '<?= htmlspecialchars($workplacename ?? '', ENT_QUOTES) ?>';
var lastEstimateAmount = '<?= htmlspecialchars($last_estimate_amount ?? '', ENT_QUOTES) ?>';
var firstord = '<?= htmlspecialchars($secondord ?? '', ENT_QUOTES) ?>'; // 시행사를 발주처로 함
var secondord = '<?= htmlspecialchars($secondord ?? '', ENT_QUOTES) ?>';
var url = 'handover_doc.php?num=' + workNum +
'&workplacename=' + encodeURIComponent(workplacename) +
'&contract_amount=' + encodeURIComponent(lastEstimateAmount) +
'&firstord=' + encodeURIComponent(firstord) +
'&secondord=' + encodeURIComponent(secondord);
customPopup(url, '인수인계 보고서 작성', 1000, 900);
}
</script>
</body>
</html>