V20260210 #137
@@ -273,6 +273,7 @@ function fn_generateMailTemplate(){
|
||||
var template = "안녕하세요.\n\n";
|
||||
template += vendorName + " 귀하\n\n";
|
||||
template += "아래와 같이 견적을 요청드립니다.\n\n";
|
||||
template += "각 품목별 납품가능일 표기 부탁드립니다.\n\n";
|
||||
template += "견적요청번호: " + quotationNo + "\n";
|
||||
if(projectNo !== ""){
|
||||
template += "프로젝트번호: " + projectNo + "\n";
|
||||
|
||||
@@ -69,6 +69,142 @@
|
||||
fn_search();
|
||||
});
|
||||
|
||||
// 마감정보입력 버튼
|
||||
$("#btnDeadlineInfo").click(function(){
|
||||
var targetObj = _tabulGrid.getSelectedData();
|
||||
|
||||
if(0 == targetObj.length){
|
||||
Swal.fire("선택된 내용이 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 선택된 OBJID 목록
|
||||
var objIdList = [];
|
||||
for(var i = 0; i < targetObj.length; i++){
|
||||
objIdList.push(fnc_checkNull(targetObj[i].OBJID));
|
||||
}
|
||||
|
||||
// 단건 선택 시 기존 마감정보 불러오기
|
||||
var loadExisting = (targetObj.length === 1);
|
||||
|
||||
function openDeadlineInfoPopup(existingInfo) {
|
||||
var taxType = (existingInfo && existingInfo.TAX_TYPE) ? existingInfo.TAX_TYPE : '';
|
||||
var taxInvoiceDate = (existingInfo && existingInfo.TAX_INVOICE_DATE) ? existingInfo.TAX_INVOICE_DATE : '';
|
||||
var exportDeclNo = (existingInfo && existingInfo.EXPORT_DECL_NO) ? existingInfo.EXPORT_DECL_NO : '';
|
||||
var loadingDate = (existingInfo && existingInfo.LOADING_DATE) ? existingInfo.LOADING_DATE : '';
|
||||
|
||||
// hidden select에서 과세구분 옵션 HTML 가져오기
|
||||
var taxTypeOptionsHtml = $('#hiddenTaxTypeList').html();
|
||||
|
||||
Swal.fire({
|
||||
title: '마감정보입력',
|
||||
width: '600px',
|
||||
html:
|
||||
'<div style="padding:10px;">' +
|
||||
'<table style="width:100%; border-collapse:collapse;">' +
|
||||
'<tr>' +
|
||||
' <td style="padding:8px; text-align:right; width:40%; font-weight:bold; border:1px solid #ddd; background:#f5f5f5;">과세구분</td>' +
|
||||
' <td style="padding:8px; border:1px solid #ddd;">' +
|
||||
' <select id="swal_taxType" style="width:100%; padding:5px;">' +
|
||||
taxTypeOptionsHtml +
|
||||
' </select>' +
|
||||
' </td>' +
|
||||
'</tr>' +
|
||||
'<tr>' +
|
||||
' <td style="padding:8px; text-align:right; font-weight:bold; border:1px solid #ddd; background:#f5f5f5;">세금계산서발행일</td>' +
|
||||
' <td style="padding:8px; border:1px solid #ddd;"><input type="text" id="swal_taxInvoiceDate" style="width:95%; padding:5px;" placeholder="YYYY-MM-DD" readonly></td>' +
|
||||
'</tr>' +
|
||||
'<tr>' +
|
||||
' <td style="padding:8px; text-align:right; font-weight:bold; border:1px solid #ddd; background:#f5f5f5;">수출신고필증신고번호</td>' +
|
||||
' <td style="padding:8px; border:1px solid #ddd;"><input type="text" id="swal_exportDeclNo" style="width:95%; padding:5px;"></td>' +
|
||||
'</tr>' +
|
||||
'<tr>' +
|
||||
' <td style="padding:8px; text-align:right; font-weight:bold; border:1px solid #ddd; background:#f5f5f5;">선적일자</td>' +
|
||||
' <td style="padding:8px; border:1px solid #ddd;"><input type="text" id="swal_loadingDate" style="width:95%; padding:5px;" placeholder="YYYY-MM-DD" readonly></td>' +
|
||||
'</tr>' +
|
||||
'</table>' +
|
||||
'<div style="margin-top:10px; color:#666; font-size:12px;">선택된 ' + targetObj.length + '건의 데이터에 마감정보를 입력합니다.</div>' +
|
||||
'</div>',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#2196F3',
|
||||
cancelButtonColor: '#666',
|
||||
confirmButtonText: '저장',
|
||||
cancelButtonText: '닫기',
|
||||
onOpen: function() {
|
||||
// 날짜 필드 datepicker 초기화
|
||||
$('#swal_taxInvoiceDate').datepicker({
|
||||
dateFormat: 'yy-mm-dd',
|
||||
changeMonth: true,
|
||||
changeYear: true
|
||||
});
|
||||
$('#swal_loadingDate').datepicker({
|
||||
dateFormat: 'yy-mm-dd',
|
||||
changeMonth: true,
|
||||
changeYear: true
|
||||
});
|
||||
// 기존 데이터 세팅
|
||||
if(taxType) $('#swal_taxType').val(taxType);
|
||||
if(taxInvoiceDate) $('#swal_taxInvoiceDate').val(taxInvoiceDate);
|
||||
if(exportDeclNo) $('#swal_exportDeclNo').val(exportDeclNo);
|
||||
if(loadingDate) $('#swal_loadingDate').val(loadingDate);
|
||||
},
|
||||
preConfirm: function() {
|
||||
return {
|
||||
taxType: $('#swal_taxType').val(),
|
||||
taxInvoiceDate: $('#swal_taxInvoiceDate').val(),
|
||||
exportDeclNo: $('#swal_exportDeclNo').val(),
|
||||
loadingDate: $('#swal_loadingDate').val()
|
||||
};
|
||||
}
|
||||
}).then(function(result) {
|
||||
if (result.isConfirmed) {
|
||||
var formData = result.value;
|
||||
|
||||
$.ajax({
|
||||
url: "/revenueMgmt/saveDeadlineInfo.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"objIdList": objIdList.join(','),
|
||||
"taxType": formData.taxType,
|
||||
"taxInvoiceDate": formData.taxInvoiceDate,
|
||||
"exportDeclNo": formData.exportDeclNo,
|
||||
"loadingDate": formData.loadingDate
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
Swal.fire({
|
||||
title: data.msg || '처리되었습니다.',
|
||||
icon: data.result ? 'success' : 'error'
|
||||
}).then(function() {
|
||||
if(data.result) fn_search();
|
||||
});
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
Swal.fire({
|
||||
title: '마감정보 저장 중 오류가 발생했습니다.',
|
||||
text: error || jqxhr.statusText || '서버 오류',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 단건 선택 시 그리드 데이터에서 기존 마감정보 가져오기
|
||||
if(loadExisting) {
|
||||
var row = targetObj[0];
|
||||
openDeadlineInfoPopup({
|
||||
TAX_TYPE: fnc_checkNull(row.TAX_TYPE),
|
||||
TAX_INVOICE_DATE: fnc_checkNull(row.TAX_INVOICE_DATE),
|
||||
EXPORT_DECL_NO: fnc_checkNull(row.EXPORT_DECL_NO),
|
||||
LOADING_DATE: fnc_checkNull(row.LOADING_DATE)
|
||||
});
|
||||
} else {
|
||||
openDeadlineInfoPopup(null);
|
||||
}
|
||||
});
|
||||
|
||||
$("#btnDeadline").click(function(){
|
||||
var targetObj = _tabulGrid.getSelectedData();
|
||||
|
||||
@@ -295,6 +431,14 @@ var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '100', title : 'S/N', field : 'SERIAL_NO'},
|
||||
// 20. 품번
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '품번', field : 'PRODUCT_NO'},
|
||||
// 21. 과세구분
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '과세구분', field : 'TAX_TYPE_NAME'},
|
||||
// 22. 세금계산서발행일
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '110', title : '세금계산서발행일', field : 'TAX_INVOICE_DATE'},
|
||||
// 23. 수출신고필증신고번호
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '140', title : '수출신고필증신고번호', field : 'EXPORT_DECL_NO'},
|
||||
// 24. 선적일자
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '선적일자', field : 'LOADING_DATE'},
|
||||
|
||||
/* 주석처리된 컬럼 - 필요시 활성화 */
|
||||
/*
|
||||
@@ -467,6 +611,11 @@ function fn_FileRegist(objId, docType, docTypeName){
|
||||
<form name="form1" id="form1" method="post">
|
||||
<input type="hidden" name="actionType" id="actionType">
|
||||
<input type="hidden" name="shippingDateRequired" value="Y"> <!-- 출하일 필수 조건 -->
|
||||
<!-- 과세구분 코드 (SweetAlert에서 사용) -->
|
||||
<select id="hiddenTaxTypeList" style="display:none;">
|
||||
<option value="">선택</option>
|
||||
${codeMap.taxTypeList}
|
||||
</select>
|
||||
<div class="min_part_enroll">
|
||||
<div class="content-box">
|
||||
<div class="content-box-s">
|
||||
@@ -476,6 +625,7 @@ function fn_FileRegist(objId, docType, docTypeName){
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
<input type="button" value="마감정보입력" class="plm_btns" id="btnDeadlineInfo" style="background-color: #2196F3; color: white;">
|
||||
<input type="button" value="매출마감" class="plm_btns" id="btnDeadline" style="background-color: #4CAF50; color: white;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9383,7 +9383,7 @@ SELECT
|
||||
|
||||
<!-- 소재 관리 쿼리 -->
|
||||
<!-- 소재 목록 조회 (전체) -->
|
||||
<select id="getMaterialList" parameterType="map" resultType="map">
|
||||
<select id="getMaterialList_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9394,8 +9394,21 @@ SELECT
|
||||
ORDER BY MATERIAL_CODE
|
||||
</select>
|
||||
|
||||
<select id="getMaterialList" parameterType="map" resultType="map">
|
||||
select
|
||||
OBJID,
|
||||
PART_NAME as MATERIAL_CODE,
|
||||
-- MATERIAL_NAME,
|
||||
STATUS
|
||||
from
|
||||
PART_MNG
|
||||
WHERE STATUS = 'release'
|
||||
AND ODRFG = '2'
|
||||
ORDER BY PART_NAME
|
||||
</select>
|
||||
|
||||
<!-- 특정 소재의 사이즈 목록 조회 -->
|
||||
<select id="getMaterialSizes" parameterType="map" resultType="map">
|
||||
<select id="getMaterialSizes_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9407,8 +9420,21 @@ SELECT
|
||||
ORDER BY SIZE_SPEC
|
||||
</select>
|
||||
|
||||
<select id="getMaterialSizes" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
PART_NAME as MATERIAL_CODE,
|
||||
SPEC as SIZE_SPEC,
|
||||
PART_NO AS MATERIAL_PART_NO
|
||||
FROM PART_MNG
|
||||
WHERE PART_NAME = #{materialCode}
|
||||
AND STATUS = 'release'
|
||||
AND ODRFG = '2'
|
||||
ORDER BY SPEC
|
||||
</select>
|
||||
|
||||
<!-- 소재 코드 + 사이즈로 소재품번 조회 -->
|
||||
<select id="getMaterialPartNo" parameterType="map" resultType="map">
|
||||
<select id="getMaterialPartNo_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9422,6 +9448,21 @@ SELECT
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<select id="getMaterialPartNo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
PART_NAME as MATERIAL_CODE,
|
||||
-- MATERIAL_NAME,
|
||||
SPEC as SIZE_SPEC,
|
||||
PART_NO as MATERIAL_PART_NO
|
||||
FROM PART_MNG
|
||||
WHERE PART_NAME = #{materialCode}
|
||||
AND SPEC = #{sizeSpec}
|
||||
AND STATUS = 'release'
|
||||
AND ODRFG = '2'
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 공급업체 담당자 목록 조회 (발주서 메일 발송용) -->
|
||||
<select id="getSupplyManagerList" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
|
||||
@@ -145,6 +145,9 @@ public class SalesNcollectMgmtController {
|
||||
codeMap.put("incotermsList",
|
||||
salesMgmtCommonService.bizMakeOptionList("IT", "", "salesMgmtCommon.getCodeList"));
|
||||
*/
|
||||
|
||||
// 과세구분
|
||||
codeMap.put("taxTypeList", commonService.bizMakeOptionList("0900215", "", "common.getCodeselect"));
|
||||
|
||||
request.setAttribute("codeMap", codeMap);
|
||||
} catch (Exception e) {
|
||||
@@ -1046,6 +1049,24 @@ public class SalesNcollectMgmtController {
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 마감정보 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value = "/revenueMgmt/getDeadlineInfo.do", method = RequestMethod.POST)
|
||||
public Map<String, Object> getDeadlineInfo(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
return salesNcollectMgmtService.getDeadlineInfo(paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 마감정보 저장
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value = "/revenueMgmt/saveDeadlineInfo.do", method = RequestMethod.POST)
|
||||
public Map saveDeadlineInfo(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
return salesNcollectMgmtService.saveDeadlineInfo(request, paramMap);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/salesMgmt/getSavedTransactionStatement.do", method = RequestMethod.POST)
|
||||
@ResponseBody
|
||||
public Map<String, Object> getSavedTransactionStatement(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
|
||||
@@ -820,6 +820,11 @@
|
||||
T.PROJECT_NO,
|
||||
T.CONTRACT_OBJID,
|
||||
T.SALES_DEADLINE_DATE,
|
||||
COALESCE(T.TAX_TYPE, '') AS TAX_TYPE,
|
||||
COALESCE(CODE_NAME(T.TAX_TYPE), '') AS TAX_TYPE_NAME,
|
||||
COALESCE(T.TAX_INVOICE_DATE, '') AS TAX_INVOICE_DATE,
|
||||
COALESCE(T.EXPORT_DECL_NO, '') AS EXPORT_DECL_NO,
|
||||
COALESCE(T.LOADING_DATE, '') AS LOADING_DATE,
|
||||
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
|
||||
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
|
||||
CODE_NAME(T.AREA_CD) AS NATION,
|
||||
@@ -2099,6 +2104,44 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
|
||||
LEFT JOIN SUPPLY_MNG SM ON SM.OBJID = CASE WHEN T.CUSTOMER_OBJID ~ '^[0-9]+$' THEN T.CUSTOMER_OBJID::NUMERIC ELSE NULL END
|
||||
WHERE T.PROJECT_NO = #{projectNo}
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 마감정보 조회
|
||||
* @since 2026.02.13
|
||||
* @author system
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<select id="getDeadlineInfo" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getDeadlineInfo - 마감정보 조회 */
|
||||
SELECT
|
||||
COALESCE(TAX_TYPE, '') AS TAX_TYPE,
|
||||
COALESCE(TAX_INVOICE_DATE, '') AS TAX_INVOICE_DATE,
|
||||
COALESCE(EXPORT_DECL_NO, '') AS EXPORT_DECL_NO,
|
||||
COALESCE(LOADING_DATE, '') AS LOADING_DATE
|
||||
FROM PROJECT_MGMT
|
||||
WHERE OBJID::VARCHAR = #{OBJID}
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 마감정보 저장
|
||||
* @since 2026.02.13
|
||||
* @author system
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<update id="saveDeadlineInfo" parameterType="map">
|
||||
/* salesNcollectMgmt.saveDeadlineInfo - 마감정보 저장 */
|
||||
UPDATE PROJECT_MGMT
|
||||
SET
|
||||
TAX_TYPE = #{taxType},
|
||||
TAX_INVOICE_DATE = #{taxInvoiceDate},
|
||||
EXPORT_DECL_NO = #{exportDeclNo},
|
||||
LOADING_DATE = #{loadingDate}
|
||||
WHERE OBJID::VARCHAR = #{OBJID}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -1456,4 +1456,76 @@ public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 마감정보 조회
|
||||
* @param paramMap - OBJID
|
||||
* @return 마감정보 Map (TAX_TYPE, TAX_INVOICE_DATE, EXPORT_DECL_NO, LOADING_DATE)
|
||||
*/
|
||||
public Map<String, Object> getDeadlineInfo(Map paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
SqlSession sqlSession = null;
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
Map<String, Object> info = sqlSession.selectOne("salesNcollectMgmt.getDeadlineInfo", paramMap);
|
||||
resultMap.put("result", true);
|
||||
resultMap.put("info", info);
|
||||
} catch (Exception e) {
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "마감정보 조회 중 오류가 발생했습니다.");
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (sqlSession != null) sqlSession.close();
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 마감정보 저장 (선택된 항목들에 일괄 적용)
|
||||
* @param request
|
||||
* @param paramMap - objIdList, taxType, taxInvoiceDate, exportDeclNo, loadingDate
|
||||
* @return 처리 결과
|
||||
*/
|
||||
public Map saveDeadlineInfo(HttpServletRequest request, Map paramMap) {
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
try {
|
||||
String objIdListStr = CommonUtils.checkNull(paramMap.get("objIdList"));
|
||||
String taxType = CommonUtils.checkNull(paramMap.get("taxType"));
|
||||
String taxInvoiceDate = CommonUtils.checkNull(paramMap.get("taxInvoiceDate"));
|
||||
String exportDeclNo = CommonUtils.checkNull(paramMap.get("exportDeclNo"));
|
||||
String loadingDate = CommonUtils.checkNull(paramMap.get("loadingDate"));
|
||||
|
||||
if (objIdListStr == null || objIdListStr.isEmpty()) {
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "선택된 항목이 없습니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
String[] targetObjIdList = objIdListStr.split(",");
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
for (int i = 0; i < targetObjIdList.length; i++) {
|
||||
HashMap sqlParamMap = new HashMap();
|
||||
sqlParamMap.put("OBJID", CommonUtils.checkNull(targetObjIdList[i]));
|
||||
sqlParamMap.put("taxType", taxType);
|
||||
sqlParamMap.put("taxInvoiceDate", taxInvoiceDate);
|
||||
sqlParamMap.put("exportDeclNo", exportDeclNo);
|
||||
sqlParamMap.put("loadingDate", loadingDate);
|
||||
|
||||
sqlSession.update("salesNcollectMgmt.saveDeadlineInfo", sqlParamMap);
|
||||
}
|
||||
sqlSession.commit();
|
||||
resultMap.put("result", true);
|
||||
resultMap.put("msg", targetObjIdList.length + "건의 마감정보가 저장되었습니다.");
|
||||
} catch (Exception e) {
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "마감정보 저장 중 오류가 발생했습니다.");
|
||||
sqlSession.rollback();
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
sqlSession.close();
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user