diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml index 4717863..968bf98 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -1405,70 +1405,70 @@ @@ -2227,8 +2242,11 @@ SELECT ,SUPPLY_TEL_NO ,REG_ID ,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE - ,STATUS - ,CHARGE_USER_NAME + ,STATUS + ,CHARGE_USER_NAME + ,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME + ,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL + ,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT ,case UPPER(STATUS) when 'ACTIVE' then '활성화' when 'INACTIVE' then '비활성화' @@ -2279,10 +2297,13 @@ SELECT ,SUPPLY_BUSNAME ,SUPPLY_STOCKNAME ,SUPPLY_TEL_NO - ,REG_ID - ,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE - ,STATUS - ,CHARGE_USER_NAME + ,REG_ID + ,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE + ,STATUS + ,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME + ,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL + ,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT + ,CHARGE_USER_NAME ,case UPPER(STATUS) when 'ACTIVE' then '활성화' when 'INACTIVE' then '비활성화' @@ -2357,6 +2378,16 @@ SELECT ,OFFICE_NO ,EMAIL ,CUS_NO + ,MANAGER1_NAME + ,MANAGER1_EMAIL + ,MANAGER2_NAME + ,MANAGER2_EMAIL + ,MANAGER3_NAME + ,MANAGER3_EMAIL + ,MANAGER4_NAME + ,MANAGER4_EMAIL + ,MANAGER5_NAME + ,MANAGER5_EMAIL ) VALUES ( @@ -2379,25 +2410,45 @@ SELECT ,#{office_no } ,#{email } ,(SELECT 'CUS-' || LPAD((SELECT MAX(SUBSTR(CUS_NO,5,8))::INTEGER+1 FROM SUPPLY_MNG)::VARCHAR,4,'0')) + ,#{manager1_name } + ,#{manager1_email } + ,#{manager2_name } + ,#{manager2_email } + ,#{manager3_name } + ,#{manager3_email } + ,#{manager4_name } + ,#{manager4_email } + ,#{manager5_name } + ,#{manager5_email } ) ON CONFLICT (OBJID) DO UPDATE SET - SUPPLY_CODE =#{supply_code } - ,SUPPLY_NAME =#{supply_name } - ,REG_NO =#{reg_no } - ,SUPPLY_ADDRESS =#{supply_address } - ,SUPPLY_BUSNAME =#{supply_busname } - ,SUPPLY_STOCKNAME =#{supply_stockname } - ,SUPPLY_TEL_NO =#{supply_tel_no } - ,SUPPLY_FAX_NO =#{supply_fax_no } - ,CHARGE_USER_NAME =#{charge_user_name } - ,PAYMENT_METHOD =#{payment_method } - ,REG_ID =#{reg_id } - ,AREA_CD =#{area_cd } - ,BUS_REG_NO =#{bus_reg_no } - ,OFFICE_NO =#{office_no } - ,EMAIL =#{email } + SUPPLY_CODE =#{supply_code } + ,SUPPLY_NAME =#{supply_name } + ,REG_NO =#{reg_no } + ,SUPPLY_ADDRESS =#{supply_address } + ,SUPPLY_BUSNAME =#{supply_busname } + ,SUPPLY_STOCKNAME =#{supply_stockname } + ,SUPPLY_TEL_NO =#{supply_tel_no } + ,SUPPLY_FAX_NO =#{supply_fax_no } + ,CHARGE_USER_NAME =#{charge_user_name } + ,PAYMENT_METHOD =#{payment_method } + ,REG_ID =#{reg_id } + ,AREA_CD =#{area_cd } + ,BUS_REG_NO =#{bus_reg_no } + ,OFFICE_NO =#{office_no } + ,EMAIL =#{email } + ,MANAGER1_NAME =#{manager1_name } + ,MANAGER1_EMAIL =#{manager1_email } + ,MANAGER2_NAME =#{manager2_name } + ,MANAGER2_EMAIL =#{manager2_email } + ,MANAGER3_NAME =#{manager3_name } + ,MANAGER3_EMAIL =#{manager3_email } + ,MANAGER4_NAME =#{manager4_name } + ,MANAGER4_EMAIL =#{manager4_email } + ,MANAGER5_NAME =#{manager5_name } + ,MANAGER5_EMAIL =#{manager5_email } diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index 67bf882..5d38df0 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -974,14 +974,24 @@ /* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */ - - AND T.PM_USER_ID = #{manager} - - - /* INCOTERMS 필드 없음 - 검색 조건 무시 */ - - -- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬) - ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC + + AND T.PM_USER_ID = #{manager} + + + /* INCOTERMS 필드 없음 - 검색 조건 무시 */ + + + + + AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료') + + + AND T.SALES_STATUS = #{salesStatus} + + + + -- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬) + ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC @@ -1068,13 +1078,23 @@ /* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */ - - AND T.PM_USER_ID = #{manager} - - - /* INCOTERMS 필드 없음 - 검색 조건 무시 */ - - + + AND T.PM_USER_ID = #{manager} + + + /* INCOTERMS 필드 없음 - 검색 조건 무시 */ + + + + + AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료') + + + AND T.SALES_STATUS = #{salesStatus} + + + + + + + + + + + + + /* salesNcollectMgmt.salesDeadlineConfirm - PROJECT_MGMT의 SALES_STATUS를 '완료'로 업데이트 및 매출마감일 저장 */ + UPDATE PROJECT_MGMT + SET + SALES_STATUS = '완료', + SALES_DEADLINE_DATE = #{deadlineDate} + WHERE OBJID::VARCHAR = #{OBJID} + + diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index ef7cea3..ebe5f9e 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -96,6 +96,7 @@ $(document).ready(function(){ }); var columns = [ + {formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true}, {headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '영업번호', field : 'CONTRACT_NO', frozen:true, formatter:fnc_createGridAnchorTag, cellClick:function(e, cell){ @@ -187,7 +188,64 @@ var columns = [ //var grid; function fn_search(){ - _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/contractMgmt/contractGridList.do", columns, true); + // 그리드 조회 및 Total 합계 업데이트를 위한 커스텀 AJAX + $.ajax({ + url: "/contractMgmt/contractGridList.do", + type: "POST", + data: $("#form1").serializeObject(), + dataType: "json", + beforeSend: function(){ + _startLoading("Loading..."); + }, + complete: function(){ + _endLoading(); + }, + success: function(response) { + // 그리드 데이터 설정 + if(_tabulGrid){ + _tabulGrid.setData(response.RESULTLIST || []); + } else { + // 그리드 초기화 + _tabulGrid = new Tabulator("#mainGrid", { + layout: _tabul_layout_fitColumns, + columns: columns, + data: response.RESULTLIST || [], + selectable: true + }); + } + + // 조회된 전체 데이터의 합계 계산 + var totalSupplyPrice = 0; + var totalVat = 0; + var totalAmount = 0; + + if(response.RESULTLIST && response.RESULTLIST.length > 0) { + response.RESULTLIST.forEach(function(row) { + var supplyPrice = parseFloat(row.ORDER_SUPPLY_PRICE_SUM || 0); + var vat = parseFloat(row.ORDER_VAT_SUM || 0); + var amount = parseFloat(row.ORDER_TOTAL_AMOUNT_SUM || 0); + + totalSupplyPrice += supplyPrice; + totalVat += vat; + totalAmount += amount; + }); + } + + // 합계 표시 + $("#totalSupplyPrice").text(Number(totalSupplyPrice).toLocaleString()); + $("#totalVat").text(Number(totalVat).toLocaleString()); + $("#totalAmount").text(Number(totalAmount).toLocaleString()); + + // 페이징 HTML 업데이트 + if(response.PAGE_HTML){ + $(".table_paging_wrap").html(response.PAGE_HTML); + } + }, + error: function(jqxhr, status, error){ + alert("데이터 조회 중 오류가 발생했습니다."); + console.error(error); + } + }); } function _fnc_datepick(){ @@ -665,6 +723,19 @@ function openProjectFormPopUp(objId){ + +
+ + Total 공급가액: 0 원 + + + Total 부가세: 0 원 + + + Total 총액: 0 원 + +
+ <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp index 5e8daae..135e76b 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp @@ -53,61 +53,129 @@ fn_search(); }); - $("#btnDeadline").click(function(){ - var targetObj = _tabulGrid.getSelectedData(); - - if(1 == targetObj.length){ - var OBJID = fnc_checkNull(targetObj[0].OBJID); - var status = fnc_checkNull(targetObj[0].SALES_STATUS); - //var settleAmount = fnc_checkNull(targetObj[0].SETTLE_AMOUNT); + $("#btnDeadline").click(function(){ + var targetObj = _tabulGrid.getSelectedData(); + + if(0 == targetObj.length){ + Swal.fire("선택된 내용이 없습니다."); + return false; + } - if(status == '' || status == null || status == '매출마감'){ - Swal.fire({ - title: '선택된 데이터를 매출마감 처리하시겠습니까?', - 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 버튼을 눌렀다면 - $.ajax({ - url:"/salesNcollectMgmt/salesDeadlineConfirm.do", - type:"POST", - data: {"OBJID" : OBJID}, - dataType:"json", - success:function(data){ - Swal.fire(data.msg); - fn_search(); - }, - error: function(jqxhr, status, error){ - } - }); - } - }); - }else{ - alert("매출마감 전 데이터만 매출마감 가능합니다."); - return false; - } - //var productGroup = fnc_checkNull(targetObj[0].PRODUCT_GROUP); - //var product = fnc_checkNull(targetObj[0].PRODUCT); - //var releaseObjId = fnc_checkNull(targetObj[0].RELEASE_OBJID); - }else if(0 == targetObj.length){ - Swal.fire("선택된 내용이 없습니다."); - return false; - }else if(1 < targetObj.length){ - Swal.fire("한번에 1개의 내용만 등록 가능합니다. "); + // 선택된 항목 중 이미 매출마감된 항목이 있는지 체크 + var hasCompletedItem = false; + for(var i = 0; i < targetObj.length; i++){ + var status = fnc_checkNull(targetObj[i].SALES_STATUS); + if(status == '완료'){ + hasCompletedItem = true; + break; + } + } + + if(hasCompletedItem){ + Swal.fire("매출마감 전 데이터만 매출마감 가능합니다."); + return false; + } + + // 매출마감일 입력 팝업 + Swal.fire({ + title: '매출마감 처리', + html: + '
' + + '' + + '' + + '
선택된 ' + targetObj.length + '건의 데이터를 매출마감 처리합니다.
' + + '
', + icon: 'info', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: '확인', + cancelButtonText: '취소', + onOpen: function() { + // datepicker 초기화 + $('#deadlineDate').datepicker({ + dateFormat: 'yy-mm-dd', + changeMonth: true, + changeYear: true + }); + // 오늘 날짜를 기본값으로 설정 + var today = new Date(); + var dateStr = today.getFullYear() + '-' + + String(today.getMonth() + 1).padStart(2, '0') + '-' + + String(today.getDate()).padStart(2, '0'); + $('#deadlineDate').val(dateStr); + }, + preConfirm: function() { + const deadlineDate = $('#deadlineDate').val(); + if (!deadlineDate) { + Swal.showValidationMessage('매출마감일을 입력해주세요.'); return false; } - //fn_confirm(); + // 날짜 형식 검증 (YYYY-MM-DD) + var datePattern = /^\d{4}-\d{2}-\d{2}$/; + if (!datePattern.test(deadlineDate)) { + Swal.showValidationMessage('날짜 형식이 올바르지 않습니다. (YYYY-MM-DD)'); + return false; + } + return deadlineDate; + } + }).then(function(result) { + if (result.isConfirmed) { + var deadlineDate = result.value; + var objIdList = []; + + // 선택된 항목들의 OBJID 수집 + for(var i = 0; i < targetObj.length; i++){ + objIdList.push(fnc_checkNull(targetObj[i].OBJID)); + } + + // AJAX 요청 + console.log('매출마감 요청 - objIdList:', objIdList); + console.log('매출마감 요청 - deadlineDate:', deadlineDate); + console.log('매출마감 요청 - 전송 데이터:', { + objIdList: objIdList.join(','), + deadlineDate: deadlineDate }); + $.ajax({ + url: "/salesNcollectMgmt/salesDeadlineConfirm.do", + type: "POST", + data: { + "objIdList": objIdList.join(','), + "deadlineDate": deadlineDate + }, + dataType: "json", + success: function(data){ + console.log('매출마감 응답 - result:', data.result); + console.log('매출마감 응답 - msg:', data.msg); + console.log('매출마감 응답 - 전체:', JSON.stringify(data)); + + Swal.fire({ + title: data.msg || '처리되었습니다.', + icon: data.result ? 'success' : 'error' + }).then(() => { + if(data.result) { + fn_search(); + } + }); + }, + error: function(jqxhr, status, error){ + console.error('매출마감 AJAX 에러 - status:', status); + console.error('매출마감 AJAX 에러 - error:', error); + console.error('매출마감 AJAX 에러 - responseText:', jqxhr.responseText); + console.error('매출마감 AJAX 에러 - statusText:', jqxhr.statusText); + + Swal.fire({ + title: '매출마감 처리 중 오류가 발생했습니다.', + text: error || jqxhr.statusText || '서버 오류', + icon: 'error' + }); + } + }); + } + }); + }); + fn_search(); }); @@ -115,6 +183,7 @@