Files
wace_plm/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp
2025-12-03 17:19:22 +09:00

1132 lines
43 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<%
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
String connector = person.getUserId();
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
<c:set var="now" value="<%=new java.util.Date() %>"/>
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<c:set var="connector" value="<%=connector %>" />
<script>
$(document).ready(function(){
//날짜
_fnc_datepick();
// jQuery 및 select2 로드 확인
console.log('jQuery loaded:', typeof $ !== 'undefined');
console.log('jQuery.fn exists:', typeof $.fn !== 'undefined');
console.log('select2 loaded:', typeof $.fn !== 'undefined' && typeof $.fn.select2 !== 'undefined');
// select2가 로드되었을 때만 초기화
if(typeof $.fn !== 'undefined' && typeof $.fn.select2 === 'function') {
$('.select2').select2();
// 품번/품명 Select2 AJAX 초기화 (common.js의 새 함수 사용)
initPartSelect2Ajax("#search_partNo", "#search_partName", "#search_partObjId", {
debug: true // 디버깅 모드 활성화
});
} else {
console.error('select2 라이브러리가 로드되지 않았습니다.');
console.error('$.fn:', $.fn);
}
$("#btnSearch").click(function(){
$("#page").val("1");
fn_search();
});
//SR자료등록 팝업
$(".File").click(function(){
var popup_width = 800;
var popup_height = 335;
var objId = $(this).attr("data-OBJID");
var docType =$(this).attr("data-docType");
var docTypeName = $(this).attr("data-docTypeName");
var params = "?targetObjId="+objId+"&docType="+docType+"&docTypeName="+docTypeName;
var url = "/projectConcept/FileRegistPopup.do"+params;
fn_centerPopup(popup_width, popup_height, url);
});
//영업활동 등록 팝업
$(".btnRegist").click(function(){
var selectedData = _tabulGrid.getSelectedData();
var popup_width = 1400;
var popup_height = 560;
var url = "";
// 선택된 행이 없으면 신규 등록
if(selectedData.length === 0){
url = "/contractMgmt/estimateRegistFormPopup.do?actionType=regist";
}
// 한 줄 선택된 경우 상세 팝업 (영업번호 클릭과 동일)
else if(selectedData.length === 1){
var objid = fnc_checkNull(selectedData[0].OBJID);
url = "/contractMgmt/estimateRegistFormPopup.do?objId=" + objid;
}
// 여러 줄 선택된 경우 경고
else {
Swal.fire("한 개의 행만 선택해주세요.");
return false;
}
fn_centerPopup(popup_width, popup_height, url);
});
//견적작성 팝업
$("#btnEstimate").click(function(){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length < 1){
Swal.fire("견적서를 작성할 행을 선택해주십시오.");
return false;
} else if(selectedData.length > 1){
Swal.fire("한번에 한개의 견적서만 작성 가능합니다.");
return false;
} else {
var objId = fnc_checkNull(selectedData[0].OBJID);
// 견적서 양식 선택 팝업
Swal.fire({
title: '견적서 양식을 선택하세요',
html: '<div style="margin: 20px 0;">' +
'<button onclick="window.openTemplate1()" class="swal2-confirm swal2-styled" style="margin: 0 5px; background-color: #3085d6;">일반 견적서</button>' +
'<button onclick="window.openTemplate2()" class="swal2-confirm swal2-styled" style="margin: 0 5px; background-color: #28a745;">장비 견적서</button>' +
'</div>',
showConfirmButton: false,
showCancelButton: true,
cancelButtonText: '취소',
cancelButtonColor: '#d33'
});
// 전역 함수로 등록
window.openTemplate1 = function() {
Swal.close();
fn_openEstimateTemplate(objId, "1");
};
window.openTemplate2 = function() {
Swal.close();
fn_openEstimateTemplate(objId, "2");
};
}
});
//고객 등록 팝업
$(".supplyMng").click(function(){
//window.open("/ordermgmt/ordermgmtUpdateFormPopup.do"+params, "", "width=650, height=750","menubars=no, scrollbars=yes, resizable=yes");
window.open("/contractMgmt/supplyMngPagingList.do", "", "width=1150, height=676","menubars=no, scrollbars=yes, resizable=yes");
});
//엔터 조회
$("input").keyup(function(e){
if(e.keyCode == 13){
$("#page").val("1");
fn_search();
}
});
//삭제
$("#btnDelete").click(function(){
fn_delete();
});
$("#btnExcel").click(function(){
document.form1.actionType.value = "excel";
document.form1.action = "/contractMgmt/contractList.do";
document.form1.submit();
});
//결재상신
$("#btnApproval").click(function(){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length<1){
Swal.fire("결재상신할 행을 선택해주십시오.");
return false;
}else if(selectedData.length>1){
Swal.fire("한번에 한개의 결재만 가능합니다.");
return false;
}else{
var targetStatus = fnc_checkNull(selectedData[0].APPR_STATUS);
var status = fnc_checkNull(selectedData[0].STATUS);
var estObjId = fnc_checkNull(selectedData[0].EST_OBJID);
var contractObjId = fnc_checkNull(selectedData[0].OBJID);
var customerObjId = fnc_checkNull(selectedData[0].CUSTOMER_OBJID);
// 견적서 작성 여부 확인
if(estObjId == ""){
Swal.fire("견적서를 먼저 작성해주세요.");
return false;
}
if(targetStatus == "결재완료" || targetStatus == "결재중" || targetStatus == "결재불필요" || status == "cancel"){
Swal.fire("작성중/결재반려인 상태만 결재상신 가능합니다.");
return false;
}else{
// 결재 필요 여부 체크 (재오더/신규수주/가격인하)
$.ajax({
url: "/contractMgmt/checkApprovalRequired.do",
type: "POST",
data: {
contractObjId: contractObjId,
customerObjId: customerObjId
},
dataType: "json",
success: function(response) {
if(response.result == "success") {
var approvalRequired = response.approvalRequired;
var reason = response.reason;
if(approvalRequired == "N") {
// 재오더 + 가격동일/인상 → 결재불필요
Swal.fire({
title: '결재 불필요',
html: '재오더(가격동일/인상)로 결재가 필요하지 않습니다.<br>결재불필요로 처리하시겠습니까?<br><br><small>* 결재불필요 처리 후 메일발송이 가능합니다.</small>',
icon: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '확인',
cancelButtonText: '취소'
}).then((result) => {
if(result.isConfirmed) {
// 결재불필요 처리
$.ajax({
url: "/contractMgmt/setApprovalNotRequired.do",
type: "POST",
data: {
estObjId: estObjId
},
dataType: "json",
success: function(res) {
if(res.result == "success") {
Swal.fire({
title: "결재불필요로 처리되었습니다.",
text: "메일발송을 진행하시겠습니까?",
icon: "success",
showCancelButton: true,
confirmButtonText: "메일발송",
cancelButtonText: "나중에"
}).then((mailResult) => {
fn_search(); // 목록 새로고침
if(mailResult.isConfirmed) {
fn_openMailFormPopup(contractObjId);
}
});
} else {
Swal.fire("오류: " + res.message);
}
},
error: function() {
Swal.fire("결재불필요 처리 중 오류가 발생했습니다.");
}
});
}
});
} else {
// 신규수주 또는 가격인하 → 결재필요
var reasonText = "";
if(reason == "신규수주") {
reasonText = "신규수주입니다.";
} else if(reason == "가격인하") {
reasonText = "가격인하 건입니다.";
}
Swal.fire({
title: '결재상신',
html: (reasonText ? reasonText + '<br>' : '') + '결재상신 하시겠습니까?<br><br><small>* 결재완료 후 메일발송이 가능합니다.</small>',
icon: 'question',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '결재상신',
cancelButtonText: '취소'
}).then((result) => {
if(result.isConfirmed) {
var objId = estObjId;
var title = encodeURIComponent(fnc_checkNull(selectedData[0].CONTRACT_NO));
var approvalUrl = "/approval/registApproval.do?targetType=CONTRACT_ESTIMATE&targetObjId="+objId+"&approvalTitle="+title;
window.open(approvalUrl, "registApproval", "width=700,height=700");
}
});
}
} else {
// API 오류 시 기존 방식으로 진행
fn_showApprovalConfirmSimple(estObjId, selectedData[0].CONTRACT_NO);
}
},
error: function() {
// AJAX 오류 시 기존 방식으로 진행
fn_showApprovalConfirmSimple(estObjId, selectedData[0].CONTRACT_NO);
}
});
}
}
});
// 메일발송
$("#btnMail").click(function(){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length < 1){
Swal.fire("메일발송할 행을 선택해주십시오.");
return false;
} else if(selectedData.length > 1){
Swal.fire("한번에 한개의 견적서만 발송 가능합니다.");
return false;
} else {
var apprStatus = fnc_checkNull(selectedData[0].APPR_STATUS);
var objId = fnc_checkNull(selectedData[0].OBJID);
var estStatus = fnc_checkNull(selectedData[0].EST_STATUS);
// 결재완료 또는 결재불필요 상태 확인
if(apprStatus !== "결재완료" && apprStatus !== "결재불필요"){
Swal.fire("결재완료 또는 결재불필요 상태의 견적서만 발송 가능합니다.");
return false;
}
// 견적서 존재 여부 확인
if(estStatus === "0" || estStatus === 0){
Swal.fire("작성된 견적서가 없습니다.");
return false;
}
// 메일 작성 팝업 열기
fn_openMailFormPopup(objId);
}
});
/* 품목별 가격비교 - 별도 메뉴로 이동 (주석처리)
$("#btnPriceCompare").click(function(){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length < 1){
Swal.fire("가격비교할 행을 선택해주십시오.");
return false;
} else if(selectedData.length > 1){
Swal.fire("한번에 한개의 건만 조회 가능합니다.");
return false;
} else {
var objId = fnc_checkNull(selectedData[0].OBJID);
if(objId == ""){
Swal.fire("선택된 데이터가 올바르지 않습니다.");
return false;
}
// 품목별 가격비교 팝업 열기
var popup_width = 1200;
var popup_height = 600;
var url = "/contractMgmt/itemPriceComparePopup.do?objId=" + objId;
window.open(url, "itemPriceCompare", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
}
});
*/
fn_search();
});
// 콤마 추가 함수
function addComma(num) {
if(!num) return '';
var regexp = /\B(?=(\d{3})+(?!\d))/g;
return num.toString().replace(regexp, ',');
}
var columns = [
{title:'EST_OBJID' ,field:'EST_OBJID' ,visible:false, frozen:true},
// 1. 영업번호
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 70, widthGrow: 0.9, title : '영업번호', field : 'CONTRACT_NO', frozen:true,
formatter:fnc_createGridAnchorTag,
cellClick:function(e, cell){
var objid = fnc_checkNull(cell.getData().OBJID);
fn_projectConceptDetail(objid);
}
},
// 2. 주문유형
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 60, widthGrow: 0.8, title : '주문유형', field : 'CATEGORY_NAME' },
// 3. 제품구분
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 60, widthGrow: 0.8, title : '제품구분', field : 'PRODUCT_NAME' },
// 4. 국내/해외
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 55, widthGrow: 0.7, title : '국내/해외', field : 'AREA_NAME' },
// 5. 접수일
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 75, widthGrow: 0.9, title : '접수일', field : 'RECEIPT_DATE' },
// 6. 고객사
{headerHozAlign : 'center', hozAlign : 'left', minWidth: 90, widthGrow: 1.5, title : '고객사', field : 'CUSTOMER_NAME' },
// 7. 유/무상
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 45, widthGrow: 0.6, title : '유/무상', field : 'PAID_TYPE' },
// 8. 품명 (품명 외 N건 형식)
{headerHozAlign : 'center', hozAlign : 'left', minWidth: 120, widthGrow: 1.5, title : '품명', field : 'ITEM_SUMMARY' },
// 9. 요청납기
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 75, widthGrow: 0.9, title : '요청납기', field : 'EARLIEST_DUE_DATE',
formatter: function(cell, formatterParams, onRendered){
var dueDate = fnc_checkNull(cell.getValue());
var otherCount = fnc_checkNull(cell.getData().OTHER_DUE_DATE_COUNT);
if(dueDate === '') return '';
// 다른 납기가 있으면 "날짜 외 N건" 형식으로 표시
if(otherCount && parseInt(otherCount) > 0){
return dueDate + ' 외 ' + otherCount + '건';
}
return dueDate;
}
},
// 10. 반납사유
{headerHozAlign : 'center', hozAlign : 'left', minWidth: 60, widthGrow: 0.8, title : '반납사유', field : 'RETURN_REASON_SUMMARY' },
// 11. 견적현황
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 50, widthGrow: 0.7, title : '견적현황', field : 'EST_STATUS',
formatter:fnc_subInfoValueFormatter,
cellClick:function(e, cell){
var objid = fnc_checkNull(cell.getData().OBJID);
fn_showEstimateList(objid);
}
},
// 12. 결재상태
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 50, widthGrow: 0.7, title : '결재상태', field : 'APPR_STATUS',
formatter:fnc_createGridAnchorTag,
cellClick:function(e, cell){
var APPROVAL_OBJID = fnc_checkNull(cell.getData().APPROVAL_OBJID);
var ROUTE_OBJID = fnc_checkNull(cell.getData().ROUTE_OBJID);
approval_form(APPROVAL_OBJID,ROUTE_OBJID);
}
},
// 13. 메일발송
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 50, widthGrow: 0.7, title : '메일발송', field : 'MAIL_SEND_STATUS',
formatter: function(cell, formatterParams, onRendered){
var status = fnc_checkNull(cell.getValue());
if(status === 'Y'){
return '<span style="color:green;">발송완료</span>';
} else if(status === 'N'){
return '<span style="color:red;">발송실패</span>';
} else {
return '<span style="color:#999;">미발송</span>';
}
}
},
// 14. 견적공급가액
{headerHozAlign : 'center', hozAlign : 'right', minWidth: 80, widthGrow: 1, title : '견적공급가액', field : 'EST_TOTAL_AMOUNT',
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '' || value === '0') return '';
var rowData = cell.getRow().getData();
var currencyName = fnc_checkNull(rowData.CONTRACT_CURRENCY_NAME) || '';
// 통화 이름을 기호로 변환
var currencySymbol = '';
if(currencyName.includes('원') || currencyName === 'KRW') currencySymbol = '₩';
else if(currencyName.includes('달러') || currencyName === 'USD') currencySymbol = '$';
else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€';
else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥';
else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥';
// 통화 기호 제거 후 콤마 추가
var numericValue = String(value).replace(/[^0-9.]/g, '');
return currencySymbol + addComma(numericValue);
}
},
// 15. 견적원화환산공급가액
{headerHozAlign : 'center', hozAlign : 'right', minWidth: 110, widthGrow: 1, title : '견적원화환산공급가액', field : 'EST_TOTAL_AMOUNT_KRW',
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '' || value === '0') return '';
// 통화 기호 제거 후 콤마 추가
var numericValue = String(value).replace(/[^0-9.]/g, '');
return '₩' + addComma(numericValue);
}
},
// 16. 견적환종
{headerHozAlign : 'center', hozAlign : 'center', minWidth: 45, widthGrow: 0.6, title : '견적환종', field : 'CONTRACT_CURRENCY_NAME' },
// 17. 견적환율
{headerHozAlign : 'center', hozAlign : 'right', minWidth: 50, widthGrow: 0.7, title : '견적환율', field : 'EXCHANGE_RATE',
formatter: function(cell) {
var value = cell.getValue();
if(!value || value === '' || value === '0') return '';
return Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
},
/* 아래는 주석처리된 컬럼들 - 필요시 활성화 */
/*
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '견적수량', field : 'ESTIMATE_QUANTITY',
formatter: function(cell) {
var value = cell.getValue();
if(!value || value === '' || value === '0') return '';
return Number(value).toLocaleString();
}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '150', title : 'S/N', field : 'SERIAL_NO',
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '') return '';
var serialNumbers = value.split(',').map(function(s){ return s.trim(); }).filter(function(s){ return s !== ''; });
var count = serialNumbers.length;
if(count === 0) return '';
if(count === 1) return '<a href="javascript:void(0);">' + serialNumbers[0] + '</a>';
var displayText = serialNumbers[0] + ' 외 ' + (count - 1) + '개';
return '<a href="javascript:void(0);">' + displayText + '</a>';
},
cellClick:function(e, cell){
var serialNo = fnc_checkNull(cell.getData().SERIAL_NO);
fn_showSerialNoPopup(serialNo);
}
},
*/
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '셋업지', field : 'SETUP' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '설비방향', field : 'FACILITY_NAME' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '설비대수', field : 'FACILITY_QTY' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '설비타입', field : 'FACILITY_TYPE' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '설비길이', field : 'FACILITY_DEPTH' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '70', title : '담당자', field : 'WRITER_NAME' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '등록일', field : 'REG_DATE' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '첨부파일', field : 'CU01_CNT',
// formatter:fnc_subInfoValueFormatter,
// cellClick:function(e, cell){
// var objid = fnc_checkNull(cell.getData().OBJID);
// var docType = 'contractMgmt01';
// var docTypeName = 'contractMgmt01';
// fn_FileRegist(objid, docType, docTypeName);
// }
// }
// ]
// },
// {title:"진행사항", headerHozAlign:'center',
// columns:[
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '검토내용', field : 'CU03_CNT',
// formatter:fnc_subInfoValueFormatter,
// cellClick:function(e, cell){
// var objid = fnc_checkNull(cell.getData().OBJID);
// fn_projectConceptReviewDetail(objid);
// }
// },
// {headerHozAlign : 'center', hozAlign : 'center', width : '70', title : '상태', field : 'CONTRACT_RESULT_NAME' }
// ]
// },
// {title:"수주정보", headerHozAlign:'center',
// columns:[
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '수주일', field : 'CONTRACT_DATE' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : 'PO계약 No', field : 'PO_NO' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '70', title : 'PM', field : 'PM_USER_NAME' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '70', title : '통화', field : 'CONTRACT_CURRENCY_NAME' },
// {headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '수주가', field : 'CONTRACT_PRICE_CURRENCY',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false,},
// },
// {headerHozAlign : 'center', hozAlign : 'left', width : '170', title : '당사프로젝트명', field : 'PROJECT_NAME' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '계약납기일', field : 'CONTRACT_DEL_DATE' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '요청납기일', field : 'REQ_DEL_DATE' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '수주회사', field : 'CONTRACT_COMPANY_NAME' },
// {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '제작공장', field : 'MANUFACTURE_PLANT_NAME' }
// ]
// },
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '상태', field : 'APPR_STATUS' ,
// formatter:fnc_createGridAnchorTag,
// cellClick:function(e, cell){
// var APPROVAL_OBJID = fnc_checkNull(cell.getData().APPROVAL_OBJID);
// var ROUTE_OBJID = fnc_checkNull(cell.getData().ROUTE_OBJID);
// approval_form(APPROVAL_OBJID,ROUTE_OBJID);
// }
// },
];
//var grid;
function fn_search(){
// Select2 값을 실제 input/select에 명시적으로 설정
var partObjId = $("#search_partObjId").val();
// 디버깅: 검색 조건 확인
console.log("품번:", $("#search_partNo").val());
console.log("품명:", $("#search_partName").val());
console.log("품목 OBJID:", partObjId);
// 품목 OBJID가 있으면 hidden 필드에 확실히 설정
if(partObjId && partObjId !== '') {
// 폼 데이터에 명시적으로 추가
console.log("품목 검색 조건 설정됨:", partObjId);
}
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/contractMgmt/contractGridList.do", columns, true);
}
function _fnc_datepick(){
var $dateinput = $("input.date_icon");
for(var i=0; i<$dateinput.length; i++){
$dateinput.eq(i).attr("size","10");
$dateinput.eq(i).datepicker({
changeMonth:true,
changeYear:true
});
}
}
function fn_delete(){
var checkedObj = _tabulGrid.getSelectedData();
if(0 < checkedObj.length){
// 선택된 모든 항목의 OBJID를 배열로 수집
var objIds = [];
for(var i = 0; i < checkedObj.length; i++){
objIds.push(fnc_checkNull(checkedObj[i].OBJID));
}
var deleteCount = objIds.length;
var confirmMessage = deleteCount === 1
? '선택한 견적요청정보를 삭제하시겠습니까?'
: '선택한 ' + deleteCount + '개의 견적요청정보를 삭제하시겠습니까?';
Swal.fire({
title: confirmMessage,
text: '',
icon: 'warning',
showCancelButton: true, // cancel버튼 보이기. 기본은 원래 없음
confirmButtonColor: '#3085d6', // confrim 버튼 색깔 지정
cancelButtonColor: '#d33', // cancel 버튼 색깔 지정
confirmButtonText: '확인', // confirm 버튼 텍스트 지정
cancelButtonText: '취소', // cancel 버튼 텍스트 지정
reverseButtons: false, // 버튼 순서 거꾸로
}).then(result => {
// 만약 Promise리턴을 받으면,
if (result.isConfirmed) { // 만약 모달창에서 confirm 버튼을 눌렀다면
// 여러 개의 objId를 배열로 전송
$.ajax({
type : "POST",
url : "/contractMgmt/deleteContractMngInfo.do",
data: {
"objId": objIds
},
traditional: true, // 배열 파라미터를 올바르게 전송
dataType:"json",
success:function(data){
if(data.result == 'true'){
var successMessage = deleteCount === 1
? '삭제되었습니다.'
: deleteCount + '개의 항목이 삭제되었습니다.';
Swal.fire(successMessage);
fn_search();
};
}
,error: function(jqxhr, status, error){
}
});
}
});
}else{
Swal.fire("선택한 항목이 없습니다.");
}
}
function approval_form(APPROVAL_OBJID,ROUTE_OBJID){
url = "/approval/approvalDetail.do?approvalObjId="+APPROVAL_OBJID+"&routeObjId="+ROUTE_OBJID;
fn_centerPopup(650,400,url,'approvalDetailPopup')
}
function fn_FileRegist(objId, docType, docTypeName){
var popup_width = 800;
var popup_height = 300;
var objId = objId;
var docType = docType;
var docTypeName = docTypeName;
var params = "?targetObjId="+objId+"&docType="+docType+"&docTypeName="+docTypeName;
var url = "/projectConcept/FileRegistPopup.do"+params;
fn_centerPopup(popup_width, popup_height, url);
}
//영업활동등록 상세 (뷰 전용 팝업)
function fn_projectConceptDetail(objId){
var popup_width = 900;
var popup_height = 700;
var url = "/contractMgmt/estimateViewPopup.do?objId="+objId;
fn_centerPopup(popup_width, popup_height, url);
}
//검토내용 상세
function fn_projectConceptReviewDetail(objId){
var popup_width = 800;
var popup_height = 250;
var url = "/contractMgmt/contracMgmtReviewFormPopup.do?objId="+objId;
fn_centerPopup(popup_width, popup_height, url);
}
// 견적서 목록 팝업
function fn_showEstimateList(contractObjId){
$.ajax({
url: "/contractMgmt/getEstimateTemplateList.do",
type: "POST",
data: { objId: contractObjId },
dataType: "json",
success: function(data){
//console.log("견적서 목록 응답:", data); // 디버깅용
if(data.result === "success" && data.list && data.list.length > 0){
var html = '<div style="max-height: 400px; overflow-y: auto;">';
html += '<table style="width: 100%; border-collapse: collapse;">';
html += '<thead><tr style="background-color: #f0f0f0;">';
html += '<th style="border: 1px solid #ddd; padding: 8px;">차수</th>';
html += '<th style="border: 1px solid #ddd; padding: 8px;">견적서 유형</th>';
html += '<th style="border: 1px solid #ddd; padding: 8px;">견적번호</th>';
html += '<th style="border: 1px solid #ddd; padding: 8px;">작성일</th>';
html += '<th style="border: 1px solid #ddd; padding: 8px;">작성자</th>';
html += '<th style="border: 1px solid #ddd; padding: 8px;">결재상태</th>';
html += '</tr></thead><tbody>';
data.list.forEach(function(item){
//console.log("견적서 항목:", item); // 디버깅용
// 대문자/소문자 모두 지원하도록 안전하게 처리
var objid = item.OBJID || item.objid || '';
var templateType = item.TEMPLATE_TYPE || item.template_type || item.templateType || '';
var revision = item.REVISION || item.revision || '';
var templateTypeName = item.TEMPLATE_TYPE_NAME || item.template_type_name || item.templateTypeName || '';
var estimateNo = item.ESTIMATE_NO || item.estimate_no || item.estimateNo || '-';
var regdate = item.REGDATE || item.regdate || '';
var writer = item.WRITER || item.writer || '';
var apprStatus = item.APPR_STATUS || item.appr_status || item.apprStatus || '-';
// 결재상태별 색상 지정
var statusColor = '#333';
if(apprStatus === '결재완료') {
statusColor = 'green';
} else if(apprStatus === '결재중') {
statusColor = 'blue';
} else if(apprStatus === '반려') {
statusColor = 'red';
} else if(apprStatus === '작성중') {
statusColor = '#999';
} else if(apprStatus === '결재불필요') {
statusColor = '#6c757d'; // 회색
}
html += '<tr style="cursor: pointer;" onclick="fn_openEstimateByObjId(\'' + objid + '\', \'' + templateType + '\')">';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center;">' + revision + '차</td>';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center;">' + templateTypeName + '</td>';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center;">' + estimateNo + '</td>';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center;">' + regdate + '</td>';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center;">' + writer + '</td>';
html += '<td style="border: 1px solid #ddd; padding: 8px; text-align: center; color: ' + statusColor + '; font-weight: bold;">' + apprStatus + '</td>';
html += '</tr>';
});
html += '</tbody></table></div>';
Swal.fire({
title: '견적서 목록',
html: html,
width: '700px',
showConfirmButton: false,
showCancelButton: true,
cancelButtonText: '닫기'
});
} else {
Swal.fire({
title: '견적서가 없습니다',
text: '작성된 견적서가 없습니다.',
icon: 'info'
});
}
},
error: function(xhr, status, error){
console.error("견적서 목록 조회 오류:", xhr, status, error); // 디버깅용
Swal.fire({
title: '오류',
text: '견적서 목록 조회 중 오류가 발생했습니다.',
icon: 'error'
});
}
});
}
// OBJID로 견적서 열기
function fn_openEstimateByObjId(templateObjId, templateType){
Swal.close();
var popup_width = 900;
var popup_height = 1200;
var url = "";
if(templateType === "1"){
// 일반 견적서
url = "/contractMgmt/estimateTemplate1.do?templateObjId="+templateObjId;
} else if(templateType === "2"){
// 장비 견적서
url = "/contractMgmt/estimateTemplate2.do?templateObjId="+templateObjId;
}
window.open(url, "estimateTemplate_"+templateObjId, "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
}
//견적서 양식 열기 (CONTRACT_OBJID로)
function fn_openEstimateTemplate(objId, templateType){
var popup_width = 900;
var popup_height = 1200;
var url = "";
if(templateType === "1"){
// 일반 견적서
url = "/contractMgmt/estimateTemplate1.do?objId="+objId;
} else if(templateType === "2"){
// 장비 견적서
url = "/contractMgmt/estimateTemplate2.do?objId="+objId;
}
window.open(url, "estimateTemplate", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
}
// S/N 목록 팝업 표시
function fn_showSerialNoPopup(serialNoString){
if(!serialNoString || serialNoString === ''){
Swal.fire("S/N 정보가 없습니다.");
return;
}
// 쉼표로 구분된 S/N을 배열로 변환
var serialNumbers = serialNoString.split(',').map(function(sn){ return sn.trim(); });
// HTML 리스트 생성
var listHtml = '<div style="text-align: left; max-height: 400px; overflow-y: auto;">';
listHtml += '<ol style="padding-left: 20px; margin: 10px 0;">';
serialNumbers.forEach(function(sn, index){
listHtml += '<li style="padding: 5px 0; font-size: 14px;">' + sn + '</li>';
});
listHtml += '</ol>';
listHtml += '</div>';
// SweetAlert2로 팝업 표시
Swal.fire({
title: 'S/N 목록',
html: listHtml,
icon: 'info',
width: 500,
confirmButtonText: '확인',
confirmButtonColor: '#3085d6'
});
}
// 결재상신 확인 다이얼로그 (단순 버전)
function fn_showApprovalConfirmSimple(estObjId, contractNo) {
Swal.fire({
title: '결재상신',
html: '결재상신 하시겠습니까?<br><br><small>* 결재완료 후 메일발송이 가능합니다.</small>',
icon: 'question',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '결재상신',
cancelButtonText: '취소'
}).then((result) => {
if(result.isConfirmed) {
var title = encodeURIComponent(fnc_checkNull(contractNo));
var approvalUrl = "/approval/registApproval.do?targetType=CONTRACT_ESTIMATE&targetObjId="+estObjId+"&approvalTitle="+title;
window.open(approvalUrl, "registApproval", "width=700,height=700");
}
});
}
// 메일 작성 팝업 열기
function fn_openMailFormPopup(contractObjId){
if(!contractObjId || contractObjId === ''){
Swal.fire("잘못된 요청입니다.");
return;
}
var popup_width = 950;
var popup_height = 800;
var url = "/contractMgmt/estimateMailFormPopup.do?contractObjId=" + contractObjId;
window.open(url, "estimateMailForm", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
}
/*
* 아래 함수들은 자동 메일 발송 기능을 위한 것입니다.
* 현재는 메일 작성 팝업을 사용하므로 주석 처리합니다.
* 필요시 참고용으로 남겨둡니다.
*/
/*
// PDF 생성 및 메일 발송 (자동)
function fn_generatePdfAndSendMail(contractObjId, templateObjId, templateType){
// ... (생략)
}
// PDF Base64와 함께 메일 발송 (청크 방식)
function fn_sendMailWithPdf(contractObjId, pdfBase64){
// ... (생략)
}
// 업로드된 PDF로 메일 발송
function sendMailWithUploadedPdf(contractObjId, sessionId){
// ... (생략)
}
*/
//코드값을 받아와서 동적으로 selectbox 생성
function optionJobGroup(code){
var val=code;
var params = "";
var option="";
var combobox = $("#writer");
combobox.empty();
if(val!=""){
params += "codeId="+val;
$.ajax({
type : "POST",
url : "/projectConcept/makewrite.do",
data : params,
dataType:"json",
async: false,
success: function(data){
if(data.RESULT !=""){
option += "<option value=''>전체</option>";
option += data.RESULT;
combobox.append(option);
}
}
});
// alert(Number(lev-1));
//$("#code"+Number(lev-1)).val(code).prop("selected", true);
}else{
option += "<option value=''>전체</option>";
combobox.append(option);
}
}
//코드값을 받아와서 동적으로 selectbox 생성
function makeSelect(code){
var val=code;
var params = "";
var option="";
var combobox = $("#outc_cd6_td");
combobox.empty();
/* <select name="outc_cd6" id="outc_cd6" type="select">
<option value="">선택</option>
</select> */
if(val!="" && val!="PLA03000"){
params += "codeId="+val;
$.ajax({
type : "POST",
url : "/ordermgmt/makeCodeselect.do",
data : params,
dataType:"json",
async: false,
success: function(data){
if(data.RESULT !=""){
option += "<select name='outc_cd6' id='outc_cd6' type='select'>"
option += "<option value=''>선택</option>";
option += data.RESULT;
option += "</select>";
combobox.append(option);
$("#outc_cd6").val("${param.outc_cd6}");
//$("#outc_cd6").select2();
}
}
});
}else{
if(val=="PLA03000"){
option += "<input type='text' name='outc_cd6' id='outc_cd6' value='${param.outc_cd6}'>"
combobox.append(option);
}else{
option += "<select name='outc_cd6' id='outc_cd6' type='select'>"
option += "<option value=''>선택</option>";
option += "</select>";
combobox.append(option);
//$("#outc_cd6").select2();
}
}
}
function saveexcelpop() {
var partLength = $("input[name=partCheckBox]:checked").length;
if(partLength == 0){
Swal.fire('선택된 영업정보가 없습니다.');
return;
}
if(partLength > 1){
Swal.fire('단건씩 선택해 주세요');
return;
}
var orderobjId ="";
$("input[name=partCheckBox]:checked").each(function(){
orderobjId = fnc_checkNull($(this).attr("data-objId").replace(" ",""));
});
var url = "/ordermgmt/openOrderExcelImportPopUp.do?orderobjId="+orderobjId;
var target = "openOrderExcelImportPopUp";
window.open(url, target,"width=1245, height=700, menubars=no, scrollbars=yes, resizable=yes");
}
//프로젝트의 form,detail 팝업을 보여준다.
function openProjectFormPopUp(objId){
window.open("","projectFormPopUp","width=1150, height=676");
var params = "?actionType=regist"
var url = "/project/projectFormPopUp.do"+params;
if("" != objId){
url = "/project/projectDetailPopUp.do";
}
var form = document.form1;
form.objId.value = objId;
form.action = url;
form.target = "projectFormPopUp";
form.submit();
}
</script>
</head>
<body class="bodyNoScroll">
<form name="form1" id="form1" action="" method="post">
<input type="hidden" name="actionType" value="" />
<input type="hidden" name="list_type" value="estimate" />
<!-- 대시보드용 -->
<input type="hidden" name="contract_month" id="contract_month" value="${param.contract_month}">
<div class="min_part_enroll">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name_gdnsi">
<h2>
<span>영업관리_견적관리</span>
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch" name="btnSearch">
<input type="button" value="삭제" class="plm_btns" id="btnDelete">
<input type="button" value="견적요청등록" class="plm_btns btnRegist">
<input type="button" value="견적작성" class="plm_btns" id="btnEstimate">
<input type="button" value="결재상신" class="plm_btns" id="btnApproval">
<input type="button" value="메일발송" class="plm_btns" id="btnMail">
<!-- <input type="button" value="가격비교" class="plm_btns" id="btnPriceCompare" style="background-color:#17a2b8;"> -->
<!-- <input type="button" value="Excel Download" class="plm_btns" id="btnExcel">
<input type="button" value="고객등록" class="plm_btns supplyMng create"> -->
</div>
</div>
<div id="plmSearchZon">
<div style="display: flex; flex-wrap: wrap; gap: 10px 15px; align-items: center;">
<!-- 주문유형 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="category_cd">주문유형</label>
<select name="category_cd" id="category_cd" style="width:130px" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.category_cd}
</select>
</div>
<!-- 제품구분 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="product">제품구분</label>
<select name="product" id="product" style="width:130px" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.product_cd}
</select>
</div>
<!-- 국내/해외 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="area_cd">국내/해외</label>
<select name="area_cd" id="area_cd" style="width:100px" class="select2" autocomplete="off">
<option value="">선택</option>
<option value="0001220">국내</option>
<option value="0001221">해외</option>
</select>
</div>
<!-- 고객사 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="customer_objid">고객사</label>
<select name="customer_objid" id="customer_objid" style="width:180px" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.customer_cd}
</select>
</div>
<!-- 유/무상 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="paid_type">유/무상</label>
<select name="paid_type" id="paid_type" style="width:100px" class="select2" autocomplete="off">
<option value="">선택</option>
<option value="paid">유상</option>
<option value="free">무상</option>
</select>
</div>
<!-- 품번 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="search_partNo">품번</label>
<select name="search_partNo" id="search_partNo" class="select2-part" style="width:130px;">
<option value="">품번 선택</option>
</select>
<input type="hidden" name="search_partObjId" id="search_partObjId" value=""/>
</div>
<!-- 품명 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="search_partName">품명</label>
<select name="search_partName" id="search_partName" class="select2-part" style="width:130px;">
<option value="">품명 선택</option>
</select>
</div>
<!-- S/N -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="search_serialNo">S/N</label>
<input type="text" name="search_serialNo" id="search_serialNo" style="width:120px;" value="${param.search_serialNo}"/>
</div>
<!-- 결재상태 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label for="appr_status">결재상태</label>
<select name="appr_status" id="appr_status" class="select2" autocomplete="off" style="width:100px">
<option value="">선택</option>
<option value="작성중">작성중</option>
<option value="결재중">결재중</option>
<option value="반려">반려</option>
<option value="결재완료">결재완료</option>
<option value="결재불필요">결재불필요</option>
<option value="취소">취소</option>
</select>
</div>
<!-- 접수일 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label>접수일</label>
<input type="text" name="receipt_start_date" id="receipt_start_date" style="width:90px;" autocomplete="off" value="${param.receipt_start_date}" class="date_icon">~
<input type="text" name="receipt_end_date" id="receipt_end_date" style="width:90px;" autocomplete="off" value="${param.receipt_end_date}" class="date_icon">
</div>
<!-- 요청납기 -->
<div style="display: flex; align-items: center; gap: 5px;">
<label>요청납기</label>
<input type="text" name="due_start_date" id="due_start_date" style="width:90px;" autocomplete="off" value="${param.due_start_date}" class="date_icon">~
<input type="text" name="due_end_date" id="due_end_date" style="width:90px;" autocomplete="off" value="${param.due_end_date}" class="date_icon">
</div>
</div>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</form>
</body>
</html>