964 lines
32 KiB
Plaintext
964 lines
32 KiB
Plaintext
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
|
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
|
<%@ page import="com.pms.common.utils.*"%>
|
|
<%@ page import="java.util.*"%>
|
|
<%@include file="/init_jqGrid.jsp"%>
|
|
<%
|
|
Map info = (HashMap)(request.getAttribute("info"));
|
|
boolean isModify = true;
|
|
if(info!=null &&
|
|
( CommonUtils.checkNull(info.get("APPR_STATUS")).equals( "결재중" )
|
|
||CommonUtils.checkNull(info.get("APPR_STATUS")).equals( "결재완료" )
|
|
||CommonUtils.checkNull(info.get("STATUS")).equals( "cancel" )
|
|
)
|
|
){
|
|
isModify = false; //수정불가
|
|
}
|
|
String actType = (String)request.getAttribute("actType");
|
|
|
|
// 담당자 목록
|
|
List userList = (List)request.getAttribute("userList");
|
|
if(userList == null) userList = new ArrayList();
|
|
|
|
// 현재 선택된 담당자 ID (SALES_MNG_USER_ID, SALES_MNG_USER_ID2에 저장)
|
|
String managerId = CommonUtils.checkNull(info != null ? info.get("SALES_MNG_USER_ID") : "");
|
|
String managerId2 = CommonUtils.checkNull(info != null ? info.get("SALES_MNG_USER_ID2") : "");
|
|
%>
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<c:set var="now" value="<%=new java.util.Date() %>" />
|
|
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
|
|
<title><%=Constants.SYSTEM_NAME%> - 일반 발주서</title>
|
|
|
|
<style>
|
|
/* 일반 발주서 스타일 - PDF 양식과 동일하게 */
|
|
body {
|
|
font-family: 'Malgun Gothic', '맑은 고딕', sans-serif;
|
|
font-size: 11px;
|
|
margin: 0;
|
|
padding: 5px;
|
|
background-color: #fff;
|
|
overflow-x: hidden;
|
|
box-sizing: border-box;
|
|
}
|
|
/* 날짜 입력창 테두리 셀렉트박스와 동일하게 */
|
|
input.date_icon {
|
|
border: 1px solid #aaa !important;
|
|
border-radius: 4px;
|
|
padding: 5px 8px;
|
|
box-sizing: border-box;
|
|
}
|
|
.po-main-table {
|
|
width: 100%;
|
|
margin: 0;
|
|
border-collapse: collapse;
|
|
border: 2px solid #000;
|
|
}
|
|
.po-main-table td {
|
|
border: 1px solid #000;
|
|
padding: 5px 8px;
|
|
vertical-align: middle;
|
|
}
|
|
.po-main-table .no-border {
|
|
border: none;
|
|
}
|
|
.po-main-table .border-right {
|
|
border-right: 1px solid #000;
|
|
}
|
|
.po-main-table .border-bottom {
|
|
border-bottom: 1px solid #000;
|
|
}
|
|
/* 헤더 영역 */
|
|
.po-logo-cell {
|
|
width: 120px;
|
|
text-align: center;
|
|
vertical-align: middle;
|
|
border: none !important;
|
|
}
|
|
.po-title-cell {
|
|
text-align: center;
|
|
font-size: 28px;
|
|
font-weight: bold;
|
|
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;
|
|
white-space: nowrap;
|
|
}
|
|
/* 담당자 박스 */
|
|
.manager-box {
|
|
border: 1px solid #000;
|
|
padding: 0;
|
|
}
|
|
.manager-box-title {
|
|
text-align: center;
|
|
font-weight: bold;
|
|
padding: 5px;
|
|
border-bottom: 1px solid #000;
|
|
letter-spacing: 10px;
|
|
}
|
|
.manager-box-content {
|
|
padding: 8px;
|
|
font-size: 11px;
|
|
line-height: 1.6;
|
|
position: relative;
|
|
}
|
|
/* 직인 이미지 */
|
|
.stamp-image {
|
|
position: absolute;
|
|
right: 10px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
width: 60px;
|
|
height: 60px;
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.company-name {
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
border-bottom: 1px solid #000;
|
|
text-align: center;
|
|
}
|
|
.company-address {
|
|
font-size: 11px;
|
|
text-align: center;
|
|
font-weight: bold;
|
|
}
|
|
/* 요청사항 */
|
|
/* .request-box {
|
|
border: 1px solid #000;
|
|
padding: 8px;
|
|
margin-top: 5px;
|
|
min-height: 60px;
|
|
} */
|
|
/* 그리드 스타일 */
|
|
.ui-jqgrid-view {
|
|
max-height: 400px;
|
|
}
|
|
.ui-jqgrid-bdiv {
|
|
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;
|
|
margin: 10px 0;
|
|
}
|
|
.graycolor {
|
|
background-color: #d9d9d9;
|
|
}
|
|
</style>
|
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
|
|
<script type="text/javascript">
|
|
var grid;
|
|
// PDF 생성용 플래그
|
|
window.dataLoaded = false;
|
|
|
|
$(document).ready(function(){
|
|
|
|
// 숫자 입력 필드 콤마 처리
|
|
$("input[numberOnly='']").each(function(){
|
|
$(this).css({'text-align':'right'})
|
|
})
|
|
.on("keyup", function() {
|
|
$(this).val(fnc_addComma($(this).val().replace(/[^0-9]/g,"")));
|
|
});
|
|
|
|
// 결재라인 가져오기
|
|
fn_getApprLine();
|
|
|
|
var unit_cd = $.parseJSON($("#unit_cd").val());
|
|
|
|
// 그리드 초기화
|
|
grid = $("#grid1").jqGrid({
|
|
url: ""
|
|
,datatype: "local"
|
|
,data: $.parseJSON($("#gridDetailList").val())
|
|
,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 %>
|
|
,formatter:"integer", formatoptions:{thousandsSeparator:","}
|
|
,editoptions:{
|
|
dataInit: function(e){ e.style.textAlign = "right"; }
|
|
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
|
|
}
|
|
}
|
|
,{name:"UNIT" , width:50, align:"center", sortable:false, editable:<%= isModify %>
|
|
,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:","}
|
|
,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:"REMARK" , width:120, align:"left", sortable:false, editable:<%= isModify %>}
|
|
]
|
|
,rownumbers : false
|
|
,viewrecords : true
|
|
,height : '300'
|
|
,multiselect : <% if(isModify){ %>true<% }else{ %>false<% } %>
|
|
,shrinkToFit : false
|
|
,autowidth : true
|
|
,sortable : false
|
|
,rowNum : 10000
|
|
,forceFit : true
|
|
,jsonReader : {repeatitems: false}
|
|
,mtype :"POST"
|
|
,loadComplete: function(){
|
|
var gid = this.id;
|
|
setTimeout("fn_jqGrid_init($('#"+gid+"'), false);", 50);
|
|
|
|
// 행번호 자동 부여
|
|
var ids = $(this).jqGrid('getDataIDs');
|
|
for(var i = 0; i < ids.length; i++){
|
|
$(this).jqGrid('setCell', ids[i], 'ROW_NUM', i+1);
|
|
}
|
|
|
|
setTimeout(function(){ gridFn.footerSummary(); }, 100);
|
|
}
|
|
});
|
|
|
|
gridFn.opennEdit();
|
|
gridFn.footerSummary();
|
|
|
|
<% if(isModify){ %>
|
|
// 수정 가능 상태
|
|
$("#PARTNER_OBJID,#DELIVERY_PLACE_CD,#PAYMENT_METHOD").prop("disabled","");
|
|
$("#DELIVERY_DATE,#REQUEST_CONTENT").removeAttr("readonly");
|
|
|
|
// 담당자1 선택 변경시
|
|
$("#SALES_MNG_USER_ID").change(function(){
|
|
var $selected = $(this).find("option:selected");
|
|
var name = $selected.data("name") || "";
|
|
var position = $selected.data("position") || "";
|
|
var phone = $selected.data("phone") || "";
|
|
var email = $selected.data("email") || "";
|
|
|
|
// hidden 필드에 저장
|
|
$("#MANAGER_NAME").val(name);
|
|
$("#MANAGER_POSITION").val(position);
|
|
$("#MANAGER_PHONE").val(phone);
|
|
$("#MANAGER_EMAIL").val(email);
|
|
|
|
// 화면에 표시
|
|
$("#display_phone1").text(phone);
|
|
$("#display_email1").text(email);
|
|
});
|
|
|
|
// 담당자2 선택 변경시
|
|
$("#SALES_MNG_USER_ID2").change(function(){
|
|
var $selected = $(this).find("option:selected");
|
|
var name = $selected.data("name") || "";
|
|
var position = $selected.data("position") || "";
|
|
var phone = $selected.data("phone") || "";
|
|
var email = $selected.data("email") || "";
|
|
|
|
// hidden 필드에 저장
|
|
$("#MANAGER_NAME2").val(name);
|
|
$("#MANAGER_POSITION2").val(position);
|
|
$("#MANAGER_PHONE2").val(phone);
|
|
$("#MANAGER_EMAIL2").val(email);
|
|
|
|
// 화면에 표시
|
|
$("#display_phone2").text(phone);
|
|
$("#display_email2").text(email);
|
|
});
|
|
|
|
// 공급업체 변경시
|
|
$("#PARTNER_OBJID").change(function(){
|
|
if($(this).val()!=""){
|
|
var list = fnc_getJsonAllDataListBySqlId({"sqlId":"purchaseOrder.purchaseOrderAdminSupplyInfo", "PARTNER_OBJID":$(this).val()});
|
|
if(fnc_checkNull(list)!=""){
|
|
var row = list[0];
|
|
// 수신업체 정보 갱신 (필요시)
|
|
}
|
|
}
|
|
});
|
|
|
|
// 버튼 이벤트
|
|
$("#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}";
|
|
document.form1.submit();
|
|
});
|
|
<% } %>
|
|
|
|
fnc_datepick();
|
|
$(".select2").select2();
|
|
|
|
gridFn.opennEdit();
|
|
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";
|
|
window.open(url,"purchaseOrderPartSelectListPopUp","width=1480,height=850");
|
|
}
|
|
|
|
// 행추가 콜백
|
|
function fn_addRow(rowData){
|
|
var v1 = Number(fnc_checkNullDefaultValue(rowData.map.ORDER_QTY, 0));
|
|
var v2 = Number(fnc_checkNullDefaultValue(rowData.map.PARTNER_PRICE, 0));
|
|
var _rowSum = v1 * v2;
|
|
|
|
var newId = grid.getGridParam("reccount")+1;
|
|
var addData = {
|
|
"PART_OBJID" : rowData.map.PART_OBJID
|
|
,"ROW_NUM" : newId
|
|
,"PART_NAME" : rowData.map.PART_NAME
|
|
,"SPEC" : rowData.map.SPEC
|
|
,"ORDER_QTY" : v1
|
|
,"UNIT" : fnc_checkNullDefaultValue(rowData.map.UNIT, '0001400')
|
|
,"PART_DELIVERY_PLACE" : "RPS"
|
|
,"PARTNER_PRICE" : v2
|
|
,"SUPPLY_UNIT_PRICE": _rowSum
|
|
,"REMARK" : ""
|
|
};
|
|
|
|
grid.addRowData(newId, addData);
|
|
grid.jqGrid("editRow", newId);
|
|
gridFn.footerSummary();
|
|
}
|
|
|
|
// 저장
|
|
function fn_save(){
|
|
if(fnc_valitate("form1")){
|
|
if(""==grid.getRowData()){
|
|
Swal.fire('저장할 품목이 존재 하지 않습니다.');
|
|
return;
|
|
}
|
|
|
|
if(confirm("저장 하시겠습니까?")){
|
|
fn_save_process();
|
|
}
|
|
}
|
|
}
|
|
|
|
<% if(isModify){ %>
|
|
function fn_save_process(){
|
|
$("input[name*='PRICE']").each(function(){
|
|
$(this).val($(this).val().replace(/,/gi,""));
|
|
});
|
|
$("input[name*='QTY']").each(function(){
|
|
$(this).val($(this).val().replace(/,/gi,""));
|
|
});
|
|
|
|
gridFn.closeEdit();
|
|
$.ajax({
|
|
url:"/purchaseOrder/purchaseOrderFormPopup_generalSave.do"
|
|
,type:"POST"
|
|
,data: $("#form1").serialize() + "&jqGrid="+ encodeURIComponent(JSON.stringify(grid.getRowData()))
|
|
,dataType:"json"
|
|
,success:function(data){
|
|
if(data && data.RESULT == 'S'){
|
|
alert("저장되었습니다.");
|
|
if(typeof opener.fn_search =="function"){ opener.fn_search() };
|
|
self.close();
|
|
}else{
|
|
alert(data.MSG);
|
|
}
|
|
}
|
|
,error: function(jqxhr, status, error){
|
|
alert('에러가 발생하였습니다. 시스템 관리자에게 문의하여 주세요.');
|
|
}
|
|
});
|
|
}
|
|
<% } %>
|
|
|
|
var gridFn = {
|
|
delRow : function(){
|
|
var selectedRowIds = grid.jqGrid("getGridParam","selarrrow");
|
|
if(selectedRowIds.length==0){
|
|
Swal.fire("삭제할 행을 선택해주십시오.");
|
|
return false;
|
|
}
|
|
for(var i = selectedRowIds.length - 1; i >= 0; i--){
|
|
grid.delRowData(selectedRowIds[i]);
|
|
}
|
|
// 행번호 재정렬
|
|
var ids = grid.jqGrid('getDataIDs');
|
|
for(var i = 0; i < ids.length; i++){
|
|
grid.jqGrid('setCell', ids[i], 'ROW_NUM', i+1);
|
|
}
|
|
gridFn.footerSummary();
|
|
}
|
|
,opennEdit : function() {
|
|
var ids = grid.jqGrid("getDataIDs");
|
|
for (var i = 0; i < ids.length; i++) {
|
|
grid.jqGrid("editRow",ids[i]);
|
|
}
|
|
}
|
|
,closeEdit : function() {
|
|
var ids = grid.jqGrid("getDataIDs");
|
|
for (var i = 0; i < ids.length; i++) {
|
|
grid.jqGrid("saveRow", ids[i], null, "clientArray");
|
|
}
|
|
}
|
|
,calcRowAll : function(e){
|
|
var $g = $("#grid1");
|
|
var rowId = e.target.id.split("_")[0];
|
|
|
|
var qty = Number(fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY")).toString().replace(/,/g,""));
|
|
var unitPrice = Number(fnc_checkNullDefaultValue($g.find("#"+rowId+"_PARTNER_PRICE").val(), grid.jqGrid('getCell', rowId, "PARTNER_PRICE")).toString().replace(/,/g,""));
|
|
|
|
var supplyPrice = qty * unitPrice;
|
|
$g.jqGrid('setCell', rowId, "SUPPLY_UNIT_PRICE", supplyPrice);
|
|
|
|
this.footerSummary();
|
|
}
|
|
,footerSummary: function(){
|
|
var totalSupplyPrice = 0;
|
|
|
|
$.each($("#grid1").jqGrid('getDataIDs'), function(i, rowId){
|
|
var supplyPrice = grid.jqGrid('getCell', rowId, "SUPPLY_UNIT_PRICE");
|
|
supplyPrice = fnc_checkNullDefaultValue(supplyPrice, "0").toString().replace(/,/g,"");
|
|
if($.isNumeric(supplyPrice)){
|
|
totalSupplyPrice += Number(supplyPrice);
|
|
}
|
|
});
|
|
|
|
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));
|
|
}
|
|
}
|
|
|
|
// 라이브러리 로드 완료 후 dataLoaded 플래그 설정
|
|
$(window).on('load', function() {
|
|
setTimeout(function() {
|
|
if(typeof html2canvas !== 'undefined' && typeof jspdf !== 'undefined') {
|
|
window.dataLoaded = true;
|
|
console.log('발주서 일반양식 - dataLoaded = true');
|
|
} else {
|
|
// jsPDF 전역 객체 확인
|
|
if(typeof html2canvas !== 'undefined' && typeof window.jspdf !== 'undefined') {
|
|
window.dataLoaded = true;
|
|
console.log('발주서 일반양식 - dataLoaded = true (jspdf)');
|
|
} else {
|
|
console.log('라이브러리 로드 대기중...');
|
|
setTimeout(function() {
|
|
window.dataLoaded = true;
|
|
console.log('발주서 일반양식 - dataLoaded = true (지연)');
|
|
}, 1000);
|
|
}
|
|
}
|
|
}, 500);
|
|
});
|
|
|
|
// PDF를 Base64로 생성하여 콜백으로 전달하는 함수
|
|
function fn_generateAndUploadPdf(callback) {
|
|
console.log('fn_generateAndUploadPdf 호출됨 (일반 발주서)');
|
|
|
|
// 라이브러리 로드 확인
|
|
if(typeof html2canvas === 'undefined') {
|
|
console.error('html2canvas 라이브러리가 로드되지 않았습니다.');
|
|
if(callback && typeof callback === 'function') {
|
|
callback(null);
|
|
}
|
|
return;
|
|
}
|
|
|
|
var jsPDF = window.jspdf ? window.jspdf.jsPDF : null;
|
|
if(!jsPDF) {
|
|
console.error('jsPDF 라이브러리가 로드되지 않았습니다.');
|
|
if(callback && typeof callback === 'function') {
|
|
callback(null);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 버튼 영역 임시 숨김
|
|
$('#btnSave, #btnDown, input[value="닫기"]').closest('div').hide();
|
|
|
|
// select2 컨테이너 숨김 (중복 표시 방지)
|
|
$('.select2-container').hide();
|
|
|
|
// input/select 값을 텍스트로 변환 (html2canvas가 input value를 캡처하지 못하는 문제 해결)
|
|
var inputBackups = [];
|
|
|
|
// input 요소 처리 (form1 내부 + 그리드 포함)
|
|
$('input[type="text"], input:not([type])').each(function(){
|
|
var $input = $(this);
|
|
var value = $input.val();
|
|
if(value) {
|
|
inputBackups.push({
|
|
element: $input,
|
|
html: $input[0].outerHTML,
|
|
parent: $input.parent()
|
|
});
|
|
var $span = $('<span class="pdf-temp-span">').text(value).css({
|
|
'display': 'inline-block',
|
|
'white-space': 'nowrap',
|
|
'text-align': $input.css('text-align') || 'left',
|
|
'font-size': $input.css('font-size') || '12px',
|
|
'font-weight': $input.css('font-weight') || 'normal',
|
|
'padding': '2px 5px',
|
|
'color': $input.css('color') || '#000',
|
|
'background': 'transparent'
|
|
});
|
|
$input.replaceWith($span);
|
|
inputBackups[inputBackups.length - 1].span = $span;
|
|
}
|
|
});
|
|
|
|
// select 요소 처리 (select2 포함)
|
|
$('select').each(function(){
|
|
var $select = $(this);
|
|
var value = $select.find('option:selected').text();
|
|
if(value && value.trim() !== '' && value !== '선택') {
|
|
inputBackups.push({
|
|
element: $select,
|
|
html: $select[0].outerHTML,
|
|
parent: $select.parent(),
|
|
wasHidden: $select.is(':hidden')
|
|
});
|
|
var $span = $('<span class="pdf-temp-span">').text(value).css({
|
|
'display': 'inline-block',
|
|
'white-space': 'nowrap',
|
|
'text-align': 'left',
|
|
'font-size': '12px',
|
|
'padding': '2px 5px',
|
|
'color': '#000',
|
|
'background': 'transparent'
|
|
});
|
|
$select.after($span).hide();
|
|
inputBackups[inputBackups.length - 1].span = $span;
|
|
}
|
|
});
|
|
|
|
// 캡처할 영역 (form1)
|
|
var captureElement = document.getElementById('form1');
|
|
|
|
// html2canvas로 캡처
|
|
html2canvas(captureElement, {
|
|
scale: 2,
|
|
useCORS: true,
|
|
logging: false,
|
|
backgroundColor: '#ffffff',
|
|
windowWidth: captureElement.scrollWidth,
|
|
windowHeight: captureElement.scrollHeight
|
|
}).then(function(canvas) {
|
|
console.log('Canvas 캡처 완료');
|
|
|
|
// 임시 span 제거 및 원본 복원
|
|
$('.pdf-temp-span').remove();
|
|
for(var i = 0; i < inputBackups.length; i++) {
|
|
var backup = inputBackups[i];
|
|
if(backup.element && backup.element.is('select')) {
|
|
// select는 숨겨둔 것만 다시 표시
|
|
backup.element.show();
|
|
} else if(backup.span && backup.parent) {
|
|
// input은 span을 원본으로 교체
|
|
backup.span.replaceWith(backup.html);
|
|
}
|
|
}
|
|
|
|
// select2 컨테이너 다시 표시
|
|
$('.select2-container').show();
|
|
|
|
// 버튼 영역 다시 표시
|
|
$('#btnSave, #btnDown, input[value="닫기"]').closest('div').show();
|
|
|
|
try {
|
|
// Canvas를 JPEG 이미지로 변환
|
|
var imgData = canvas.toDataURL('image/jpeg', 0.85);
|
|
console.log('이미지 변환 완료');
|
|
|
|
// PDF 생성
|
|
var pdf = new jsPDF('p', 'mm', 'a4');
|
|
var imgWidth = 210;
|
|
var pageHeight = 297;
|
|
var imgHeight = canvas.height * imgWidth / canvas.width;
|
|
var heightLeft = imgHeight;
|
|
var position = 0;
|
|
|
|
// 이미지 추가
|
|
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
|
|
heightLeft -= pageHeight;
|
|
|
|
while (heightLeft >= 0) {
|
|
position = heightLeft - imgHeight;
|
|
pdf.addPage();
|
|
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
|
|
heightLeft -= pageHeight;
|
|
}
|
|
|
|
console.log('PDF 생성 완료');
|
|
|
|
// PDF를 Base64로 변환
|
|
var pdfBase64 = pdf.output('dataurlstring').split(',')[1];
|
|
console.log('PDF Base64 생성 완료, 길이:', pdfBase64.length);
|
|
|
|
// 콜백 함수 호출
|
|
if(callback && typeof callback === 'function') {
|
|
callback(pdfBase64);
|
|
}
|
|
} catch(pdfError) {
|
|
console.error('PDF 생성 중 오류:', pdfError);
|
|
if(callback && typeof callback === 'function') {
|
|
callback(null);
|
|
}
|
|
}
|
|
|
|
}).catch(function(error) {
|
|
// span을 다시 input으로 복원
|
|
for(var i = 0; i < inputBackups.length; i++) {
|
|
var backup = inputBackups[i];
|
|
if(backup.span) {
|
|
backup.span.replaceWith(backup.html);
|
|
}
|
|
}
|
|
$('#btnSave, #btnDown, input[value="닫기"]').closest('div').show();
|
|
console.error('Canvas 캡처 오류:', error);
|
|
if(callback && typeof callback === 'function') {
|
|
callback(null);
|
|
}
|
|
});
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<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="MASTER_OBJID" id="MASTER_OBJID" value="${objId}" />
|
|
<input type="hidden" name="PROPOSAL_OBJID" id="PROPOSAL_OBJID" value="${info.PROPOSAL_OBJID}" />
|
|
<input type="hidden" name="FORM_TYPE" id="FORM_TYPE" value="general" />
|
|
<input type="hidden" name="CONTRACT_MGMT_OBJID" id="CONTRACT_MGMT_OBJID" value="${info.CONTRACT_MGMT_OBJID}" />
|
|
<input type="hidden" name="SALES_REQUEST_OBJID" id="SALES_REQUEST_OBJID" value="${info.SALES_REQUEST_OBJID}" />
|
|
<input type="hidden" name="TYPE" id="TYPE" value="${info.TYPE}" />
|
|
|
|
<!-- 메인 발주서 테이블 (PDF 양식과 동일) -->
|
|
<table class="po-main-table">
|
|
<!-- 1행: 로고 + 타이틀 + 결재란 -->
|
|
<tr>
|
|
<td colspan="2" class="po-logo-cell" style="width:15%; border-right:none;">
|
|
<img src="<%=request.getContextPath()%>/images/logo.png" alt="RPS Logo" style="max-width: 100px; height: auto;">
|
|
</td>
|
|
<td colspan="3" class="po-title-cell" style="border-left:none; border-right:none;">
|
|
발 주 서
|
|
</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>
|
|
|
|
<!-- 2행: 기본정보(좌) + 담당자(우) -->
|
|
<tr>
|
|
<td colspan="4" style="vertical-align:top; padding:10px; ">
|
|
<!-- 좌측: 기본정보 -->
|
|
<table style="width:100%; border:none;">
|
|
<tr>
|
|
<td class="info-label" style="width:120px; border:none;">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> -->
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="info-label" style="border:none;">2. 발 주 일 자 :</td>
|
|
<td style="border:none;">
|
|
<input type="text" name="PURCHASE_DATE" id="PURCHASE_DATE" class="date_icon" value="${info.PURCHASE_DATE}" <% if(!isModify){ %>readonly<% } %> style="width:100%;"/>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="info-label" style="border:none;">3. 수 신 업 체 :</td>
|
|
<td style="border:none;">
|
|
<select name="PARTNER_OBJID" id="PARTNER_OBJID" class="select2" style="width:100%;" <% if(!isModify){ %>disabled<% } %>>
|
|
<option value="">선택</option>
|
|
${code_map.partner_cd}
|
|
</select>
|
|
</td>
|
|
</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%;"/>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="info-label" style="border:none;">5. 납 품 장 소 :</td>
|
|
<td style="border:none;">
|
|
<select name="DELIVERY_PLACE" id="DELIVERY_PLACE" class="select2" style="width:100%;" <% if(!isModify){ %>disabled<% } %>>
|
|
<option value="">선택</option>
|
|
${code_map.delivery_place_cd}
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="info-label" style="border:none;">6. 결 제 방 식 :</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>
|
|
</table>
|
|
</td>
|
|
<td colspan="3" style="vertical-align:top; padding:10px;">
|
|
<!-- 우측: 담당자 + 회사정보 + 요청사항 -->
|
|
<!-- 담당자 박스 (PDF 양식과 동일한 테이블 형태) -->
|
|
<table class="manager-table" style="width:100%; border-collapse:collapse; border:1px solid #000; font-size:10px;">
|
|
<tr>
|
|
<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;">
|
|
<option value="">선택</option>
|
|
<%
|
|
for(int u=0; u<userList.size(); u++){
|
|
Map userMap = (Map)userList.get(u);
|
|
// 대소문자 모두 체크
|
|
String userId = CommonUtils.checkNull(userMap.get("user_id"));
|
|
if("".equals(userId)) userId = CommonUtils.checkNull(userMap.get("USER_ID"));
|
|
String userName = CommonUtils.checkNull(userMap.get("user_name"));
|
|
if("".equals(userName)) userName = CommonUtils.checkNull(userMap.get("USER_NAME"));
|
|
String positionName = CommonUtils.checkNull(userMap.get("position_name"));
|
|
if("".equals(positionName)) positionName = CommonUtils.checkNull(userMap.get("POSITION_NAME"));
|
|
String cellPhone = CommonUtils.checkNull(userMap.get("cell_phone"));
|
|
if("".equals(cellPhone)) cellPhone = CommonUtils.checkNull(userMap.get("CELL_PHONE"));
|
|
String email = CommonUtils.checkNull(userMap.get("email"));
|
|
if("".equals(email)) email = CommonUtils.checkNull(userMap.get("EMAIL"));
|
|
String selected = managerId.equals(userId) ? "selected" : "";
|
|
%>
|
|
<option value="<%=userId%>" data-name="<%=userName%>" data-position="<%=positionName%>" data-phone="<%=cellPhone%>" data-email="<%=email%>" <%=selected%>><%=userName%> <%=positionName%></option>
|
|
<% } %>
|
|
</select>
|
|
<input type="hidden" name="MANAGER_NAME" id="MANAGER_NAME" value="${info.MANAGER_NAME}"/>
|
|
<input type="hidden" name="MANAGER_POSITION" id="MANAGER_POSITION" value="${info.MANAGER_POSITION}"/>
|
|
<input type="hidden" name="MANAGER_PHONE" id="MANAGER_PHONE" value="${info.MANAGER_PHONE}"/>
|
|
<input type="hidden" name="MANAGER_EMAIL" id="MANAGER_EMAIL" value="${info.MANAGER_EMAIL}"/>
|
|
<% } else { %>
|
|
${info.MANAGER_NAME} ${info.MANAGER_POSITION}
|
|
<% } %>
|
|
</td>
|
|
</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>
|
|
<!-- 직인 이미지 -->
|
|
<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>
|
|
</tr>
|
|
<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;">
|
|
<option value="">선택</option>
|
|
<%
|
|
for(int u=0; u<userList.size(); u++){
|
|
Map userMap = (Map)userList.get(u);
|
|
// 대소문자 모두 체크
|
|
String uId = CommonUtils.checkNull(userMap.get("user_id"));
|
|
if("".equals(uId)) uId = CommonUtils.checkNull(userMap.get("USER_ID"));
|
|
String uName = CommonUtils.checkNull(userMap.get("user_name"));
|
|
if("".equals(uName)) uName = CommonUtils.checkNull(userMap.get("USER_NAME"));
|
|
String pName = CommonUtils.checkNull(userMap.get("position_name"));
|
|
if("".equals(pName)) pName = CommonUtils.checkNull(userMap.get("POSITION_NAME"));
|
|
String cPhone = CommonUtils.checkNull(userMap.get("cell_phone"));
|
|
if("".equals(cPhone)) cPhone = CommonUtils.checkNull(userMap.get("CELL_PHONE"));
|
|
String eMail = CommonUtils.checkNull(userMap.get("email"));
|
|
if("".equals(eMail)) eMail = CommonUtils.checkNull(userMap.get("EMAIL"));
|
|
String selected2 = managerId2.equals(uId) ? "selected" : "";
|
|
%>
|
|
<option value="<%=uId%>" data-name="<%=uName%>" data-position="<%=pName%>" data-phone="<%=cPhone%>" data-email="<%=eMail%>" <%=selected2%>><%=uName%> <%=pName%></option>
|
|
<% } %>
|
|
</select>
|
|
<input type="hidden" name="MANAGER_NAME2" id="MANAGER_NAME2" value="${info.MANAGER_NAME2}"/>
|
|
<input type="hidden" name="MANAGER_POSITION2" id="MANAGER_POSITION2" value="${info.MANAGER_POSITION2}"/>
|
|
<input type="hidden" name="MANAGER_PHONE2" id="MANAGER_PHONE2" value="${info.MANAGER_PHONE2}"/>
|
|
<input type="hidden" name="MANAGER_EMAIL2" id="MANAGER_EMAIL2" value="${info.MANAGER_EMAIL2}"/>
|
|
<% } else { %>
|
|
${info.MANAGER_NAME2} ${info.MANAGER_POSITION2}
|
|
<% } %>
|
|
</td>
|
|
</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>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2" class="company-name">㈜알피에스 대표이사 이 동 헌</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2" class="company-address">대전광역시 유성구 국제과학10로8(둔곡동 402-4번지)</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- 요청사항 박스 -->
|
|
<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>
|
|
</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){ %>
|
|
<input type="button" value="저장" class="dtn" id="btnSave" style="background:#dfeffc; padding:5px 15px; cursor:pointer; font-size:14px; border-radius: 5px;">
|
|
<% }else{ %>
|
|
<input type="button" value="발주서다운" class="" id="btnDown" style="background:#dfeffc; padding:5px 15px; cursor:pointer; font-size:14px; border-radius: 5px;">
|
|
<% } %>
|
|
<input type="button" value="닫기" class="" style="background:#dfeffc; padding:5px 15px; cursor:pointer; font-size:14px; border-radius: 5px;" onclick="window.close();">
|
|
</div>
|
|
|
|
<textarea style="display:none;" id="unit_cd">${code_map.unit_cd}</textarea>
|
|
</form>
|
|
</body>
|
|
</html>
|