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 @@