Merge pull request 'V20260210' (#164) from V20260210 into main

Reviewed-on: #164
This commit was merged in pull request #164.
This commit is contained in:
2026-03-10 05:19:24 +00:00
11 changed files with 438 additions and 269 deletions

View File

@@ -101,6 +101,7 @@ var columns = [
}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:0.9, title:'프로젝트번호', field:'PROJECT_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'부품품번', field:'COMPONENT_PART_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'},
@@ -130,8 +131,8 @@ var columns = [
},
{headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:0.9, title:'확정입고수량', field:'CONFIRMED_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'}
}
//,{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'}
];
function fn_search(){
@@ -329,7 +330,7 @@ function fn_purchaseClose(){
<div class="btnArea">
<input type="button" class="plm_btns" value="조회" id="btnSearch">
<!-- <input type="button" class="plm_btns" value="입고등록" id="btnAccept"> -->
<input type="button" class="plm_btns" value="매입마감" id="btnClose">
<!-- <input type="button" class="plm_btns" value="매입마감" id="btnClose"> -->
</div>
</div>

View File

@@ -84,25 +84,7 @@ input.date_icon {
letter-spacing: 20px;
border: none !important;
}
/* 결재란 */
.approval-table {
border-collapse: collapse;
float: right;
}
.approval-table th, .approval-table td {
border: 1px solid #000;
text-align: center;
padding: 3px 10px;
font-size: 11px;
width: 55px;
}
.approval-table th {
background-color: #d9d9d9;
font-weight: normal;
}
.approval-table td {
height: 35px;
}
/* 기본정보 라벨 */
.info-label {
font-weight: bold;
@@ -163,34 +145,6 @@ input.date_icon {
overflow-y: scroll !important;
max-height: 350px !important;
}
/* 합계 테이블 */
.total-table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
.total-table td {
border: 1px solid #000;
padding: 8px;
font-size: 12px;
}
.total-table .label {
text-align: center;
font-weight: bold;
width: 60%;
letter-spacing: 5px;
}
.total-table .currency {
width: 30px;
text-align: center;
font-weight: bold;
border-right: none !important;
}
.total-table .amount {
text-align: right;
font-weight: bold;
}
/* 버튼 영역 */
.btn-area {
text-align: left;
@@ -199,6 +153,54 @@ input.date_icon {
.graycolor {
background-color: #d9d9d9;
}
.total-section {
border: 1px solid #333;
width: 50%;
}
.total-section table {
width: 100%;
border-collapse: collapse;
}
.total-section td {
padding: 10px;
border: 1px solid #333;
font-size: 14px;
}
.total-section .label {
background-color: #e2efda;
font-weight: bold;
text-align: center;
width: 40%;
white-space: nowrap;
}
.total-section .amount {
text-align: right;
font-weight: bold;
}
.confidential-notice {
padding: 10px;
font-size: 12px;
text-align: right;
color: #cb3333;
}
/* jqGrid 내 Select2 스타일 */
.ui-jqgrid .select2-container {
z-index: 9999;
}
.ui-jqgrid .select2-container--default .select2-selection--single {
height: 24px;
min-height: 24px;
border: none;
background: transparent;
}
.ui-jqgrid .select2-container--default .select2-selection--single .select2-selection__rendered {
line-height: 24px;
padding-left: 4px;
font-size: 12px;
}
.ui-jqgrid .select2-container--default .select2-selection--single .select2-selection__arrow {
height: 24px;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
@@ -218,25 +220,23 @@ $(document).ready(function(){
$(this).val(fnc_addComma($(this).val().replace(/[^0-9]/g,"")));
});
// 결재라인 가져오기
fn_getApprLine();
var unit_cd = $.parseJSON($("#unit_cd").val());
var delivery_place_grid = $.parseJSON($("#delivery_place_grid").val());
// 그리드 초기화
grid = $("#grid1").jqGrid({
url: ""
,datatype: "local"
,data: $.parseJSON($("#gridDetailList").val())
,colNames: ["OBJID","PART_OBJID","PART_NO","No","품명","규격","수량","단위","배송지","단가","공급가액","비고"]
,colNames: ["OBJID","PART_OBJID","PART_NO","No","품명","규격","수량","단위","배송지","단가","공급가액","비고","입고요청일"]
,colModel: [
{name:"OBJID" , hidden: true, sortable:false, editable:false}
,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false}
,{name:"PART_NO" , hidden: true, sortable:false, editable:false}
,{name:"ROW_NUM" , width:40, align:"center", sortable:false, editable:false}
,{name:"PART_NAME" , width:170, align:"left", sortable:false, editable:false}
,{name:"SPEC" , width:180, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"ORDER_QTY" , width:60, align:"right", sortable:false, editable:<%= isModify %>
,{name:"PART_NAME" , width:160, align:"left", sortable:false, editable:false}
,{name:"SPEC" , width:120, align:"left", sortable:false, editable:false}
,{name:"ORDER_QTY" , width:50, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,editoptions:{
dataInit: function(e){ e.style.textAlign = "right"; }
@@ -247,18 +247,38 @@ $(document).ready(function(){
,edittype:"select", formatter:"select"
,editoptions:{ value: unit_cd }
}
,{name:"PART_DELIVERY_PLACE" , width:80, align:"center", sortable:false, editable:<%= isModify %>}
,{name:"PARTNER_PRICE" , width:90, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,{name:"PART_DELIVERY_PLACE", width:130, align:"center", sortable:false, editable:<%= isModify %>
,edittype:"select", formatter:"select"
,editoptions:{
value: delivery_place_grid
,defaultValue: "RPS"
,dataInit: function(elem) {
var $el = $(elem);
if(!$el.val() || $el.val() === '') {
$el.val('RPS');
}
setTimeout(function(){
$el.select2({
width: '100%'
,dropdownAutoWidth: true
,dropdownParent: $el.closest('.ui-jqgrid')
});
}, 50);
}
}
}
,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
,editoptions:{
dataInit: function(e){ e.style.textAlign = "right"; }
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
}
}
,{name:"SUPPLY_UNIT_PRICE", width:100, align:"right", sortable:false, editable:false
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,{name:"SUPPLY_UNIT_PRICE", width:90, align:"right", sortable:false, editable:false
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
}
,{name:"REMARK" , width:120, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"REMARK" , width:100, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"DELIVERY_REQUEST_DATE", width:90, align:"center", sortable:false, editable:<%= isModify %>}
]
,rownumbers : false
,viewrecords : true
@@ -346,17 +366,7 @@ $(document).ready(function(){
$("#btnAdd").click(function(){ fn_openPartMngListPopUp(); });
$("#btnDel").click(function(){ gridFn.delRow(); });
$("#btnSave").click(function(){ fn_save(); });
$("#btnAppr").click(function(){
if(fnc_valitate("form1")){
var objId = "${objId}";
if(""==grid.getRowData()){
Swal.fire('저장할 품목이 존재 하지 않습니다');
return;
}
var title = encodeURIComponent($("#TITLE").val());
window.open("/approval/registApproval.do?targetType=PURCHASE_ORDER_GENERAL&targetObjId="+objId+"&approvalTitle="+title,"registApproval","width=700,height=700");
}
});
<% }else{ %>
$("#btnDown").click(function(){
document.form1.action = "/purchaseOrder/purchaseOrderFormPopup_general.do?actType=DOWN&PURCHASE_ORDER_MASTER_OBJID=${objId}";
@@ -371,28 +381,6 @@ $(document).ready(function(){
gridFn.calcAllRows();
});
// 결재라인 가져오기
function fn_getApprLine(){
if('${objId}'!=''){
$.ajax({
url:"/common/getApprovalLine.do",
type:"POST",
data:{"objId":"${objId}"},
dataType:"json",
async:false,
success:function(data){
$.each(data.RESULT, function(i,o){
if(i==0){
$("#appr_writer").html(o.WRITER);
}
if(i < 3){
$("#appr"+(i+1)).html(o.TARGET_USER_NAME +"<br/>"+ (o.PROC_DATE!=undefined?o.PROC_DATE:""));
}
});
}
});
}
}
// 행추가 팝업
function fn_openPartMngListPopUp(){
@@ -418,6 +406,7 @@ function fn_addRow(rowData){
,"PARTNER_PRICE" : v2
,"SUPPLY_UNIT_PRICE": _rowSum
,"REMARK" : ""
,"DELIVERY_REQUEST_DATE" : ""
};
grid.addRowData(newId, addData);
@@ -538,12 +527,18 @@ var gridFn = {
var vat = Math.floor(totalSupplyPrice * 0.1);
var totalWithVat = totalSupplyPrice + vat;
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice));
$("#TOTAL_VAT").val(numberWithCommas(vat));
$("#TOTAL_PRICE_ALL").val(numberWithCommas(totalWithVat));
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommasDecimal(totalSupplyPrice));
$("#TOTAL_VAT").val(numberWithCommasDecimal(vat));
$("#TOTAL_PRICE_ALL").val(numberWithCommasDecimal(totalWithVat));
$("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원");
}
}
function numberWithCommasDecimal(num) {
var n = Number(num);
return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
// 라이브러리 로드 완료 후 dataLoaded 플래그 설정
$(window).on('load', function() {
setTimeout(function() {
@@ -762,18 +757,6 @@ function fn_generateAndUploadPdf(callback) {
발 주 서
</td>
<td colspan="2" style="border-left:none; padding:5px;">
<table class="approval-table">
<tr>
<th>담당자</th>
<th>부사장</th>
<th>대표이사</th>
</tr>
<tr>
<td id="appr1"></td>
<td id="appr2">전결</td>
<td id="appr3">전결</td>
</tr>
</table>
</td>
</tr>
@@ -783,7 +766,7 @@ function fn_generateAndUploadPdf(callback) {
<!-- 좌측: 기본정보 -->
<table style="width:100%; border:none;">
<tr>
<td class="info-label" style="width:120px; border:none;">1. 발 주 번 호 :</td>
<td class="info-label" style="width:40%; border:none; white-space:nowrap;">1. 발 주 번 호 :</td>
<td style="border:none;">
<input type="text" name="PURCHASE_ORDER_NO" id="PURCHASE_ORDER_NO" value="${info.PURCHASE_ORDER_NO}" readonly style="border:none; width:200px; font-weight:bold;"/>
<!-- <span style="color:#888; font-size:10px;">(자동생성)</span> -->
@@ -804,7 +787,7 @@ function fn_generateAndUploadPdf(callback) {
</select>
</td>
</tr>
<tr>
<!-- <tr>
<td class="info-label" style="border:none;">4. 납 기 일 :</td>
<td style="border:none;">
<input type="text" name="DELIVERY_DATE" id="DELIVERY_DATE" class="date_icon" value="${info.DELIVERY_DATE}" <% if(!isModify){ %>readonly<% } %> style="width:100%;"/>
@@ -818,20 +801,20 @@ function fn_generateAndUploadPdf(callback) {
${code_map.delivery_place_cd}
</select>
</td>
</tr> -->
<tr>
<td class="info-label" style="border:none;">4. 합 계 금 액(VAT별도) :</td>
<td style="border:none;"><span id="TOTAL_AMOUNT_DISPLAY" style="font-weight:bold;"></span></td>
</tr>
<tr>
<td class="info-label" style="border:none;">6. 결 제 방 식 :</td>
<td class="info-label" style="border:none;">5. 결 제 방 식 :</td>
<td style="border:none;">
<select name="PAYMENT_TERMS" id="PAYMENT_TERMS" class="select2" style="width:100%;" <% if(!isModify){ %>disabled<% } %>>
<option value="">선택</option>
${code_map.payment_terms_cd}
</select>
</td>
</tr>
<tr>
<td class="info-label" style="border:none;">7. 합 계 금 액 :</td>
<td style="border:none;"></td>
</tr>
</tr>
</table>
</td>
<td colspan="3" style="vertical-align:top; padding:10px;">
@@ -842,7 +825,7 @@ function fn_generateAndUploadPdf(callback) {
<td rowspan="4" class="graycolor" style="width:50px; text-align:center; font-weight:bold; border:1px solid #000; letter-spacing:3px; vertical-align:middle; font-size:11px;">담 당 자</td>
<td style="border:1px solid #000; padding:2px 6px; text-align:center;">
<% if(isModify){ %>
<select name="SALES_MNG_USER_ID" id="SALES_MNG_USER_ID" style="width:150px; font-size:10px;">
<select name="SALES_MNG_USER_ID" id="SALES_MNG_USER_ID" class="select2" style="width:150px; font-size:10px;">
<option value="">선택</option>
<%
for(int u=0; u<userList.size(); u++){
@@ -874,7 +857,7 @@ function fn_generateAndUploadPdf(callback) {
</tr>
<tr>
<td style="border:1px solid #000; padding:2px 6px; text-align:center; position:relative;">
<span id="manager1_info">(<span id="display_phone1">${info.MANAGER_PHONE}</span> / <span id="display_email1">${info.MANAGER_EMAIL}</span>)</span>
<span id="manager1_info" style="font-size:12px;">(<span id="display_phone1">${info.MANAGER_PHONE}</span> / <span id="display_email1">${info.MANAGER_EMAIL}</span>)</span>
<!-- 직인 이미지 -->
<img src="<%=request.getContextPath()%>/images/stamp_rps.png" alt="직인" style="position:absolute; right:5px; top:-10px; width:45px; height:45px; opacity:0.9;" onerror="this.style.display='none'">
</td>
@@ -882,7 +865,7 @@ function fn_generateAndUploadPdf(callback) {
<tr>
<td style="border:1px solid #000; padding:2px 6px; text-align:center;">
<% if(isModify){ %>
<select name="SALES_MNG_USER_ID2" id="SALES_MNG_USER_ID2" style="width:150px; font-size:10px;">
<select name="SALES_MNG_USER_ID2" id="SALES_MNG_USER_ID2" class="select2" style="width:150px; font-size:10px;">
<option value="">선택</option>
<%
for(int u=0; u<userList.size(); u++){
@@ -914,52 +897,30 @@ function fn_generateAndUploadPdf(callback) {
</tr>
<tr>
<td style="border:1px solid #000; padding:2px 6px; text-align:center;">
<span id="manager2_info">(<span id="display_phone2">${info.MANAGER_PHONE2}</span> / <span id="display_email2">${info.MANAGER_EMAIL2}</span>)</span>
<span id="manager2_info" style="font-size:12px;">(<span id="display_phone2">${info.MANAGER_PHONE2}</span> / <span id="display_email2">${info.MANAGER_EMAIL2}</span>)</span>
</td>
</tr>
<tr>
<td colspan="2" class="company-name">㈜알피에스 대표이사 이 동 헌</td>
<td colspan="2" style="border:1px solid #000; border-bottom:none; padding:5px; text-align:center; font-size:14px; font-weight:bold;">㈜알피에스 대표이사 이 동 헌</td>
</tr>
<tr>
<td colspan="2" class="company-address">대전광역시 유성구 국제과학10로8(둔곡동 402-4번지)</td>
<td colspan="2" style="border:1px solid #000; border-top:none; padding:5px; text-align:center; font-size:11px; font-weight:bold;">대전광역시 유성구 국제과학10로8(둔곡동 402-4번지)</td>
</tr>
<!-- <tr>
<td colspan="2" class="company-address">대전광역시 유성구 국제과학10로8(둔곡동 402-4번지)</td>
</tr> -->
</table>
<!-- 요청사항 박스 -->
<div class="request-box">
<!-- <div class="request-box">
<span style="font-weight:bold;">요청사항 :</span><br/>
<textarea name="REQUEST_CONTENT" id="REQUEST_CONTENT" style="width:100%; height:40px; border:none; resize:none; margin-top:5px;" <% if(!isModify){ %>readonly<% } %>>${info.REQUEST_CONTENT}</textarea>
</div>
</div> -->
</td>
</tr>
</table>
<!-- 그리드 영역 -->
<div id="plm_table_wrap1" style="width:100%; margin:0;">
<table id="grid1"></table>
<textarea style="display:none;" id="gridDetailList">${gridDetailList}<c:if test="${empty gridDetailList}">[]</c:if></textarea>
</div>
<!-- 합계 테이블 -->
<table class="total-table" style="width:100%; margin:10px 0 0 0;">
<tr>
<td class="label">공 급 가 액</td>
<td class="currency" style="border-right:none;">₩</td>
<td class="amount" style="border-left:none;"><input type="text" name="TOTAL_SUPPLY_PRICE" id="TOTAL_SUPPLY_PRICE" value="" readonly style="border:none; text-align:right; width:100%; font-weight:bold;"/></td>
</tr>
<tr>
<td class="label">부 가 세</td>
<td class="currency" style="border-right:none;">₩</td>
<td class="amount" style="border-left:none;"><input type="text" name="TOTAL_VAT" id="TOTAL_VAT" value="" readonly style="border:none; text-align:right; width:100%; font-weight:bold;"/></td>
</tr>
<tr>
<td class="label graycolor">총 결 제 금 액 (VAT포함)</td>
<td class="currency" style="border-right:none;">₩</td>
<td class="amount" style="border-left:none;"><input type="text" name="TOTAL_PRICE_ALL" id="TOTAL_PRICE_ALL" value="" readonly style="border:none; text-align:right; width:100%; font-weight:bold; font-size:14px;"/></td>
</tr>
</table>
<!-- 버튼 영역 (하단) -->
<div style="width:100%; margin:15px 0; text-align:right;">
<% if(isModify){ %>
@@ -969,8 +930,32 @@ function fn_generateAndUploadPdf(callback) {
<% } %>
<input type="button" value="닫기" class="" style="background:#dfeffc; padding:5px 15px; cursor:pointer; font-size:14px; border-radius: 5px;" onclick="window.close();">
</div>
<!-- 그리드 영역 -->
<div id="plm_table_wrap1" style="width:100%; margin:0;">
<table id="grid1"></table>
<textarea style="display:none;" id="gridDetailList">${gridDetailList}<c:if test="${empty gridDetailList}">[]</c:if></textarea>
</div>
<!-- 합계 영역 -->
<div class="total-section" style="margin-left:auto;">
<table>
<tr>
<td class="label">총 공 급 가 액 (VAT별도)</td>
<td class="amount"><input type="text" name="TOTAL_SUPPLY_PRICE" id="TOTAL_SUPPLY_PRICE" value="" readonly style="border:none; text-align:right; width:100%; font-weight:bold; font-size:16px;"/></td>
</tr>
</table>
</div>
<input type="hidden" name="TOTAL_VAT" id="TOTAL_VAT" value=""/>
<input type="hidden" name="TOTAL_PRICE_ALL" id="TOTAL_PRICE_ALL" value=""/>
<!-- 보안문서 안내 -->
<div class="confidential-notice">
※ 보안문서(CONFIDENTIAL) : ㈜알피에스의 승인(APPROVAL) 없이 외부로 반출하거나 공유 할수 없습니다.
</div>
<textarea style="display:none;" id="unit_cd">${code_map.unit_cd}</textarea>
<textarea style="display:none;" id="delivery_place_grid">${code_map.delivery_place_grid}</textarea>
</form>
</body>
</html>

View File

@@ -65,23 +65,6 @@
font-size: 28px;
font-weight: bold;
}
.approval-box {
border: 1px solid #333;
width: 200px;
}
.approval-box table {
width: 100%;
border-collapse: collapse;
}
.approval-box th, .approval-box td {
border: 1px solid #333;
text-align: center;
padding: 5px;
font-size: 12px;
}
.approval-box th {
background-color: #f0f0f0;
}
.po-info-table {
width: 100%;
border-collapse: collapse;
@@ -95,7 +78,8 @@
.po-info-table .label {
/* background-color: #f5f5f5; */
font-weight: bold;
width: 20%;
width: 35%;
white-space: nowrap;
}
.po-manager-box {
border: 1px solid #333;
@@ -215,9 +199,6 @@ $(document).ready(function(){
$("#display_email2").text(email);
});
// 결재라인 가져오기
fn_getApprLine();
var unit_cd = $.parseJSON($("#unit_cd").val());
// 그리드 초기화 - 외주가공 발주서용 컬럼
@@ -225,15 +206,15 @@ $(document).ready(function(){
url: ""
,datatype: "local"
,data: $.parseJSON($("#gridDetailList").val())
,colNames: ["OBJID","PART_OBJID","No","발주번호","업체명","제품명","부품명","수량","단위","단가","합계","작업지시번호","부품품번","납기요청"]
,colNames: ["OBJID","PART_OBJID","No","업체명","제품명","부품명","수량","단위","단가","합계","작업지시번호","부품품번","입고요청"]
,colModel: [
{name:"OBJID" , hidden: true, sortable:false, editable:false}
,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false}
,{name:"ROW_NUM" , width:35, align:"center", sortable:false, editable:false}
,{name:"PURCHASE_ORDER_NO" , width:110, align:"center", sortable:false, editable:false}
,{name:"PARTNER_NAME" , width:80, align:"center", sortable:false, editable:false}
//,{name:"PURCHASE_ORDER_NO" , width:110, align:"center", sortable:false, editable:false}
,{name:"PARTNER_NAME" , width:130, align:"left", sortable:false, editable:false}
,{name:"PRODUCT_NAME" , width:160, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"PART_NAME" , width:80, align:"center", sortable:false, editable:false}
,{name:"PART_NAME" , width:140, align:"left", sortable:false, editable:false}
,{name:"ORDER_QTY" , width:50, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,editoptions:{
@@ -246,14 +227,14 @@ $(document).ready(function(){
,editoptions:{ value: unit_cd }
}
,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
,editoptions:{
dataInit: function(e){ e.style.textAlign = "right"; }
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
}
}
,{name:"SUPPLY_UNIT_PRICE" , width:90, align:"right", sortable:false, editable:false
,formatter:"integer", formatoptions:{thousandsSeparator:","}
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
}
,{name:"WORK_ORDER_NO" , width:100, align:"center", sortable:false, editable:<%= isModify %>}
,{name:"PART_NO" , width:90, align:"center", sortable:false, editable:false}
@@ -306,17 +287,6 @@ $(document).ready(function(){
$("#btnAdd").click(function(){ fn_openPartMngListPopUp(); });
$("#btnDel").click(function(){ gridFn.delRow(); });
$("#btnSave").click(function(){ fn_save(); });
$("#btnAppr").click(function(){
if(fnc_valitate("form1")){
var objId = "${objId}";
if(""==grid.getRowData()){
Swal.fire('저장할 품목이 존재 하지 않습니다');
return;
}
var title = encodeURIComponent("외주가공 발주서");
window.open("/approval/registApproval.do?targetType=PURCHASE_ORDER_OUTSOURCING&targetObjId="+objId+"&approvalTitle="+title,"registApproval","width=700,height=700");
}
});
<% }else{ %>
$("#btnDown").click(function(){
document.form1.action = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do?actType=DOWN&PURCHASE_ORDER_MASTER_OBJID=${objId}";
@@ -331,29 +301,6 @@ $(document).ready(function(){
gridFn.footerSummary();
});
// 결재라인 가져오기
function fn_getApprLine(){
if('${objId}'!=''){
$.ajax({
url:"/common/getApprovalLine.do",
type:"POST",
data:{"objId":"${objId}"},
dataType:"json",
async:false,
success:function(data){
$.each(data.RESULT, function(i,o){
if(i==0){
$("#appr_writer").html(o.WRITER);
}
if(i < 3){
$("#appr"+(i+1)).html(o.TARGET_USER_NAME +"<br/>"+ (o.PROC_DATE!=undefined?o.PROC_DATE:""));
}
});
}
});
}
}
// 행추가 팝업
function fn_openPartMngListPopUp(){
var url = "/partMng/partMngListPopUp.do?callbackFnc=fn_addRow&callType=purchaseOrder";
@@ -499,9 +446,15 @@ var gridFn = {
});
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice));
$("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원");
}
}
function numberWithCommasDecimal(num) {
var n = Number(num);
return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
// 라이브러리 로드 완료 후 dataLoaded 플래그 설정
$(window).on('load', function() {
setTimeout(function() {
@@ -718,20 +671,6 @@ function fn_generateAndUploadPdf(callback) {
<div class="po-company-title">㈜ 알피에스</div>
<div class="po-title">외주가공 발주서</div>
</div>
<div class="approval-box">
<table>
<tr>
<th>담당자</th>
<th>부사장</th>
<th>대표이사</th>
</tr>
<tr>
<td id="appr1" style="height:40px;">${info.MANAGER_NAME}</td>
<td id="appr2"></td>
<td id="appr3">전 결</td>
</tr>
</table>
</div>
</div>
<!-- 기본정보 + 담당자 영역 -->
@@ -757,6 +696,10 @@ function fn_generateAndUploadPdf(callback) {
</select>
</td>
</tr>
<tr>
<td class="label">4. 합계금액(VAT별도) :</td>
<td><span id="TOTAL_AMOUNT_DISPLAY" style="width:100%; display:inline-block;"></span></td>
</tr>
</table>
</div>
@@ -767,7 +710,7 @@ function fn_generateAndUploadPdf(callback) {
<td rowspan="4" style="width:25%; text-align:center; font-weight:bold; border:1px solid #000; letter-spacing:3px; vertical-align:middle; font-size:11px; background-color:#d9d9d9;">담 당 자</td>
<td style="border:1px solid #000; padding:2px 6px; text-align:center;">
<% if(isModify){ %>
<select name="SALES_MNG_USER_ID" id="SALES_MNG_USER_ID" style="width:150px; font-size:10px;">
<select name="SALES_MNG_USER_ID" id="SALES_MNG_USER_ID" class="select2" style="width:150px; font-size:10px;">
<option value="">선택</option>
<%
for(int u=0; u<userList.size(); u++){
@@ -802,7 +745,7 @@ function fn_generateAndUploadPdf(callback) {
<tr>
<td style="border:1px solid #000; padding:2px 6px; text-align:center;">
<% if(isModify){ %>
<select name="SALES_MNG_USER_ID2" id="SALES_MNG_USER_ID2" style="width:150px; font-size:10px;">
<select name="SALES_MNG_USER_ID2" id="SALES_MNG_USER_ID2" class="select2" style="width:150px; font-size:10px;">
<option value="">선택</option>
<%
for(int u=0; u<userList.size(); u++){
@@ -843,7 +786,7 @@ function fn_generateAndUploadPdf(callback) {
</div>
<!-- 상세내역 안내 -->
<div class="detail-label">[아래 상세내역 리스트 확인]</div>
<!-- <div class="detail-label">[아래 상세내역 리스트 확인]</div> -->
<!-- 버튼 영역 -->
<div style="text-align:right; margin-bottom:10px;">
@@ -867,7 +810,7 @@ function fn_generateAndUploadPdf(callback) {
<div class="total-section" style="margin-left:auto;">
<table>
<tr>
<td class="label">총 공 급 가 액</td>
<td class="label">총 공 급 가 액 (VAT별도)</td>
<td class="amount"><input type="text" name="TOTAL_SUPPLY_PRICE" id="TOTAL_SUPPLY_PRICE" value="" readonly style="border:none; text-align:right; width:100%; font-weight:bold; font-size:16px;"/></td>
</tr>
</table>

View File

@@ -694,7 +694,7 @@ function fn_save(){
</div>
<!-- 하단 기본정보 (수신및참조, 시행자, 시행일자, 제목) - 입력 가능 -->
<div class="sub-info-section">
<!-- <div class="sub-info-section">
<table class="info-table" style="border-top: none;">
<tr>
<td class="label">수신및참조</td>
@@ -721,7 +721,7 @@ function fn_save(){
</td>
</tr>
</table>
</div>
</div> -->
<!-- 개정 정보 -->
<div class="revision-info">[구매품의서 개정 : 22.05.17]</div>
@@ -800,15 +800,18 @@ function fn_save(){
<table class="item-table">
<thead>
<tr>
<th style="width:40px;">No.</th>
<th style="width:150px;">목 적</th>
<th style="width:250px;">품명 / 규격</th>
<th style="width:100px;">납 기 일</th>
<th style="width:100px;">업 체 명</th>
<th style="width:60px;">수량</th>
<th style="width:50px;">단위</th>
<th style="width:80px;">단가</th>
<th style="width:100px;">합 계</th>
<th style="width:30px;">No.</th>
<th style="width:80px;">목 적</th>
<th style="width:100px;">제 품 명</th>
<th style="width:110px;">부 품 명</th>
<th style="width:110px;"> 명</th>
<th style="width:80px;">규 격</th>
<th style="width:80px;">업 체 명</th>
<th style="width:90px;">입고요청일</th>
<th style="width:50px;">수량</th>
<th style="width:45px;">단위</th>
<th style="width:70px;">단가</th>
<th style="width:85px;">합 계</th>
</tr>
</thead>
<tbody>
@@ -820,16 +823,14 @@ function fn_save(){
<td class="text-left">
<input type="text" name="REMARK_${item.OBJID}" class="part-remark no-print-border" value="${item.REMARK}" style="width:100%; box-sizing:border-box;"/>
</td>
<td class="text-left">
${item.PART_NAME}
<c:if test="${not empty item.SPEC}">
<br/>(${item.SPEC})
</c:if>
</td>
<td class="text-left">${item.PROJECT_PRODUCT_NAME}</td>
<td class="text-left">${item.COMPONENT_PART_NAME}</td>
<td class="text-left">${item.DISPLAY_PART_NAME}</td>
<td class="text-left">${item.DISPLAY_SPEC}</td>
<td class="text-left">${item.VENDOR_NAME}</td>
<td class="text-center">
<input type="text" name="DELIVERY_DATE_${item.OBJID}" class="part-delivery-date date_icon no-print-border" value="${item.DELIVERY_REQUEST_DATE_TITLE}" style="width:100%; box-sizing:border-box;" autocomplete="off"/>
</td>
<td class="text-left">${item.VENDOR_NAME}</td>
<td class="text-right"><fmt:formatNumber value="${item.QTY}" pattern="#,###"/></td>
<td>
<select name="UNIT_${item.OBJID}" class="part-unit no-print-border" style="width:100%; box-sizing:border-box;">
@@ -840,14 +841,14 @@ function fn_save(){
$(function(){ $("select[name='UNIT_${item.OBJID}']").val("${item.UNIT}"); });
</script>
</td>
<td class="text-right"><fmt:formatNumber value="${item.UNIT_PRICE}" pattern="#,###"/></td>
<td class="text-right"><fmt:formatNumber value="${item.TOTAL_PRICE}" pattern="#,###"/></td>
<td class="text-right"><fmt:formatNumber value="${item.UNIT_PRICE}" pattern="#,##0.00"/></td>
<td class="text-right"><fmt:formatNumber value="${item.TOTAL_PRICE}" pattern="#,##0.00"/></td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="9" style="height:100px;">등록된 품목이 없습니다.</td>
<td colspan="12" style="height:100px;">등록된 품목이 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
@@ -864,6 +865,9 @@ function fn_save(){
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</c:forEach>
</c:if>
@@ -872,14 +876,14 @@ function fn_save(){
</div>
<!-- 참조문서 섹션 -->
<div class="reference-section">
<!-- <div class="reference-section">
<table class="reference-table">
<tr style="height: 50px;">
<td class="label" style="vertical-align: middle; width: 150px;">참 조 문 서</td>
<td style="vertical-align: top; padding: 10px;">선택된 문서가 없습니다.</td>
</tr>
</table>
</div>
</div> -->
</div>
<!-- 버튼 영역 -->

View File

@@ -322,8 +322,83 @@
});
});
// 거래명세서 생성 버튼
$("#btnTransactionStatement").click(function(){
fn_printTransactionStatement();
});
fn_search();
});
// 거래명세서 생성 함수
function fn_printTransactionStatement() {
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length === 0) {
alert("거래명세서를 출력할 항목을 선택해주세요.");
return;
}
// 같은 거래처인지 확인
var firstCustomer = selectedData[0].CUSTOMER;
for(var i = 1; i < selectedData.length; i++) {
if(selectedData[i].CUSTOMER !== firstCustomer) {
alert("같은 거래처만 선택 가능합니다.\n선택한 거래처: " + firstCustomer + ", " + selectedData[i].CUSTOMER);
return;
}
}
// 이미 거래명세서가 생성된 항목이 있는지 확인
var alreadyCreated = selectedData.filter(function(row) {
return row.HAS_TRANSACTION_STATEMENT === 'Y';
});
if(alreadyCreated.length > 0) {
var projectNames = alreadyCreated.map(function(row) { return row.PROJECT_NO; }).join(', ');
alert("이미 거래명세서가 생성된 항목이 있습니다.\n(" + projectNames + ")\n파란 폴더 아이콘을 클릭하여 확인해주세요.");
return;
}
localStorage.setItem('loadSavedStatement', 'false');
localStorage.setItem('transactionStatementData', JSON.stringify(selectedData));
var projectNos = selectedData.map(function(row) { return row.PROJECT_NO; }).join(',');
var projectObjids = selectedData.map(function(row) { return row.OBJID; }).join(',');
var popup_width = 1000;
var popup_height = 800;
var url = "/salesMgmt/transactionStatementForm.do?projectNos=" + encodeURIComponent(projectNos)
+ "&projectObjids=" + encodeURIComponent(projectObjids);
fn_centerPopup(popup_width, popup_height, url);
}
// 거래명세서 팝업 열기 (단일 프로젝트 - 아이콘 클릭)
function fn_openTransactionStatementPopup(projectNo, projectObjid, hasStatement) {
if(!projectNo) { alert("프로젝트 번호가 없습니다."); return; }
if(!hasStatement) { return; }
var allData = _tabulGrid.getData();
var projectData = allData.filter(function(row) { return row.PROJECT_NO === projectNo; });
if(projectData.length === 0) { alert("프로젝트 데이터를 찾을 수 없습니다."); return; }
localStorage.setItem('transactionStatementData', JSON.stringify(projectData));
localStorage.setItem('loadSavedStatement', 'true');
var url = "/salesMgmt/transactionStatementForm.do?projectNos=" + encodeURIComponent(projectNo)
+ "&projectObjids=" + encodeURIComponent(projectObjid);
var popup_width = 900;
var popup_height = 800;
var left = (screen.width - popup_width) / 2;
var top = (screen.height - popup_height) / 2;
var popup = window.open(url, "transactionStatement", "width=" + popup_width + ",height=" + popup_height + ",left=" + left + ",top=" + top + ",scrollbars=yes,resizable=yes");
var checkPopup = setInterval(function() {
if(popup.closed) {
clearInterval(checkPopup);
fn_search();
}
}, 500);
}
</script>
<script type="text/javascript">
@@ -459,6 +534,29 @@ var columns = [
{headerHozAlign : 'center', hozAlign : 'left', width : '140', title : '수출신고필증신고번호', field : 'EXPORT_DECL_NO'},
// 24. 선적일자
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '선적일자', field : 'LOADING_DATE'},
// 25. 거래명세서
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '거래명세서', field : 'TRANSACTION_STATEMENT',
formatter: function(cell) {
var data = cell.getRow().getData();
var projectNo = data.PROJECT_NO;
var hasStatement = data.HAS_TRANSACTION_STATEMENT === 'Y';
if(projectNo) {
if(hasStatement) {
return '<img src="/images/folder_blue.png" height="25px" width="25px" style="cursor:pointer;" title="거래명세서 보기">';
} else {
return '<img src="/images/file_empty.png" height="25px" width="25px" style="cursor:pointer;" title="거래명세서 미작성">';
}
}
return '';
},
cellClick: function(e, cell) {
var data = cell.getRow().getData();
var projectNo = data.PROJECT_NO;
var projectObjid = data.OBJID;
var hasStatement = data.HAS_TRANSACTION_STATEMENT === 'Y';
if(projectNo) fn_openTransactionStatementPopup(projectNo, projectObjid, hasStatement);
}
},
/* 주석처리된 컬럼 - 필요시 활성화 */
/*
@@ -653,6 +751,7 @@ function fn_FileRegist(objId, docType, docTypeName){
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch">
<input type="button" value="거래명세서 생성" class="plm_btns" id="btnTransactionStatement" style="background-color: #FF9800; color: white;">
<input type="button" value="마감정보입력" class="plm_btns" id="btnDeadlineInfo" style="background-color: #2196F3; color: white;">
<input type="button" value="매출마감" class="plm_btns" id="btnDeadline" style="background-color: #4CAF50; color: white;">
</div>

View File

@@ -730,7 +730,8 @@ body {
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch">
<input type="button" value="거래명세서 생성" class="plm_btns" id="btnTransactionStatement" style="background-color: #2196F3; color: white;">
<!-- 거래명세서는 매출관리로 이동 -->
<!-- <input type="button" value="거래명세서 생성" class="plm_btns" id="btnTransactionStatement" style="background-color: #2196F3; color: white;"> -->
<input type="button" value="출하지시/판매등록" class="plm_btns" id="btnBulkRegister" style="background-color: #4CAF50; color: white;">
<!-- <input type="button" value="분할출하" class="plm_btns" id="btnSplitShipment" style="background-color: #FF9800; color: white;"> -->
</div>

View File

@@ -757,24 +757,36 @@ public class PurchaseOrderController {
detailRow.put("UNIT", "".equals(unit) ? "0001400" : unit);
// 배송지
detailRow.put("DELIVERY_PLACE", "RPS");
detailRow.put("PART_DELIVERY_PLACE", "RPS");
// 단가 (대소문자 모두 체크)
Object priceObj = partRow.get("UNIT_PRICE");
if(priceObj == null) priceObj = partRow.get("unit_price");
String priceStr = CommonUtils.checkNull(priceObj, "0").toString().replaceAll(",", "");
int unitPrice = 0;
try { unitPrice = (int)Double.parseDouble(priceStr.equals("") ? "0" : priceStr); } catch(Exception e) { unitPrice = 0; }
double unitPrice = 0;
try { unitPrice = Double.parseDouble(priceStr.equals("") ? "0" : priceStr); } catch(Exception e) { unitPrice = 0; }
detailRow.put("PARTNER_PRICE", unitPrice);
// 공급가액 = 수량 * 단가
detailRow.put("SUPPLY_UNIT_PRICE", qty * unitPrice);
// 비고 (대소문자 모두 체크)
String remark = CommonUtils.checkNull(partRow.get("REMARK"));
if("".equals(remark)) remark = CommonUtils.checkNull(partRow.get("remark"));
// 비고: 제품명 / 부품명 형태
String projectProductName = CommonUtils.checkNull(partRow.get("PROJECT_PRODUCT_NAME"));
String componentPartName = CommonUtils.checkNull(partRow.get("COMPONENT_PART_NAME"));
String remark = "";
if(!"".equals(projectProductName) && !"".equals(componentPartName)) {
remark = projectProductName + " / " + componentPartName;
} else if(!"".equals(projectProductName)) {
remark = projectProductName;
} else if(!"".equals(componentPartName)) {
remark = componentPartName;
}
detailRow.put("REMARK", remark);
// 입고요청일
Object deliveryDateObj = partRow.get("DELIVERY_REQUEST_DATE");
detailRow.put("DELIVERY_REQUEST_DATE", deliveryDateObj != null ? String.valueOf(deliveryDateObj).trim() : "");
detailList.add(detailRow);
}
}
@@ -793,6 +805,9 @@ public class PurchaseOrderController {
param.put("code","0001399");
code_map.put("unit_cd", commonService.getJqGridSelectBoxJsonData2("common.getCodeselect", param, "선택", "CODE", "NAME"));
// 배송지 (jqGrid 셀렉트박스용 - 수신업체와 동일 데이터)
code_map.put("delivery_place_grid", commonService.getJqGridSelectBoxJsonData2("common.getClientMngSupplySelect", new HashMap(), "선택", "NAME", "NAME"));
// 결제조건
code_map.put("payment_terms_cd", commonService.bizMakeOptionList("0001074", (String)info.get("PAYMENT_TERMS"),"common.getCodeselect"));
@@ -911,6 +926,10 @@ public class PurchaseOrderController {
if("".equals(vendorName)) vendorName = CommonUtils.checkNull(partRow.get("vendor_name"));
detailRow.put("VENDOR_NAME", vendorName);
String productName = CommonUtils.checkNull(partRow.get("PROJECT_PRODUCT_NAME"));
if("".equals(productName)) productName = CommonUtils.checkNull(partRow.get("project_product_name"));
detailRow.put("PRODUCT_NAME", productName);
String partName = CommonUtils.checkNull(partRow.get("PART_NAME"));
if("".equals(partName)) partName = CommonUtils.checkNull(partRow.get("part_name"));
detailRow.put("PART_NAME", partName);

View File

@@ -887,11 +887,37 @@
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
PM.UNIT,
PM.MAKER
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT,
PM.MAKER,
(SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME,
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
COALESCE(
(SELECT MIN(PM2.PART_NAME) FROM MBOM_DETAIL MD2
JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR
WHERE MD2.RAW_MATERIAL_PART_NO = PM.PART_NO
AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR),
PM.PART_NAME
)
ELSE PM.PART_NAME
END AS COMPONENT_PART_NAME,
COALESCE(SRP.DELIVERY_REQUEST_DATE,
CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
ELSE
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
END
ELSE NULL
END
) AS DELIVERY_REQUEST_DATE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON PM.OBJID::VARCHAR = SRP.PART_OBJID
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRP.SALES_REQUEST_MASTER_OBJID = SRM.OBJID
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_OBJID}
AND SRP.VENDOR_PM = #{PARTNER_OBJID}
@@ -6205,6 +6231,25 @@ FROM(
,POM.PURCHASE_ORDER_NO
,CM.PROJECT_NO
<!-- 부품품번: 소재 입고시 MBOM에서 부품품번 조회, 부품/가공 입고시 품번과 동일 -->
,COALESCE(
(SELECT
CASE WHEN COALESCE(SRP2.MATERIAL_YN, 'N') = 'Y' AND SRM2.MBOM_HEADER_OBJID IS NOT NULL THEN
(SELECT MIN(PM2.PART_NO) FROM MBOM_DETAIL MD2
JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR
WHERE MD2.RAW_MATERIAL_PART_NO = POP.PART_NO
AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM2.MBOM_HEADER_OBJID::VARCHAR)
ELSE POP.PART_NO
END
FROM SALES_REQUEST_PART SRP2
JOIN SALES_REQUEST_MASTER SRM2 ON SRP2.SALES_REQUEST_MASTER_OBJID = SRM2.OBJID
WHERE SRM2.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID
AND SRP2.PART_OBJID = POP.PART_OBJID
LIMIT 1
),
POP.PART_NO
) AS COMPONENT_PART_NO
<!-- 품목 정보 -->
,POP.PART_NO
,POP.PART_NAME

View File

@@ -5007,9 +5007,9 @@ ORDER BY V.PATH2
PM.PART_NAME,
PM.SPEC,
PM.MATERIAL,
COALESCE(SRP.UNIT, PM.UNIT) AS UNIT,
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRP.UNIT),
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = NULLIF(SRP.UNIT, '')),
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT)
) AS UNIT_TITLE,
SRP.QTY,
@@ -5021,11 +5021,57 @@ ORDER BY V.PATH2
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.REMARK,
SRP.DELIVERY_REQUEST_DATE,
SRP.DELIVERY_REQUEST_DATE AS DELIVERY_REQUEST_DATE_TITLE
/* 입고요청일: SRP에 값 있으면 우선, 없으면 MBOM_DETAIL에서 조회 */
COALESCE(SRP.DELIVERY_REQUEST_DATE,
CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
ELSE
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
END
ELSE NULL
END
) AS DELIVERY_REQUEST_DATE,
COALESCE(SRP.DELIVERY_REQUEST_DATE,
CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
ELSE
(SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3
WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR)
END
ELSE NULL
END
) AS DELIVERY_REQUEST_DATE_TITLE,
COALESCE(SRP.MATERIAL_YN, 'N') AS MATERIAL_YN,
/* 제품명: 프로젝트 품명 */
(SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME,
/* 부품명: 소재이면 MBOM에서 원래 부품명 조회, 아니면 PM.PART_NAME */
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
COALESCE(
(SELECT MIN(PM2.PART_NAME) FROM MBOM_DETAIL MD2
JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR
WHERE MD2.RAW_MATERIAL_PART_NO = PM.PART_NO
AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR),
PM.PART_NAME
)
ELSE PM.PART_NAME
END AS COMPONENT_PART_NAME,
/* 품명: 소재있으면 소재품명(현재 PM), 없으면 부품명(현재 PM) */
PM.PART_NAME AS DISPLAY_PART_NAME,
/* 규격: 품명의 규격 */
PM.SPEC AS DISPLAY_SPEC
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRP.SALES_REQUEST_MASTER_OBJID = SRM.OBJID
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{PROPOSAL_OBJID}
ORDER BY SRP.REGDATE
@@ -5036,7 +5082,12 @@ ORDER BY V.PATH2
UPDATE SALES_REQUEST_MASTER SET
RECIPIENT_REF = #{RECIPIENT_REF},
EXECUTOR = #{EXECUTOR},
EXECUTION_DATE = CASE WHEN #{EXECUTION_DATE} IS NOT NULL AND #{EXECUTION_DATE} != '' THEN #{EXECUTION_DATE}::DATE ELSE NULL END,
<if test="EXECUTION_DATE != null and EXECUTION_DATE != ''">
EXECUTION_DATE = #{EXECUTION_DATE}::DATE,
</if>
<if test="EXECUTION_DATE == null or EXECUTION_DATE == ''">
EXECUTION_DATE = NULL,
</if>
TITLE = #{TITLE}
WHERE OBJID = #{PROPOSAL_OBJID}
</update>

View File

@@ -2415,7 +2415,11 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
CASE
WHEN SL.sales_deadline_date IS NOT NULL AND SL.sales_deadline_date != '' THEN '완료'
ELSE ''
END AS SALES_STATUS
END AS SALES_STATUS,
CASE WHEN EXISTS(
SELECT 1 FROM NSWOS100_TBL
WHERE T.OBJID::VARCHAR = ANY(STRING_TO_ARRAY(LinkedProjectObjids, ','))
) THEN 'Y' ELSE 'N' END AS HAS_TRANSACTION_STATEMENT
FROM PROJECT_MGMT AS T
INNER JOIN shipment_log SL ON SL.target_objid = T.PROJECT_NO
WHERE 1 = 1

View File

@@ -1941,6 +1941,23 @@ public class PurchaseOrderService {
partParam.put("SPEC", CommonUtils.checkNull((String) partMap.get("spec")));
partParam.put("UNIT", CommonUtils.checkNull((String) partMap.get("unit")));
partParam.put("MAKER", CommonUtils.checkNull((String) partMap.get("maker")));
partParam.put("PRODUCT_NAME", CommonUtils.checkNull(partMap.get("project_product_name")));
Object deliveryDateObj = partMap.get("delivery_request_date");
partParam.put("DELIVERY_REQUEST_DATE", deliveryDateObj != null ? String.valueOf(deliveryDateObj).trim() : "");
// 비고: 제품명 / 부품명 형태
String projectProductName = CommonUtils.checkNull(partMap.get("project_product_name"));
String componentPartName = CommonUtils.checkNull(partMap.get("component_part_name"));
String remark = "";
if(!"".equals(projectProductName) && !"".equals(componentPartName)) {
remark = projectProductName + " / " + componentPartName;
} else if(!"".equals(projectProductName)) {
remark = projectProductName;
} else if(!"".equals(componentPartName)) {
remark = componentPartName;
}
partParam.put("REMARK", remark);
partParam.put("WRITER", writer);
partParam.put("STATUS", "create");