구매요청 메뉴 분리
This commit is contained in:
714
WebContent/WEB-INF/view/salesMng/purchaseRequestRegList.jsp
Normal file
714
WebContent/WEB-INF/view/salesMng/purchaseRequestRegList.jsp
Normal file
@@ -0,0 +1,714 @@
|
|||||||
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||||
|
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||||
|
<%@ page import="com.pms.common.utils.*"%>
|
||||||
|
<%@ page import="java.util.*" %>
|
||||||
|
<%@include file= "/init.jsp" %>
|
||||||
|
<c:set var="now" value="<%=new java.util.Date() %>"/>
|
||||||
|
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
|
||||||
|
<%
|
||||||
|
// DB에서 메뉴명 조회 (공통 유틸 사용)
|
||||||
|
String menuObjId = request.getParameter("menuObjId");
|
||||||
|
String menuName = CommonUtils.getMenuName(menuObjId, "구매관리_구매요청서작성");
|
||||||
|
%>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<title><%=Constants.SYSTEM_NAME%></title>
|
||||||
|
<style>
|
||||||
|
.pmsPopupForm tr:last-child td {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
.select2-selection__choice {
|
||||||
|
font-size: 11px;
|
||||||
|
background-color: #fff !important;
|
||||||
|
border: none !important;
|
||||||
|
margin-right: 0px !important;
|
||||||
|
}
|
||||||
|
.select2-selection__choice__remove {
|
||||||
|
display: contents !important;
|
||||||
|
}
|
||||||
|
.select2-container .select2-selection--multiple {
|
||||||
|
min-height: 20px !important;
|
||||||
|
}
|
||||||
|
.select2-container--default .select2-selection--multiple .select2-selection__choice {
|
||||||
|
margin-top: 3.5px !important;
|
||||||
|
}
|
||||||
|
.select2-selection__rendered {
|
||||||
|
height: 18px !important;
|
||||||
|
}
|
||||||
|
.select2-container .select2-selection--multiple .select2-selection__rendered {
|
||||||
|
/* overflow: auto !important; */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$('.select2').select2();
|
||||||
|
|
||||||
|
// 품번/품명 Select2 AJAX 초기화
|
||||||
|
initPartSelect2Ajax("#SEARCH_PART_NO", "#SEARCH_PART_NAME", "#SEARCH_PART_OBJID");
|
||||||
|
|
||||||
|
$("input[type=text]").keyup(function(e){
|
||||||
|
if(e.keyCode == 13){
|
||||||
|
$("#btnSearch").trigger("click");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnSearch").click(function(){
|
||||||
|
fn_search();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnRelease").click(function(){
|
||||||
|
var targetObj = $("input[name=REQUEST_OBJID]:checked");
|
||||||
|
|
||||||
|
if(0 < targetObj.length){
|
||||||
|
fn_releaseSalesRequest();
|
||||||
|
}else{
|
||||||
|
Swal.fire("선택된 내용이 없습니다.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//접수
|
||||||
|
$("#btnRec").click(function(){
|
||||||
|
var selectedRowIds = _tabulGrid.getSelectedData();
|
||||||
|
if(selectedRowIds.length<1){
|
||||||
|
Swal.fire("접수할 행을 선택해주십시오.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetStatus = fnc_checkNull(selectedRowIds[0].STATUS_TITLE);
|
||||||
|
if(targetStatus != "결재완료"){
|
||||||
|
Swal.fire("결재완료일 경우 접수가능합니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let partIds = selectedRowIds.map(function(o,i){
|
||||||
|
return fnc_checkNull(selectedRowIds[i].OBJID);
|
||||||
|
});
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url:"/salesMng/receiptSalesRequestInfo.do"
|
||||||
|
,type:"POST"
|
||||||
|
,data: "partIds="+partIds.join(",")
|
||||||
|
,dataType:"json"
|
||||||
|
,async:false
|
||||||
|
,success:function(data){
|
||||||
|
Swal.fire(data.message);
|
||||||
|
fn_search();
|
||||||
|
self.close();
|
||||||
|
}
|
||||||
|
,error: function(jqxhr, status, error){
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnExcel").click(function(){
|
||||||
|
fn_excelExport($("#mainGrid"),"BOM_REPORT_역전개");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 구매요청서 작성 버튼 - 활성화됨
|
||||||
|
$("#btnOrderReg").click(function(){
|
||||||
|
fn_openSalesRequestFormPopUp("");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 품의서 생성
|
||||||
|
$("#btnReg").click(function(){
|
||||||
|
fn_createProposal();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnOrderBOMReg").click(function(){
|
||||||
|
fn_salesRequestTargetBOMListPopUp();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnDelete").click(function(){
|
||||||
|
fn_delete();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnApproval").click(function(){
|
||||||
|
var checkedObj = $("input[name=REQUEST_OBJID]:checked");
|
||||||
|
var title = "";
|
||||||
|
if(1 < checkedObj){
|
||||||
|
Swal.fire("한번에 한개의 결재만 가능합니다.");
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
var targetStatus = checkedObj.attr("data-STATUS");
|
||||||
|
var objId = checkedObj.val();
|
||||||
|
|
||||||
|
var targeType = "SALES_REQUEST";
|
||||||
|
|
||||||
|
if(targetStatus == "create" || targetStatus == "reception" || targetStatus == "reject"){
|
||||||
|
window.open("/approval/registApproval.do?targetType="+targeType+"&targetObjId="+objId+"&approvalTitle="+title+"&callbackFnc=fn_search","registApproval","width=700,height=700");
|
||||||
|
}else{
|
||||||
|
Swal.fire("이미 결재완료 또는 결재중 상태입니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".btnApprovalDetail").click(function(){
|
||||||
|
var approvalObjId = $(this).attr("data-APPROVAL_OBJID");
|
||||||
|
var routeObjId = $(this).attr("data-ROUTE_OBJID");
|
||||||
|
var params = "?approvalObjId="+approvalObjId;
|
||||||
|
params += "&routeObjId="+routeObjId;
|
||||||
|
//Swal.fire("params : "+params);
|
||||||
|
window.open("/approval/approvalDetail.do"+params,"approvalDetailPopup","width=650 height=400 menubar=no status=no");
|
||||||
|
});
|
||||||
|
|
||||||
|
fnc_getAjaxProductMgmtList("SEARCH_PRODUCT_CODE", "", "", "${param.SEARCH_PRODUCT_CODE}");
|
||||||
|
|
||||||
|
fn_search();
|
||||||
|
//날짜
|
||||||
|
_fnc_datepick();
|
||||||
|
});
|
||||||
|
|
||||||
|
var columns = [
|
||||||
|
{title:'OBJID' , field:'OBJID' ,visible: false},
|
||||||
|
{title:'SPC_OBJID' , field:'SPC_OBJID' ,visible: false},
|
||||||
|
{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:'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,
|
||||||
|
// cellClick : function(e, cell) {
|
||||||
|
// fn_openSalesRequestPopUp(cell.getData().OBJID);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매유형", field :"PURCHASE_TYPE_NAME" , widthGrow:1.1 }
|
||||||
|
,{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 :"HAS_PURCHASE_REQUEST" , widthGrow:1.1,
|
||||||
|
formatter:fnc_subInfoValueFormatter,
|
||||||
|
cellClick : function(e, cell) {
|
||||||
|
var data = cell.getData();
|
||||||
|
fn_openSalesRequestFormPopUp(data.OBJID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1,
|
||||||
|
// 요청인: 구매요청서 작성 시에만 표시
|
||||||
|
formatter: function(cell, formatterParams, onRendered){
|
||||||
|
var data = cell.getData();
|
||||||
|
var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||||
|
if(hasPurchaseRequest == 'Y') {
|
||||||
|
return fnc_checkNull(data.REQUEST_USER_NAME);
|
||||||
|
}
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "입고요청일", field :"DELIVERY_REQUEST_DATE" , widthGrow:1.1,
|
||||||
|
// 입고요청일: 구매요청서 작성 시에만 표시
|
||||||
|
formatter: function(cell, formatterParams, onRendered){
|
||||||
|
var data = cell.getData();
|
||||||
|
var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||||
|
if(hasPurchaseRequest == 'Y') {
|
||||||
|
return fnc_checkNull(data.DELIVERY_REQUEST_DATE);
|
||||||
|
}
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "작성일", field :"REGDATE_TITLE" , widthGrow:1.1 }
|
||||||
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "상태", field :"STATUS_TITLE" , widthGrow:1.1 }
|
||||||
|
];
|
||||||
|
|
||||||
|
//var grid;
|
||||||
|
function fn_search(){
|
||||||
|
var selectedValues = $("#project_no").val();
|
||||||
|
|
||||||
|
$('<input>').attr({
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'project_nos',
|
||||||
|
value: selectedValues
|
||||||
|
}).appendTo('#form1');
|
||||||
|
|
||||||
|
// 구매요청서 작성 페이지용 API 호출
|
||||||
|
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/salesMng/purchaseRequestRegGridList.do", columns, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_delete(){
|
||||||
|
var selectedObj = $("input[name=REQUEST_OBJID]:checked");
|
||||||
|
|
||||||
|
if(0 < selectedObj.length){
|
||||||
|
if(confirm("선택된 정보를 삭제하시겠습니까?")){
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url:"/salesMng/deleteSalesRequestMng.do",
|
||||||
|
type:"POST",
|
||||||
|
data:$("#form1").serialize(),
|
||||||
|
dataType:"json",
|
||||||
|
success:function(data){
|
||||||
|
Swal.fire(data.msg);
|
||||||
|
fn_search();
|
||||||
|
},
|
||||||
|
error: function(jqxhr, status, error){
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Swal.fire("선택된 정보가 없습니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//구매의뢰서(BOM) 작성 시 사용
|
||||||
|
function fn_salesRequestTargetBOMListPopUp(){
|
||||||
|
var url = "/salesMng/salesRequestTargetBOMList.do";
|
||||||
|
|
||||||
|
window.open(url,"salesRequestTargetBOMListPopUp","width=1300,height=550");
|
||||||
|
}
|
||||||
|
|
||||||
|
//구매의뢰 요청 팝업 (요청번호 클릭 시 - 구매리스트 화면)
|
||||||
|
function fn_openSalesRequestPopUp(objId){
|
||||||
|
// 그리드에서 선택된 행의 MBOM_HEADER_OBJID 가져오기
|
||||||
|
var selectedRow = _tabulGrid.searchRows("OBJID", "=", objId);
|
||||||
|
var mbomHeaderObjid = '';
|
||||||
|
if(selectedRow && selectedRow.length > 0) {
|
||||||
|
mbomHeaderObjid = fnc_checkNull(selectedRow[0].getData().MBOM_HEADER_OBJID);
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = "/salesMng/purchaseListFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
|
||||||
|
if(mbomHeaderObjid) {
|
||||||
|
url += "&MBOM_HEADER_OBJID=" + mbomHeaderObjid;
|
||||||
|
}
|
||||||
|
window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시)
|
||||||
|
// DOC_TYPE 파라미터 추가하여 새 페이지에서 생성된 데이터임을 표시
|
||||||
|
function fn_openSalesRequestFormPopUp(objId){
|
||||||
|
var url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId+"&DOC_TYPE=PURCHASE_REG";
|
||||||
|
window.open(url,"salesRequestFormPopUp","width=1100,height=630");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_releaseSalesRequest(){
|
||||||
|
var checkArr = new Array();
|
||||||
|
var ngCnt = 0;
|
||||||
|
$("input[name=REQUEST_OBJID]:checked").each(function(){
|
||||||
|
var objId = $(this).val();
|
||||||
|
var status = $(this).attr("data-STATUS");
|
||||||
|
|
||||||
|
if("create" != status){
|
||||||
|
ngCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkArr.push(objId);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(0 < ngCnt){
|
||||||
|
Swal.fire("이미 제출된 정보입니다.\n대상을 확인하시기 바랍니다.");
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
if(confirm("선택된 정보를 구매당당자에게 제출 하시겠습니까?")){
|
||||||
|
$.ajax({
|
||||||
|
type : "POST",
|
||||||
|
url : "/salesMng/releaseSalesRequest.do",
|
||||||
|
data: {"checkArr":checkArr.join(),"status":"release"},
|
||||||
|
dataType:"json",
|
||||||
|
success:function(data){
|
||||||
|
Swal.fire(data.msg);
|
||||||
|
if(data.result){
|
||||||
|
fn_search();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,error: function(jqxhr, status, error){
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//양산제품에 해당하는 SPEC 정보 목록을 가져온다.
|
||||||
|
function fn_productSpecList(productObjId,selectboxId,selectedVal){
|
||||||
|
$("#"+selectboxId).empty();
|
||||||
|
|
||||||
|
$("#"+selectboxId).append("<option value=''>선택</option>");
|
||||||
|
|
||||||
|
if("" != productObjId){
|
||||||
|
$.ajax({
|
||||||
|
url:"/common/getProductSPECList.do",
|
||||||
|
type:"POST",
|
||||||
|
data:{"isJson":true,"TARGET_OBJID":productObjId},
|
||||||
|
dataType:"json",
|
||||||
|
async:false,
|
||||||
|
success:function(data){
|
||||||
|
resultList = data
|
||||||
|
|
||||||
|
if(0 < resultList.length){
|
||||||
|
for (var i = 0; i < resultList.length; i++) {
|
||||||
|
var commonCodeId = resultList[i].OBJID;
|
||||||
|
var commonCodeName = resultList[i].SPEC_NAME;
|
||||||
|
|
||||||
|
$("#"+selectboxId).append("<option value='"+commonCodeId+"'>"+commonCodeName+"</option>");
|
||||||
|
}
|
||||||
|
$("#"+selectboxId).val(selectedVal);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(jqxhr, status, error){
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_approvalDetail(approvalObjId,routeObjId){
|
||||||
|
var params = "?approvalObjId="+approvalObjId;
|
||||||
|
params += "&routeObjId="+routeObjId;
|
||||||
|
window.open("/approval/approvalDetail.do"+params,"approvalDetailPopup","width=650 height=400 menubar=no status=no");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_excelExport(pGridObj,pFileName){
|
||||||
|
var mya = pGridObj.getDataIDs();
|
||||||
|
var data = pGridObj.getRowData(mya[0]);
|
||||||
|
var colNames=new Array();
|
||||||
|
var ii=0;
|
||||||
|
for (var d in data){ colNames[ii++] = d; }
|
||||||
|
|
||||||
|
//컬럼 헤더 가져오기
|
||||||
|
var columnHeader = pGridObj.jqGrid('getGridParam','colNames') + '';
|
||||||
|
var arrHeader = columnHeader.split(',');
|
||||||
|
var html="<table border=1><tr>";
|
||||||
|
for ( var y = 0; y < arrHeader.length; y++ ) {
|
||||||
|
var hName = arrHeader[y];
|
||||||
|
if("PART_OBJID" == hName || "EO_OBJID" == hName){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
html = html + "<td><b>" + arrHeader[y] + "</b></td>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
html = html + "</tr>";
|
||||||
|
|
||||||
|
//값 불러오기
|
||||||
|
for(var i=0;i< mya.length;i++) {
|
||||||
|
var datac= pGridObj.getRowData(mya[i]);
|
||||||
|
html = html +"<tr>";
|
||||||
|
for(var j=0; j< colNames.length;j++){
|
||||||
|
if("PART_OBJID" == colNames[j] || "EO_OBJID" == colNames[j]){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
html=html + '<td>' + datac[colNames[j]]+"</td>";
|
||||||
|
}
|
||||||
|
html = html+"</tr>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
html=html+"</table>"; // end of line at the end
|
||||||
|
document.EXCEL_.csvBuffer.value = html;
|
||||||
|
document.EXCEL_.fileName.value = pFileName;
|
||||||
|
document.EXCEL_.target='_new';
|
||||||
|
document.EXCEL_.submit();
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_str_openPopup(bom_report_objid, product_code, product_mgmt_spec, upg_no, search_partNo, search_partName){
|
||||||
|
var param = "actionType=search"
|
||||||
|
+"&bom_report_objid=" + bom_report_objid
|
||||||
|
+"&product_code=" + product_code
|
||||||
|
+"&product_mgmt_spec=" + product_mgmt_spec
|
||||||
|
+"&upg_no=" + upg_no
|
||||||
|
+"&search_partNo=" + search_partNo
|
||||||
|
+"&search_partName=" + search_partName
|
||||||
|
;
|
||||||
|
window.open("/partmgmt/structureAscendingListPopup.do?"+param, "_strListPopup", "width=1200, height=800, toolbar=no, status=no, menubar=no, location=no, scrollbars=yes, resizable=yes");
|
||||||
|
}
|
||||||
|
|
||||||
|
//구매 BOM 팝업
|
||||||
|
function fn_salesMngBOMOpenPopUp(bom_report_objid){
|
||||||
|
var param = "actionType=search"
|
||||||
|
+"&bom_report_objid=" + bom_report_objid
|
||||||
|
;
|
||||||
|
window.open("/salesMng/salesMngBOMListPopUp.do?"+param, "_strListPopup", "width=1200, height=800, toolbar=no, status=no, menubar=no, location=no, scrollbars=yes, resizable=yes");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fn_salesMngBOMOpenPopUp(bom_report_objid){
|
||||||
|
var param = "actionType=search"
|
||||||
|
+"&bom_report_objid=" + 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++){
|
||||||
|
$dateinput.eq(i).attr("size","10");
|
||||||
|
$dateinput.eq(i).datepicker({
|
||||||
|
changeMonth:true,
|
||||||
|
changeYear:true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//품의서 생성
|
||||||
|
function fn_formPopUp(objId,sales_request_objid){
|
||||||
|
var popup_width = 1260;
|
||||||
|
var popup_height = 1050;
|
||||||
|
|
||||||
|
//var hiddenForm = document.hiddenForm;
|
||||||
|
var target = "purchaseOrderFormPopup_salesRequest";
|
||||||
|
var url = "/purchaseOrder/purchaseOrderFormPopup_new.do?ObjId="+objId+"&sales_request_objid="+sales_request_objid;
|
||||||
|
fn_centerPopup(popup_width, popup_height, url, target);
|
||||||
|
|
||||||
|
/* hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId;
|
||||||
|
hiddenForm.action = url;
|
||||||
|
hiddenForm.target = target;
|
||||||
|
hiddenForm.submit(); */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 품의서 생성 함수
|
||||||
|
* - 선택된 구매요청서에서 단가가 입력된 품목만 필터링
|
||||||
|
* - 이미 품의서가 생성된 품목은 제외
|
||||||
|
* - 하나의 품의서로 생성
|
||||||
|
*/
|
||||||
|
function fn_createProposal() {
|
||||||
|
// 1. 선택된 행 확인
|
||||||
|
var selectedRows = _tabulGrid.getSelectedData();
|
||||||
|
|
||||||
|
if(selectedRows.length == 0) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '알림',
|
||||||
|
text: '품의서를 생성할 구매요청서를 선택해주세요.',
|
||||||
|
icon: 'info'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selectedRows.length > 1) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '알림',
|
||||||
|
text: '한 번에 하나의 구매요청서만 선택해주세요.',
|
||||||
|
icon: 'info'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var selectedRow = selectedRows[0];
|
||||||
|
var salesRequestObjid = fnc_checkNull(selectedRow.OBJID);
|
||||||
|
|
||||||
|
// 2. 구매요청서의 품목 중 단가가 입력되고 품의서 미생성된 품목 조회
|
||||||
|
$.ajax({
|
||||||
|
url: "/salesMng/getProposalTargetParts.do",
|
||||||
|
type: "POST",
|
||||||
|
data: {
|
||||||
|
SALES_REQUEST_MASTER_OBJID: salesRequestObjid
|
||||||
|
},
|
||||||
|
dataType: "json",
|
||||||
|
success: function(response) {
|
||||||
|
if(response.resultFlag === "S") {
|
||||||
|
var targetParts = response.data;
|
||||||
|
var excludedParts = response.excludedParts || []; // 공급업체 미입력 품목
|
||||||
|
|
||||||
|
// 3. 대상 품목 확인
|
||||||
|
if(!targetParts || targetParts.length == 0) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '알림',
|
||||||
|
text: '품의서를 생성할 품목이 없습니다.\n(단가와 공급업체가 모두 입력되고 품의서가 생성되지 않은 품목만 대상)',
|
||||||
|
icon: 'info'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 품의서 생성 확인
|
||||||
|
var partCount = targetParts.length;
|
||||||
|
var partListHtml = targetParts.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
// 공급업체 미입력으로 제외된 품목이 있는 경우 알림 추가
|
||||||
|
var excludedHtml = '';
|
||||||
|
if(excludedParts && excludedParts.length > 0) {
|
||||||
|
var excludedListHtml = excludedParts.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
excludedHtml = '<div style="margin-top:15px; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
||||||
|
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 공급업체 미입력으로 제외된 품목 (' + excludedParts.length + '건)</p>' +
|
||||||
|
'<div style="max-height:100px; overflow-y:auto; font-size:11px; color:#856404;">' +
|
||||||
|
excludedListHtml +
|
||||||
|
'</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: '품의서 생성',
|
||||||
|
html: '<div style="text-align:left;">' +
|
||||||
|
'<p>총 <strong>' + partCount + '건</strong>의 품목으로 품의서를 생성합니다.</p>' +
|
||||||
|
'<div style="max-height:150px; overflow-y:auto; border:1px solid #ddd; padding:10px; margin-top:10px; font-size:12px;">' +
|
||||||
|
partListHtml +
|
||||||
|
'</div>' +
|
||||||
|
excludedHtml +
|
||||||
|
'</div>',
|
||||||
|
icon: 'question',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: '생성',
|
||||||
|
cancelButtonText: '취소'
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
fn_executeCreateProposal(salesRequestObjid, targetParts);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 실패 시에도 공급업체 미입력 품목 정보 표시
|
||||||
|
var excludedParts = response.excludedParts || [];
|
||||||
|
var excludedHtml = '';
|
||||||
|
|
||||||
|
if(excludedParts && excludedParts.length > 0) {
|
||||||
|
var excludedListHtml = excludedParts.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
excludedHtml = '<br/><br/><div style="text-align:left; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
||||||
|
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 공급업체 미입력 품목 (' + excludedParts.length + '건)</p>' +
|
||||||
|
'<div style="max-height:150px; overflow-y:auto; font-size:11px; color:#856404;">' +
|
||||||
|
excludedListHtml +
|
||||||
|
'</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: '알림',
|
||||||
|
html: (response.message || '품목 조회 중 오류가 발생했습니다.') + excludedHtml,
|
||||||
|
icon: 'info'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '오류',
|
||||||
|
text: '서버 통신 중 오류가 발생했습니다.22',
|
||||||
|
icon: 'error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 품의서 생성 실행
|
||||||
|
*/
|
||||||
|
function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
||||||
|
$.ajax({
|
||||||
|
url: "/salesMng/createProposalFromPurchaseList.do",
|
||||||
|
type: "POST",
|
||||||
|
data: {
|
||||||
|
SALES_REQUEST_MASTER_OBJID: salesRequestObjid,
|
||||||
|
TARGET_PARTS: JSON.stringify(targetParts)
|
||||||
|
},
|
||||||
|
dataType: "json",
|
||||||
|
success: function(response) {
|
||||||
|
if(response.resultFlag === "S") {
|
||||||
|
Swal.fire({
|
||||||
|
title: '생성 완료',
|
||||||
|
text: '품의서가 생성되었습니다.\n품의서 관리에서 확인하세요.',
|
||||||
|
icon: 'success'
|
||||||
|
}).then(() => {
|
||||||
|
fn_search(); // 목록 새로고침
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Swal.fire({
|
||||||
|
title: '오류',
|
||||||
|
text: response.message || '품의서 생성 중 오류가 발생했습니다.',
|
||||||
|
icon: 'error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
Swal.fire({
|
||||||
|
title: '오류',
|
||||||
|
text: '서버 통신 중 오류가 발생했습니다.',
|
||||||
|
icon: 'error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="backcolor">
|
||||||
|
<form name="hiddenForm" id="hiddenForm" method="post">
|
||||||
|
<input type="hidden" name="OBJID" id="OBJID">
|
||||||
|
</form>
|
||||||
|
<form name="form1" id="form1" action="" method="post">
|
||||||
|
<input type="hidden" name="actionType" id="actionType" value="" />
|
||||||
|
<div class="min_part_enroll">
|
||||||
|
<div class="content-box">
|
||||||
|
<div class="content-box-s">
|
||||||
|
<div class="plm_menu_name_gdnsi">
|
||||||
|
<h2>
|
||||||
|
<span><%=menuName%></span>
|
||||||
|
</h2>
|
||||||
|
<div class="btnArea">
|
||||||
|
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||||
|
<input type="button" value="구매요청서작성" class="plm_btns" id="btnOrderReg">
|
||||||
|
<input type="button" value="품의서생성" class="plm_btns" id="btnReg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="plmSearchZon">
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<%-- 품번 활성화 --%>
|
||||||
|
<td class="align_r">
|
||||||
|
<label for="" class="">품번</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="SEARCH_PART_NO" id="SEARCH_PART_NO" class="select2-part" style="width:200px;">
|
||||||
|
<option value="">품번 선택</option>
|
||||||
|
</select>
|
||||||
|
<input type="hidden" name="SEARCH_PART_OBJID" id="SEARCH_PART_OBJID" value="">
|
||||||
|
</td>
|
||||||
|
<%-- 품명 활성화 --%>
|
||||||
|
<td class="align_r">
|
||||||
|
<label for="" class="">품명</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="SEARCH_PART_NAME" id="SEARCH_PART_NAME" class="select2-part" style="width:200px;">
|
||||||
|
<option value="">품명 선택</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<%-- 작성일 활성화 --%>
|
||||||
|
<td class="align_r"><label>작성일</label></td>
|
||||||
|
<td>
|
||||||
|
<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>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
<style>
|
||||||
|
.container::-webkit-scrollbar-thumb {background: linear-gradient(to bottom, #f5d78e, #f5d78e) !important;}
|
||||||
|
.container::-webkit-scrollbar-track {background-color: white !important;}
|
||||||
|
.container::-webkit-scrollbar-button { display: none !important;}
|
||||||
|
</style>
|
||||||
|
</html>
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
( CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "결재중" )
|
( CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "결재중" )
|
||||||
||CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "결재완료" )
|
||CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "결재완료" )
|
||||||
||CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "접수" )
|
||CommonUtils.checkNull(info.get("STATUS_TITLE")).equals( "접수" )
|
||||||
|
||CommonUtils.checkNull(info.get("STATUS")).equals( "confirmed" )
|
||||||
)
|
)
|
||||||
){
|
){
|
||||||
isModify = false; //수정불가
|
isModify = false; //수정불가
|
||||||
@@ -84,6 +85,11 @@ $(function(){
|
|||||||
fn_deleteRow();
|
fn_deleteRow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 확정 버튼 클릭
|
||||||
|
$("#btnConfirm").click(function(){
|
||||||
|
fn_confirm();
|
||||||
|
});
|
||||||
|
|
||||||
$("#btnAppr").click(function(){ //결재상신
|
$("#btnAppr").click(function(){ //결재상신
|
||||||
if(fnc_valitate("form1")){
|
if(fnc_valitate("form1")){
|
||||||
var objId = "${resultMap.OBJID}";
|
var objId = "${resultMap.OBJID}";
|
||||||
@@ -285,17 +291,16 @@ function fn_getSalesRequestTargetPartList(masterObjId,bomObjId){
|
|||||||
appendText += " <td class='align_c' type='number'>";
|
appendText += " <td class='align_c' type='number'>";
|
||||||
appendText += " <input type='number' name='QTY_"+rowObjId+"' value='"+QTY+"' reqTitle='수량' required style='text-align: center;'>";
|
appendText += " <input type='number' name='QTY_"+rowObjId+"' value='"+QTY+"' reqTitle='수량' required style='text-align: center;'>";
|
||||||
appendText += " </td>";
|
appendText += " </td>";
|
||||||
//appendText += " <td class='input_title'><label>공급업체</label></td>";
|
// 공급업체
|
||||||
//appendText += " <td class='align_l'>";
|
appendText += " <td class='align_l'>";
|
||||||
//appendText += " <select name='PARTNER_OBJID_"+rowObjId+"' id='PARTNER_OBJID_"+rowObjId+"' reqTitle='공급업체' type='select' class='select2' >";
|
appendText += " <select name='PARTNER_OBJID_"+rowObjId+"' id='PARTNER_OBJID_"+rowObjId+"' type='select' class='select2' style='width:100%;'>";
|
||||||
//appendText += " </select>";
|
appendText += " </select>";
|
||||||
//appendText += " </td>";
|
appendText += " </td>";
|
||||||
//appendText += " <td class='align_l'>";
|
// 단가
|
||||||
//appendText += " <input type='date' name='DELIVERY_REQUEST_DATE_"+rowObjId+"' value='"+DELIVERY_REQUEST_DATE+"'>";
|
var PARTNER_PRICE = fnc_checkNull(resultData[i].PARTNER_PRICE);
|
||||||
//appendText += " </td>";
|
appendText += " <td class='align_r'>";
|
||||||
//appendText += " <td class='align_l'>";
|
appendText += " <input type='text' name='PARTNER_PRICE_"+rowObjId+"' id='PARTNER_PRICE_"+rowObjId+"' value='"+PARTNER_PRICE+"' style='text-align: right; width:100%;'>";
|
||||||
//appendText += " <input type='text' name='REMARK_"+rowObjId+"' value='"+REMARK+"'>";
|
appendText += " </td>";
|
||||||
//appendText += " </td>";
|
|
||||||
appendText += " </tr>";
|
appendText += " </tr>";
|
||||||
|
|
||||||
|
|
||||||
@@ -316,10 +321,9 @@ function fn_getSalesRequestTargetPartList(masterObjId,bomObjId){
|
|||||||
var PART_NO = fnc_checkNull(resultData[i].PART_NO);
|
var PART_NO = fnc_checkNull(resultData[i].PART_NO);
|
||||||
var PART_NAME = fnc_checkNull(resultData[i].PART_NAME);
|
var PART_NAME = fnc_checkNull(resultData[i].PART_NAME);
|
||||||
|
|
||||||
// 공급업체 제거로 주석처리
|
// 공급업체 셋팅
|
||||||
// var PARTNER_OBJID = fnc_checkNull(resultData[i].PARTNER_OBJID);
|
var PARTNER_OBJID = fnc_checkNull(resultData[i].PARTNER_OBJID);
|
||||||
// fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, PARTNER_OBJID);
|
fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, PARTNER_OBJID);
|
||||||
// $("#PARTNER_OBJID_"+rowObjId).val(PARTNER_OBJID);
|
|
||||||
|
|
||||||
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId,"");
|
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId,"");
|
||||||
|
|
||||||
@@ -381,17 +385,15 @@ function fn_AddRow(){
|
|||||||
appendText += " <td class='align_c' value='QTY' type='number' readonly>";
|
appendText += " <td class='align_c' value='QTY' type='number' readonly>";
|
||||||
appendText += " <input type='number' name='QTY_"+rowObjId+"' reqTitle='수량' required style='text-align: center;'>";
|
appendText += " <input type='number' name='QTY_"+rowObjId+"' reqTitle='수량' required style='text-align: center;'>";
|
||||||
appendText += " </td>";
|
appendText += " </td>";
|
||||||
//appendText += " <td class='input_title'><label>공급업체</label></td>";
|
// 공급업체
|
||||||
//appendText += " <td class='align_l' value='PARTNER_OBJID'>";
|
appendText += " <td class='align_l' value='PARTNER_OBJID'>";
|
||||||
//appendText += " <select name='PARTNER_OBJID_"+rowObjId+"' id='PARTNER_OBJID_"+rowObjId+"' reqTitle='공급업체' type='select' class='select2'>";
|
appendText += " <select name='PARTNER_OBJID_"+rowObjId+"' id='PARTNER_OBJID_"+rowObjId+"' type='select' class='select2' style='width:100%;'>";
|
||||||
//appendText += " </select>";
|
appendText += " </select>";
|
||||||
//appendText += " </td>";
|
appendText += " </td>";
|
||||||
//appendText += " <td class='align_l' value='DELIVERY_REQUEST_DATE'>";
|
// 단가
|
||||||
//appendText += " <input type='date' name='DELIVERY_REQUEST_DATE_"+rowObjId+"'>";
|
appendText += " <td class='align_r' value='PARTNER_PRICE'>";
|
||||||
//appendText += " </td>";
|
appendText += " <input type='text' name='PARTNER_PRICE_"+rowObjId+"' id='PARTNER_PRICE_"+rowObjId+"' style='text-align: right; width:100%;'>";
|
||||||
//appendText += " <td class='align_l' value='REMARK'>";
|
appendText += " </td>";
|
||||||
//appendText += " <input type='text' name='REMARK_"+rowObjId+"'>";
|
|
||||||
//appendText += " </td>";
|
|
||||||
appendText += " </tr>";
|
appendText += " </tr>";
|
||||||
|
|
||||||
if(0 < $("#partListArea tr:first").lenght || typeof $("#partListArea tr:first").lenght != "undefined") {
|
if(0 < $("#partListArea tr:first").lenght || typeof $("#partListArea tr:first").lenght != "undefined") {
|
||||||
@@ -399,8 +401,8 @@ function fn_AddRow(){
|
|||||||
}else{
|
}else{
|
||||||
$("#partListArea").append(appendText);
|
$("#partListArea").append(appendText);
|
||||||
}
|
}
|
||||||
// 공급업체 제거로 주석처리
|
// 공급업체 셋팅
|
||||||
// fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, "");
|
fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, "");
|
||||||
fn_addBomPart("PART_OBJID_"+rowObjId, "", "PART_NAME_"+rowObjId, "");
|
fn_addBomPart("PART_OBJID_"+rowObjId, "", "PART_NAME_"+rowObjId, "");
|
||||||
fnc_datepick();
|
fnc_datepick();
|
||||||
$(".select2").select2();
|
$(".select2").select2();
|
||||||
@@ -498,6 +500,61 @@ function fn_Supply_save(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 구매요청서 확정 처리
|
||||||
|
function fn_confirm(){
|
||||||
|
var masterObjId = $("#SALES_REQUEST_MASTER_OBJID").val();
|
||||||
|
|
||||||
|
if(fnc_checkNull(masterObjId) == ""){
|
||||||
|
Swal.fire("먼저 저장해주세요.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 품목이 있는지 확인
|
||||||
|
if($("#partListArea tr").length < 1){
|
||||||
|
Swal.fire("품목이 없습니다. 먼저 품목을 추가하고 저장해주세요.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: '확정',
|
||||||
|
text: '확정하시겠습니까? 확정 후에는 수정이 불가능합니다.',
|
||||||
|
icon: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: '#5cb85c',
|
||||||
|
cancelButtonColor: '#d33',
|
||||||
|
confirmButtonText: '확정',
|
||||||
|
cancelButtonText: '취소'
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/salesMng/confirmSalesRequest.do",
|
||||||
|
data: { "SALES_REQUEST_MASTER_OBJID": masterObjId },
|
||||||
|
dataType: "json",
|
||||||
|
success: function(data){
|
||||||
|
if(data.result){
|
||||||
|
Swal.fire({
|
||||||
|
title: '완료',
|
||||||
|
text: '확정되었습니다.',
|
||||||
|
icon: 'success'
|
||||||
|
}).then(() => {
|
||||||
|
if(typeof opener.fn_search == "function"){
|
||||||
|
opener.fn_search();
|
||||||
|
}
|
||||||
|
self.close();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Swal.fire('오류', data.msg || '확정 처리 중 오류가 발생했습니다.', 'error');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(jqxhr, status, error){
|
||||||
|
Swal.fire('오류', '서버 통신 중 오류가 발생했습니다.', 'error');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// ★★★ 프로젝트 선택 시 M-BOM 품목 자동 로드 ★★★
|
// ★★★ 프로젝트 선택 시 M-BOM 품목 자동 로드 ★★★
|
||||||
function fn_loadMbomParts(projectObjId){
|
function fn_loadMbomParts(projectObjId){
|
||||||
if(fnc_checkNull(projectObjId) == "") return;
|
if(fnc_checkNull(projectObjId) == "") return;
|
||||||
@@ -539,12 +596,23 @@ function fn_loadMbomParts(projectObjId){
|
|||||||
appendText += " <td class='align_c'>";
|
appendText += " <td class='align_c'>";
|
||||||
appendText += " <input type='number' name='QTY_"+rowObjId+"' value='"+QTY+"' reqTitle='수량' required style='text-align: center;'>";
|
appendText += " <input type='number' name='QTY_"+rowObjId+"' value='"+QTY+"' reqTitle='수량' required style='text-align: center;'>";
|
||||||
appendText += " </td>";
|
appendText += " </td>";
|
||||||
|
// 공급업체
|
||||||
|
appendText += " <td class='align_l'>";
|
||||||
|
appendText += " <select name='PARTNER_OBJID_"+rowObjId+"' id='PARTNER_OBJID_"+rowObjId+"' type='select' class='select2' style='width:100%;'>";
|
||||||
|
appendText += " </select>";
|
||||||
|
appendText += " </td>";
|
||||||
|
// 단가
|
||||||
|
appendText += " <td class='align_r'>";
|
||||||
|
appendText += " <input type='text' name='PARTNER_PRICE_"+rowObjId+"' id='PARTNER_PRICE_"+rowObjId+"' style='text-align: right; width:100%;'>";
|
||||||
|
appendText += " </td>";
|
||||||
appendText += "</tr>";
|
appendText += "</tr>";
|
||||||
|
|
||||||
$("#partListArea").append(appendText);
|
$("#partListArea").append(appendText);
|
||||||
|
|
||||||
// 품번 드롭다운에 M-BOM 전체 품목 옵션 추가
|
// 품번 드롭다운에 M-BOM 전체 품목 옵션 추가
|
||||||
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId, "");
|
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId, "");
|
||||||
|
// 공급업체 셋팅
|
||||||
|
fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, "");
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".select2").select2();
|
$(".select2").select2();
|
||||||
@@ -633,6 +701,7 @@ function fn_callbackFnc(){
|
|||||||
<form name="form1" id="form1" action="" method="post">
|
<form name="form1" id="form1" action="" method="post">
|
||||||
<input type="hidden" name="SALES_REQUEST_MASTER_OBJID" id="SALES_REQUEST_MASTER_OBJID" value="${resultMap.OBJID}">
|
<input type="hidden" name="SALES_REQUEST_MASTER_OBJID" id="SALES_REQUEST_MASTER_OBJID" value="${resultMap.OBJID}">
|
||||||
<input type="hidden" name="STATUS" id="STATUS" value="${resultMap.STATUS}">
|
<input type="hidden" name="STATUS" id="STATUS" value="${resultMap.STATUS}">
|
||||||
|
<input type="hidden" name="DOC_TYPE" id="DOC_TYPE" value="${param.DOC_TYPE}">
|
||||||
<input type="hidden" name="TARGET_DRAWING_DOWNLOAD" id="TARGET_DRAWING_DOWNLOAD">
|
<input type="hidden" name="TARGET_DRAWING_DOWNLOAD" id="TARGET_DRAWING_DOWNLOAD">
|
||||||
<section>
|
<section>
|
||||||
<div class="plm_menu_name" style="display:flex;">
|
<div class="plm_menu_name" style="display:flex;">
|
||||||
@@ -731,12 +800,14 @@ function fn_callbackFnc(){
|
|||||||
<input type="button" value="행추가" class="plm_btns" id="btnAddRow" name="btnAddRow">
|
<input type="button" value="행추가" class="plm_btns" id="btnAddRow" name="btnAddRow">
|
||||||
<input type="button" value="행삭제" class="plm_btns" id="btnDeleteRow" name="btnDeleteRow">
|
<input type="button" value="행삭제" class="plm_btns" id="btnDeleteRow" name="btnDeleteRow">
|
||||||
<input type="button" value="저장" class="plm_btns" id="btnReg">
|
<input type="button" value="저장" class="plm_btns" id="btnReg">
|
||||||
|
<input type="button" value="닫기" class="plm_btns" onclick="window.close();">
|
||||||
|
<input type="button" value="확정" class="plm_btns" id="btnConfirm" style="background-color:#5cb85c; color:white;">
|
||||||
|
</div>
|
||||||
<% }else{ %>
|
<% }else{ %>
|
||||||
<!-- <input type="button" value="공급업체저장" class="plm_btns" id="btnSupplySave"> -->
|
<div class="plm_btn_wrap" style="padding:0 8 0 8; text-align: right;">
|
||||||
<% } %>
|
|
||||||
<input type="button" value="닫기" class="plm_btns" onclick="window.close();">
|
<input type="button" value="닫기" class="plm_btns" onclick="window.close();">
|
||||||
</div>
|
</div>
|
||||||
|
<% } %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="businessPopupFormWrap" style="z-index:99;">
|
<div id="businessPopupFormWrap" style="z-index:99;">
|
||||||
@@ -748,12 +819,14 @@ function fn_callbackFnc(){
|
|||||||
</tr> -->
|
</tr> -->
|
||||||
<tr>
|
<tr>
|
||||||
<td style="border-top:1px solid #ccc;">
|
<td style="border-top:1px solid #ccc;">
|
||||||
<div class="in_table_scroll_wrap _table1" style="height:22px;width:99.5%;">
|
<div class="in_table_scroll_wrap _table1" style="height:40px;width:100%;">
|
||||||
<table class="plm_table">
|
<table class="plm_table">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="30px">
|
<col width="30px">
|
||||||
<col width="200px">
|
<col width="180px">
|
||||||
<col width="200px">
|
<col width="180px">
|
||||||
|
<col width="80px">
|
||||||
|
<col width="150px">
|
||||||
<col width="100px">
|
<col width="100px">
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead>
|
<thead>
|
||||||
@@ -762,6 +835,8 @@ function fn_callbackFnc(){
|
|||||||
<td>품번</td>
|
<td>품번</td>
|
||||||
<td>품명</td>
|
<td>품명</td>
|
||||||
<td>수량</td>
|
<td>수량</td>
|
||||||
|
<td>공급업체</td>
|
||||||
|
<td>단가</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
</table>
|
</table>
|
||||||
@@ -770,8 +845,10 @@ function fn_callbackFnc(){
|
|||||||
<table class="plm_table">
|
<table class="plm_table">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="30px">
|
<col width="30px">
|
||||||
<col width="200px">
|
<col width="180px">
|
||||||
<col width="200px">
|
<col width="180px">
|
||||||
|
<col width="80px">
|
||||||
|
<col width="150px">
|
||||||
<col width="100px">
|
<col width="100px">
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<tbody id="partListArea">
|
<tbody id="partListArea">
|
||||||
|
|||||||
@@ -633,7 +633,7 @@ VALUES
|
|||||||
#{AREA_CD },
|
#{AREA_CD },
|
||||||
#{CUSTOMER_OBJID },
|
#{CUSTOMER_OBJID },
|
||||||
#{PAID_TYPE },
|
#{PAID_TYPE },
|
||||||
'PURCHASE_REQUEST'
|
COALESCE(NULLIF(#{DOC_TYPE}, ''), 'PURCHASE_REQUEST')
|
||||||
) ON CONFLICT (OBJID) DO
|
) ON CONFLICT (OBJID) DO
|
||||||
UPDATE
|
UPDATE
|
||||||
SET
|
SET
|
||||||
@@ -1117,6 +1117,15 @@ VALUES
|
|||||||
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = SRM.UNIT_NAME) AS UNIT_CODE_NAME,
|
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = SRM.UNIT_NAME) AS UNIT_CODE_NAME,
|
||||||
SRM.STATUS,
|
SRM.STATUS,
|
||||||
CASE
|
CASE
|
||||||
|
-- PURCHASE_REG(구매요청서작성) 페이지용 상태
|
||||||
|
WHEN SRM.DOC_TYPE = 'PURCHASE_REG' THEN
|
||||||
|
CASE
|
||||||
|
-- 품의서 생성 여부 확인 (PROPOSAL 타입의 SALES_REQUEST_MASTER가 연결되어 있는지)
|
||||||
|
WHEN EXISTS (SELECT 1 FROM SALES_REQUEST_MASTER P WHERE P.DOC_TYPE = 'PROPOSAL' AND P.PROJECT_NO = SRM.OBJID::VARCHAR) THEN '품의서생성'
|
||||||
|
WHEN SRM.STATUS = 'confirmed' THEN '확정'
|
||||||
|
ELSE '작성중'
|
||||||
|
END
|
||||||
|
-- 기존 PURCHASE_REQUEST용 상태
|
||||||
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) >= (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주완료'
|
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) >= (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주완료'
|
||||||
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) < (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주부분완료'
|
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) < (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주부분완료'
|
||||||
WHEN SRM.STATUS = 'create' THEN '등록'
|
WHEN SRM.STATUS = 'create' THEN '등록'
|
||||||
@@ -1125,7 +1134,7 @@ VALUES
|
|||||||
WHEN SRM.STATUS = 'approvalRequest' THEN '결재중'
|
WHEN SRM.STATUS = 'approvalRequest' THEN '결재중'
|
||||||
WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료'
|
WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료'
|
||||||
WHEN SRM.STATUS = 'reject' THEN '반려'
|
WHEN SRM.STATUS = 'reject' THEN '반려'
|
||||||
<!-- WHEN 'orderComplete' THEN '발주완료' -->
|
WHEN SRM.STATUS = 'confirmed' THEN '확정'
|
||||||
ELSE ''
|
ELSE ''
|
||||||
END STATUS_TITLE,
|
END STATUS_TITLE,
|
||||||
SRM.RECEIPT_USER_ID,
|
SRM.RECEIPT_USER_ID,
|
||||||
@@ -1224,7 +1233,15 @@ VALUES
|
|||||||
AND SRP.SUB_RNUM = 1 -->
|
AND SRP.SUB_RNUM = 1 -->
|
||||||
WHERE 1=1
|
WHERE 1=1
|
||||||
-- 구매요청서만 조회 (품의서 제외)
|
-- 구매요청서만 조회 (품의서 제외)
|
||||||
|
-- DOC_TYPE_FILTER가 있으면 해당 값으로 필터링, 없으면 기존 조건 적용
|
||||||
|
<choose>
|
||||||
|
<when test="DOC_TYPE_FILTER != null and !''.equals(DOC_TYPE_FILTER)">
|
||||||
|
AND SRM.DOC_TYPE = #{DOC_TYPE_FILTER}
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
AND (SRM.DOC_TYPE = 'PURCHASE_REQUEST' OR SRM.DOC_TYPE IS NULL)
|
AND (SRM.DOC_TYPE = 'PURCHASE_REQUEST' OR SRM.DOC_TYPE IS NULL)
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
<if test="Year !=null and Year != '' ">
|
<if test="Year !=null and Year != '' ">
|
||||||
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
|
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
|
||||||
</if>
|
</if>
|
||||||
@@ -1409,7 +1426,7 @@ VALUES
|
|||||||
,COALESCE(PM.PART_NO, BPQ.PART_NO, '') AS PART_NO
|
,COALESCE(PM.PART_NO, BPQ.PART_NO, '') AS PART_NO
|
||||||
,COALESCE(PM.PART_NAME, '') AS PART_NAME
|
,COALESCE(PM.PART_NAME, '') AS PART_NAME
|
||||||
,COALESCE(PM.PART_NAME, '') AS PART_FULL_NAME
|
,COALESCE(PM.PART_NAME, '') AS PART_FULL_NAME
|
||||||
,COALESCE(PM.STANDARD, '') AS SPEC
|
,COALESCE(PM.SPEC, '') AS SPEC
|
||||||
,BPQ.QTY AS ORDER_QTY
|
,BPQ.QTY AS ORDER_QTY
|
||||||
,COALESCE(PM.MAKER, '') AS MAKER
|
,COALESCE(PM.MAKER, '') AS MAKER
|
||||||
,'' AS REMARK
|
,'' AS REMARK
|
||||||
|
|||||||
@@ -194,6 +194,56 @@ public class SalesMngController {
|
|||||||
return paramMap;
|
return paramMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 구매요청서 작성 페이지 (새로운 페이지)
|
||||||
|
* - 구매요청서 작성 버튼 활성화
|
||||||
|
* - SOURCE_TYPE = 'PURCHASE_REG'인 데이터만 조회
|
||||||
|
*/
|
||||||
|
@RequestMapping("/salesMng/purchaseRequestRegList.do")
|
||||||
|
public String purchaseRequestRegList(HttpServletRequest request, @RequestParam Map paramMap){
|
||||||
|
String actionType = CommonUtils.checkNull(paramMap.get("actionType"));
|
||||||
|
String returnUrl = "/salesMng/purchaseRequestRegList";
|
||||||
|
Map code_map = new HashMap();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if("excel".equals(actionType)){
|
||||||
|
returnUrl = "/salesMng/purchaseRequestRegList";
|
||||||
|
}
|
||||||
|
|
||||||
|
paramMap.put("SEARCH_STATUS", "create,reject,approvalRequest,release,reception");
|
||||||
|
|
||||||
|
// 프로젝트번호 project_no
|
||||||
|
code_map.put("contract_objid",commonService.bizMakeOptionList("", (String)paramMap.get("contract_objid"),"common.getProjectNameList"));
|
||||||
|
// 상태
|
||||||
|
code_map.put("act_status",commonService.bizMakeOptionList("0001062", (String)paramMap.get("act_status"),"common.getCodeselect"));
|
||||||
|
// 접수자
|
||||||
|
code_map.put("receipt_writer", commonService.bizMakeOptionList("", (String)paramMap.get("writer"),"common.getUserselect"));
|
||||||
|
// 구분
|
||||||
|
code_map.put("request_cd",commonService.bizMakeOptionList("0000167", (String)paramMap.get("request_cd"),"common.getCodeselect"));
|
||||||
|
|
||||||
|
code_map.put("product_code",commonService.bizMakeOptionList("", (String)paramMap.get("product_code"),"common.getProductCodeselect"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
request.setAttribute("code_map", code_map);
|
||||||
|
|
||||||
|
return returnUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 구매요청서 작성 - 목록 페이징 (새로운 페이지용)
|
||||||
|
* - DOC_TYPE = 'PURCHASE_REG'인 데이터만 조회
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@RequestMapping("/salesMng/purchaseRequestRegGridList.do")
|
||||||
|
public Map getPurchaseRequestRegList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||||
|
// DOC_TYPE 필터 추가 (구매요청서 작성 페이지에서 생성된 데이터만)
|
||||||
|
paramMap.put("DOC_TYPE_FILTER", "PURCHASE_REG");
|
||||||
|
commonService.selectListPagingNew("salesMng.getSalesRequestMasterGridList", request, paramMap);
|
||||||
|
return paramMap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 구매의뢰서 조회
|
* 구매의뢰서 조회
|
||||||
*/
|
*/
|
||||||
@@ -419,6 +469,26 @@ public class SalesMngController {
|
|||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 구매요청서 확정 처리
|
||||||
|
* - STATUS를 'confirmed'로 변경하여 수정 불가능하게 함
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@RequestMapping("/salesMng/confirmSalesRequest.do")
|
||||||
|
public Map<String,Object> confirmSalesRequest(HttpServletRequest request, @RequestParam Map paramMap){
|
||||||
|
Map<String,Object> resultMap = new HashMap();
|
||||||
|
|
||||||
|
try{
|
||||||
|
resultMap = salesMngService.confirmSalesRequest(request, paramMap);
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
resultMap.put("result", false);
|
||||||
|
resultMap.put("msg", "확정 처리 중 오류가 발생했습니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 구매의뢰 공급업체 내용을 저장한다.
|
* 구매의뢰 공급업체 내용을 저장한다.
|
||||||
* @param request
|
* @param request
|
||||||
|
|||||||
@@ -409,6 +409,48 @@ public class SalesMngService {
|
|||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 구매요청서 확정 처리
|
||||||
|
* - STATUS를 'confirmed'로 변경하여 수정 불가능하게 함
|
||||||
|
*/
|
||||||
|
public Map confirmSalesRequest(HttpServletRequest request, Map paramMap){
|
||||||
|
Map resultMap = new HashMap();
|
||||||
|
SqlSession sqlSession = null;
|
||||||
|
|
||||||
|
try{
|
||||||
|
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||||
|
|
||||||
|
String masterObjId = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID"));
|
||||||
|
|
||||||
|
if("".equals(masterObjId)){
|
||||||
|
resultMap.put("result", false);
|
||||||
|
resultMap.put("msg", "구매요청서 정보가 없습니다.");
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map updateParam = new HashMap();
|
||||||
|
updateParam.put("OBJID", masterObjId);
|
||||||
|
updateParam.put("STATUS", "confirmed");
|
||||||
|
|
||||||
|
sqlSession.update("salesMng.changeStatusSalesRequestMaster", updateParam);
|
||||||
|
|
||||||
|
sqlSession.commit();
|
||||||
|
|
||||||
|
resultMap.put("result", true);
|
||||||
|
resultMap.put("msg", "확정되었습니다.");
|
||||||
|
|
||||||
|
}catch(Exception e){
|
||||||
|
if(sqlSession != null) sqlSession.rollback();
|
||||||
|
resultMap.put("result", false);
|
||||||
|
resultMap.put("msg", "확정 처리 중 오류가 발생했습니다.");
|
||||||
|
e.printStackTrace();
|
||||||
|
}finally{
|
||||||
|
if(sqlSession != null) sqlSession.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 구매의뢰 내용을 저장한다.
|
* 구매의뢰 내용을 저장한다.
|
||||||
* @param request
|
* @param request
|
||||||
|
|||||||
Reference in New Issue
Block a user