발주취소 기능 추가, 발주서 메일 발송 시 도면 첨부 선택 기능 추가
This commit is contained in:
@@ -88,6 +88,7 @@ $(document).ready(function(){
|
||||
|
||||
var columns = [
|
||||
// 요구사항: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 발주수량, 입고수량, 미입고수량, 검사성적서, 입고결과
|
||||
{title:'STATUS' ,field:'STATUS' ,visible:false, frozen:true},
|
||||
{title:'TOTAL_SUPPLY_PRICE' ,field:'TOTAL_SUPPLY_PRICE' ,visible:false, frozen:true},
|
||||
{title:'TOTAL_DELIVERY_PRICE' ,field:'TOTAL_DELIVERY_PRICE' ,visible:false, frozen:true},
|
||||
{title:'TOTAL_NOT_DELIVERY_PRICE',field:'TOTAL_NOT_DELIVERY_PRICE',visible:false, frozen:true},
|
||||
@@ -127,15 +128,36 @@ var columns = [
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', minWidth : 90, widthGrow : 1, title : '입고결과', field : 'DELIVERY_STATUS',
|
||||
formatter:fnc_createGridAnchorTag,
|
||||
cellClick:function(e, cell){
|
||||
formatter: function(cell, formatterParams, onRendered){
|
||||
var status = fnc_checkNull(cell.getData().STATUS);
|
||||
var deliveryStatus = fnc_checkNull(cell.getValue());
|
||||
|
||||
// 발주취소 상태인 경우
|
||||
if(status === 'orderCancel'){
|
||||
return '<span style="color:red; font-weight:bold;">발주취소</span>';
|
||||
}
|
||||
|
||||
// 일반 상태 - 링크로 표시
|
||||
if(deliveryStatus != ''){
|
||||
return '<a href="#none" style="color:#0000EE">' + deliveryStatus + '</a>';
|
||||
}
|
||||
return deliveryStatus;
|
||||
},
|
||||
cellClick:function(e, cell){
|
||||
var status = fnc_checkNull(cell.getData().STATUS);
|
||||
|
||||
// 발주취소 상태인 경우 팝업 열지 않음
|
||||
if(status === 'orderCancel'){
|
||||
return;
|
||||
}
|
||||
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
var DELIVERY_STATUS = fnc_checkNull(cell.getData().DELIVERY_STATUS);
|
||||
var purchaseOrderNo = fnc_checkNull(cell.getData().PURCHASE_ORDER_NO);
|
||||
fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS);
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', minWidth : 140, widthGrow : 1, title : '매입마감', field : 'PURCHASE_CLOSE_DATE'}
|
||||
}
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', minWidth : 140, widthGrow : 1, title : '매입마감', field : 'PURCHASE_CLOSE_DATE'}
|
||||
];
|
||||
|
||||
//var grid;
|
||||
@@ -219,7 +241,14 @@ function fn_deliveryAcceptancePopUp(){
|
||||
if(selected.length > 1){
|
||||
Swal.fire("한건씩 등록 가능합니다.");
|
||||
return;
|
||||
}else{
|
||||
}else{
|
||||
// 발주취소 상태 체크
|
||||
var status = fnc_checkNull(selected[0].STATUS);
|
||||
if(status === 'orderCancel'){
|
||||
Swal.fire("발주취소된 건은 입고등록할 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var MULTI_MASTER_YN = fnc_checkNull(selected[0].MULTI_MASTER_YN);
|
||||
var MULTI_YN = fnc_checkNull(selected[0].MULTI_YN);
|
||||
|
||||
@@ -472,7 +501,7 @@ function fn_purchaseClose(){
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="조회" id="btnSearch">
|
||||
<input type="button" class="plm_btns" value="입고등록" id="btnAccept">
|
||||
<input type="button" class="plm_btns" value="매입마감" id="btnClose">
|
||||
<!-- <input type="button" class="plm_btns" value="매입마감" id="btnClose"> -->
|
||||
<%-- <input type="button" class="plm_btns" value="부적합등록" id="btnInvaild"> --%>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -76,6 +76,11 @@ $(document).ready(function(){
|
||||
fn_sendPurchaseOrder();
|
||||
});
|
||||
|
||||
// 발주 취소 버튼 클릭
|
||||
$("#btnOrderCancel").click(function(){
|
||||
fn_orderCancel();
|
||||
});
|
||||
|
||||
//수주활동 복사 팝업
|
||||
$("#btnCopy").click(function(){
|
||||
var checkedObj = _tabulGrid.getSelectedData();
|
||||
@@ -352,7 +357,11 @@ var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'메일발송', field:'MAIL_SEND_YN',
|
||||
formatter: function(cell, formatterParams, onRendered){
|
||||
var value = fnc_checkNull(cell.getValue());
|
||||
if(value === 'Y'){
|
||||
var status = fnc_checkNull(cell.getData().STATUS);
|
||||
// 발주취소 상태인 경우
|
||||
if(status === 'orderCancel'){
|
||||
return '<span style="color:red; font-weight:bold;">발주취소</span>';
|
||||
} else if(value === 'Y'){
|
||||
return '<span style="color:green;">발송완료</span>';
|
||||
} else {
|
||||
return '';
|
||||
@@ -771,7 +780,7 @@ function fn_sendPurchaseOrder(){
|
||||
var mailSendYn = fnc_checkNull(selectedData[0].MAIL_SEND_YN);
|
||||
|
||||
// 취소 상태 확인
|
||||
if(status === "cancel"){
|
||||
if(status === "cancel" || status === "orderCancel"){
|
||||
Swal.fire("취소된 발주서는 발송할 수 없습니다.");
|
||||
return false;
|
||||
}
|
||||
@@ -817,6 +826,119 @@ function fn_openMailFormPopup(purchaseOrderObjId){
|
||||
window.open(url, "purchaseOrderMailForm", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 발주 취소
|
||||
function fn_orderCancel(){
|
||||
var selectedData = _tabulGrid.getSelectedData();
|
||||
|
||||
if(selectedData.length < 1){
|
||||
Swal.fire("발주 취소할 행을 선택해주세요.");
|
||||
return false;
|
||||
} else if(selectedData.length > 1){
|
||||
Swal.fire("한번에 한 개의 발주서만 취소 가능합니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var objId = fnc_checkNull(selectedData[0].OBJID);
|
||||
var status = fnc_checkNull(selectedData[0].STATUS);
|
||||
var MULTI_YN = fnc_checkNull(selectedData[0].MULTI_YN);
|
||||
var MULTI_MASTER_YN = fnc_checkNull(selectedData[0].MULTI_MASTER_YN);
|
||||
var purchaseOrderNo = fnc_checkNull(selectedData[0].PURCHASE_ORDER_NO);
|
||||
|
||||
// 이미 취소된 상태 확인
|
||||
if(status === 'cancel'){
|
||||
Swal.fire("이미 취소된 발주서입니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 이미 발주취소된 상태 확인
|
||||
if(status === 'orderCancel'){
|
||||
Swal.fire("이미 발주취소된 발주서입니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 동시발주 하위건 확인
|
||||
if(MULTI_YN === 'Y' && MULTI_MASTER_YN !== 'Y'){
|
||||
Swal.fire("동시발주 하위건은 마스터건으로 취소해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 입고 여부 확인 후 취소 진행
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/purchaseOrder/checkReceiptForCancel.do",
|
||||
data: { PURCHASE_ORDER_MASTER_OBJID: objId },
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.hasReceipt){
|
||||
// 입고된 항목이 있는 경우
|
||||
Swal.fire({
|
||||
title: '취소 불가',
|
||||
html: '입고된 항목이 있어 발주 취소가 불가합니다.<br/><br/>' +
|
||||
'<span style="color:#666;">입고수량: ' + data.totalReceiptQty + '개</span>',
|
||||
icon: 'error'
|
||||
});
|
||||
} else {
|
||||
// 입고된 항목이 없는 경우 - 취소 확인
|
||||
Swal.fire({
|
||||
title: '발주 취소',
|
||||
html: '발주서 <strong>' + purchaseOrderNo + '</strong>을(를) 취소하시겠습니까?<br/><br/>' +
|
||||
'<span style="color:#666; font-size:12px;">취소 후에도 목록에서 확인 가능하며, 메일발송 컬럼에 "발주취소"로 표시됩니다.</span>',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
confirmButtonText: '취소하기',
|
||||
cancelButtonText: '닫기'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
fn_executeOrderCancel(objId);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.error("입고 확인 오류:", error);
|
||||
Swal.fire("입고 확인 중 오류가 발생했습니다.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 발주 취소 실행
|
||||
function fn_executeOrderCancel(objId){
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/purchaseOrder/executeOrderCancel.do",
|
||||
data: { PURCHASE_ORDER_MASTER_OBJID: objId },
|
||||
dataType: "json",
|
||||
beforeSend: function(){
|
||||
_startLoading("처리중입니다.");
|
||||
},
|
||||
complete: function(){
|
||||
_endLoading();
|
||||
},
|
||||
success: function(data){
|
||||
if(data.result){
|
||||
Swal.fire({
|
||||
title: '완료',
|
||||
text: '발주가 취소되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
fn_search();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: data.message || '발주 취소 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.error("발주 취소 오류:", error);
|
||||
Swal.fire("발주 취소 중 오류가 발생했습니다.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
<body class="<%--bodyNoScrollX--%>">
|
||||
<form name="hiddenForm" id="hiddenForm" method="post">
|
||||
@@ -842,6 +964,7 @@ function fn_openMailFormPopup(purchaseOrderObjId){
|
||||
<input type="button" class="plm_btns" value="삭제" id="btnDelete">
|
||||
<input type="button" class="plm_btns" value="저장" id="btnSave"> -->
|
||||
<input type="button" class="plm_btns" value="발주서 송부" id="btnSend">
|
||||
<input type="button" class="plm_btns" value="발주 취소" id="btnOrderCancel" style="background-color:#dc3545; border-color:#dc3545;">
|
||||
<input type="button" class="plm_btns" value="조회" id="btnSearch">
|
||||
</div>
|
||||
|
||||
|
||||
@@ -191,7 +191,14 @@ String purchaseOrderObjId = request.getParameter("purchaseOrderObjId");
|
||||
|
||||
<div class="attachment-status">
|
||||
<i class="fa fa-file-pdf-o"></i>
|
||||
<strong>첨부파일:</strong> 발주서(PDF) 및 도면 파일이 자동으로 첨부됩니다.
|
||||
<strong>첨부파일:</strong> 발주서(PDF)가 자동으로 첨부됩니다.
|
||||
<div style="margin-top: 8px;">
|
||||
<label style="display: inline-flex; align-items: center; cursor: pointer; font-weight: normal;">
|
||||
<input type="checkbox" id="includeDrawingFiles" name="includeDrawingFiles" checked style="width: 16px; height: 16px; margin-right: 6px;">
|
||||
<span>도면 파일 첨부</span>
|
||||
</label>
|
||||
<span id="drawingFileCount" style="margin-left: 10px; color: #666; font-size: 12px;"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="mailForm">
|
||||
@@ -291,6 +298,9 @@ function fn_loadPurchaseOrderInfo(){
|
||||
} else {
|
||||
$("#managerListContainer").html('<div class="no-managers">공급업체 정보가 없습니다.</div>');
|
||||
}
|
||||
|
||||
// 도면 파일 개수 조회
|
||||
fn_loadDrawingFileCount(purchaseOrderObjId);
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
@@ -313,6 +323,31 @@ function fn_loadPurchaseOrderInfo(){
|
||||
});
|
||||
}
|
||||
|
||||
// 도면 파일 개수 조회
|
||||
function fn_loadDrawingFileCount(purchaseOrderObjId){
|
||||
$.ajax({
|
||||
url: "/purchaseOrder/getDrawingFileCount.do",
|
||||
type: "POST",
|
||||
data: { objId: purchaseOrderObjId },
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.result === "success"){
|
||||
var count = parseInt(data.count) || 0;
|
||||
if(count > 0){
|
||||
$("#drawingFileCount").text("(" + count + "개 파일)");
|
||||
} else {
|
||||
$("#drawingFileCount").text("(파일 없음)");
|
||||
$("#includeDrawingFiles").prop("checked", false);
|
||||
$("#includeDrawingFiles").prop("disabled", true);
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
$("#drawingFileCount").text("(조회 실패)");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 공급업체 담당자 목록 로드
|
||||
function fn_loadPartnerManagers(partnerObjId){
|
||||
$.ajax({
|
||||
@@ -669,7 +704,8 @@ function fn_submitMailForm(){
|
||||
toEmails: $("#toEmails").val(),
|
||||
ccEmails: $("#ccEmails").val(),
|
||||
subject: $("#subject").val(),
|
||||
contents: $("#contents").val()
|
||||
contents: $("#contents").val(),
|
||||
includeDrawingFiles: $("#includeDrawingFiles").is(":checked") ? "Y" : "N"
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
|
||||
Reference in New Issue
Block a user