FilePond.registerPlugin(FilePondPluginFileValidateSize); //Grid용 클래스. 블록 처리용 class Tb_class_Order { constructor(){ let _this = this; _this.tblList = ""; _this.ajax_url = "./registration.ajax.php"; _this.clickData = null; } //리스트 로드 getMainList (sdata) { let _this = this; let talert = window.setTimeout(function () { _this.tblList.alert("Loading ...") }, 1000); //1초 이상 지연되면 로딩 출력 ajax_json({ url: _this.ajax_url, data: { mode: 'getOrderList', BP_CD: sdata?.BP_CD||'', SO_DT_ST: sdata?.SO_DT_ST||'', SO_DT_ED: sdata?.SO_DT_ED||'', MNG_NO: sdata?.MNG_NO||'', SALES_GRP: sdata?.SALES_GRP||'', SO_TYPE_I: (document.getElementById("S_SO_TYPE_I").checked?"I":""), SO_TYPE_E: (document.getElementById("S_SO_TYPE_E").checked?"E":""), OFLD: sdata?.OFLD||'', OASC: sdata?.OASC||'', LINE_NUM: sdata?.LINE_NUM||'', NOW_PAGE: sdata?.NOW_PAGE||'', }, success: function (data) { if (data.code) { _this.tblList.setData(data.data); _this.tblList.getRows().forEach(row=>row.getData()['DTL_CNT'] && row.getCell('CHECK').getElement().querySelector('input').setAttribute('disabled',true)); //진행된 수주현항 선택 못하도록 처리 //page putPagiNation({ ...sdata, TARGET: ".tabulator-footer-contents", PREB_PAGE: data?.data[0]?.PREB_PAGE, NEXB_PAGE: data?.data[0]?.NEXB_PAGE, LAST_PAGE: data?.data[0]?.LAST_PAGE, PAGE_LISTS: data?.data[0]?.PAGE_LISTS?.split('|'), callback: (conf)=>{ _this.getMainList({ BP_CD: conf?.BP_CD||'', SO_DT_ST: conf?.SO_DT_ST||'', SO_DT_ED: conf?.SO_DT_ED||'', MNG_NO: conf?.MNG_NO||'', SALES_GRP: conf?.SALES_GRP||'', SO_TYPE_I: conf?.SO_TYPE_I||'', SO_TYPE_E: conf?.SO_TYPE_E||'', OFLD: conf?.OFLD||'', OASC: conf?.OASC||'', LINE_NUM: conf?.LINE_NUM||'', NOW_PAGE: conf?.NOW_PAGE||'', }); } }); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { window.clearTimeout(talert); _this.tblList.clearAlert(); Tb_funcs_Order.setFilter(); } }); return true; }; //Row 클릭 콜백 rowClick (e, tgt){ let _this = this; let rowData = tgt.getData(); _this.clickData = rowData; Tb_funcs_Detail.getMainList(rowData); Tb_funcs_Att.getMainList(rowData); jQuery(tgt.getElement()).siblings().removeClass("user-checked"); tgt.getElement().classList.add("user-checked"); if( rowData.SO_NO ){ $("#btnCopyDetail").attr("disabled", false); $("#btnAddDetail" ).attr("disabled", false); $("#btnDelDetail" ).attr("disabled", false); $("#btnPutDetail" ).attr("disabled", false); $("#btnAddFile").attr("disabled", false); $("#btnDelFile").attr("disabled", false); $("#btnPutFile").attr("disabled", false); }else{ $("#btnCopyDetail").attr("disabled", true); $("#btnPasteDetail").attr("disabled", true); $("#btnAddDetail" ).attr("disabled", true); $("#btnDelDetail" ).attr("disabled", true); $("#btnPutDetail" ).attr("disabled", true); $("#btnAddFile").attr("disabled", true); $("#btnDelFile").attr("disabled", true); $("#btnPutFile").attr("disabled", true); } }; setFilter () { return false; let _this = this; let stdate = document.getElementById("S_SO_DT_ST").value; let endate = document.getElementById("S_SO_DT_ED").value; let stI = document.getElementById("S_SO_TYPE_I").checked?"I":""; let stO = document.getElementById("S_SO_TYPE_E").checked?"E":""; _this.tblList.setFilter(function(data){ //필터링 return ( true && ( !document.getElementById("S_BP_NM") || ( (data.ORDR_BP_CD+"|"+data.ORDR_BP_NM).search(document.getElementById("S_BP_NM").value) !== -1 ) ) && ( !document.getElementById("S_SO_NO") || ( (data.SO_NO).search(document.getElementById("S_SO_NO").value) !== -1 ) ) && ( !document.getElementById("S_SALES_GRP") || ( (data.SALES_GRP).search(document.getElementById("S_SALES_GRP").value) !== -1 ) ) && ( (!stdate || stdate <= data['SO_DT']) && (!endate || endate >= data['SO_DT']) ) && (( stI == data['SO_TYPE'] ) || ( stO == data['SO_TYPE'] ) ) ) }, '=', true); }; //Row 추가 addRow(){ let _this = this; _this.tblList.addRow({SO_TYPE:'I',_STATUS_:'I'},true); } //Cell 클릭 콜백 cellClick (e, tgt){ let _this = this; _this.tgt = tgt; switch( tgt.getField() ){ case "ORDR_BP_NM": popPartnerList({tgt_id:'ORDR_BP_CD', tgt_name:'ORDR_BP_NM', tgt_currency:'CURRENCY_CD', tgt_chname:'CUST_PRSN_NM', tgt_chmail:'CUST_EMAIL', tgt_chtel:'CUST_TEL_NO', tgt_chcell:'CUST_CELL_NO', tgt_chfax:'CUST_FAX_NO', tgt_filter:'#sgrp', txt_filter:tgt.getData()['SALES_GRP']}, tgt.getRow()._row); break; case "DLVY_BP_NM": popPartnerList({tgt_id:'DLVY_BP_CD', tgt_name:'DLVY_BP_NM'}, tgt.getRow()._row); break; case "TRANS_FEE": case "CUSTOM_FEE": tgt.setValue( tgt.getValue() == "Y"?"N":"Y" ); break; case "SO_TYPE": break; } }; //Cell 변경 콜백 cellEdited (cell){ let _this = this; cell.getData()._STATUS_ = cell.getData()._STATUS_||'U'; }; //sort columnSort(e,tgt) { let _this = this; let sorters = tgt.getTable().getSorters()[0]; _this.getMainList({..._this.searchData,OFLD:sorters?.field,OASC:sorters?.dir}); }; popBP () { let _this = this; popPartnerList({tgt_id:'#S_BP_CD',tgt_name:'#S_BP_NM'}); }; // 스펙정보 등록 putOrder (){ let _this = this; let postdata = { 'mode': 'putOrderList', 'reqdata': JSON.stringify(_this.tblList.getData().filter(row=> row._STATUS_)), }; ajax_json({ url: _this.ajax_url, data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); _this.getMainList(); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); return true; }; delOrder (){ let _this = this; _this.tblList.getSelectedRows().forEach(row => { row.update({_STATUS_:'D'}); row.getElement().classList.add("del-row"); }); }; //시작 실행 init () { let _this = this; let currow = Object.keys(varsCurrency).reduce( (param,key) => {param[key] = `${key} (${varsCurrency[key]})`; return param;}, {}); const fields = [ { field: "CHECK",formatter:"rowSelection", titleFormatter: "rowSelection", title: "No", width: "4%", noxls:true }, { field: "SO_NO", title: "관리번호", width: "10%", headerFilterPlaceholder:"자동채번", headerSort: true, formatter: (cell)=>{ return cell.getValue()||"자동채번" }}, { field: "SO_DT", title: "수주일", width: "7%", editor:'date', editorParams: {max:'9999-12-31'}, headerSort: true, }, { field: "ORDR_BP_NM", title: "거래처", width: "10%", editor:'input', headerSort: true, }, { field: "SO_NET_AMT", title: "수주금액", width: "8%", formatter: "money", formatterParams:{precision:false},}, { field: "SO_NET_AMT_LOC", title: "수주금액
(원화)", width: "8%", formatter: "money", formatterParams:{precision:false}, }, { field: "SALES_GRP", title: "영업구분", width: "7%", editor:'list', cssClass:"user-list", editorParams: {values: varsSALES_GRP,}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsSALES_GRP,}, }, { field: "SO_TYPE", title: "내수/수출", width: "10%", cssClass:'user-editable', formatter: tb_common_funtions.formatterMultiCheckBox, formatterParams: {class:'', type:'radio', default:'I', inputs:[ {title:' 내수', name:'SO_TYPE', value:'I', class:'form_checkbox_before', }, {title:' 수출', name:'SO_TYPE', value:'E', class:'green form_checkbox_before ml-2', } ]}}, { field: "DEAL_TYPE", title: "가격조건", width: "6%", editor:'list', cssClass:"user-list", editorParams: {values: varsDEAL_TYPE,}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsDEAL_TYPE,}, }, { field: "PAY_METH", title: "결제방법", width: "6%", editor:'list', cssClass:"user-list", editorParams: {values: varsPAY_METH,}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsPAY_METH,}, }, { field: "", title: "결제조건", width: "20%", columns:[ { field:"PAY_TERM_DOWN", title:"선금", hozAlign:"center", width:"6%", editor:'input', formatter:"money", formatterParams:{precision:false}, }, { field:"PAY_TERM_INTR1", title:"중도금1", hozAlign:"center", width:"6%", editor:'input', formatter:"money", formatterParams:{precision:false}, }, { field:"PAY_TERM_INTR2", title:"중도금2", hozAlign:"center", width:"6%", editor:'input', formatter:"money", formatterParams:{precision:false}, }, { field:"PAY_TERM_REMD", title:"잔금", hozAlign:"center", width:"6%", editor:'input', formatter:"money", formatterParams:{precision:false}, }, ], }, { field: "CURRENCY_CD", title: "화폐", width: "7%", editor:'list', cssClass:"user-list", editorParams:{ values: currow }, formatter: tb_common_funtions.formatterSelect, formatterParams: { values: currow }, }, { field: "", title: "추가비용", width: "10%", columns:[ { field:"TRANS_FEE", title:"운송비", hozAlign:"center", width:"5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: {checkval:'Y'}, }, { field:"CUSTOM_FEE", title:"관세", hozAlign:"center", width:"5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: {checkval:'Y'}, }, ], }, { field: "SPECFIC_DOC", title: "시방서", width: "10%", editor:'input', }, { field: "DLVY_BP_NM", title: "납품처", width: "10%", editor:'input', }, { field: "", title: "거래처연락처", width: "30%", columns:[ { field:"CUST_PRSN_NM", title:"담당자", hozAlign:"center", width:"6%", editor:'input', }, { field:"CUST_EMAIL", title:"이메일", hozAlign:"center", width:"6%", editor:'input', }, { field:"CUST_TEL_NO", title:"전화번호", hozAlign:"center", width:"6%", editor:'input', }, { field:"CUST_CELL_NO", title:"휴대폰", hozAlign:"center", width:"6%", editor:'input', }, { field:"CUST_FAX_NO", title:"FAX", hozAlign:"center", width:"6%", editor:'input', }, ], }, { field: "CUST_PO_NO", title: "고객 PO NO", width: "10%", editor:'input', }, { field: "ESTM_NO", title: "견적번호", width: "10%", }, { field: "REMK", title: "비고", width: "10%", editor:'input', }, ]; _this.tblList = new Tabulator("#tblOrderList",{ layout: "fitColumns", height: "100%", data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: { //컬럼 공통 규칙 sorter:()=>{}, headerSort: false, vertAlign: "middle", hozAlign: "center", resizable: "header",//Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }, footerElement:'', headerSortElement: "", //정렬 아이콘 }); _this.tblList.on("tableBuilt", () => { //Tabulator 초기 데이터 불러오기 이벤트 _this.getMainList({SO_TYPE_I:'I',SO_TYPE_E:'E'}); }); _this.tblList.on("rowClick", (e,tgt) => { //Tabulator Row Click _this.rowClick && _this.rowClick(e,tgt); }); _this.tblList.on("cellClick", (e,tgt) => { //Tabulator cell Click _this.cellClick && _this.cellClick(e,tgt); }); _this.tblList.on("cellEdited", (cell) => { //Tabulator cell Edited _this.cellEdited && _this.cellEdited(cell); }); _this.tblList.on("headerClick", (e,tgt) => { //Tabulator cell Edited _this.columnSort && _this.columnSort(e,tgt); }); _this.tblList.on("rowSelected", (row) => { //Tabulator cell Deslected if( row.getData()['DTL_CNT'] ){ row.getTable().deselectRow(row); } }); ['click','keypress'].forEach(evt => document.querySelector("#bntListSearch").addEventListener(evt,()=>{ _this.searchData = { BP_CD: document.querySelector('#S_BP_CD').value||'', SO_DT_ST: document.querySelector('#S_SO_DT_ST').value||'', SO_DT_ED: document.querySelector('#S_SO_DT_ED').value||'', MNG_NO: document.querySelector('#S_MNG_NO').value||'', SALES_GRP: document.querySelector('#S_SALES_GRP').value||'', SO_TYPE_I: document.querySelector('#S_SO_TYPE_I').checked?'I':'', SO_TYPE_E: document.querySelector('#S_SO_TYPE_E').checked?'E':'', LINE_NUM: document.querySelector('#S_LINE_NUM').value||'', NOW_PAGE: 1, } _this.getMainList(_this.searchData) })); ['click','keypress'].forEach(evt => document.querySelector("#btnAddOrder").addEventListener(evt,()=>{_this.addRow()})); ['click','keypress'].forEach(evt => document.querySelector("#btnDelOrder").addEventListener(evt,()=>{_this.delOrder()})); ['click','keypress'].forEach(evt => document.querySelector("#btnPutOrder").addEventListener(evt,()=>{_this.putOrder()})); ['click','keypress'].forEach(evt => document.querySelector("#btnExcelDown").addEventListener(evt,()=>{_this.excelDataLoad(_this.tblList,'수주현황')})); ['click','keypress'].forEach(evt => document.querySelector("#btnObDown").addEventListener(evt,()=>{_this.excelDataLoad(_this.tblList,'수주대장', 'ob')})); ['click','keypress'].forEach(evt => document.querySelector("#S_BP_NM").addEventListener(evt,()=>{_this.popBP()})); ['change','keydown','keyup'].forEach(evt => document.querySelectorAll("#S_BP_NM, #S_SO_DT_ST, #S_SO_DT_ED, #S_SO_NO, #S_SALES_GRP, #S_SO_TYPE_I, #S_SO_TYPE_E").forEach(tgt=>tgt.addEventListener(evt,()=>{Tb_funcs_Order.setFilter()}))); }; excelDataLoad(table_block, title, docType = 'list') { //페이징 처리된 리스트에서 엑셀 전체 다운 let _this = this; let sdata = _this.searchData; let filename = title + "_"+luxon.DateTime.now().toFormat('yyyyMMdd'); ajax_json({ url: _this.ajax_url, data: { mode: 'getOrderList', BP_CD: sdata?.BP_CD||'', SO_DT_ST: sdata?.SO_DT_ST||'', SO_DT_ED: sdata?.SO_DT_ED||'', MNG_NO: sdata?.MNG_NO||'', SALES_GRP: sdata?.SALES_GRP||'', SO_TYPE_I: (document.getElementById("S_SO_TYPE_I").checked?"I":""), SO_TYPE_E: (document.getElementById("S_SO_TYPE_E").checked?"E":""), OFLD: sdata?.OFLD||'', OASC: sdata?.OASC||'', LINE_NUM: 999999999, NOW_PAGE: sdata?.NOW_PAGE||'', }, success: function (data) { if (data.code) { if (docType === 'list') { tb_common_funtions.tabu2xls(table_block, filename, title, data.data); } else if (docType === 'ob') { if (!_this.clickData) { return false; } else { makeSoBook(_this.clickData, filename, Tb_funcs_Detail.tblList.getData()); } } }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () {} }); }; excelDataSuju(title){ let _this = this; let sdata = _this.searchData; let filename = title+"_"+luxon.DateTime.now().toFormat('yyyyMMdd'); ajax_json({ url: _this.ajax_url, data: { mode: 'getOrderDetailList', BP_CD: sdata?.BP_CD||'', SO_DT_ST: sdata?.SO_DT_ST||'', SO_DT_ED: sdata?.SO_DT_ED||'', MNG_NO: sdata?.MNG_NO||'', SALES_GRP: sdata?.SALES_GRP||'', SO_TYPE_I: (document.getElementById("S_SO_TYPE_I").checked?"I":""), SO_TYPE_E: (document.getElementById("S_SO_TYPE_E").checked?"E":""), }, success: function (data) { if (data.code) { let excelHeader = [ { key: 'SO_DT', width: 10, title: '일 자', }, { key: 'MNG_NO', width: 20, title: '수주번호', }, { key: 'SPEC', width: 25, title: '규 격', }, { key: 'SO_QTY', width: 10, title: '수량', }, { key: 'UNIT_WGT', width: 12, title: '분철단중', }, { key: 'PWR_WGT', width: 12, title: '분철중량', }, { key: 'SO_PRICE_LOC', width: 15, title: '발주단가', }, { key: 'SO_NET_AMT_LOC', width: 15, title: '발주금액', }, { key: 'UNIT_DAN', width: 15, title: '분철단가', }, { key: 'PWR_DAN', width: 10, title: '단중단가', }, { key: 'REQ_DLVY_DT', width: 10, title: '납기', }, { key: 'REMK', width: 20, title: '비고', }, ]; let excelData = data.data.map( v => { return { SO_DT: v.SO_DT, MNG_NO: v.MNG_NO, SPEC: Math.ceil(v.OUT_DIA) +' x '+ Math.ceil(v.IN_DIA) +' x '+ Math.ceil(v.THICK), SO_QTY: Math.ceil(v.SO_QTY), UNIT_WGT: Math.ceil(v.UNIT_WGT*10)/10, PWR_WGT: Math.ceil(v.PWR_WGT*10)/10, SO_PRICE_LOC: Math.ceil(v.SO_PRICE_LOC), SO_NET_AMT_LOC: Math.ceil(v.SO_NET_AMT_LOC), UNIT_DAN: v.PWR_WGT?(Math.ceil(v.SO_PRICE_LOC*100/v.PWR_WGT)/100):0, PWR_DAN: v.UNIT_WGT?(Math.ceil(v.SO_PRICE_LOC*100/v.UNIT_WGT)/100):0, REQ_DLVY_DT: v.REQ_DLVY_DT, REMK: v.REMK, }} ); json2xls(filename, title, excelHeader, excelData); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () {} }); } } //Grid용 클래스. 블록 처리용 class Tb_class_Detail { constructor(){ let _this = this; _this.tblList = ""; _this.drawModal = ""; _this.ajax_url = "./registration.ajax.php"; _this.hdr = {}; } //리스트 로드 getMainList (hdr) { let _this = this; if( hdr ) _this.hdr = hdr; let talert = window.setTimeout(function () { _this.tblList.alert("Loading ...") }, 1000); //1초 이상 지연되면 로딩 출력 ajax_json({ url: _this.ajax_url, data: { mode: 'getDetailList', SO_NO: _this.hdr.SO_NO }, success: function (data) { if (data.code) { console.log(data.data) _this.tblList.setData(data.data); _this.tblList.getRows().forEach(row=>row.getData()['MST_CNT'] && row.getCell('CHECK').getElement().querySelector('input').setAttribute('disabled',true)); //진행된 수주상세 선택 못하도록 처리 }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { window.clearTimeout(talert); _this.tblList.clearAlert(); } }); return true; }; //Row 추가 addRow(){ let _this = this; if( _this.hdr ){ _this.tblList.addRow({_STATUS_:'I', SO_NO:_this.hdr.SO_NO, CURRENCY_CD:_this.hdr.CURRENCY_CD, DLVY_BP_CD:_this.hdr.DLVY_BP_CD||_this.hdr.ORDR_BP_CD, DLVY_BP_NM:_this.hdr.DLVY_BP_NM||_this.hdr.ORDR_BP_NM},true); }else{ kuls_alert("저장된 수주를 선택하거나,
새로운 수주를 저장한뒤 수주상세를 등록할 수 있습니다."); } } copyRow() { let _this = this; let spos = _this.tblList.getRows().filter( row => row.getElement().classList.contains('user-checked') )[0]?._row.position; if( !spos ){ kuls_alert("복사할 행을 선택해야 합니다."); return; } let crow = _this.tblList.getRowFromPosition(spos); _this.cdata = crow.getData(); delete _this.cdata.SO_NO; delete _this.cdata.MNG_NO; delete _this.cdata.SO_SEQ; delete _this.cdata.MNG_NO_OLD; delete _this.cdata.ASS_DRAW; delete _this.cdata.ASS_FILE; delete _this.cdata.MAKE_TM; delete _this.cdata.MAKE_USER_ID; delete _this.cdata.EDIT_TM; delete _this.cdata.EDIT_USER_ID; kuls_success("복사 되었습니다."); $("#btnPasteDetail").attr("disabled", false); }; pasteRow(){ let _this = this; let spos = _this.tblList.getRows().filter( row => row.getElement().classList.contains('user-checked') )[0]?._row.position; if( !spos ){ kuls_alert("붙여넣을 행을 선택해야 합니다."); return; } if( !_this.cdata ){ kuls_alert("붙여넣을 내용이 없습니다. 복사를 먼저 해주세요."); return; } let prow = _this.tblList.getRowFromPosition(spos); prow.update({..._this.cdata,}); kuls_success("붙여넣기 되었습니다."); } //Row 클릭 콜백 rowClick (e, tgt){ let _this = this; if( e.target.classList.contains("btnfile") //첨부파일시 Row클릭금지 || e.target.classList.contains("toggle-switchy") //일품번호기준 Row클릭금지 || e.target.classList.contains("toggle") //일품번호기준 Row클릭금지 || e.target.classList.contains("switch") //일품번호기준 Row클릭금지 ){ return; } jQuery(tgt.getElement()).siblings().removeClass("user-checked"); tgt.getElement().classList.add("user-checked"); }; //Cell 클릭 콜백 cellClick (e, tgt){ let _this = this; _this.tgt = tgt; switch( tgt.getField() ){ case "DLVY_BP_NM": popPartnerList({tgt_id:'DLVY_BP_CD', tgt_name:'DLVY_BP_NM', tgt_currency:'CURRENCY_CD'}, tgt.getRow()._row); break; case "ASS_FILE": e.preventDefault(); e.stopPropagation(); break; case "RMK1": case "RMK2": case "RMK3": case "RMK4": tgt.setValue( tgt.getValue() == "Y"?"N":"Y" ); break; } }; //Cell 변경 콜백 cellEdited (cell){ let _this = this; let rowData = cell.getData(); rowData['_STATUS_'] = rowData['_STATUS_']||'U'; switch ( cell.getField() ){ case "SO_PRICE": case "SO_QTY": case "XCH_RATE": if( rowData['CURRENCY_CD'] != "KRW" ){ //원화가 아닐때만 if( rowData['SO_QTY'] && rowData['SO_PRICE'] ){ cell.getRow().update({SO_NET_AMT:rowData['SO_QTY']*rowData['SO_PRICE']}); } if( rowData['XCH_RATE'] ){ cell.getRow().update({SO_PRICE_LOC:rowData['SO_PRICE']*rowData['XCH_RATE'], SO_NET_AMT_LOC:rowData['SO_PRICE']*rowData['SO_QTY']*rowData['XCH_RATE']}); } } break; case "ITEM_CD": let dval = varsSHAPE_GRP[cell.getValue()].children; cell.getRow().update({SHAPE_TYPE:Object.keys(dval)[0]}); break; } if( cell.getField() == "SO_PRICE_LOC" || cell.getField() == "SO_QTY" ){ if( rowData['SO_QTY'] && rowData['SO_PRICE_LOC'] && rowData['CURRENCY_CD'] == "KRW" ){ cell.getRow().update({SO_NET_AMT_LOC:rowData['SO_QTY']*rowData['SO_PRICE_LOC']}); } } }; // 수주상세 등록 putDetail (){ let _this = this; let pdata = _this.tblList.getData(); let dupdata = pdata.map( data => data.MNG_NO ).filter( data => data ); if( dupdata.filter( (data,idx) => dupdata.indexOf(data) !== idx ).length > 0 ){ kuls_alert("수주번호가 중복됩니다."); return false; } let postdata = { 'mode': 'putDetailList', 'reqdata': JSON.stringify(_this.tblList.getData().filter(row=> row._STATUS_)), }; ajax_json({ url: _this.ajax_url, data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); Tb_funcs_Order.getMainList(); _this.getMainList(); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); return true; }; delDetail (){ let _this = this; _this.tblList.getSelectedRows().forEach(row => { row.update({_STATUS_:'D'}); row.getElement().classList.add("del-row"); }); }; popDrawList ( cell ){ let _this = this; //팝업 템플릿 로드 후 모달 출력 Tb_funcs_draw.init(cell.getComponent().getRow()); }; shGEdParams ( cell ) { let _this = this; return Object.keys(varsSHAPE_GRP).reduce( (ret, key) => { ret[varsSHAPE_GRP[key].Code_Uid] = varsSHAPE_GRP[key].Code_Exp; return ret; }, {}) }; shEdParams ( cell ) { let _this = this; return varsSHAPE_GRP[cell.getData()['ITEM_CD']].children; }; shGFormatter ( cell ) { let _this = this; return varsSHAPE_GRP[cell.getValue()]?.Code_Exp; }; shFormatter ( cell ) { let _this = this; return varsSHAPE_TYPE[cell.getValue()]; }; stFmtParams( cell ){ let _this = this; return tb_common_funtions.precs(cell.getData()['ITEM_CD'] === "F", 3,1); } init () { let _this = this; let currow = Object.keys(varsCurrency).reduce( (param,key) => {param[key] = `${key} (${varsCurrency[key]})`; return param;}, {}); const fields = [ { field: "CHECK", formatter:"rowSelection", titleFormatter: "rowSelection", title: "No", width: "4%", noxls:true, }, { field: "MNG_NO", title: "수주번호", width: "10%", editor:'input', visible: false, }, { field: "MNG_NO_P", title: "수주번호", width: "10%", editor:'input', }, { field: "DTL_SEQ", title: "순번", width: "6%", maxWidth:200, editor:'input', }, { field: "ITEM_CD", title: "품명", width: "8%", editor:'list', cssClass:"user-list", editorParams:{ valuesLookup: _this.shGEdParams }, formatter:_this.shGFormatter, }, { field: "SHAPE_TYPE", title: "형태(형상)", width: "8%", editor:'list', cssClass:"user-list", editorParams:{ valuesLookup: _this.shEdParams }, formatter:_this.shFormatter, }, { field: "", title: "규격", width: "20%", columns:[ { field:"OUT_DIA", title:"OD", width:"5%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: _this.stFmtParams, }, { field:"IN_DIA", title:"ID", width:"5%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: _this.stFmtParams, }, { field:"THICK", title:"TH", width:"5%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: _this.stFmtParams, }, { field:"WIDTH", title:"W", width:"5%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: _this.stFmtParams, }, { field:"LENGTH", title:"L", width:"5%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: _this.stFmtParams, }, ], }, { field: "MATR_TYPE", title: "재질", width: "8%", editor:'input', }, { field: "", title: "도면", width: "12%", columns:[ { field:"ASS_DRAW", title:"도면번호", width:"10%", }, { field:"ASS_FILE", title:"", width:"2%", noxls:true, formatter: tb_common_funtions.formatterButton, formatterParams:{ btnTitle:'', btnClass:'btn btn-sm btn-nobd fa-regular fa-image btnfile', cfunc: (cell)=> { _this.popDrawList(cell) }, event: ['click', 'keyup'], }, }, ], }, { field: "REQ_DLVY_DT", title: "납기요청일", width: "7%", editor:'date', editorParams: {max:'9999-12-31'}, }, { field: "DLVY_BP_NM", title: "납품처", width: "8%", editor:'input', }, { field: "ITEM_NRULE", title: "일품번호기준", width: "8%", cssClass:'user-editable', formatter: tb_common_funtions.formatterMultiCheckBox, formatterParams: {class:'', type:'radio', default:'', inputs:[ {title:' 수량', name:'ITEM_NRULE', value:'', class:'form_checkbox_before', }, {title:' 번호', name:'ITEM_NRULE', value:'Y', class:'green form_checkbox_before ml-2', } ], }, visible:false, }, //{ field: "ITEM_NRULE", title: "일품번호
기준", width: "5%", formatter: tb_common_funtions.formatterToggleboxText, formatterParams: { checkval:'Y', onval:'번호', offval:'수량', } }, { field: "SO_QTY", title: "수량", width: "5%", editor:'input', }, { field: "SO_UNIT", title: "단위", width: "6%", editor:'list', cssClass:"user-list", editorParams:{ values: varsUNIT }, formatter: tb_common_funtions.formatterSelect, formatterParams: { values: varsUNIT }, }, { field: "CURRENCY_CD", title: "화폐", width: "6%", editor:'list', cssClass:"user-list", editorParams:{ values: currow }, formatter: tb_common_funtions.formatterSelect, formatterParams: { values: currow }, }, { field: "", title: "원화", columns: [ { field: "SO_PRICE_LOC", title: "단가", width: "10%", editor:'input', formatter:"money", formatterParams:{precision:false}, }, { field: "SO_NET_AMT_LOC", title: "금액", width: "10%", formatter:"money", formatterParams:{precision:false}, }, ] }, { field: "", title: "외화", columns: [ { field: "SO_PRICE", title: "단가", width: "10%", editor:'input', formatter:"money", }, { field: "SO_NET_AMT", title: "금액", width: "10%", formatter:"money", }, { field: "XCH_RATE", title: "환율", width: "10%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: function() { return {'precision':2}; }, }, ] }, { field: "PWR_WGT", title: "분철", width: "10%", editor:'input', }, { field: "UNIT_WGT", title: "단중", width: "10%", editor:'input', formatter: tb_common_funtions.formatterNumber, formatterParams: function() { return {'precision':2}; }, }, { field: "RMK1", title: "특1", width: "5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterCheckboxIconYn,}, { field: "RMK2", title: "특2", width: "5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterCheckboxIconYn,}, { field: "RMK3", title: "특3", width: "5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterCheckboxIconYn,}, { field: "RMK4", title: "특4", width: "5%", cssClass:'user-editable', formatter: tb_common_funtions.formatterCheckboxIconYn,}, { field: "RMK_ETC", title: "특 기타", width: "20%", editor:'input', }, { field: "REMK", title: "비고", width: "10%", editor:'input', }, { field: "REVNO", title: "변경이력", width: "13%", editor:'input', }, { field: "CPRNO", title: "협조전번호", width: "13%", editor:'input', }, { field: "CHANGE_DATE", title: "변경일자", width: "13%", editor:'date', editorParams: {max:'9999-12-31'},}, { field: "CHANGE_DTL", title: "변경내용", width: "13%", editor:'input', }, { field: "MNG_GRD", title: "관리등급", width: "13%", editor:'input', }, { field: "PROC_GRD", title: "가공등급", width: "13%", editor:'input', }, { field: "CLASSIFICATION", title: "선급", width: "13%", editor:'input', }, { field: "PRESENCE", title: "입회", width: "13%", editor:'input', }, { field: "HEAT_TREATMENT", title: "열처리", width: "13%", editor:'input', }, { field: "APPROVAL", title: "승인도", width: "13%", editor:'input', }, ]; _this.tblList = new Tabulator("#tblDetailList",{ layout: "fitColumns", height: "100%", maxHeight: "100%", data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: { //컬럼 공통 규칙 vertAlign: "middle", hozAlign: "center", resizable: "header",//Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }, headerSortElement: "", //정렬 아이콘 }); _this.tblList.on("rowClick", (e,tgt) => { //Tabulator cell Click _this.rowClick && Tb_funcs_Detail.rowClick(e,tgt); }); _this.tblList.on("cellClick", (e,tgt) => { //Tabulator cell Click _this.cellClick && Tb_funcs_Detail.cellClick(e,tgt); }); _this.tblList.on("cellEdited", (cell) => { //Tabulator cell Edited _this.cellEdited && Tb_funcs_Detail.cellEdited(cell); }); _this.tblList.on("rowSelected", (row) => { //Tabulator cell Deslected if( row.getData()['MST_CNT'] ){ row.getTable().deselectRow(row); } }); ['click','keypress'].forEach(evt => document.querySelector("#btnAddDetail").addEventListener(evt,()=>{_this.addRow()})); ['click','keypress'].forEach(evt => document.querySelector("#btnCopyDetail").addEventListener(evt,()=>{_this.copyRow()})); ['click','keypress'].forEach(evt => document.querySelector("#btnPasteDetail").addEventListener(evt,()=>{_this.pasteRow()})); ['click','keypress'].forEach(evt => document.querySelector("#btnDelDetail").addEventListener(evt,()=>{_this.delDetail()})); ['click','keypress'].forEach(evt => document.querySelector("#btnPutDetail").addEventListener(evt,()=>{_this.putDetail()})); }; } class Tb_class_Att { constructor(){ let _this = this; _this.tblList = ""; _this.ajax_url = "./attfile.ajax.php"; _this.upload_ajax_url = "./attfile.ajax.php"; _this.download_url = "/include/getFile.php"; _this.hdr = {}; } //리스트 로드 getMainList (hdr) { let _this = this; if( hdr ) _this.hdr = hdr; let talert = window.setTimeout(function () { _this.tblList.alert("Loading ...") }, 1000); //1초 이상 지연되면 로딩 출력 ajax_json({ url: _this.ajax_url, data: { mode: 'getAttList', nid: _this.hdr.SO_NO }, success: function (data) { if (data.code) { _this.tblList.setData(data.data.map(sd=>{return {...sd,_OLD_STATUS_:sd._STATUS_};})); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { window.clearTimeout(talert); _this.tblList.clearAlert(); //멀티파일 업로더 if (!_this.uploader) { _this.uploader = FilePond.create(document.getElementById("attfilepond"), { ...filepond_ko_KR, name: 'upfile', allowMultiple: true, maxParallelUploads: 3, allowProcess: false, instantUpload: true, server: { url: _this.upload_ajax_url + "?mode=putTempFile", process: { onload: function (data) { data = JSON.parse(data); let fdata = data.data; let file_name = fdata['file_name']; let tmp_name = fdata['tmp_name']; let file_size = fdata['file_size']; let file_type = fdata['file_type']; _this.tblList.addRow({ _STATUS_: 'I', nid: _this.hdr.SO_NO, file_name, tmp_name, file_size, file_type, gubun: 'temp' },true); }, }, }, allowFileSizeValidation: true, maxFileSize: 100000000, credits: {}, }); // document.addEventListener('FilePond:processfile', (e)=>{ // let data = e.detail.file; // let name = data.filename; // let ext = data.fileExtension; // let size = data.fileSize; // let type = data.fileType; // let file_url = _this.download_url+"?gubun=temp&tmp_name="+1+"&name="+name+"&size="+size; // // _this.tblList.addRow({_STATUS_:'I', file_name:name, url:file_url},true); // }); document.getElementById("attfilepond").addEventListener('FilePond:addfilestart', (e) => { _this.tblList.alert("미리보기 작성중..."); document.querySelector("#btnPutFile").disabled = true; }); document.getElementById("attfilepond").addEventListener('FilePond:processfiles', (e) => { _this.tblList.clearAlert(); document.querySelector("#btnPutFile").disabled = false; }); } } }); return true; }; setFilter () { let _this = this; }; //등록 uploadFile (){ let _this = this; _this.uploader.browse(); }; //등록 putAtt (){ let _this = this; /* 삭제를 토글로 처리시, 복구를 위해 DEL_FLG가 추가될 경우에 사용. let rowData = _this.tblList.getData().map( row => { if( row['DEL_FLG'] === "Y" ){ row['_STATUS_'] = "D"; } return row; }).filter(row => row['_STATUS_'] && (row['_STATUS_'] !== "D" || row['file_id']) ); */ let rowData = _this.tblList.getData().filter(row => row['_STATUS_']); ajax_json({ url: _this.upload_ajax_url, data: { mode: 'putAtt', reqdata: JSON.stringify(rowData) }, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); //Tb_funcs_Detail.drawModal.delete(); _this.getMainList(); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); }; //Cell 클릭 콜백 cellClick (e, tgt){ let _this = this; let rowData = tgt.getData(); switch( tgt.getField() ){ case "file_url": let file_url = _this.download_url+"?gubun="+rowData['gubun']+"&nid="+rowData['nid']+"&sid="+rowData['sid']+"&file_id="+rowData['file_id']+"&tmp_name="+rowData['tmp_name']+"&name="+rowData['file_name']+"&size="+rowData['file_size']; pop_filedown(file_url, rowData['file_name'].split(".").pop()); break; case "DEL_FLG": tgt.setValue( tgt.getValue() == "Y"?"N":"Y" ); break; } }; //Cell 변경 콜백 cellEdited (cell){ let _this = this; cell.getData()._STATUS_ = cell.getData()._STATUS_||'U'; }; /* //Row 선택 콜백 rowSelected (row){ let _this = this; row.getData().DEL_FLG = "Y"; }; //Row 선택 콜백 rowDeSelected (row){ let _this = this; let rowData = row.getData(); row.getData().DEL_FLG = ""; };*/ //Row 삭제처리 rowDelete (){ let _this = this; _this.tblList.getSelectedRows().forEach( row => { row.getData()['_STATUS_'] = 'D'; row.getElement().classList.add("del-row"); } ); }; revokeData(row){ let _this = this; row.update({_STATUS_:row.getData()['_OLD_STATUS_']}); row.getElement().classList.remove("del-row"); }; init () { let _this = this; const fields = [ { formatter:"rowSelection", title: "No", width: "10%", headerSort: false, }, { field: "file_name", title: "파일명", width: "40%", minWidth:200, }, { field: "file_exp", title: "비 고", width: "40%", minWidth:200, editor:"input" }, { field: "file_url", title: "", width: "10%", minWidth:80, formatter: ()=>'', }, ]; _this.tblList = new Tabulator("#tblFileList",{ layout: "fitColumns", height: "calc(100% - 20px)", data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: { //컬럼 공통 규칙 vertAlign: "middle", hozAlign: "center", resizable: "header",//Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }, headerSortElement: "", //정렬 아이콘 }); _this.tblList.on("cellClick", (e,tgt) => { //Tabulator cell Click _this.cellClick && _this.cellClick(e,tgt); }); _this.tblList.on("cellEdited", (cell) => { //Tabulator cell Edited _this.cellEdited && _this.cellEdited(cell); }); _this.tblList.on("rowDeselected", (row) => { //Tabulator cell Deslected _this.revokeData && _this.revokeData(row); }); ['click','keypress'].forEach(evt => document.querySelector("#btnAddFile").addEventListener(evt,()=>{_this.uploadFile()})); ['click','keypress'].forEach(evt => document.querySelector("#btnDelFile").addEventListener(evt,()=>{_this.rowDelete()})); ['click','keypress'].forEach(evt => document.querySelector("#btnPutFile").addEventListener(evt,()=>{_this.putAtt()})); }; } const Tb_funcs_Order = new Tb_class_Order(); const Tb_funcs_Detail = new Tb_class_Detail(); const Tb_funcs_Att = new Tb_class_Att(); const Tb_funcs_draw = new drawManager(); Tb_funcs_Order.init(); Tb_funcs_Detail.init(); Tb_funcs_Att.init();