Merge pull request 'V2025111901' (#85) from V2025111901 into main
Reviewed-on: #85
This commit was merged in pull request #85.
This commit is contained in:
@@ -91,7 +91,7 @@ $(document).ready(function(){
|
||||
//상신된 결재라인 가져오기
|
||||
fn_getApprLine();
|
||||
//구매요청서 정보 가져오기
|
||||
fn_getSalesRequest();
|
||||
//fn_getSalesRequest();
|
||||
|
||||
//grid.data = $.parseJSON($("#gridDetailList").val());
|
||||
|
||||
@@ -108,227 +108,38 @@ $(document).ready(function(){
|
||||
,datatype: "local"
|
||||
,data : $.parseJSON($("#gridDetailList").val())
|
||||
,colNames: ["OBJID","PART_OBJID","LD_PART_OBJID"
|
||||
,"품명"
|
||||
,"품번"
|
||||
//,"품번2"
|
||||
,"규격","메이커","단위","설계수량","수량","실발주수량"
|
||||
,"공급단가"
|
||||
//,"레이져단가","용접단가","가공단가","후처리단가"
|
||||
,"공급가","부가세","부가세포함공급가"
|
||||
,"총발주수량","재고수량","재고수량(org)","총실발주수량","실공급가" //sum
|
||||
,"품명","품번","규격","메이커","단위"
|
||||
,"수량","단가","공급가"
|
||||
]
|
||||
,colModel: [
|
||||
{name:"OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false}
|
||||
,{name:"PART_OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false}
|
||||
,{name:"LD_PART_OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false}
|
||||
,{name:"PART_NAME" , index:"", width:200, align:"left", hidden:false, sortable:false, editable:false
|
||||
{name:"OBJID" , hidden: true, sortable:false, editable:false}
|
||||
,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false}
|
||||
,{name:"LD_PART_OBJID" , hidden: true, sortable:false, editable:false}
|
||||
,{name:"PART_NAME" , width:300, align:"left", sortable:false, editable:false}
|
||||
,{name:"PART_NO" , width:300, align:"left", sortable:false, editable:false, formatter:setLink}
|
||||
,{name:"SPEC" , width:180, align:"left", sortable:false, editable:false}
|
||||
,{name:"MAKER" , width:180, align:"left", sortable:false, editable:false}
|
||||
,{name:"UNIT" , width:60, align:"center", sortable:false, editable:true
|
||||
,edittype:"select", formatter:"select"
|
||||
,editoptions:{ value: unit_cd }
|
||||
}
|
||||
,{name:"ORDER_QTY" , width:90, align:"right", sortable:false, editable:false
|
||||
,formatter:"integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { }} ]
|
||||
dataInit: function(e){ e.style.textAlign = "right"; }
|
||||
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
|
||||
}
|
||||
}
|
||||
,{name:"PART_NO" , index:"", width:200, align:"left", hidden:false, sortable:false, editable:false
|
||||
<%--
|
||||
,formatter:'showlink'
|
||||
,formatoptions:{baseLinkUrl:'/partMng/partMngDetailPopUp.do', //?OBJID=
|
||||
//addParam: '&action=display&OBJID='
|
||||
//baseLinkUrl:'javascript:openPartMngPopup()',
|
||||
idName:'OBJID',
|
||||
addParam: function (options) {
|
||||
//console.log(options.rowData.PART_OBJID);
|
||||
//return "/partMng/partMngDetailPopUp.do?OBJID=" + options.rowData.PART_OBJID;
|
||||
//return 'openPartMngPopup(\"" + rowObject.PART_OBJID + "\");'
|
||||
//return 'openPartMngPopup(' + rowData.PART_OBJID + ')';
|
||||
return rowData.PART_OBJID;
|
||||
}
|
||||
}
|
||||
--%>
|
||||
,formatter:setLink
|
||||
,{name:"PARTNER_PRICE" , width:110, align:"right", sortable:false, editable:false
|
||||
,formatter:"integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { }} ]
|
||||
dataInit: function(e){ e.style.textAlign = "right"; }
|
||||
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
|
||||
}
|
||||
}
|
||||
<%--
|
||||
,{name:"PART_OBJID" , index:"", width:110, align:"left", hidden:false, sortable:false, editable:false
|
||||
,formatter:'showlink'
|
||||
,formatoptions:{baseLinkUrl:'/partMng/partMngDetailPopUp.do', //?OBJID=
|
||||
//addParam: '&action=display&OBJID='
|
||||
//baseLinkUrl:'javascript:openPartMngPopup()',
|
||||
idName:'PART_OBJID',
|
||||
/*
|
||||
addParam: function (options) {
|
||||
//console.log(options.rowData.PART_OBJID);
|
||||
//return "/partMng/partMngDetailPopUp.do?OBJID=" + options.rowData.PART_OBJID;
|
||||
//return 'openPartMngPopup(\"" + rowObject.PART_OBJID + "\");'
|
||||
//return 'openPartMngPopup(' + rowData.PART_OBJID + ')';
|
||||
return rowData.PART_OBJID;
|
||||
}
|
||||
*/
|
||||
}
|
||||
//,formatter:setLink
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { }} ]
|
||||
}
|
||||
,{name:"SUPPLY_UNIT_PRICE", width:130, align:"right", sortable:false, editable:false
|
||||
,formatter:"integer", formatoptions:{thousandsSeparator:","}
|
||||
}
|
||||
--%>
|
||||
,{name:"SPEC" , index:"", width:140, align:"left", hidden:false, sortable:false, editable:false
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { }} ]
|
||||
}
|
||||
}
|
||||
,{name:"MAKER" , index:"", width:110, align:"left", hidden:false, sortable:false, editable:false
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { }} ]
|
||||
}
|
||||
}
|
||||
,{name:"UNIT" , index:"", width:52, align:"center", hidden:false, sortable:false, editable: true
|
||||
,edittype :"select"
|
||||
,formatter :"select"
|
||||
,editoptions:{
|
||||
value: unit_cd
|
||||
,dataInit : function(e){
|
||||
e.style.width = "92%";
|
||||
e.style.fontSize = 13;
|
||||
}
|
||||
}
|
||||
}
|
||||
,{name:"BOM_QTY" , index:"", width:53, align: "right", hidden:true, sortable:false, editable: false
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"QTY" , index:"", width:40, align: "right", hidden:false, sortable:false, editable: (<%=isModify%> && ('${info.TYPE}' == TYPE_BUY_ITEM ||'${info.TYPE}' == TYPE_ETC || '${info.TYPE}' == TYPE_LONG_DLV || '${info.TYPE}' == TYPE_SUBCONTRACT || "${info.ORDER_TYPE_CD}" == '0001408') ? true : false) <%--=isModify--%>
|
||||
//,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"ORDER_QTY" , index:"", width:53, align: "right", hidden:false, sortable:false, editable: false
|
||||
//,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"PARTNER_PRICE" , index:"", width:80, align: "right", hidden:false, sortable:false, editable: true
|
||||
,formatter: "integer", formatoptions:{//decimalPlaces: 0, // 소수점 자리수 (0으로 설정하면 정수만 표시)
|
||||
thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }
|
||||
}
|
||||
/*
|
||||
,{type:"onclick", fn:function(e) {
|
||||
var rowid = this.id.replace("_PARTNER_PRICE","");
|
||||
var value = zero_to_null(this.value);
|
||||
grid.jqGrid('setCell', rowid, 'PARTNER_PRICE', value);
|
||||
}
|
||||
}
|
||||
*/
|
||||
]
|
||||
}
|
||||
}
|
||||
// ,{name:"PRICE1" , index:"", width:70, align: "right", hidden:false, sortable:false, editable: true
|
||||
// ,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
// ,editoptions:{
|
||||
// dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
// ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }}
|
||||
/*
|
||||
,
|
||||
{type:"focus", fn:function(e) {
|
||||
var rowid = this.id.replace("_PRICE1","");
|
||||
var value = zero_to_null(this.value);
|
||||
grid.jqGrid('setCell', rowid, 'PRICE1', value);
|
||||
}
|
||||
}
|
||||
*/
|
||||
// ]
|
||||
// }
|
||||
// }
|
||||
// ,{name:"PRICE2" , index:"", width:60, align: "right", hidden:false, sortable:false, editable: true
|
||||
// ,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
// ,editoptions:{
|
||||
// dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
// ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
// }
|
||||
// }
|
||||
// ,{name:"PRICE3" , index:"", width:60, align: "right", hidden:false, sortable:false, editable: true
|
||||
// ,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
// ,editoptions:{
|
||||
// dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
// ,dataEvents: [ {type:"change", fn:function(e) {
|
||||
// gridFn.calcRowAll(e); }} ]
|
||||
// }
|
||||
// }
|
||||
// ,{name:"PRICE4" , index:"", width:70, align: "right", hidden:false, sortable:false, editable: true
|
||||
// ,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
// ,editoptions:{
|
||||
// dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
// ,dataEvents: [ {type:"change", fn:function(e) {
|
||||
// gridFn.calcRowAll(e); }} ]
|
||||
// }
|
||||
// }
|
||||
,{name:"SUPPLY_UNIT_PRICE", index:"", width:100, align: "right", hidden:false, sortable:false, editable: true
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"SUPPLY_UNIT_VAT_PRICE", index:"", /* width:70, */ align: "right", hidden:true, sortable:false, editable: true
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"SUPPLY_UNIT_VAT_SUM_PRICE", index:"", width:110, align: "right", hidden:true, sortable:false, editable: true
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e);gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"TOTAL_ORDER_QTY" , index:"", width:66, align: "right", hidden:false, sortable:false, editable: false
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"STOCK_QTY" , index:"", width:55, align: "right", hidden:false, sortable:false, editable: <%=isModify%> //240426 임시로 수정 가능하게 반영 editable: editable
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"STOCK_QTY_ORG" , index:"", width:55, align: "right", hidden:true, sortable:false, editable: false
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ]
|
||||
}
|
||||
}
|
||||
,{name:"REAL_ORDER_QTY" , index:"", width:79, align: "right", hidden:false, sortable:false, editable: false //240501 입력으로 변경하려다 stop
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
}
|
||||
}
|
||||
,{name:"REAL_SUPPLY_PRICE" , index:"", width:96, align: "right", hidden:false, sortable:false, editable: false
|
||||
,formatter: "integer", formatoptions:{thousandsSeparator:","}
|
||||
,editoptions:{
|
||||
dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; }
|
||||
}
|
||||
}
|
||||
]
|
||||
,ignoreCase : true
|
||||
,rownumbers : false
|
||||
@@ -346,22 +157,12 @@ $(document).ready(function(){
|
||||
,userDataOnFooter: true //바닥합계
|
||||
//,caption :"제목"
|
||||
,loadComplete: function(){
|
||||
|
||||
/*
|
||||
var ids = $("#grid1").jqGrid('getDataIDs');
|
||||
//var arrNumColumNames = ['PARTNER_PRICE', 'PRICE1', 'PRICE2', 'PRICE3', 'PRICE4']
|
||||
for (var i = 0; i < ids.length; i++) {
|
||||
var rowId = ids[i];
|
||||
var cellValue = $("#grid").jqGrid('getCell', rowId, 'PARTNER_PRICE');
|
||||
//var formattedValue = cellValue.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
$("#grid").jqGrid('setCell', rowId, 'PARTNER_PRICE', numberWithCommas(cellValue));
|
||||
}
|
||||
*/
|
||||
|
||||
var gid = this.id;
|
||||
var grid_wrap_div = $("#gbox_"+gid);
|
||||
setTimeout("fn_jqGrid_init($('#"+gid+"'), false);", 50); //윈도우크기 비례 자동조절
|
||||
|
||||
// 디버깅: 데이터 확인
|
||||
|
||||
//footer 커스텀..
|
||||
var $fr = $(this.grid.sDiv).find("tr.footrow");
|
||||
var $frNew1;
|
||||
@@ -415,6 +216,9 @@ $(document).ready(function(){
|
||||
$("td", $(".footerRowNew1")).slice(0,_idx+1).css({"background-color":"#e4e4e4"});
|
||||
$("td", $(".footerRowNew1")).slice(_idx+1).css({"background-color":"#e4e4e4"}); //(옅은핑크)
|
||||
$("#TOTAL_SUPPLY_PRICE,#TOTAL_SUPPLY_UNIT_PRICE,#TOTAL_REAL_SUPPLY_PRICE").css({"background-color":"#fbead9"});
|
||||
|
||||
// 합계 계산
|
||||
setTimeout(function(){ gridFn.footerSummary(); }, 100);
|
||||
}
|
||||
,beforeSubmitCell: function (rowid, cellname, value, iRow, iCol) {
|
||||
// 'linkColumn' 컬럼에 대해서만 링크 태그를 제외하고 값만 전송
|
||||
@@ -432,11 +236,27 @@ $(document).ready(function(){
|
||||
},
|
||||
});
|
||||
|
||||
if("${info.PARTNER_OBJID}" != "" && ("${info.SALES_REQUEST_OBJID}" != "" || "${info.SALES_REQUEST_OBJID}" != null)){
|
||||
changelist("${info.PARTNER_OBJID}");
|
||||
// 이미 저장된 발주서(OBJID가 있는 경우)는 그리드 데이터는 유지하고 공급처 정보만 가져옴
|
||||
if("${info.OBJID}" != "" && "${info.PARTNER_OBJID}" != ""){
|
||||
// 공급처 정보만 가져오기
|
||||
var list = fnc_getJsonAllDataListBySqlId({"sqlId":"purchaseOrder.purchaseOrderAdminSupplyInfo", "PARTNER_OBJID":"${info.PARTNER_OBJID}"});
|
||||
if(fnc_checkNull(list) != ""){
|
||||
var row = list[0];
|
||||
$("#SUPPLY_BUS_NO").val(row["SUPPLY_BUS_NO"]);
|
||||
$("#SUPPLY_USER_NAME").val(row["SUPPLY_USER_NAME"]);
|
||||
$("#SUPPLY_USER_HP").val(row["SUPPLY_USER_HP"]);
|
||||
$("#SUPPLY_USER_TEL").val(row["SUPPLY_USER_TEL"]);
|
||||
$("#SUPPLY_USER_FAX").val(row["SUPPLY_USER_FAX"]);
|
||||
$("#SUPPLY_USER_EMAIL").val(row["SUPPLY_USER_EMAIL"]);
|
||||
$("#SUPPLY_ADDR").val(row["SUPPLY_ADDR"]);
|
||||
}
|
||||
} else if("${info.PARTNER_OBJID}" != "" && "${info.SALES_REQUEST_OBJID}" != ""){
|
||||
// 신규 작성시 changelist 호출
|
||||
changelist("${info.PARTNER_OBJID}");
|
||||
}
|
||||
|
||||
gridFn.opennEdit(); //수정가능
|
||||
gridFn.footerSummary(); // 합계 계산
|
||||
|
||||
|
||||
<% if(isModify){ %>
|
||||
@@ -604,54 +424,55 @@ $(document).ready(function(){
|
||||
fn_setMultiInfo(val); //동시적용 정보 셋팅
|
||||
});
|
||||
//발주구분,프로젝트,유닛명,공급업체 변경시 - 구매BOM에서 등록한 PART정보를 가져온다
|
||||
$("#TYPE,#CONTRACT_MGMT_OBJID,#UNIT_CODE,#PARTNER_OBJID").change(function(){
|
||||
//$("#TYPE,#CONTRACT_MGMT_OBJID,#UNIT_CODE,#PARTNER_OBJID").change(function(){
|
||||
//alert(_PRE_ORDER_TYPE_CD);
|
||||
var ORDER_TYPE_CD = $("#ORDER_TYPE_CD").val(); //발주구분
|
||||
if("${info.SALES_REQUEST_OBJID}"=="" || "${info.SALES_REQUEST_OBJID}" == null){
|
||||
if(ORDER_TYPE_CD == '0001407'){ //신규면 자동조회 //재발주(0001408)가 아니면 초기화(자동 조회)
|
||||
addBomPart(); //이전 발주 목록
|
||||
}
|
||||
}
|
||||
});
|
||||
// var ORDER_TYPE_CD = $("#ORDER_TYPE_CD").val(); //발주구분
|
||||
// if("${info.SALES_REQUEST_OBJID}"=="" || "${info.SALES_REQUEST_OBJID}" == null){
|
||||
// if(ORDER_TYPE_CD == '0001407'){ //신규면 자동조회 //재발주(0001408)가 아니면 초기화(자동 조회)
|
||||
// addBomPart(); //이전 발주 목록
|
||||
// }
|
||||
// }
|
||||
//});
|
||||
|
||||
$("#ORDER_TYPE_CD").change(function(){ //발주구분
|
||||
var ORDER_TYPE_CD = $("#PURCHASE_ORDER_NO_ORG").val("");
|
||||
// $("#ORDER_TYPE_CD").change(function(){ //발주구분
|
||||
// var ORDER_TYPE_CD = $("#PURCHASE_ORDER_NO_ORG").val("");
|
||||
|
||||
//alert(_PRE_ORDER_TYPE_CD);
|
||||
if(!fnc_isEmpty(_PRE_ORDER_TYPE_CD) || fnc_isEmpty(ORDER_TYPE_CD)){ //이전이 선택이 아니거나 선택 선택하면 초기화
|
||||
getPartData(''); //품목 초기화
|
||||
}
|
||||
if($(this).val() == '0001408'){//재발주
|
||||
var partnerObjid = $("#PARTNER_OBJID").val();
|
||||
//alert("partnerObjid:"+partnerObjid);
|
||||
$("#PURCHASE_ORDER_NO_ORG").prop("disabled","");
|
||||
$("#PURCHASE_ORDER_NO_ORG").prop("required","required");
|
||||
fnc_getPurchaseOrderCdListAppend("PURCHASE_ORDER_NO_ORG","${info.PURCHASE_ORDER_NO_ORG}","",partnerObjid); //발주 정보목록
|
||||
}else{
|
||||
$("#PURCHASE_ORDER_NO_ORG").prop("disabled","disabled");
|
||||
$("#PURCHASE_ORDER_NO_ORG").prop("required","");
|
||||
if($(this).val() == '0001407'){//신규
|
||||
addBomPart();
|
||||
}
|
||||
}
|
||||
$("#PURCHASE_ORDER_NO_ORG").trigger("change");
|
||||
//$("#PARTNER_OBJID").trigger("change");
|
||||
_PRE_ORDER_TYPE_CD = $(this).val(); //이전 값 저장
|
||||
});
|
||||
// //alert(_PRE_ORDER_TYPE_CD);
|
||||
// // if(!fnc_isEmpty(_PRE_ORDER_TYPE_CD) || fnc_isEmpty(ORDER_TYPE_CD)){ //이전이 선택이 아니거나 선택 선택하면 초기화
|
||||
// // getPartData(''); //품목 초기화
|
||||
// // }
|
||||
// if($(this).val() == '0001408'){//재발주
|
||||
// var partnerObjid = $("#PARTNER_OBJID").val();
|
||||
// //alert("partnerObjid:"+partnerObjid);
|
||||
// $("#PURCHASE_ORDER_NO_ORG").prop("disabled","");
|
||||
// $("#PURCHASE_ORDER_NO_ORG").prop("required","required");
|
||||
// fnc_getPurchaseOrderCdListAppend("PURCHASE_ORDER_NO_ORG","${info.PURCHASE_ORDER_NO_ORG}","",partnerObjid); //발주 정보목록
|
||||
// }else{
|
||||
// $("#PURCHASE_ORDER_NO_ORG").prop("disabled","disabled");
|
||||
// $("#PURCHASE_ORDER_NO_ORG").prop("required","");
|
||||
// if($(this).val() == '0001407'){//신규
|
||||
// addBomPart();
|
||||
// }
|
||||
// }
|
||||
// $("#PURCHASE_ORDER_NO_ORG").trigger("change");
|
||||
// //$("#PARTNER_OBJID").trigger("change");
|
||||
// _PRE_ORDER_TYPE_CD = $(this).val(); //이전 값 저장
|
||||
// });
|
||||
|
||||
$("#PURCHASE_ORDER_NO_ORG").change(function(){
|
||||
var val = $(this).val();
|
||||
if(fnc_isNotEmpty(val)){
|
||||
getPartData(val);
|
||||
//changelist(val);
|
||||
}else{
|
||||
}
|
||||
});
|
||||
// $("#PURCHASE_ORDER_NO_ORG").change(function(){
|
||||
// var val = $(this).val();
|
||||
// if(fnc_isNotEmpty(val)){
|
||||
// getPartData(val);
|
||||
// //changelist(val);
|
||||
// }else{
|
||||
// }
|
||||
// });
|
||||
|
||||
fnc_datepick(); //달력
|
||||
$(".select2").select2();
|
||||
|
||||
gridFn.opennEdit(); //수정가능
|
||||
gridFn.footerSummary(); // 합계 계산
|
||||
|
||||
//버튼
|
||||
$("#btnAdd" ).click(function(){ fn_openPartMngListPopUp(); }); //행추가
|
||||
@@ -701,23 +522,23 @@ $(document).ready(function(){
|
||||
});
|
||||
|
||||
//유닛명
|
||||
if("${info.CONTRACT_MGMT_OBJID}"!=""){
|
||||
fn_UnitCodeList("${info.CONTRACT_MGMT_OBJID}", "UNIT_CODE","");
|
||||
$("#UNIT_CODE").val("${info.UNIT_CODE}");
|
||||
}
|
||||
// if("${info.CONTRACT_MGMT_OBJID}"!=""){
|
||||
// fn_UnitCodeList("${info.CONTRACT_MGMT_OBJID}", "UNIT_CODE","");
|
||||
// $("#UNIT_CODE").val("${info.UNIT_CODE}");
|
||||
// }
|
||||
//프로젝트번호 triggger로 동시적용 정보 셋팅(240109)
|
||||
$("#CONTRACT_MGMT_OBJID").val("${info.CONTRACT_MGMT_OBJID}");
|
||||
//$("#CONTRACT_MGMT_OBJID").val("${info.CONTRACT_MGMT_OBJID}");
|
||||
//$("#CONTRACT_MGMT_OBJID").trigger("change");
|
||||
fn_setMultiInfo("${info.CONTRACT_MGMT_OBJID}")
|
||||
fn_setMultiInfoForSaved("${info.CONTRACT_MGMT_OBJID}"); //동시적용 정보 셋팅
|
||||
//fn_setMultiInfo("${info.CONTRACT_MGMT_OBJID}")
|
||||
//fn_setMultiInfoForSaved("${info.CONTRACT_MGMT_OBJID}"); //동시적용 정보 셋팅
|
||||
|
||||
fnc_datepick(); //달력
|
||||
$(".select2").select2();
|
||||
|
||||
//동시프로젝트 선택
|
||||
$(".APPLICATION_PROJECT_NO").on("change", function() {
|
||||
reCalculatePrice();
|
||||
});
|
||||
// $(".APPLICATION_PROJECT_NO").on("change", function() {
|
||||
// reCalculatePrice();
|
||||
// });
|
||||
|
||||
addZeroEvtAtPriceInput();
|
||||
|
||||
@@ -1087,18 +908,17 @@ function zero_to_null(value){
|
||||
}
|
||||
}
|
||||
function setLink(cellval, options, rowObject) {
|
||||
|
||||
if(typeof(cellval) == "undefined") {
|
||||
return "";
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
if(fnc_isEmpty(rowObject.PART_OBJID)){
|
||||
return rowObject.PART_NO
|
||||
return rowObject.PART_NO;
|
||||
}else{
|
||||
if(rowObject.PART_NO.indexOf('openPartMngPopup') < 0){
|
||||
return "<a onclick='openPartMngPopup(\"" + rowObject.PART_OBJID + "\");' class='pointer'>" + rowObject.PART_NO + "</a>";
|
||||
}else{
|
||||
return rowObject.PART_NO
|
||||
return rowObject.PART_NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1148,6 +968,7 @@ function fn_getApprLine(){
|
||||
}
|
||||
|
||||
function fn_getSalesRequest(){
|
||||
//alert("1234")
|
||||
if('${param.sales_request_objid}'!=''){
|
||||
$.ajax({
|
||||
url:"/salesMng/getSalesRequest.do",
|
||||
@@ -1513,65 +1334,24 @@ function fn_save(){
|
||||
function fn_checkQty(){
|
||||
var isValid = true;
|
||||
var $g = $("#grid1");
|
||||
//var rowId = $g.jqGrid('getGridParam', 'selrow'); //선택된행 번호
|
||||
var isValid = true;
|
||||
var ids = grid.jqGrid("getDataIDs");
|
||||
for (var i = 0; i < ids.length; i++) {
|
||||
var rowId = ids[i]; //수정중인 행번호 (행선택은 안될수있음)
|
||||
var v1 = Number( fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY")).replace(/,/gi,"") );
|
||||
var v2 = Number( $g.find("#"+rowId+"_PARTNER_PRICE").val().replace(/,/gi,"") );
|
||||
var v3 = Number( $g.find("#"+rowId+"_PRICE1").val().replace(/,/gi,"") );
|
||||
var v4 = Number( $g.find("#"+rowId+"_PRICE2").val().replace(/,/gi,"") );
|
||||
var v5 = Number( $g.find("#"+rowId+"_PRICE3").val().replace(/,/gi,"") );
|
||||
var v6 = Number( $g.find("#"+rowId+"_PRICE4").val().replace(/,/gi,"") );
|
||||
//var q1 = Number( $g.find("#"+rowId+"_TOTAL_ORDER_QTY").val().replace(/,/gi,"") );
|
||||
var q1 = grid.jqGrid('getCell', rowId, "TOTAL_ORDER_QTY").replace(/,/gi,"");
|
||||
var q2 = Number( fnc_checkNullDefaultValue($g.find("#"+rowId+"_STOCK_QTY").val(), grid.jqGrid('getCell', rowId, "STOCK_QTY")).replace(/,/gi,"") );
|
||||
var q3 = grid.jqGrid('getCell', rowId, "REAL_ORDER_QTY").replace(/,/gi,"");
|
||||
//var q3 = Number( $g.find("#"+rowId+"_REAL_ORDER_QTY").val().replace(/,/gi,"") );
|
||||
//var v6 = Number( $g.find("#"+rowId+"_SUPPLY_UNIT_PRICE").val() );
|
||||
|
||||
var sameProjectCount = fn_getProjectCount();
|
||||
//alert(v1);
|
||||
/*
|
||||
if(!$.isNumeric( fnc_checkNullDefaultValue(eVal,"0")) ){
|
||||
Swal.fire("숫자를 입력해주세요."); $(e.target).select(); return;
|
||||
}
|
||||
else if(v1<=q2){
|
||||
Swal.fire("재고수량은 마지막 동시발주건의 수량이 입력되도록 수량보다 작아야 합니다."); $(e.target).select(); return;
|
||||
}
|
||||
*/
|
||||
var rowId = ids[i];
|
||||
// 수량
|
||||
var qtyVal = fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY"));
|
||||
var v1 = Number((qtyVal || "0").toString().replace(/,/gi,""));
|
||||
// 단가
|
||||
var priceVal = fnc_checkNullDefaultValue($g.find("#"+rowId+"_PARTNER_PRICE").val(), grid.jqGrid('getCell', rowId, "PARTNER_PRICE"));
|
||||
var v2 = Number((priceVal || "0").toString().replace(/,/gi,""));
|
||||
|
||||
if( !$.isNumeric(v1)
|
||||
|| !$.isNumeric(v2)
|
||||
|| !$.isNumeric(v3)
|
||||
|| !$.isNumeric(v4)
|
||||
|| !$.isNumeric(v5)
|
||||
|| !$.isNumeric(v6)
|
||||
|| !$.isNumeric(q1)
|
||||
|| !$.isNumeric(q2)
|
||||
|| !$.isNumeric(q3)
|
||||
){
|
||||
Swal.fire("단가와 수량은 숫자로 입력해 주세요."); $(e.target).select(); return;
|
||||
if(!$.isNumeric(v1) || !$.isNumeric(v2)){
|
||||
Swal.fire("단가와 수량은 숫자로 입력해 주세요.");
|
||||
isValid = false;
|
||||
break;
|
||||
} else if(v1 < 1){
|
||||
Swal.fire("실발주수량은 0보다 커야합니다.");
|
||||
Swal.fire("수량은 0보다 커야합니다.");
|
||||
isValid = false;
|
||||
break;
|
||||
}else if(q3 < 1){
|
||||
Swal.fire("총실발주수량이 0보다 커야합니다.");
|
||||
isValid = false;
|
||||
break;
|
||||
/*
|
||||
}else if(sameProjectCount > 1 && q1 - q2 < v1){
|
||||
Swal.fire("총 발주수량이 수량만큼은 확보되도록 재고수량을 입력해 주세요.");
|
||||
isValid = false;
|
||||
break;
|
||||
*/
|
||||
}else if(q1<q2){
|
||||
Swal.fire("재고수량은 총발주수량보다 클 수 없습니다.");
|
||||
isValid = false;
|
||||
break;
|
||||
}else{
|
||||
}
|
||||
}
|
||||
return isValid;
|
||||
@@ -1687,121 +1467,20 @@ var gridFn = {
|
||||
//}).trigger("reloadGrid");
|
||||
//grid.setGridParam({url: "", datatype : "local"});
|
||||
}
|
||||
,calcRowAll : function(e, pRowId){ //행 모든 컬럼 계산
|
||||
,calcRowAll : function(e, pRowId){ //행 계산: 수량 * 단가 = 공급가
|
||||
var $g = $("#grid1");
|
||||
//alert('calcrowall');
|
||||
//var rowId = $g.jqGrid('getGridParam', 'selrow'); //선택된행 번호
|
||||
var rowId = e ? e.target.id.split("_")[0] : pRowId; //수정중인 행번호 (행선택은 안될수있음)
|
||||
//var v1 = Number( $g.find("#"+rowId+"_ORDER_QTY").val().replace(/,/gi,"") ); 240411 아래로 변경(단가 저장시 editable:false)
|
||||
var v0 = Number( fnc_checkNullDefaultValue(fnc_checkNull($g.find("#"+rowId+"_BOM_QTY").val()).replace(/,/gi,"") , grid.jqGrid('getCell', rowId, "BOM_QTY")).replace(/,/gi,"") );
|
||||
var v1 = Number( fnc_checkNullDefaultValue(fnc_checkNull($g.find("#"+rowId+"_QTY").val()).replace(/,/gi,"") , grid.jqGrid('getCell', rowId, "QTY")).replace(/,/gi,"") );
|
||||
var v11= Number( fnc_checkNullDefaultValue(fnc_checkNull($g.find("#"+rowId+"_ORDER_QTY").val()).replace(/,/gi,"") , grid.jqGrid('getCell', rowId, "ORDER_QTY")).replace(/,/gi,"") );
|
||||
var v2 = Number( $g.find("#"+rowId+"_PARTNER_PRICE").val().replace(/,/gi,"") );
|
||||
var v3 = Number( $g.find("#"+rowId+"_PRICE1").val().replace(/,/gi,"") );
|
||||
var v4 = Number( $g.find("#"+rowId+"_PRICE2").val().replace(/,/gi,"") );
|
||||
var v5 = Number( $g.find("#"+rowId+"_PRICE3").val().replace(/,/gi,"") );
|
||||
var v6 = Number( $g.find("#"+rowId+"_PRICE4").val().replace(/,/gi,"") );
|
||||
var rowId = e ? e.target.id.split("_")[0] : pRowId;
|
||||
|
||||
var eVal = $(e.target).val() .replace(/,/gi,"");
|
||||
var sameProjectCount = fn_getProjectCount();
|
||||
// 수량 (ORDER_QTY)
|
||||
var qty = Number(fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY")).toString().replace(/,/g,""));
|
||||
// 단가
|
||||
var unitPrice = Number(fnc_checkNullDefaultValue($g.find("#"+rowId+"_PARTNER_PRICE").val(), grid.jqGrid('getCell', rowId, "PARTNER_PRICE")).toString().replace(/,/g,""));
|
||||
|
||||
if(!$.isNumeric( fnc_checkNullDefaultValue(eVal,"0").replace(/,/g,"")) ){
|
||||
Swal.fire("숫자를 입력해주세요."); $(e.target).select(); return;
|
||||
}
|
||||
/*
|
||||
else if(v1<=q2){
|
||||
Swal.fire("재고수량은 마지막 동시발주건의 수량이 입력되도록 수량보다 작아야 합니다."); $(e.target).select(); return;
|
||||
}
|
||||
*/
|
||||
// 공급가 = 수량 * 단가
|
||||
var supplyPrice = qty * unitPrice;
|
||||
|
||||
if(e.target.id == rowId+"_ORDER_QTY"
|
||||
|| e.target.id == rowId+"_QTY"
|
||||
|| e.target.id == rowId+"_BOM_QTY"
|
||||
|| e.target.id == rowId+"_PARTNER_PRICE"
|
||||
|| e.target.id == rowId+"_PRICE1"
|
||||
|| e.target.id == rowId+"_PRICE2"
|
||||
|| e.target.id == rowId+"_PRICE3"
|
||||
|| e.target.id == rowId+"_PRICE4"
|
||||
|| e.target.id == rowId+"_TOTAL_ORDER_QTY"
|
||||
|| e.target.id == rowId+"_STOCK_QTY"
|
||||
|| e.target.id == rowId+"_REAL_ORDER_QTY"
|
||||
){
|
||||
//var v1 = Number( $g.find("#"+rowId+"_ORDER_QTY").val().replace(/,/gi,"") );
|
||||
if( e.target.id == rowId+"_ORDER_QTY"
|
||||
|| e.target.id == rowId+"_QTY"
|
||||
|| e.target.id == rowId+"_BOM_QTY"
|
||||
//|| e.target.id == rowId+"_STOCK_QTY"
|
||||
|| e.target.id == rowId+"_REAL_ORDER_QTY" //240501 입력으로 변경하려다 stop
|
||||
){
|
||||
//$g.find("#"+rowId+"_TOTAL_ORDER_QTY").val( numberWithCommas( v1*sameProjectCount ));
|
||||
//$g.jqGrid('setCell', rowId, "TOTAL_ORDER_QTY", numberWithCommas( v1*sameProjectCount ));
|
||||
$g.jqGrid('setCell', rowId, "TOTAL_ORDER_QTY", v1*sameProjectCount );
|
||||
}
|
||||
|
||||
//q1 = Number( $g.find("#"+rowId+"_TOTAL_ORDER_QTY").val().replace(/,/gi,"") );
|
||||
var q1 = Number( grid.jqGrid('getCell', rowId, "TOTAL_ORDER_QTY").replace(/,/gi,"") );
|
||||
//q2 = Number( $g.find("#"+rowId+"_STOCK_QTY").val().replace(/,/gi,"") );
|
||||
var q2 = Number( fnc_checkNullDefaultValue(fnc_checkNull($g.find("#"+rowId+"_STOCK_QTY").val()).replace(/,/gi,""), grid.jqGrid('getCell', rowId, "STOCK_QTY")).replace(/,/gi,"") );
|
||||
var q3 = Number( fnc_checkNullDefaultValue(fnc_checkNull($g.find("#"+rowId+"_REAL_ORDER_QTY").val()).replace(/,/gi,""), grid.jqGrid('getCell', rowId, "REAL_ORDER_QTY")).replace(/,/gi,"") );
|
||||
var STOCK_QTY = q2;
|
||||
|
||||
//q3 = Number( $g.find("#"+rowId+"_REAL_ORDER_QTY").val().replace(/,/gi,"") );
|
||||
var realQ = q1-q2;
|
||||
//var realQ = q3;
|
||||
var ORDER_QTY = v1 - (v1*(sameProjectCount-1) == 0 ? STOCK_QTY : (STOCK_QTY < v1*(sameProjectCount-1) ? 0 : STOCK_QTY - v1*(sameProjectCount-1)) );
|
||||
//$g.find("#"+rowId+"_REAL_ORDER_QTY").val( numberWithCommas( realQ ));
|
||||
//$g.jqGrid('setCell', rowId, "REAL_ORDER_QTY", numberWithCommas( realQ ));
|
||||
//alert(v1*sameProjectCount-q2);
|
||||
$g.jqGrid('setCell', rowId, "REAL_ORDER_QTY", v1*sameProjectCount-q2 );
|
||||
$g.jqGrid('setCell', rowId, "REAL_SUPPLY_PRICE", (v1*sameProjectCount-q2) * (v2+v3+v4+v5+v6));
|
||||
|
||||
//240904 comma처리 추가
|
||||
$g.find("#"+rowId+"_PARTNER_PRICE").val( numberWithCommas(v2));
|
||||
$g.find("#"+rowId+"_PRICE1").val( numberWithCommas(v3));
|
||||
$g.find("#"+rowId+"_PRICE2").val( numberWithCommas(v4));
|
||||
$g.find("#"+rowId+"_PRICE3").val( numberWithCommas(v5));
|
||||
$g.find("#"+rowId+"_PRICE4").val( numberWithCommas(v6));
|
||||
|
||||
//공급가 = 수량 *(공급단가+레이져단가+용접단가+가공단가)
|
||||
|
||||
$g.find("#"+rowId+"_SUPPLY_UNIT_PRICE").val( numberWithCommas(ORDER_QTY * (v2+v3+v4+v5+v6)));
|
||||
$g.find("#"+rowId+"_SUPPLY_UNIT_VAT_PRICE").val( numberWithCommas(ORDER_QTY * (v2+v3+v4+v5+v6) * 0.1));
|
||||
$g.find("#"+rowId+"_SUPPLY_UNIT_VAT_SUM_PRICE").val( numberWithCommas( Math.floor(ORDER_QTY * (v2+v3+v4+v5+v6) * 1.1) )); //.toFixed()
|
||||
|
||||
if( e.target.id == rowId+"_ORDER_QTY"
|
||||
//|| e.target.id == rowId+"_BOM_QTY"
|
||||
|| e.target.id == rowId+"_QTY"
|
||||
|| e.target.id == rowId+"_STOCK_QTY"
|
||||
|| e.target.id == rowId+"_REAL_ORDER_QTY"
|
||||
){
|
||||
if( e.target.id == rowId+"_STOCK_QTY"
|
||||
|| e.target.id == rowId+"_QTY"
|
||||
){
|
||||
if(<%=isModify%>){
|
||||
//$("#"+rowId+"_QTY").val(numberWithCommas( ORDER_QTY ));
|
||||
$("#"+rowId+"_ORDER_QTY").val(numberWithCommas( ORDER_QTY ));
|
||||
}else{
|
||||
//$g.jqGrid('setCell', rowId, "QTY", numberWithCommas( ORDER_QTY ));
|
||||
$g.jqGrid('setCell', rowId, "ORDER_QTY", numberWithCommas( ORDER_QTY ));
|
||||
}
|
||||
$g.jqGrid('setCell', rowId, "ORDER_QTY", numberWithCommas( ORDER_QTY ));
|
||||
}
|
||||
|
||||
if(v1 < 1){
|
||||
Swal.fire("실발주수량은 0보다 커야합니다."); $(e.target).select(); return;
|
||||
}else if(realQ < 1){
|
||||
Swal.fire("총실발주수량이 0보다 커야합니다."); $(e.target).select(); return;
|
||||
/*
|
||||
}else if(sameProjectCount > 1 && q1 - q2 < v1){
|
||||
Swal.fire("총 발주수량이 수량만큼은 확보되도록 재고수량을 입력해 주세요."); $(e.target).select(); return;
|
||||
*/
|
||||
}else if(q1<q2){
|
||||
Swal.fire("재고수량은 총발주수량보다 클 수 없습니다."); $(e.target).select(); return;
|
||||
}else{
|
||||
$(e.target).val(fnc_addComma(eVal.replace(/[^0-9]/g,"")));
|
||||
}
|
||||
}
|
||||
}
|
||||
// 공급가 셋팅
|
||||
$g.jqGrid('setCell', rowId, "SUPPLY_UNIT_PRICE", supplyPrice);
|
||||
|
||||
this.footerSummary();
|
||||
}
|
||||
@@ -1847,54 +1526,25 @@ var gridFn = {
|
||||
}
|
||||
}
|
||||
*/
|
||||
,footerSummary: function(){ //자동합계
|
||||
$("#TOTAL_SUPPLY_UNIT_PRICE, #TOTAL_PRICE, #NEGO_RATE").val("");
|
||||
,footerSummary: function(){ //자동합계: 공급가 합계
|
||||
var totalSupplyPrice = 0;
|
||||
|
||||
//footer1
|
||||
var colSum1 = 0; //세금포함공급가합계
|
||||
var colSum2 = 0; //공급가합계
|
||||
var colSum3 = 0; //실공급가합계
|
||||
var colSum4 = 0; //실공급가합계(세금포함)
|
||||
$.each($("#grid1").getDataIDs(), function(i,o){
|
||||
//console.log(i+" :: " + o);
|
||||
var rowId = o;
|
||||
var _v1 = $("#"+o+"_SUPPLY_UNIT_PRICE").val().replace(/,/gi,""); //공급가
|
||||
var _v2 = $("#"+o+"_SUPPLY_UNIT_VAT_PRICE").val().replace(/,/gi,""); //부가세
|
||||
var _v3 = $("#"+o+"_SUPPLY_UNIT_VAT_SUM_PRICE").val().replace(/,/gi,""); //부가세포함공급가
|
||||
var _v4 = grid.jqGrid('getCell', rowId, "REAL_SUPPLY_PRICE").replace(/,/gi,""); //실공급가
|
||||
//var q2 = Number( fnc_checkNullDefaultValue($g.find("#"+rowId+"_STOCK_QTY").val(), grid.jqGrid('getCell', rowId, "STOCK_QTY")).replace(/,/gi,"") );
|
||||
|
||||
if($.isNumeric(_v1)){
|
||||
colSum1 += Number( _v1 ) + Number( _v2 );
|
||||
colSum2 += Number( _v1 );
|
||||
colSum3 += Number( _v4 );
|
||||
//colSum4 += Number( _v4 ) + Math.floor(Number( _v4 )*0.1) ;
|
||||
$.each($("#grid1").jqGrid('getDataIDs'), function(i, rowId){
|
||||
var supplyPrice = grid.jqGrid('getCell', rowId, "SUPPLY_UNIT_PRICE");
|
||||
supplyPrice = fnc_checkNullDefaultValue(supplyPrice, "0").toString().replace(/,/g,"");
|
||||
if($.isNumeric(supplyPrice)){
|
||||
totalSupplyPrice += Number(supplyPrice);
|
||||
}
|
||||
});
|
||||
|
||||
colSum4 = Number( colSum3 ) + Math.round(Number( colSum3 )*0.1) ; //250110 위에서 아래로 변경
|
||||
$("#TOTAL_SUPPLY_UNIT_PRICE").val( numberWithCommas( Math.floor(colSum1)+"" ) ); //소계
|
||||
$("#TOTAL_SUPPLY_PRICE").val( numberWithCommas( colSum2+"" ) ); //소계(세금미포함)
|
||||
$("#TOTAL_REAL_SUPPLY_PRICE").val( numberWithCommas( Math.floor(colSum3)+"" ) ); //소계
|
||||
var totalWithVat = Math.floor(totalSupplyPrice * 1.1); // 부가세 포함
|
||||
|
||||
//footer2
|
||||
var vDC = fnc_checkcommmanumberDefaultValue($("#DISCOUNT_PRICE").val(),"0"); // 할인금액
|
||||
if(!$.isNumeric(vDC)){
|
||||
Swal.fire("숫자를 입력해주세요.");
|
||||
$("#DISCOUNT_PRICE").select();
|
||||
$("#DISCOUNT_PRICE").val("");
|
||||
return;
|
||||
}
|
||||
vDC = Number(vDC);
|
||||
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice));
|
||||
$("#TOTAL_SUPPLY_UNIT_PRICE").val(numberWithCommas(totalWithVat));
|
||||
$("#TOTAL_REAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice));
|
||||
|
||||
var vTP = Math.floor(colSum1 - vDC); //내림 (원래 TOTAL_PRICE_TXT 240502전)
|
||||
//alert(vTP);
|
||||
$("#TOTAL_PRICE").val(numberWithCommas( vTP )); //최종발주금액 : 소계-할인금액
|
||||
$("#TOTAL_PRICE_TXT").val( fnc_numToKr((colSum3)+"","일금 "," 원정") + " (₩ "+numberWithCommas( vTP )+")" );
|
||||
$("#TOTAL_PRICE_TXT_ALL").val( fnc_numToKr((colSum4)+"","일금 "," 원정") + " (₩ "+numberWithCommas( colSum4 )+")" );
|
||||
if(colSum1 != 0){
|
||||
$("#NEGO_RATE" ).val( ((1-((vTP)/colSum1))*100).toFixed(1) +"%" ); //Nego율 : 1-(최종금액/소계)
|
||||
}
|
||||
$("#TOTAL_PRICE_TXT").val(fnc_numToKr(totalSupplyPrice+"","일금 "," 원정") + " (₩ "+numberWithCommas(totalSupplyPrice)+")");
|
||||
$("#TOTAL_PRICE_TXT_ALL").val(fnc_numToKr(totalWithVat+"","일금 "," 원정") + " (₩ "+numberWithCommas(totalWithVat)+")");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2000,10 +1650,10 @@ function fn_price_save(){
|
||||
${code_map.project_no}
|
||||
</select>
|
||||
</td>
|
||||
<td colspan="">유닛명</td>
|
||||
<!-- <td colspan="">유닛명</td>
|
||||
<td colspan="2">
|
||||
<select name="UNIT_CODE" id="UNIT_CODE" required reqTitle="유닛명" type="select" class="select2" autocomplete="off" disabled></select>
|
||||
</td>
|
||||
</td> -->
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2" colspan="6" style="text-align:center; height: 65px;"><h1 style="font-size: 35px;">발 주 서<br/><p style="font-size:12px; border:none; width:100%;">(Purchase Order)</p></h1></td>
|
||||
@@ -2124,7 +1774,7 @@ function fn_price_save(){
|
||||
<td colspan="1"><input type="text" name="DELIVERY_DATE" id="DELIVERY_DATE" class="date_icon" required reqTitle="입고요청일" value="${info.DELIVERY_DATE }" readonly/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="input_title">발주서 No.</td>
|
||||
<!-- <td colspan="2" class="input_title">발주서 No.</td>
|
||||
<td colspan="1">
|
||||
<%if(isModify){ %>
|
||||
<select name="PURCHASE_ORDER_NO_ORG" id="PURCHASE_ORDER_NO_ORG" required reqTitle="발주서 No." type="select" class="select2" autocomplete="off" disabled style="width:100%;">
|
||||
@@ -2132,11 +1782,11 @@ function fn_price_save(){
|
||||
<%}else{ %>
|
||||
${info.PURCHASE_ORDER_NO_ORG_NO}
|
||||
<%}%>
|
||||
</td>
|
||||
<td colspan="1" class="input_title">제목</td>
|
||||
<td colspan="2"><input type="text" name="TITLE" id="TITLE" value="${info.TITLE }" required reqTitle="제목" readonly style="width:100%;"/></td>
|
||||
<td colspan="2" class="input_title">부가세포함 발주금액(원)</td>
|
||||
<td colspan="5"><input type="hidden" name="TOTAL_PRICE_TXT" id="TOTAL_PRICE_TXT" value="${info.TOTAL_PRICE_TXT }" readonly placeHolder="금액합계 자동계산"/>
|
||||
</td> -->
|
||||
<td colspan="2" class="input_title">제목</td>
|
||||
<td colspan="3"><input type="text" name="TITLE" id="TITLE" value="${info.TITLE }" required reqTitle="제목" readonly style="width:100%;"/></td>
|
||||
<td colspan="" class="input_title">부가세포함 발주금액(원)</td>
|
||||
<td colspan="6"><input type="hidden" name="TOTAL_PRICE_TXT" id="TOTAL_PRICE_TXT" value="${info.TOTAL_PRICE_TXT }" readonly placeHolder="금액합계 자동계산"/>
|
||||
<input type="text" name="TOTAL_PRICE_TXT_ALL" id="TOTAL_PRICE_TXT_ALL" value="${info.TOTAL_PRICE_TXT_ALL}" readonly placeHolder="금액합계 자동계산"/></td>
|
||||
|
||||
<%--
|
||||
@@ -2183,7 +1833,7 @@ function fn_price_save(){
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="expenseApplyPopupFormWrap1" style="margin-top:0px;position:relative;">
|
||||
<!-- <div id="expenseApplyPopupFormWrap1" style="margin-top:0px;position:relative;">
|
||||
<div style="width:50%;position: absolute;left:0"></div>
|
||||
<div style="width:48%;position: absolute;right:0">
|
||||
<table class="pmsPopupForm" style="with:200px !important;border:1px solid">
|
||||
@@ -2210,9 +1860,9 @@ function fn_price_save(){
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div id="expenseApplyPopupFormWrap1" style="margin-top:35px;position: ">
|
||||
<!-- <div id="expenseApplyPopupFormWrap1" style="margin-top:35px;position: ">
|
||||
<table class="pmsPopupForm">
|
||||
<colgroup>
|
||||
<col width="10%" />
|
||||
@@ -2298,7 +1948,7 @@ function fn_price_save(){
|
||||
<td colspan="12" style="text-align: right; color: #980000; font-weight:500;">★거래명세서 자동생성은 발주서 기준으로 입고수량 대비 정품수량 동일시 구매팀 확인후 발주서 기준으로 자동생성 된다.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div> -->
|
||||
</section>
|
||||
|
||||
<textarea style="width:0px; height:0px; visibility: hidden;" id="unit_cd">${code_map.unit_cd}</textarea><!-- 코드동적설정 -->
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -59,6 +59,12 @@ $(document).ready(function(){
|
||||
$("#btnExcel").click(function() {
|
||||
fn_excel();
|
||||
});
|
||||
|
||||
// 발주서 송부 버튼 클릭
|
||||
$("#btnSend").click(function(){
|
||||
fn_sendPurchaseOrder();
|
||||
});
|
||||
|
||||
//수주활동 복사 팝업
|
||||
$("#btnCopy").click(function(){
|
||||
var checkedObj = _tabulGrid.getSelectedData();
|
||||
@@ -72,10 +78,10 @@ $(document).ready(function(){
|
||||
fn_formPopUp(objId, "copy");
|
||||
}
|
||||
});
|
||||
$("#project_no").change(function(){
|
||||
//$("#project_no").change(function(){
|
||||
//fnc_productUPGNEWList(this.value,"","upg_no", "");
|
||||
fn_UnitCodeList(this.value, "unit_code", "");
|
||||
});
|
||||
// fn_UnitCodeList(this.value, "unit_code", "");
|
||||
//});
|
||||
|
||||
//결재상신
|
||||
$("#btnApproval").click(function(){
|
||||
@@ -324,10 +330,22 @@ var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', widthGrow:2, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'공급업체', field:'PARTNER_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_PRICE_ALL',
|
||||
{headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_SUPPLY_PRICE',
|
||||
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'메일발송', field:'MAIL_SEND_YN'},
|
||||
// {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_PRICE_ALL',
|
||||
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
|
||||
// },
|
||||
{headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'메일발송', field:'MAIL_SEND_YN',
|
||||
formatter: function(cell, formatterParams, onRendered){
|
||||
var value = fnc_checkNull(cell.getValue());
|
||||
if(value === 'Y'){
|
||||
return '<span style="color:green;">발송완료</span>';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'발주일', field:'REGDATE'}
|
||||
];
|
||||
|
||||
@@ -696,6 +714,71 @@ function col_custom_fmt_un(cellvalue, options, cell) {
|
||||
return cellvalue;
|
||||
}
|
||||
|
||||
// 발주서 송부 (메일 발송 팝업)
|
||||
function fn_sendPurchaseOrder(){
|
||||
var selectedData = _tabulGrid.getSelectedData();
|
||||
|
||||
if(selectedData.length < 1){
|
||||
Swal.fire("발주서를 송부할 행을 선택해주세요.");
|
||||
return false;
|
||||
} else if(selectedData.length > 1){
|
||||
Swal.fire("한번에 한 개의 발주서만 발송 가능합니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var status = fnc_checkNull(selectedData[0].STATUS);
|
||||
var objId = fnc_checkNull(selectedData[0].OBJID);
|
||||
var MULTI_YN = fnc_checkNull(selectedData[0].MULTI_YN);
|
||||
var MULTI_MASTER_YN = fnc_checkNull(selectedData[0].MULTI_MASTER_YN);
|
||||
var mailSendYn = fnc_checkNull(selectedData[0].MAIL_SEND_YN);
|
||||
|
||||
// 취소 상태 확인
|
||||
if(status === "cancel"){
|
||||
Swal.fire("취소된 발주서는 발송할 수 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 동시발주 하위건 확인
|
||||
if(MULTI_YN === 'Y' && MULTI_MASTER_YN !== 'Y'){
|
||||
Swal.fire("동시발주 하위건은 마스터건으로 발송해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 이미 발송된 경우 재발송 확인
|
||||
if(mailSendYn === 'Y'){
|
||||
Swal.fire({
|
||||
title: '이미 발송된 발주서입니다.',
|
||||
text: '다시 발송하시겠습니까?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '재발송',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
fn_openMailFormPopup(objId);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
// 메일 발송 팝업 열기
|
||||
fn_openMailFormPopup(objId);
|
||||
}
|
||||
|
||||
// 발주서 메일 발송 팝업 열기
|
||||
function fn_openMailFormPopup(purchaseOrderObjId){
|
||||
if(!purchaseOrderObjId || purchaseOrderObjId === ''){
|
||||
Swal.fire("잘못된 요청입니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var popup_width = 900;
|
||||
var popup_height = 750;
|
||||
var url = "/purchaseOrder/purchaseOrderMailFormPopup.do?purchaseOrderObjId=" + purchaseOrderObjId;
|
||||
|
||||
window.open(url, "purchaseOrderMailForm", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
</script>
|
||||
<body class="<%--bodyNoScrollX--%>">
|
||||
<form name="hiddenForm" id="hiddenForm" method="post">
|
||||
@@ -749,11 +832,11 @@ function col_custom_fmt_un(cellvalue, options, cell) {
|
||||
<td><label for="">프로젝트번호</label></td>
|
||||
<td><select name="project_no" id="project_no" class="select2" autocomplete="off" style="width:190px;" multiple="multiple"><option value="">선택</option>${code_map.project_no}</select></td>
|
||||
|
||||
<td><label for="unit_code">유닛명</label></td>
|
||||
<!-- <td><label for="unit_code">유닛명</label></td>
|
||||
<td>
|
||||
<select name="unit_code" id="unit_code" style="" class="select2" autocomplete="off" type="select" reqTitle="유닛명">
|
||||
</select>
|
||||
</td>
|
||||
</td> -->
|
||||
|
||||
<td><label for="">발주No.</label></td>
|
||||
<td><input type="text" name="purchase_order_no" id="purchase_order_no" autocomplete="off" value="${param.purchase_order_no}" style=""/></td>
|
||||
|
||||
@@ -0,0 +1,539 @@
|
||||
<%@ 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();
|
||||
String purchaseOrderObjId = request.getParameter("purchaseOrderObjId");
|
||||
%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>발주서 메일 발송</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 10px;
|
||||
background-color: #f5f5f5;
|
||||
font-size: 13px;
|
||||
}
|
||||
.mail-form-container {
|
||||
background: white;
|
||||
padding: 15px 20px;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 1px 5px rgba(0,0,0,0.1);
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.form-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 15px;
|
||||
color: #333;
|
||||
border-bottom: 2px solid #3085d6;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
.form-group {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.form-group label {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
color: #555;
|
||||
font-size: 13px;
|
||||
}
|
||||
.form-group label.required:after {
|
||||
content: " *";
|
||||
color: red;
|
||||
}
|
||||
.form-group input[type="text"],
|
||||
.form-group input[type="email"],
|
||||
.form-group textarea {
|
||||
width: 100%;
|
||||
padding: 6px 8px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.form-group textarea {
|
||||
min-height: 120px;
|
||||
resize: vertical;
|
||||
}
|
||||
.manager-list {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
padding: 8px;
|
||||
background-color: #fafafa;
|
||||
max-height: 150px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.manager-item {
|
||||
padding: 5px;
|
||||
margin-bottom: 3px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 13px;
|
||||
}
|
||||
.manager-item input[type="checkbox"] {
|
||||
margin-right: 8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.manager-item label {
|
||||
cursor: pointer;
|
||||
margin: 0;
|
||||
flex: 1;
|
||||
font-size: 13px;
|
||||
}
|
||||
.no-managers {
|
||||
color: #999;
|
||||
text-align: center;
|
||||
padding: 12px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.button-group {
|
||||
text-align: center;
|
||||
margin-top: 15px;
|
||||
padding-top: 15px;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
.btn {
|
||||
padding: 8px 20px;
|
||||
margin: 0 4px;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.btn-primary {
|
||||
background-color: #3085d6;
|
||||
color: white;
|
||||
}
|
||||
.btn-primary:hover {
|
||||
background-color: #2874c5;
|
||||
}
|
||||
.btn-secondary {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
.btn-secondary:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
.info-text {
|
||||
font-size: 11px;
|
||||
color: #666;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.attachment-status {
|
||||
padding: 8px 10px;
|
||||
background-color: #e7f3ff;
|
||||
border-left: 3px solid #3085d6;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.attachment-status i {
|
||||
color: #3085d6;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.order-info {
|
||||
background-color: #f8f9fa;
|
||||
border: 1px solid #e9ecef;
|
||||
border-radius: 3px;
|
||||
padding: 10px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.order-info-row {
|
||||
display: flex;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.order-info-row:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.order-info-label {
|
||||
width: 100px;
|
||||
font-weight: bold;
|
||||
color: #555;
|
||||
}
|
||||
.order-info-value {
|
||||
flex: 1;
|
||||
color: #333;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="mail-form-container">
|
||||
<div class="form-title">발주서 메일 발송</div>
|
||||
|
||||
<!-- 발주서 정보 표시 -->
|
||||
<div class="order-info" id="orderInfoArea">
|
||||
<div class="order-info-row">
|
||||
<span class="order-info-label">발주번호:</span>
|
||||
<span class="order-info-value" id="displayPoNo">-</span>
|
||||
</div>
|
||||
<div class="order-info-row">
|
||||
<span class="order-info-label">공급업체:</span>
|
||||
<span class="order-info-value" id="displayPartnerName">-</span>
|
||||
</div>
|
||||
<div class="order-info-row">
|
||||
<span class="order-info-label">프로젝트:</span>
|
||||
<span class="order-info-value" id="displayProjectNo">-</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="attachment-status">
|
||||
<i class="fa fa-file-excel-o"></i>
|
||||
<strong>첨부파일:</strong> 발주서 및 도면 파일이 자동으로 첨부됩니다.
|
||||
</div>
|
||||
|
||||
<form id="mailForm">
|
||||
<input type="hidden" id="purchaseOrderObjId" name="purchaseOrderObjId" value="<%=purchaseOrderObjId%>"/>
|
||||
|
||||
<!-- 공급업체 담당자 선택 -->
|
||||
<div class="form-group">
|
||||
<label>공급업체 담당자 선택</label>
|
||||
<div id="managerListContainer" class="manager-list">
|
||||
<div class="no-managers">담당자 정보를 불러오는 중...</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 수신인 이메일 -->
|
||||
<div class="form-group">
|
||||
<label for="toEmails" class="required">수신인 (To)</label>
|
||||
<input type="text" id="toEmails" name="toEmails" placeholder="이메일 주소를 입력하세요 (여러 개는 쉼표로 구분)"/>
|
||||
<div class="info-text">예: email1@example.com, email2@example.com</div>
|
||||
</div>
|
||||
|
||||
<!-- 참조 이메일 -->
|
||||
<div class="form-group">
|
||||
<label for="ccEmails">참조 (CC)</label>
|
||||
<input type="text" id="ccEmails" name="ccEmails" placeholder="참조 이메일 주소 (선택사항)"/>
|
||||
<div class="info-text">발주 담당자 이메일이 자동으로 참조에 추가됩니다.</div>
|
||||
</div>
|
||||
|
||||
<!-- 메일 제목 -->
|
||||
<div class="form-group">
|
||||
<label for="subject" class="required">제목</label>
|
||||
<input type="text" id="subject" name="subject" placeholder="메일 제목을 입력하세요"/>
|
||||
</div>
|
||||
|
||||
<!-- 메일 내용 -->
|
||||
<div class="form-group">
|
||||
<label for="contents" class="required">내용</label>
|
||||
<textarea id="contents" name="contents" placeholder="메일 내용을 입력하세요"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- 버튼 -->
|
||||
<div class="button-group">
|
||||
<button type="button" class="btn btn-primary" onclick="fn_sendMail()">발송</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="window.close()">취소</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var purchaseOrderInfo = null;
|
||||
var managerList = [];
|
||||
|
||||
$(document).ready(function(){
|
||||
// 발주서 정보 및 담당자 목록 로드
|
||||
fn_loadPurchaseOrderInfo();
|
||||
});
|
||||
|
||||
// 발주서 정보 로드
|
||||
function fn_loadPurchaseOrderInfo(){
|
||||
var purchaseOrderObjId = $("#purchaseOrderObjId").val();
|
||||
|
||||
$.ajax({
|
||||
url: "/purchaseOrder/getPurchaseOrderInfoForMail.do",
|
||||
type: "POST",
|
||||
data: { objId: purchaseOrderObjId },
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.result === "success" && data.purchaseOrderInfo){
|
||||
purchaseOrderInfo = data.purchaseOrderInfo;
|
||||
|
||||
// 발주서 정보 표시
|
||||
$("#displayPoNo").text(fnc_checkNull(purchaseOrderInfo.PURCHASE_ORDER_NO) || '-');
|
||||
$("#displayPartnerName").text(fnc_checkNull(purchaseOrderInfo.PARTNER_NAME) || '-');
|
||||
$("#displayProjectNo").text(fnc_checkNull(purchaseOrderInfo.PROJECT_NO) || '-');
|
||||
|
||||
// 메일 제목 자동 생성
|
||||
var poNo = fnc_checkNull(purchaseOrderInfo.PURCHASE_ORDER_NO);
|
||||
var poTitle = fnc_checkNull(purchaseOrderInfo.TITLE);
|
||||
$("#subject").val(poNo + " " + poTitle);
|
||||
|
||||
// 참조에 발주담당자 이메일 자동 추가
|
||||
var salesMngEmail = fnc_checkNull(purchaseOrderInfo.SALES_MNG_USER_EMAIL);
|
||||
if(salesMngEmail !== ""){
|
||||
$("#ccEmails").val(salesMngEmail);
|
||||
}
|
||||
|
||||
// 메일 내용 템플릿 생성
|
||||
fn_generateMailTemplate();
|
||||
|
||||
// 공급업체 담당자 목록 로드
|
||||
var partnerObjId = fnc_checkNull(purchaseOrderInfo.PARTNER_OBJID);
|
||||
if(partnerObjId !== ""){
|
||||
fn_loadPartnerManagers(partnerObjId);
|
||||
} else {
|
||||
$("#managerListContainer").html('<div class="no-managers">공급업체 정보가 없습니다.</div>');
|
||||
}
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '발주서 정보를 불러올 수 없습니다.',
|
||||
icon: 'error'
|
||||
}).then(() => {
|
||||
window.close();
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '발주서 정보 조회 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
}).then(() => {
|
||||
window.close();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 공급업체 담당자 목록 로드
|
||||
function fn_loadPartnerManagers(partnerObjId){
|
||||
$.ajax({
|
||||
url: "/purchaseOrder/getPartnerManagerList.do",
|
||||
type: "POST",
|
||||
data: { partnerObjId: partnerObjId },
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.result === "success" && data.managers && data.managers.length > 0){
|
||||
managerList = data.managers;
|
||||
fn_renderManagerList();
|
||||
} else {
|
||||
// 공급업체의 대표 이메일 표시
|
||||
var supplyEmail = fnc_checkNull(purchaseOrderInfo.SUPPLY_USER_EMAIL);
|
||||
var supplyUserName = fnc_checkNull(purchaseOrderInfo.SUPPLY_USER_NAME);
|
||||
|
||||
if(supplyEmail !== ""){
|
||||
var html = '<div class="manager-item">';
|
||||
html += '<input type="checkbox" id="manager_default" data-email="' + supplyEmail + '" onchange="fn_updateRecipients()" checked>';
|
||||
html += '<label for="manager_default">' + (supplyUserName || '담당자') + ' (' + supplyEmail + ')</label>';
|
||||
html += '</div>';
|
||||
$("#managerListContainer").html(html);
|
||||
fn_updateRecipients();
|
||||
} else {
|
||||
$("#managerListContainer").html('<div class="no-managers">등록된 담당자가 없습니다. 수신인을 직접 입력해주세요.</div>');
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
$("#managerListContainer").html('<div class="no-managers">담당자 정보를 불러올 수 없습니다. 수신인을 직접 입력해주세요.</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 담당자 목록 렌더링
|
||||
function fn_renderManagerList(){
|
||||
var html = '';
|
||||
|
||||
for(var i = 0; i < managerList.length; i++){
|
||||
var manager = managerList[i];
|
||||
var name = fnc_checkNull(manager.name || manager.NAME);
|
||||
var email = fnc_checkNull(manager.email || manager.EMAIL);
|
||||
|
||||
if(name !== ""){
|
||||
html += '<div class="manager-item">';
|
||||
html += '<input type="checkbox" id="manager_' + i + '" data-email="' + email + '" onchange="fn_updateRecipients()">';
|
||||
html += '<label for="manager_' + i + '">' + name;
|
||||
if(email !== ""){
|
||||
html += ' (' + email + ')';
|
||||
}
|
||||
html += '</label>';
|
||||
html += '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
if(html === ''){
|
||||
// 공급업체의 대표 이메일 표시
|
||||
var supplyEmail = fnc_checkNull(purchaseOrderInfo.SUPPLY_USER_EMAIL);
|
||||
var supplyUserName = fnc_checkNull(purchaseOrderInfo.SUPPLY_USER_NAME);
|
||||
|
||||
if(supplyEmail !== ""){
|
||||
html = '<div class="manager-item">';
|
||||
html += '<input type="checkbox" id="manager_default" data-email="' + supplyEmail + '" onchange="fn_updateRecipients()" checked>';
|
||||
html += '<label for="manager_default">' + (supplyUserName || '담당자') + ' (' + supplyEmail + ')</label>';
|
||||
html += '</div>';
|
||||
} else {
|
||||
html = '<div class="no-managers">등록된 담당자가 없습니다. 수신인을 직접 입력해주세요.</div>';
|
||||
}
|
||||
}
|
||||
|
||||
$("#managerListContainer").html(html);
|
||||
|
||||
// 기본 담당자가 있으면 자동 선택
|
||||
if($("#manager_default").length > 0){
|
||||
fn_updateRecipients();
|
||||
}
|
||||
}
|
||||
|
||||
// 담당자 선택 시 수신인 필드 업데이트
|
||||
function fn_updateRecipients(){
|
||||
var selectedEmails = [];
|
||||
|
||||
$("input[type='checkbox'][id^='manager_']:checked").each(function(){
|
||||
var email = $(this).attr("data-email");
|
||||
if(email && email !== ""){
|
||||
selectedEmails.push(email);
|
||||
}
|
||||
});
|
||||
|
||||
$("#toEmails").val(selectedEmails.join(", "));
|
||||
}
|
||||
|
||||
// 메일 내용 템플릿 생성
|
||||
function fn_generateMailTemplate(){
|
||||
var partnerName = fnc_checkNull(purchaseOrderInfo.PARTNER_NAME);
|
||||
var poNo = fnc_checkNull(purchaseOrderInfo.PURCHASE_ORDER_NO);
|
||||
var projectNo = fnc_checkNull(purchaseOrderInfo.PROJECT_NO);
|
||||
var deliveryDate = fnc_checkNull(purchaseOrderInfo.DELIVERY_DATE);
|
||||
|
||||
var template = "안녕하세요.\n\n";
|
||||
template += partnerName + " 귀하\n\n";
|
||||
template += "발주서를 첨부파일로 송부드립니다.\n\n";
|
||||
template += "발주번호: " + poNo + "\n";
|
||||
if(projectNo !== ""){
|
||||
template += "프로젝트: " + projectNo + "\n";
|
||||
}
|
||||
if(deliveryDate !== ""){
|
||||
template += "입고요청일: " + deliveryDate + "\n";
|
||||
}
|
||||
template += "\n첨부된 발주서를 확인하시고, 납기 준수 부탁드립니다.\n\n";
|
||||
template += "문의사항이 있으시면 연락 주시기 바랍니다.\n\n";
|
||||
template += "감사합니다.\n";
|
||||
|
||||
$("#contents").val(template);
|
||||
}
|
||||
|
||||
// 메일 발송
|
||||
function fn_sendMail(){
|
||||
// 입력값 검증
|
||||
var toEmails = $("#toEmails").val().trim();
|
||||
var subject = $("#subject").val().trim();
|
||||
var contents = $("#contents").val().trim();
|
||||
|
||||
if(toEmails === ""){
|
||||
Swal.fire("수신인을 입력해주세요.");
|
||||
$("#toEmails").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
// 이메일 형식 검증
|
||||
var emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
var emails = toEmails.split(",").map(function(e){ return e.trim(); });
|
||||
for(var i = 0; i < emails.length; i++){
|
||||
if(!emailPattern.test(emails[i])){
|
||||
Swal.fire("올바른 이메일 형식이 아닙니다: " + emails[i]);
|
||||
$("#toEmails").focus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(subject === ""){
|
||||
Swal.fire("제목을 입력해주세요.");
|
||||
$("#subject").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
if(contents === ""){
|
||||
Swal.fire("내용을 입력해주세요.");
|
||||
$("#contents").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
// 발송 확인
|
||||
Swal.fire({
|
||||
title: '메일 발송',
|
||||
text: "발주서를 발송하시겠습니까?",
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '발송',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
fn_submitMailForm();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 메일 발송 요청
|
||||
function fn_submitMailForm(){
|
||||
Swal.fire({
|
||||
title: '발송 중...',
|
||||
text: '발주서 메일을 발송하고 있습니다.',
|
||||
allowOutsideClick: false,
|
||||
onOpen: () => {
|
||||
Swal.showLoading();
|
||||
}
|
||||
});
|
||||
|
||||
var formData = {
|
||||
objId: $("#purchaseOrderObjId").val(),
|
||||
toEmails: $("#toEmails").val(),
|
||||
ccEmails: $("#ccEmails").val(),
|
||||
subject: $("#subject").val(),
|
||||
contents: $("#contents").val()
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url: "/purchaseOrder/sendPurchaseOrderMail.do",
|
||||
type: "POST",
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
timeout: 120000, // 2분 타임아웃 (파일 첨부 시간 고려)
|
||||
success: function(data){
|
||||
Swal.close();
|
||||
if(data.result === "success"){
|
||||
Swal.fire({
|
||||
title: '발송 완료',
|
||||
text: '발주서가 성공적으로 발송되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
// 부모 창 새로고침
|
||||
if(window.opener && typeof window.opener.fn_search === 'function'){
|
||||
window.opener.fn_search();
|
||||
}
|
||||
window.close();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '발송 실패',
|
||||
text: data.message || '메일 발송 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
Swal.close();
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '메일 발송 중 시스템 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -247,7 +247,7 @@ function _fnc_datepick(){
|
||||
<td>
|
||||
<select name="SEARCH_STATUS" id="SEARCH_STATUS" class="select2" style="width:130px;">
|
||||
<option value="">전체</option>
|
||||
<option value="create">미결재</option>
|
||||
<option value="create">작성중</option>
|
||||
<option value="inProcess">결재중</option>
|
||||
<option value="approvalComplete">결재완료</option>
|
||||
<option value="reject">반려</option>
|
||||
@@ -255,8 +255,8 @@ function _fnc_datepick(){
|
||||
</td>
|
||||
<td class="align_r"><label>작성일</label></td>
|
||||
<td>
|
||||
<input type="text" name="regdate_start" id="regdate_start" style="width:90px;" autocomplete="off" value="${param.regdate_start}" class="date_icon">~
|
||||
<input type="text" name="regdate_end" id="regdate_end" style="width:90px;" autocomplete="off" value="${param.regdate_end}" class="date_icon">
|
||||
<input type="text" name="regdate_start" id="regdate_start" style="width:110px;" autocomplete="off" value="${param.regdate_start}" class="date_icon">~
|
||||
<input type="text" name="regdate_end" id="regdate_end" style="width:110px;" autocomplete="off" value="${param.regdate_end}" class="date_icon">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -324,12 +324,12 @@ function fn_initGrid() {
|
||||
title: '표면처리',
|
||||
field: 'SURFACE_TREATMENT'
|
||||
},
|
||||
// 14. 공급업체
|
||||
// 14. 메이커
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'left',
|
||||
width: 150,
|
||||
title: '공급업체',
|
||||
title: '메이커',
|
||||
field: 'VENDOR'
|
||||
},
|
||||
// 15. 범주 이름
|
||||
|
||||
@@ -164,7 +164,9 @@ var columns = [
|
||||
{title:'PURCHASE_ORDER_MASTER_OBJID', field:'PURCHASE_ORDER_MASTER_OBJID' ,visible: false},
|
||||
{title:'APPROVAL_OBJID' , field:'APPROVAL_OBJID' ,visible:false},
|
||||
{title:'ROUTE_OBJID' , field:'ROUTE_OBJID' ,visible:false},
|
||||
{title:'MBOM_HEADER_OBJID' , field:'MBOM_HEADER_OBJID' ,visible:false}
|
||||
{title:'MBOM_HEADER_OBJID' , field:'MBOM_HEADER_OBJID' ,visible:false},
|
||||
{title:'DOC_TYPE' , field:'DOC_TYPE' ,visible:false},
|
||||
{title:'HAS_PURCHASE_REQUEST' , field:'HAS_PURCHASE_REQUEST' ,visible:false}
|
||||
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청번호", field :"REQUEST_MNG_NO" , widthGrow:1.3,
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
@@ -173,31 +175,42 @@ var columns = [
|
||||
}
|
||||
}
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매유형", field :"PURCHASE_TYPE_NAME" , widthGrow:1.1 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "프로젝트번호", field :"PROJECT_NUMBER" , widthGrow:1.4 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "프로젝트번호", field :"PROJECT_NUMBER" , widthGrow:1.4,
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
var orderNo = fnc_checkNull(cell.getData().PROJECT_NUMBER);
|
||||
// 프로젝트 번호가 없으면 팝업 열지 않음
|
||||
if(orderNo == '' || orderNo == null) {
|
||||
return;
|
||||
}
|
||||
// 프로젝트 번호 클릭 시: 결재 정보 조회 모드 (saleNo에 "detail" 전달)
|
||||
fn_openSaleRegPopup(orderNo, "detail");
|
||||
}
|
||||
}
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "주문유형", field :"ORDER_TYPE_NAME" , widthGrow:1.1 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "제품구분", field :"PRODUCT_NAME_FULL" , widthGrow:1.1}
|
||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "고객사", field :"CUSTOMER_NAME" , widthGrow:1.5 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4}
|
||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1,
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1,
|
||||
formatter: function(cell, formatterParams, onRendered){
|
||||
// 구매요청서 작성 여부: PART_NO가 있으면 품목이 저장된 것 (구매요청서 작성됨)
|
||||
// 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨
|
||||
var data = cell.getData();
|
||||
var partNo = fnc_checkNull(data.PART_NO);
|
||||
var iconClass = (partNo != '' && partNo != null) ? 'file_icon' : 'file_empty_icon';
|
||||
var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||
var iconClass = (hasPurchaseRequest == 'Y') ? 'file_icon' : 'file_empty_icon';
|
||||
return '<a href="#" class="File ' + iconClass + '" style="width:20px; height:20px; display:inline-block;"></a>';
|
||||
},
|
||||
cellClick : function(e, cell) {
|
||||
var data = cell.getData();
|
||||
var partNo = fnc_checkNull(data.PART_NO);
|
||||
var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||
|
||||
// 구매요청서가 작성된 경우(파란색 아이콘)만 팝업 열기
|
||||
if(partNo != '' && partNo != null) {
|
||||
if(hasPurchaseRequest == 'Y') {
|
||||
fn_openSalesRequestFormPopUp(data.OBJID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "입고요청일", field :"DELIVERY_REQUEST_DATE" , widthGrow:1.1 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "작성일", field :"REGDATE_TITLE" , widthGrow:1.1 }
|
||||
@@ -416,6 +429,14 @@ function fn_salesMngBOMOpenPopUp(bom_report_objid){
|
||||
window.open("/salesMng/salesRequestDetailPopUp.do?"+param, "_strListPopup", "width=1200, height=800, toolbar=no, status=no, menubar=no, location=no, scrollbars=yes, resizable=yes");
|
||||
}
|
||||
|
||||
function fn_openSaleRegPopup(orderNo, saleNo){
|
||||
var popup_width = 1000;
|
||||
var popup_height = 550;
|
||||
// 한글 프로젝트 번호 인코딩 처리
|
||||
var url = "/salesMgmt/salesRegForm.do?orderNo=" + encodeURIComponent(orderNo) + "&saleNo=" + (saleNo ? encodeURIComponent(saleNo) : "");
|
||||
fn_centerPopup(popup_width, popup_height, url);
|
||||
}
|
||||
|
||||
function _fnc_datepick(){
|
||||
var $dateinput = $("input.date_icon");
|
||||
for(var i=0; i<$dateinput.length; i++){
|
||||
@@ -640,14 +661,14 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
||||
<label for="" class="">품번</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="SEARCH_PART_NO" id="SEARCH_PART_NO" value="${param.SEARCH_PART_NO}" style="width:150px;"/>
|
||||
<input type="text" name="SEARCH_PART_NO" id="SEARCH_PART_NO" value="${param.SEARCH_PART_NO}" style="width:200px;"/>
|
||||
</td>
|
||||
<%-- 품명 활성화 --%>
|
||||
<td class="align_r">
|
||||
<label for="" class="">품명</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="SEARCH_PART_NAME" id="SEARCH_PART_NAME" value="${param.SEARCH_PART_NAME}" style="width:150px;"/>
|
||||
<input type="text" name="SEARCH_PART_NAME" id="SEARCH_PART_NAME" value="${param.SEARCH_PART_NAME}" style="width:200px;"/>
|
||||
</td>
|
||||
<%-- 상태 주석처리
|
||||
<td class="align_r">
|
||||
@@ -662,11 +683,11 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
||||
</select>
|
||||
</td>
|
||||
--%>
|
||||
<%-- <td><select name="act_status" id="act_status" class="select2" autocomplete="off" style="width:120px;"><option value="">선택</option>${code_map.act_status}</select></td> --%>
|
||||
<%-- <td><select name="act_status" id="act_status" class="select2" autocomplete="off" style="width:170px;"><option value="">선택</option>${code_map.act_status}</select></td> --%>
|
||||
|
||||
<%-- 접수자 주석처리
|
||||
<td><label for="">접수자</label></td>
|
||||
<td><select name="receipt_writer" id="receipt_writer" class="select2" autocomplete="off" style="width:120px;"><option value="">선택</option>${code_map.receipt_writer}</select></td>
|
||||
<td><select name="receipt_writer" id="receipt_writer" class="select2" autocomplete="off" style="width:170px;"><option value="">선택</option>${code_map.receipt_writer}</select></td>
|
||||
|
||||
<td class="align_r"><label>접수일</label></td>
|
||||
<td>
|
||||
@@ -677,8 +698,8 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
||||
<%-- 작성일 활성화 --%>
|
||||
<td class="align_r"><label>작성일</label></td>
|
||||
<td>
|
||||
<input type="text" name="regdate_start" id="regdate_start" style="width:90px;" autocomplete="off" value="${param.regdate_start}" class="date_icon">~
|
||||
<input type="text" name="regdate_end" id="regdate_end" style="width:90px;" autocomplete="off" value="${param.regdate_end}" class="date_icon">
|
||||
<input type="text" name="regdate_start" id="regdate_start" style="width:120px;" autocomplete="off" value="${param.regdate_start}" class="date_icon">~
|
||||
<input type="text" name="regdate_end" id="regdate_end" style="width:120px;" autocomplete="off" value="${param.regdate_end}" class="date_icon">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -1644,4 +1644,135 @@ public class PurchaseOrderController {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 발주서 메일 발송 팝업
|
||||
* @param request
|
||||
* @param paramMap - purchaseOrderObjId
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/purchaseOrder/purchaseOrderMailFormPopup.do")
|
||||
public String purchaseOrderMailFormPopup(HttpServletRequest request, @RequestParam Map paramMap){
|
||||
return "/purchaseOrder/purchaseOrderMailFormPopup";
|
||||
}
|
||||
|
||||
/**
|
||||
* 발주서 정보 조회 (메일 발송용) (AJAX)
|
||||
* @param request
|
||||
* @param paramMap - objId (PURCHASE_ORDER_MASTER_OBJID)
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/purchaseOrder/getPurchaseOrderInfoForMail.do")
|
||||
public Map getPurchaseOrderInfoForMail(HttpServletRequest request, @RequestParam Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
|
||||
try {
|
||||
String objId = CommonUtils.checkNull(paramMap.get("objId"));
|
||||
|
||||
if("".equals(objId)){
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "잘못된 요청입니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
paramMap.put("PURCHASE_ORDER_MASTER_OBJID", objId);
|
||||
Map purchaseOrderInfo = purchaseOrderService.getPurchaseOrderMasterInfo(request, paramMap);
|
||||
|
||||
if(purchaseOrderInfo != null){
|
||||
// 키를 대문자로 변환
|
||||
purchaseOrderInfo = CommonUtils.toUpperCaseMapKey(purchaseOrderInfo);
|
||||
resultMap.put("result", "success");
|
||||
resultMap.put("purchaseOrderInfo", purchaseOrderInfo);
|
||||
} else {
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "발주서 정보를 찾을 수 없습니다.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "발주서 정보 조회 중 오류가 발생했습니다.");
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공급업체 담당자 목록 조회 (AJAX)
|
||||
* @param request
|
||||
* @param paramMap - partnerObjId
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/purchaseOrder/getPartnerManagerList.do")
|
||||
public Map getPartnerManagerList(HttpServletRequest request, @RequestParam Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
|
||||
try {
|
||||
String partnerObjId = CommonUtils.checkNull(paramMap.get("partnerObjId"));
|
||||
|
||||
if("".equals(partnerObjId)){
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "공급업체 정보가 없습니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// 공급업체 담당자 목록 조회
|
||||
paramMap.put("SUPPLY_OBJID", partnerObjId);
|
||||
List managerList = commonService.selectList("admin.getSupplyManagerList", request, paramMap);
|
||||
|
||||
if(managerList != null && managerList.size() > 0){
|
||||
// 키를 대문자로 변환
|
||||
managerList = CommonUtils.keyChangeUpperList(managerList);
|
||||
resultMap.put("result", "success");
|
||||
resultMap.put("managers", managerList);
|
||||
} else {
|
||||
resultMap.put("result", "success");
|
||||
resultMap.put("managers", new ArrayList());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "담당자 목록 조회 중 오류가 발생했습니다.");
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 발주서 메일 발송 (AJAX)
|
||||
* @param session
|
||||
* @param request
|
||||
* @param paramMap - objId, toEmails, ccEmails, subject, contents
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/purchaseOrder/sendPurchaseOrderMail.do")
|
||||
public Map sendPurchaseOrderMail(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
|
||||
try {
|
||||
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
||||
paramMap.put("WRITER", CommonUtils.checkNull(person.getUserId()));
|
||||
paramMap.put("WRITER_EMAIL", CommonUtils.checkNull(person.getEmail()));
|
||||
|
||||
String objId = CommonUtils.checkNull(paramMap.get("objId"));
|
||||
|
||||
if("".equals(objId)){
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "잘못된 요청입니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// 메일 발송 서비스 호출
|
||||
resultMap = purchaseOrderService.sendPurchaseOrderMailManual(request, paramMap);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage());
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9366,4 +9366,17 @@ SELECT
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 공급업체 담당자 목록 조회 (발주서 메일 발송용) -->
|
||||
<select id="getSupplyManagerList" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
SCM.OBJID,
|
||||
SCM.CHARGER_NAME AS NAME,
|
||||
SCM.EMAIL,
|
||||
SCM.PHONE,
|
||||
SCM.TEL
|
||||
FROM SUPPLY_CHARGER_MNG SCM
|
||||
WHERE SCM.SUPPLY_OBJID = #{SUPPLY_OBJID}
|
||||
ORDER BY SCM.REGDATE DESC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -3078,6 +3078,8 @@ SELECT POM.OBJID
|
||||
,POM.MULTI_MASTER_OBJID
|
||||
,CASE WHEN POM.MULTI_MASTER_YN = 'Y' THEN '' ELSE POM.MULTI_YN END MULTI_YN_MAKED
|
||||
|
||||
,POM.MAIL_SEND_YN
|
||||
,POM.MAIL_SEND_DATE
|
||||
,POM.STATUS
|
||||
,A.APPR_STATUS
|
||||
,CASE WHEN POM.STATUS = 'cancel' then '취소'
|
||||
@@ -5862,4 +5864,13 @@ FROM(
|
||||
AND P.PART_OBJID = #{objId}
|
||||
</select>
|
||||
|
||||
<!-- 발주서 메일 발송 상태 업데이트 -->
|
||||
<update id="updateMailSendStatus" parameterType="map">
|
||||
UPDATE PURCHASE_ORDER_MASTER
|
||||
SET
|
||||
MAIL_SEND_YN = #{MAIL_SEND_YN}
|
||||
,MAIL_SEND_DATE = #{MAIL_SEND_DATE}
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -961,17 +961,31 @@ VALUES
|
||||
SRM.REQUEST_CD,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_CD) AS REQUEST_CD_NAME,
|
||||
|
||||
-- 구매요청서 작성 여부 (SALES_REQUEST_PART에 데이터가 있으면 'Y')
|
||||
(SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) AS HAS_PURCHASE_REQUEST,
|
||||
-- 문서유형 (PURCHASE_REQUEST: 구매요청서, PROPOSAL: 품의서)
|
||||
SRM.DOC_TYPE,
|
||||
|
||||
-- 구매요청서 작성 여부 (SALES_REQUEST_PART에 DOC_TYPE이 PURCHASE_REQUEST인 데이터가 있으면 'Y')
|
||||
(SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END
|
||||
FROM SALES_REQUEST_PART
|
||||
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
|
||||
AND (DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL)) AS HAS_PURCHASE_REQUEST,
|
||||
|
||||
-- M-BOM 관련 컬럼
|
||||
SRM.MBOM_HEADER_OBJID,
|
||||
|
||||
-- 추가된 컬럼들
|
||||
SRM.PURCHASE_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
SRM.ORDER_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME,
|
||||
CODE_NAME(SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
|
||||
-- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.ORDER_TYPE
|
||||
) AS ORDER_TYPE,
|
||||
CODE_NAME(COALESCE(
|
||||
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.ORDER_TYPE
|
||||
)) AS ORDER_TYPE_NAME,
|
||||
|
||||
-- 제품구분: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
@@ -1010,28 +1024,51 @@ VALUES
|
||||
) AS PAID_TYPE_NAME,
|
||||
|
||||
-- 품번/품명 ("외 N건" 형태로 표시)
|
||||
(
|
||||
SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
|
||||
END
|
||||
FROM SALES_REQUEST_PART
|
||||
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
|
||||
) AS PART_NO,
|
||||
(
|
||||
SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
|
||||
END
|
||||
FROM SALES_REQUEST_PART
|
||||
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
|
||||
) AS PART_NAME,
|
||||
-- M-BOM이 있으면 MBOM_DETAIL에서, 없으면 SALES_REQUEST_PART에서 조회
|
||||
CASE
|
||||
WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
WHEN COUNT(*) = 1 THEN
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1))
|
||||
ELSE NULL
|
||||
END
|
||||
FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID)
|
||||
ELSE
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
WHEN COUNT(*) = 1 THEN
|
||||
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
|
||||
ELSE NULL
|
||||
END
|
||||
FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID)
|
||||
END AS PART_NO,
|
||||
CASE
|
||||
WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
WHEN COUNT(*) = 1 THEN
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1))
|
||||
ELSE NULL
|
||||
END
|
||||
FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID)
|
||||
ELSE
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) > 1 THEN
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
WHEN COUNT(*) = 1 THEN
|
||||
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
|
||||
ELSE NULL
|
||||
END
|
||||
FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID)
|
||||
END AS PART_NAME,
|
||||
|
||||
SRM.PROJECT_NO,
|
||||
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
|
||||
@@ -1190,26 +1227,40 @@ VALUES
|
||||
</if>
|
||||
|
||||
<if test="SEARCH_PART_NO != null and !''.equals(SEARCH_PART_NO)">
|
||||
AND SRM.OBJID IN (
|
||||
SELECT
|
||||
SRP.SALES_REQUEST_MASTER_OBJID
|
||||
FROM
|
||||
SALES_REQUEST_PART SRP
|
||||
LEFT OUTER JOIN PART_MNG PM
|
||||
ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NO LIKE '%${SEARCH_PART_NO}%'
|
||||
)
|
||||
AND (
|
||||
-- SALES_REQUEST_PART에서 검색
|
||||
SRM.OBJID IN (
|
||||
SELECT SRP.SALES_REQUEST_MASTER_OBJID
|
||||
FROM SALES_REQUEST_PART SRP
|
||||
LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%')
|
||||
)
|
||||
-- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우)
|
||||
OR SRM.MBOM_HEADER_OBJID IN (
|
||||
SELECT MD.MBOM_HEADER_OBJID
|
||||
FROM MBOM_DETAIL MD
|
||||
LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%')
|
||||
)
|
||||
)
|
||||
</if>
|
||||
<if test="SEARCH_PART_NAME != null and !''.equals(SEARCH_PART_NAME)">
|
||||
AND SRM.OBJID IN (
|
||||
SELECT
|
||||
SRP.SALES_REQUEST_MASTER_OBJID
|
||||
FROM
|
||||
SALES_REQUEST_PART SRP
|
||||
LEFT OUTER JOIN PART_MNG PM
|
||||
ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NAME LIKE '%${SEARCH_PART_NAME}%'
|
||||
)
|
||||
AND (
|
||||
-- SALES_REQUEST_PART에서 검색
|
||||
SRM.OBJID IN (
|
||||
SELECT SRP.SALES_REQUEST_MASTER_OBJID
|
||||
FROM SALES_REQUEST_PART SRP
|
||||
LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%')
|
||||
)
|
||||
-- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우)
|
||||
OR SRM.MBOM_HEADER_OBJID IN (
|
||||
SELECT MD.MBOM_HEADER_OBJID
|
||||
FROM MBOM_DETAIL MD
|
||||
LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||
WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%')
|
||||
)
|
||||
)
|
||||
</if>
|
||||
|
||||
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
|
||||
@@ -3567,10 +3618,17 @@ ORDER BY V.PATH2
|
||||
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
|
||||
SRM.PURCHASE_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
SRM.ORDER_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME,
|
||||
-- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.ORDER_TYPE
|
||||
) AS ORDER_TYPE,
|
||||
CODE_NAME(COALESCE(
|
||||
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.ORDER_TYPE
|
||||
)) AS ORDER_TYPE_NAME,
|
||||
SRM.PRODUCT_NAME,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE,
|
||||
CODE_NAME(SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE,
|
||||
-- 품번/품명 ("외 N건" 형태로 표시) - 품의서는 항상 SALES_REQUEST_PART에 데이터가 있음
|
||||
(
|
||||
SELECT
|
||||
@@ -3612,7 +3670,13 @@ ORDER BY V.PATH2
|
||||
-- (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID AND MAIL_SENT = 'Y') AS MAIL_SENT,
|
||||
-- 발주일 (일단 주석처리)
|
||||
-- (SELECT TO_CHAR(MAX(ORDER_DATE), 'YYYY-MM-DD') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS ORDER_DATE,
|
||||
SRM.STATUS,
|
||||
-- 상태: 결재 테이블 상태 우선, 없으면 SRM.STATUS
|
||||
CASE
|
||||
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
|
||||
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
|
||||
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
|
||||
ELSE SRM.STATUS
|
||||
END AS STATUS,
|
||||
CASE
|
||||
WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS
|
||||
WHEN SRM.STATUS = 'create' THEN '작성중'
|
||||
@@ -3631,6 +3695,7 @@ ORDER BY V.PATH2
|
||||
LEFT OUTER JOIN (
|
||||
SELECT
|
||||
B.OBJID AS ROUTE_OBJID,
|
||||
B.STATUS AS ROUTE_STATUS,
|
||||
CASE B.STATUS
|
||||
WHEN 'inProcess' THEN '결재중'
|
||||
WHEN 'complete' THEN '결재완료'
|
||||
@@ -3675,7 +3740,14 @@ ORDER BY V.PATH2
|
||||
</if>
|
||||
|
||||
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
|
||||
AND SRM.STATUS = #{SEARCH_STATUS}
|
||||
AND (
|
||||
CASE
|
||||
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
|
||||
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
|
||||
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
|
||||
ELSE SRM.STATUS
|
||||
END
|
||||
) = #{SEARCH_STATUS}
|
||||
</if>
|
||||
|
||||
<if test="regdate_start != null and !''.equals(regdate_start)">
|
||||
|
||||
@@ -2279,6 +2279,7 @@ public class PurchaseOrderService {
|
||||
|
||||
/**
|
||||
* 발주서 결재완료 후처리
|
||||
* - 자동 메일 발송 기능 비활성화 (2024.12 - 발주서 송부 버튼으로 수동 발송으로 변경)
|
||||
*/
|
||||
public void afterApprovalCompleteRouteInfo(SqlSession sqlSession, Map<String, Object> routeMap, Map<String, Object> targetMap, Map sqlParamMap) {
|
||||
String targetObjId = CommonUtils.checkNull(sqlParamMap.get("targetObjId"));
|
||||
@@ -2305,6 +2306,10 @@ public class PurchaseOrderService {
|
||||
sqlParamMap.put("act_status", "0001065"); //발주완료
|
||||
sqlSession.update("purchaseOrder.salesPartChgActStatusByPurchaseOrderId", sqlParamMap);
|
||||
|
||||
// 2024.12 - 자동 메일 발송 비활성화
|
||||
// 발주서 메일 발송은 목록 화면의 "발주서 송부" 버튼을 통해 수동으로 발송합니다.
|
||||
// 수동 발송 메서드: sendPurchaseOrderMailManual()
|
||||
/*
|
||||
//2. 발주서 메일발송
|
||||
try{
|
||||
|
||||
@@ -2332,13 +2337,6 @@ public class PurchaseOrderService {
|
||||
String subject = poNo + poTitle;
|
||||
|
||||
//내용
|
||||
/*Map param = new HashMap();
|
||||
param.put("SUBJECT" , subject);
|
||||
param.put("CAR_CODE" , "CAR-BENZ0001");
|
||||
param.put("CAR_NAME" , "G63 AMG 6x6");
|
||||
param.put("PRODUCT_GROUP_NAME", "메르세데스벤츠");
|
||||
param.put("PRODUCT_NAME" , "지바겐");
|
||||
String contents = MailUtil.getHTMLContents("mailTemplate2", param);*/
|
||||
String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList);
|
||||
String contents = this.makeMailContents(contents_table);
|
||||
|
||||
@@ -2370,6 +2368,7 @@ public class PurchaseOrderService {
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2914,4 +2913,194 @@ public class PurchaseOrderService {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 발주서 메일 수동 발송 (버튼 클릭 시)
|
||||
* @param request
|
||||
* @param paramMap - objId, toEmails, ccEmails, subject, contents
|
||||
* @return 발송 결과
|
||||
*/
|
||||
public Map sendPurchaseOrderMailManual(HttpServletRequest request, Map paramMap) {
|
||||
Map resultMap = new HashMap();
|
||||
|
||||
try {
|
||||
String targetObjId = CommonUtils.checkNull(paramMap.get("objId"));
|
||||
String toEmails = CommonUtils.checkNull(paramMap.get("toEmails"));
|
||||
String ccEmails = CommonUtils.checkNull(paramMap.get("ccEmails"));
|
||||
String subject = CommonUtils.checkNull(paramMap.get("subject"));
|
||||
String contents = CommonUtils.checkNull(paramMap.get("contents"));
|
||||
String writerEmail = CommonUtils.checkNull(paramMap.get("WRITER_EMAIL"));
|
||||
String writer = CommonUtils.checkNull(paramMap.get("WRITER"));
|
||||
|
||||
// 발주서 정보 조회
|
||||
Map infoParam = new HashMap();
|
||||
infoParam.put("objId", targetObjId);
|
||||
infoParam.put("PURCHASE_ORDER_MASTER_OBJID", targetObjId);
|
||||
|
||||
Map masterInfo = commonService.selectOne("purchaseOrder.getPurchaseOrderMasterInfo", null, infoParam);
|
||||
|
||||
if(masterInfo == null) {
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "발주서 정보를 찾을 수 없습니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// 발주부품목록, 결재정보, 동시발주목록, 도면목록 조회
|
||||
infoParam.put("MULTI_MASTER_OBJID", targetObjId);
|
||||
List detailList = commonService.selectList("purchaseOrder.getPURCHASE_ORDER_PART", null, infoParam);
|
||||
List apprList = commonService.getApprovalLine(infoParam);
|
||||
List multiMasterList = commonService.selectList("purchaseOrder.selectPurchaseOrderMasterList", null, infoParam);
|
||||
ArrayList partFileList = commonService.selectList("purchaseOrder.purchaseOrderPartFileListForMail", null, infoParam);
|
||||
|
||||
SimpleDateFormat frm = new SimpleDateFormat("yyyyMMddHHmm");
|
||||
SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd");
|
||||
Calendar cal = Calendar.getInstance();
|
||||
String todayKor = frm.format(cal.getTime());
|
||||
String poNo = CommonUtils.checkNull((String)masterInfo.get("PURCHASE_ORDER_NO"));
|
||||
String excelName = "발주서_" + poNo + "_" + todayKor + ".xls";
|
||||
String zipName = "도면_" + poNo + "_" + todayKor + ".zip";
|
||||
masterInfo.put("EXCELFILE_NAME", excelName);
|
||||
masterInfo.put("APPR_COMPLETE_DATE", frm2.format(cal.getTime()));
|
||||
|
||||
// 발주서 테이블 내용 생성
|
||||
String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList);
|
||||
|
||||
// 메일 본문 생성 (사용자 입력 내용 + 발주서 테이블)
|
||||
String mailContents = this.makeMailContentsWithUserInput(contents, contents_table);
|
||||
|
||||
// 수신인 이메일 목록 생성
|
||||
ArrayList<String> toUserIdList = new ArrayList<String>();
|
||||
ArrayList<String> toEmailList = new ArrayList<String>();
|
||||
String[] toEmailArr = toEmails.split(",");
|
||||
for(String email : toEmailArr) {
|
||||
email = email.trim();
|
||||
if(!"".equals(email)) {
|
||||
toEmailList.add(email);
|
||||
toUserIdList.add(""); // 이름은 비워둠
|
||||
}
|
||||
}
|
||||
|
||||
// 참조 이메일 목록 생성
|
||||
ArrayList<String> ccEmailList = new ArrayList<String>();
|
||||
if(!"".equals(ccEmails)) {
|
||||
String[] ccEmailArr = ccEmails.split(",");
|
||||
for(String email : ccEmailArr) {
|
||||
email = email.trim();
|
||||
if(!"".equals(email)) {
|
||||
ccEmailList.add(email);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 작성자 이메일을 참조에 추가 (중복 방지)
|
||||
if(!"".equals(writerEmail) && !ccEmailList.contains(writerEmail)) {
|
||||
ccEmailList.add(writerEmail);
|
||||
}
|
||||
|
||||
// 첨부파일 목록 생성
|
||||
ArrayList<HashMap> attachFileList = new ArrayList<HashMap>();
|
||||
|
||||
// 1. 발주서 엑셀 파일 첨부
|
||||
HashMap excelFile = this.makeMailAttachFileOrderSheet(masterInfo, contents_table);
|
||||
if(excelFile != null) {
|
||||
attachFileList.add(excelFile);
|
||||
}
|
||||
|
||||
// 2. 도면 파일 압축 첨부
|
||||
if(partFileList != null && partFileList.size() > 0) {
|
||||
File zf = MailUtil.zipFileListMail(zipName, partFileList);
|
||||
if(zf != null && zf.exists()) {
|
||||
HashMap hm = new HashMap();
|
||||
hm.put(Constants.Db.COL_FILE_REAL_NAME, zf.getName());
|
||||
hm.put(Constants.Db.COL_FILE_SAVED_NAME, zf.getName());
|
||||
hm.put(Constants.Db.COL_FILE_PATH, zf.getPath().replace("\\" + zf.getName(), ""));
|
||||
attachFileList.add(hm);
|
||||
}
|
||||
}
|
||||
|
||||
// 메일 발송
|
||||
String fromUser = writer;
|
||||
String fromEmail = writerEmail;
|
||||
if("".equals(fromEmail)) {
|
||||
fromEmail = CommonUtils.checkNull((String)masterInfo.get("WRITER_EMAIL"));
|
||||
}
|
||||
if("".equals(fromUser)) {
|
||||
fromUser = CommonUtils.checkNull((String)masterInfo.get("WRITER"));
|
||||
}
|
||||
|
||||
boolean sendResult = MailUtil.sendMailWithAttachFile(fromUser, fromEmail, toUserIdList, toEmailList, ccEmailList, null, null, subject, mailContents, attachFileList, "PURCHASE_ORDER");
|
||||
|
||||
if(sendResult) {
|
||||
// 메일 발송 성공 시 DB 업데이트
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
try {
|
||||
Map updateParam = new HashMap();
|
||||
updateParam.put("OBJID", targetObjId);
|
||||
updateParam.put("MAIL_SEND_YN", "Y");
|
||||
updateParam.put("MAIL_SEND_DATE", frm2.format(cal.getTime()));
|
||||
sqlSession.update("purchaseOrder.updateMailSendStatus", updateParam);
|
||||
sqlSession.commit();
|
||||
} catch(Exception e) {
|
||||
sqlSession.rollback();
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
sqlSession.close();
|
||||
}
|
||||
|
||||
resultMap.put("result", "success");
|
||||
resultMap.put("message", "메일이 성공적으로 발송되었습니다.");
|
||||
} else {
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "메일 발송에 실패했습니다.");
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", "error");
|
||||
resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage());
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용자 입력 내용과 발주서 테이블을 합친 메일 본문 생성
|
||||
* @param userContents 사용자가 입력한 메일 내용
|
||||
* @param poContentsTable 발주서 테이블 HTML
|
||||
* @return 완성된 메일 본문
|
||||
*/
|
||||
private String makeMailContentsWithUserInput(String userContents, String poContentsTable) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("<!DOCTYPE html><html lang='ko' dir='ltr'>");
|
||||
sb.append("<head>");
|
||||
sb.append(" <meta http-equiv='Content-Type' content='text/html; charset=euc-kr'>");
|
||||
sb.append(" <style>");
|
||||
sb.append(" @import url(http://fonts.googleapis.com/earlyaccess/notosanskr.css);");
|
||||
sb.append(" @import url(https://fonts.googleapis.com/css?family=Roboto:100,300,500,500,700,900);");
|
||||
sb.append(" body {font-family: 'Noto Sans KR', sans-serif; background: #fff; width: 100%; position:relative;}");
|
||||
sb.append(" .table {border-collapse: collapse; border-top:2px solid rgb(72, 155, 191); margin-top: 10px;}");
|
||||
sb.append(" .table td {border: 1px solid #ccc; border-radius: 5px; font-size: 13px; padding: 5px; border-bottom:1px solid #000;}");
|
||||
sb.append(" </style>");
|
||||
sb.append("</head>");
|
||||
sb.append("<body style='margin:0; padding:20px;'>");
|
||||
|
||||
// 사용자 입력 내용 (줄바꿈을 <br>로 변환)
|
||||
sb.append("<div style='white-space: pre-line; margin-bottom: 30px;'>");
|
||||
sb.append(userContents.replace("\n", "<br>"));
|
||||
sb.append("</div>");
|
||||
|
||||
// 구분선
|
||||
sb.append("<hr style='border: 1px solid #ddd; margin: 20px 0;'>");
|
||||
|
||||
// 발주서 테이블
|
||||
sb.append("<div style='margin-top: 20px;'>");
|
||||
sb.append("<h3 style='margin-bottom: 10px;'>[ 발주서 상세 ]</h3>");
|
||||
sb.append(poContentsTable);
|
||||
sb.append("</div>");
|
||||
|
||||
sb.append("<div style='margin-top: 20px; color: #666;'>※발신전용 메일입니다.</div>");
|
||||
sb.append("</body>");
|
||||
sb.append("</html>");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user