/*
* ContractMgmtController
*
* 1.0
*
* 2021.10.01
*
* Copyright ions
*/
package com.pms.salesmgmt.controller;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.pms.common.utils.CommonUtils;
import com.pms.salesmgmt.service.ContractMgmtService;
import com.pms.salesmgmt.service.SalesMgmtCommonService;
import com.pms.salesmgmt.service.SalesNcollectMgmtService;
import com.pms.service.CommonService;
/**
*
* 매출수금관리 Controller
*
* @since 2021.11.05
* @author min
* @version 1.0
*
*
* << 개정 이력 >>
*
* 수정일 수정자 수정내용
* ---------------- --------------------- --------------------------------------------------------
* 2021.11.05 민상익 최초작성
*
*
*
*/
@Controller
public class SalesNcollectMgmtController {
/** 계약관리 Service */
@Autowired
private ContractMgmtService contractMgmtService;
/** 매출수금 Service */
@Autowired
private SalesNcollectMgmtService salesNcollectMgmtService;
/** 영업관리 공통 Service */
@Autowired
private SalesMgmtCommonService salesMgmtCommonService;
@Autowired
private CommonService commonService;
/**
*
* 매출관리 메인 페이지 (메뉴 진입점)
*
* @param request
* @param paramMap - 검색 정보
* @return String
*
*
* << 개정 이력 >>
*
* 수정일 수정자 수정내용
* ---------------- --------------------- ----------------------------------------------------------
* 2025.10.15 수정 메뉴 URL 매핑 추가
*
*
*/
@RequestMapping(value = "/salesMgmt/salesMgmtList.do", method = RequestMethod.GET)
public String salesMgmtList(HttpServletRequest request
, @RequestParam Map paramMap) {
// /salesNcollectMgmt/contractList.do로 리다이렉트
return salesContractList(request, paramMap);
}
/**
*
* 매출관리 목록 페이지
*
* @param request
* @param paramMap - 검색 정보
* @return String
*/
@RequestMapping(value = "/revenueMgmt/revenueList.do", method = RequestMethod.GET)
public String showRevenueMgmtList(HttpServletRequest request, @RequestParam Map paramMap) {
try {
// 코드정보
Map codeMap = new HashMap();
// 주문유형
codeMap.put("orderTypeList" , commonService.bizMakeOptionList("0000167", "" , "common.getCodeselect"));
// 제품구분
codeMap.put("productTypeList", commonService.bizMakeOptionList("0000001", "", "common.getCodeselect"));
// 국내/해외
codeMap.put("nationList", commonService.bizMakeOptionList("0001219", "", "common.getCodeselect"));
//고객사
codeMap.put("customer_cd",commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")),"common.getsupplyselect"));
/*
// 유/무상
codeMap.put("paymentTypeList",
salesMgmtCommonService.bizMakeOptionList("0000156", "", "salesMgmtCommon.getCodeList"));
*/
// 수주상태
codeMap.put("orderStatusList", commonService.bizMakeOptionList("0000963", "", "common.getCodeselect"));
//codeMap.put("orderStatusList",
// commonService.bizMakeOptionList("0000932", "", "common.getCodeselect"));
// 출하지시상태 - 하드코딩
StringBuilder shippingStatusOptions = new StringBuilder();
shippingStatusOptions.append("");
shippingStatusOptions.append("");
shippingStatusOptions.append("");
codeMap.put("shippingStatusList", shippingStatusOptions.toString());
/*
// 출고방법
codeMap.put("shippingMethodList",
salesMgmtCommonService.bizMakeOptionList("SM", "", "salesMgmtCommon.getCodeList"));
*/
// 담당자
codeMap.put("managerList", commonService.bizMakeOptionList("", "", "common.getUserselect"));
//codeMap.put("managerList",
// salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
/*
// 인도조건
codeMap.put("incotermsList",
salesMgmtCommonService.bizMakeOptionList("IT", "", "salesMgmtCommon.getCodeList"));
*/
// 과세구분
codeMap.put("taxTypeList", commonService.bizMakeOptionList("0900215", "", "common.getCodeselect"));
request.setAttribute("codeMap", codeMap);
} catch (Exception e) {
e.printStackTrace();
}
return "/salesmgmt/salesMgmt/revenueMgmtList";
}
/**
*
* 신규 매출관리 목록 페이지
*
* @param request
* @param paramMap - 검색 정보
* @return String
*/
@RequestMapping(value = "/contractMgmt/salesMgmtList.do", method = RequestMethod.GET)
public String showSalesMgmtList(HttpServletRequest request, @RequestParam Map paramMap) {
try {
// 코드정보 (기존 로직과 동일하게 설정 가능)
Map codeMap = new HashMap();
// 주문유형 - 0000167 코드 사용 (판매, 개발, 수리, 개조)
codeMap.put("orderTypeList",
commonService.bizMakeOptionList("0000167", "", "common.getCodeselect"));
// 제품구분
codeMap.put("productTypeList",
commonService.bizMakeOptionList("0000001", "", "common.getCodeselect"));
// 국내/해외
codeMap.put("nationList",
commonService.bizMakeOptionList("0001219", "", "common.getCodeselect"));
// 고객사
codeMap.put("customer_cd", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")), "common.getsupplyselect"));
// 수주상태
codeMap.put("orderStatusList",
commonService.bizMakeOptionList("0000963", "", "common.getCodeselect"));
// 출하지시상태 - 하드코딩
StringBuilder shippingStatusOptions = new StringBuilder();
shippingStatusOptions.append("");
shippingStatusOptions.append("");
shippingStatusOptions.append("");
codeMap.put("shippingStatusList", shippingStatusOptions.toString());
// 담당자
codeMap.put("managerList", commonService.bizMakeOptionList("", "", "common.getUserselect"));
// 판매상태 - 0900207
codeMap.put("salesStatusList", commonService.bizMakeOptionList("0900207", "", "common.getCodeselect"));
request.setAttribute("codeMap", codeMap);
} catch (Exception e) {
e.printStackTrace();
}
return "/salesmgmt/salesMgmt/salesMgmtList";
}
/**
*
* 매출관리 그리드 데이터 조회 (Tabulator용)
*
* @param request
* @param paramMap - 검색 정보
* @return Map
*/
@ResponseBody
@RequestMapping(value = "/revenueMgmt/revenueGridList.do", method = RequestMethod.POST)
public Map salesMgmtGridList(HttpServletRequest request, @RequestParam Map paramMap) {
try {
commonService.selectListPagingNew("salesNcollectMgmt.getRevenueMgmtGridList", request, paramMap);
Map totals = salesNcollectMgmtService.getRevenueMgmtTotals(paramMap);
paramMap.put("TOTALS", totals);
} catch(Exception e) {
e.printStackTrace();
paramMap.put("RESULTLIST", new java.util.ArrayList<>());
Map emptyTotals = new HashMap();
emptyTotals.put("TOTAL_SUPPLY_PRICE", 0);
emptyTotals.put("TOTAL_VAT", 0);
emptyTotals.put("TOTAL_AMOUNT", 0);
paramMap.put("TOTALS", emptyTotals);
}
return paramMap;
}
/**
*
* 판매등록 폼 팝업
*
* @param request
* @param paramMap
* @return String
*/
@RequestMapping(value = "/salesMgmt/salesRegForm.do", method = RequestMethod.GET)
public String showSalesRegForm(HttpServletRequest request, @RequestParam Map paramMap) {
try {
// URL 인코딩 처리: 한글 프로젝트 번호 디코딩
if(paramMap.get("orderNo") != null) {
String orderNo = paramMap.get("orderNo").toString();
// 이미 디코딩된 경우와 구분하기 위해 %가 포함된 경우에만 디코딩
if(orderNo.contains("%")) {
try {
orderNo = java.net.URLDecoder.decode(orderNo, "UTF-8");
paramMap.put("orderNo", orderNo);
} catch(Exception ex) {
// 디코딩 실패시 원본 사용
ex.printStackTrace();
}
}
}
Map codeMap = new HashMap();
// 담당자
codeMap.put("managerList", commonService.bizMakeOptionList("", "", "common.getUserselect"));
// 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅
Map saleInfo = null;
String salesCurrency = "";
// contractObjId가 있으면 주문서 관리에서 넘어온 것 -> 수주 데이터 조회
if(paramMap.get("contractObjId") != null && !paramMap.get("contractObjId").equals("")) {
// 수주 데이터 조회 (CONTRACT_ITEM 테이블에서)
saleInfo = salesNcollectMgmtService.getOrderDataForSale(paramMap);
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
request.setAttribute("saleInfo", saleInfo);
request.setAttribute("orderInfo", saleInfo);
}
// orderNo가 있으면 판매 정보 조회
else if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
System.out.println("=== salesRegForm.do 파라미터 확인 ===");
System.out.println("orderNo: " + paramMap.get("orderNo"));
System.out.println("saleNo: " + paramMap.get("saleNo"));
System.out.println("remainingQuantity: " + paramMap.get("remainingQuantity"));
// saleNo가 "detail"이면 주문서 관리의 결재 정보 조회 모드
if(paramMap.get("saleNo") != null && "detail".equals(paramMap.get("saleNo"))) {
System.out.println("=== 주문서 관리 결재 정보 조회 모드 ===");
// PROJECT_MGMT에서 CONTRACT_OBJID 조회
Map projectInfo = salesNcollectMgmtService.getProjectInfo(paramMap);
Object contractObjId = projectInfo != null ? projectInfo.get("contract_objid") : null;
if(contractObjId == null && projectInfo != null) {
contractObjId = projectInfo.get("CONTRACT_OBJID");
}
System.out.println("CONTRACT_OBJID: " + contractObjId);
if(contractObjId != null) {
// CONTRACT_MGMT 상세 정보 조회
Map contractParam = new HashMap();
contractParam.put("objId", contractObjId);
Map contractInfo = commonService.selectOne("contractMgmt.getContractInfo", request, contractParam);
// PROJECT_MGMT에서 품번/품명/S/N/요청납기/고객요청사항/반납사유 조회
if(projectInfo != null) {
// 품번
if(contractInfo.get("PART_NO") == null || "".equals(contractInfo.get("PART_NO"))) {
contractInfo.put("PART_NO", projectInfo.get("part_no") != null ? projectInfo.get("part_no") : projectInfo.get("PART_NO"));
}
// 품명
if(contractInfo.get("PART_NAME") == null || "".equals(contractInfo.get("PART_NAME"))) {
contractInfo.put("PART_NAME", projectInfo.get("part_name") != null ? projectInfo.get("part_name") : projectInfo.get("PART_NAME"));
}
// S/N
Object serialNo = projectInfo.get("serial_no") != null ? projectInfo.get("serial_no") : projectInfo.get("SERIAL_NO");
contractInfo.put("SERIAL_NO", serialNo != null ? serialNo : "-");
// 요청납기
Object reqDelDate = projectInfo.get("req_del_date") != null ? projectInfo.get("req_del_date") : projectInfo.get("REQ_DEL_DATE");
contractInfo.put("REQ_DEL_DATE", reqDelDate != null ? reqDelDate : "-");
// 고객요청사항
Object customerRequest = projectInfo.get("customer_request") != null ? projectInfo.get("customer_request") : projectInfo.get("CUSTOMER_REQUEST");
contractInfo.put("CUSTOMER_REQUEST", customerRequest != null ? customerRequest : "-");
// 반납사유
Object returnReason = projectInfo.get("return_reason") != null ? projectInfo.get("return_reason") : projectInfo.get("RETURN_REASON");
contractInfo.put("RETURN_REASON", returnReason != null ? returnReason : "-");
}
// 결재 라인 정보 조회
Map approvalParam = new HashMap();
approvalParam.put("objId", contractObjId);
List