diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp index 6a18fbd..c9dba45 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp @@ -151,33 +151,37 @@ $(document).ready(function(){ document.form1.submit(); }); - //결재상신 + // 결재상신 (Amaranth10 전자결재 SSO 방식) $("#btnApproval").click(function(){ var selectedData = _tabulGrid.getSelectedData(); - if(selectedData.length<1){ + if(selectedData.length < 1){ Swal.fire("결재상신할 행을 선택해주십시오."); return false; - }else if(selectedData.length>1){ + } 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); + } else { + var amaranthStatus = fnc_checkNull(selectedData[0].AMARANTH_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("작성중/결재반려인 상태만 결재상신 가능합니다."); + + if(amaranthStatus == "inProcess"){ + Swal.fire("결재 진행중인 건은 상신할 수 없습니다."); return false; - }else{ + } else if(amaranthStatus == "complete"){ + Swal.fire("결재 완료된 건은 상신할 수 없습니다."); + return false; + } else if(amaranthStatus == "notRequired"){ + Swal.fire("결재불필요로 처리된 건입니다."); + return false; + } + // 결재 필요 여부 체크 (재오더/신규수주/가격인하) $.ajax({ url: "/contractMgmt/checkApprovalRequired.do", @@ -191,9 +195,8 @@ $(document).ready(function(){ if(response.result == "success") { var approvalRequired = response.approvalRequired; var reason = response.reason; - + if(approvalRequired == "N") { - // 재오더 + 가격동일/인상 → 결재불필요 Swal.fire({ title: '결재 불필요', html: '재오더(가격동일/인상)로 결재가 필요하지 않습니다.
결재불필요로 처리하시겠습니까?

* 결재불필요 처리 후 메일발송이 가능합니다.', @@ -205,13 +208,10 @@ $(document).ready(function(){ cancelButtonText: '취소' }).then((result) => { if(result.isConfirmed) { - // 결재불필요 처리 $.ajax({ url: "/contractMgmt/setApprovalNotRequired.do", type: "POST", - data: { - estObjId: estObjId - }, + data: { estObjId: estObjId }, dataType: "json", success: function(res) { if(res.result == "success") { @@ -223,7 +223,7 @@ $(document).ready(function(){ confirmButtonText: "메일발송", cancelButtonText: "나중에" }).then((mailResult) => { - fn_search(); // 목록 새로고침 + fn_search(); if(mailResult.isConfirmed) { fn_openMailFormPopup(contractObjId); } @@ -239,14 +239,10 @@ $(document).ready(function(){ } }); } else { - // 신규수주 또는 가격인하 → 결재필요 var reasonText = ""; - if(reason == "신규수주") { - reasonText = "신규수주입니다."; - } else if(reason == "가격인하") { - reasonText = "가격인하 건입니다."; - } - + if(reason == "신규수주") reasonText = "신규수주입니다."; + else if(reason == "가격인하") reasonText = "가격인하 건입니다."; + Swal.fire({ title: '결재상신', html: (reasonText ? reasonText + '
' : '') + '결재상신 하시겠습니까?

* 결재완료 후 메일발송이 가능합니다.', @@ -258,24 +254,18 @@ $(document).ready(function(){ 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"); + fn_openAmaranthApproval(estObjId, fnc_checkNull(selectedData[0].CONTRACT_NO)); } }); } } else { - // API 오류 시 기존 방식으로 진행 fn_showApprovalConfirmSimple(estObjId, selectedData[0].CONTRACT_NO); } }, error: function() { - // AJAX 오류 시 기존 방식으로 진행 fn_showApprovalConfirmSimple(estObjId, selectedData[0].CONTRACT_NO); } }); - } } }); @@ -427,15 +417,19 @@ var columns = [ 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); - } - }, + // 12. 아마란스 결재상태 (hidden) + {title:'AMARANTH_STATUS', field:'AMARANTH_STATUS', visible: false}, + // 13. 결재상태 (아마란스 전자결재) + {headerHozAlign : 'center', hozAlign : 'center', minWidth: 50, widthGrow: 0.7, title : '결재상태', field : 'APPR_STATUS', + formatter:function(cell){ + var val = fnc_checkNull(cell.getValue()); + if(val == '결재중') return "" + val + ""; + if(val == '결재완료') return "" + val + ""; + if(val == '반려') return "" + val + ""; + if(val == '결재불필요') return "" + val + ""; + return val; + } + }, // 13. 메일발송 {headerHozAlign : 'center', hozAlign : 'center', minWidth: 50, widthGrow: 0.7, title : '메일발송', field : 'MAIL_SEND_STATUS', formatter: function(cell, formatterParams, onRendered){ @@ -634,12 +628,6 @@ function fn_delete(){ } } -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; @@ -825,7 +813,7 @@ function fn_showSerialNoPopup(serialNoString){ }); } -// 결재상신 확인 다이얼로그 (단순 버전) +// 결재상신 확인 다이얼로그 (단순 버전 - 아마란스 전자결재) function fn_showApprovalConfirmSimple(estObjId, contractNo) { Swal.fire({ title: '결재상신', @@ -838,9 +826,39 @@ function fn_showApprovalConfirmSimple(estObjId, contractNo) { 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"); + fn_openAmaranthApproval(estObjId, contractNo); + } + }); +} + +// Amaranth10 전자결재 SSO 팝업 열기 +function fn_openAmaranthApproval(estObjId, contractNo) { + var title = "견적서 결재" + (contractNo ? " - " + contractNo : ""); + + $.ajax({ + url: "/approval/getAmaranthSsoUrl.do", + type: "POST", + data: { + "targetType": "CONTRACT_ESTIMATE", + "targetObjId": estObjId, + "approvalTitle": title, + "outProcessCode": "${AMARANTH_OUT_PROCESS_CODE}", + "formId": "", + "compSeq": "1000", + "deptSeq": "" + }, + dataType: "json", + success: function(data) { + if(data.resultCode == 0 && data.resultData && data.resultData.fullUrl) { + var fullUrl = data.resultData.fullUrl; + window.open(fullUrl, "amaranthApproval", "width=1200,height=900,scrollbars=yes,resizable=yes"); + } else { + Swal.fire("결재 연동 오류: " + (data.resultMsg || "알 수 없는 오류")); + } + }, + error: function(xhr, status, error) { + console.error("Amaranth SSO URL 요청 오류:", error); + Swal.fire("결재 시스템 연동 중 오류가 발생했습니다."); } }); } diff --git a/src/com/pms/mapper/approval.xml b/src/com/pms/mapper/approval.xml index 2a2d6b4..b1d5838 100644 --- a/src/com/pms/mapper/approval.xml +++ b/src/com/pms/mapper/approval.xml @@ -603,7 +603,7 @@ SELECT CONTRACT_OBJID FROM ESTIMATE_TEMPLATE - WHERE OBJID = #{estObjId}::NUMERIC + WHERE OBJID::VARCHAR = #{estObjId} + + INSERT INTO AMARANTH_APPROVAL ( + APPRO_KEY, TARGET_TYPE, TARGET_OBJID, APPROVAL_TITLE, WRITER, STATUS, REGDATE + ) VALUES ( + #{approKey}, #{targetType}, #{targetObjId}, '결재불필요', #{writer}, 'notRequired', NOW() + ) + + + + + UPDATE AMARANTH_APPROVAL SET + STATUS = 'notRequired', + UPDATE_DATE = NOW() + WHERE TARGET_OBJID = #{targetObjId} AND TARGET_TYPE = #{targetType} + + UPDATE SALES_REQUEST_MASTER SET @@ -678,4 +695,57 @@ WHERE OBJID::VARCHAR = #{targetObjId}::VARCHAR + + + + + + \ No newline at end of file diff --git a/src/com/pms/salesmgmt/controller/ContractMgmtController.java b/src/com/pms/salesmgmt/controller/ContractMgmtController.java index 0a27e7c..a77369d 100644 --- a/src/com/pms/salesmgmt/controller/ContractMgmtController.java +++ b/src/com/pms/salesmgmt/controller/ContractMgmtController.java @@ -1659,7 +1659,7 @@ public class ContractMgmtController { request.setAttribute("code_map",code_map); request.setAttribute("actionType",actionType); - //request.setAttribute("LIST", list); + request.setAttribute("AMARANTH_OUT_PROCESS_CODE", com.pms.common.utils.Constants.AMARANTH_OUT_PROCESS_CODE); }catch(Exception e){ e.printStackTrace(); diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 83ce317..46390f6 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -423,7 +423,7 @@ ( SELECT - OBJID + T.OBJID ,CATEGORY_CD ,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME ,CUSTOMER_OBJID @@ -494,9 +494,9 @@ ,CONTRACT_PRICE_CURRENCY ,CONTRACT_CURRENCY ,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME - ,REGDATE - ,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE - ,WRITER + ,T.REGDATE + ,TO_CHAR(T.REGDATE,'YYYY-MM-DD') AS REG_DATE + ,T.WRITER ,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE IN ('FTC_ORDER', 'ORDER') AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT