본문으로 건너뛰기

소스 변경 전체 보기

PHP 8 · GODO25
변경 파일 수: 118개
변경 파일 목록
118
data (66)
write.htmlskin/front/moment/board/skin/default/write.htmlskin/front/moment/board/skin/event/write.htmlskin/front/moment/board/skin/gallery/write.htmlskin/front/moment/board/skin/qa/write.htmlskin/front/moment/board/template/default/write.htmlskin/front/moment/board/template/event/write.htmlskin/front/moment/board/template/gallery/write.htmlskin/front/moment/board/template/qa/gd_common.jsskin/front/moment/js/gd_gettext.jsskin/front/moment/js/gd_multi_select_box.jsskin/front/moment/js/naverCommonInflowScript.jsskin/front/moment/js/naver/_order_goods_list.htmlskin/front/moment/mypage/_reorder_goods_list.htmlskin/front/moment/mypage/layer_order_refund_reason.htmlskin/front/moment/mypage/order_view.htmlskin/front/moment/mypage/order.htmlskin/front/moment/order/write.htmlskin/front/mygreek/board/skin/default/write.htmlskin/front/mygreek/board/skin/event/write.htmlskin/front/mygreek/board/skin/gallery/write.htmlskin/front/mygreek/board/skin/qa/write.htmlskin/front/mygreek/board/template/default/write.htmlskin/front/mygreek/board/template/event/write.htmlskin/front/mygreek/board/template/gallery/write.htmlskin/front/mygreek/board/template/qa/gd_common.jsskin/front/mygreek/js/gd_gettext.jsskin/front/mygreek/js/gd_multi_select_box.jsskin/front/mygreek/js/naverCommonInflowScript.jsskin/front/mygreek/js/naver/_order_goods_list.htmlskin/front/mygreek/mypage/_reorder_goods_list.htmlskin/front/mygreek/mypage/layer_order_refund_reason.htmlskin/front/mygreek/mypage/order_view.htmlskin/front/mygreek/mypage/order.htmlskin/front/mygreek/order/write.htmlskin/mobile/moment/board/skin/default/write.htmlskin/mobile/moment/board/skin/event/write.htmlskin/mobile/moment/board/skin/gallery/write.htmlskin/mobile/moment/board/skin/qa/write.htmlskin/mobile/moment/board/template/default/write.htmlskin/mobile/moment/board/template/event/write.htmlskin/mobile/moment/board/template/gallery/write.htmlskin/mobile/moment/board/template/qa/gd_common.jsskin/mobile/moment/js/gd_gettext.jsskin/mobile/moment/js/gd_member2.jsskin/mobile/moment/js/_order_goods_list.htmlskin/mobile/moment/mypage/_reorder_goods_list.htmlskin/mobile/moment/mypage/layer_order_refund_reason.htmlskin/mobile/moment/mypage/layer_tax_invoice_request.htmlskin/mobile/moment/mypage/order.htmlskin/mobile/moment/order/write.htmlskin/mobile/mygreek/board/skin/default/write.htmlskin/mobile/mygreek/board/skin/event/write.htmlskin/mobile/mygreek/board/skin/gallery/write.htmlskin/mobile/mygreek/board/skin/qa/write.htmlskin/mobile/mygreek/board/template/default/write.htmlskin/mobile/mygreek/board/template/event/write.htmlskin/mobile/mygreek/board/template/gallery/write.htmlskin/mobile/mygreek/board/template/qa/gd_common.jsskin/mobile/mygreek/js/gd_gettext.jsskin/mobile/mygreek/js/gd_member2.jsskin/mobile/mygreek/js/_order_goods_list.htmlskin/mobile/mygreek/mypage/_reorder_goods_list.htmlskin/mobile/mygreek/mypage/layer_order_refund_reason.htmlskin/mobile/mygreek/mypage/layer_tax_invoice_request.htmlskin/mobile/mygreek/mypage/order.htmlskin/mobile/mygreek/order/
변경 파일 코드
추가삭제
Admin/goods/goods_register.php-1
변경 전goods_register.php
$imageInput .= '<input type="hidden" name="imageDB[imageName][]" value="' . $iVal['imageName'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageRealSize][]" value="' . $iVal['imageRealSize'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[goodsImageStorage][]" value="' . $iVal['goodsImageStorage'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[obsConvertFl][]" value="' . $iVal['obsConvertFl'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageFolder][]" value="' . $iVal['imageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[thumbImageFolder][]" value="' . $iVal['thumbImageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageUrl][]" value="' . $iVal['imageUrl'] . '" /> ';
 
변경 후goods_register.php
$imageInput .= '<input type="hidden" name="imageDB[imageName][]" value="' . $iVal['imageName'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageRealSize][]" value="' . $iVal['imageRealSize'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[goodsImageStorage][]" value="' . $iVal['goodsImageStorage'] . '" /> ';
 
$imageInput .= '<input type="hidden" name="imageDB[imageFolder][]" value="' . $iVal['imageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[thumbImageFolder][]" value="' . $iVal['thumbImageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageUrl][]" value="' . $iVal['imageUrl'] . '" /> ';
 
Admin/goods/goods_register_option_stock.php-1
변경 전goods_register_option_stock.php
$imageInput .= '<input type="hidden" name="imageDB[imageName][]" value="' . $iVal['imageName'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageRealSize][]" value="' . $iVal['imageRealSize'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[goodsImageStorage][]" value="' . $iVal['goodsImageStorage'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[obsConvertFl][]" value="' . $iVal['obsConvertFl'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageFolder][]" value="' . $iVal['imageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[thumbImageFolder][]" value="' . $iVal['thumbImageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageUrl][]" value="' . $iVal['imageUrl'] . '" /> ';
 
변경 후goods_register_option_stock.php
$imageInput .= '<input type="hidden" name="imageDB[imageName][]" value="' . $iVal['imageName'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageRealSize][]" value="' . $iVal['imageRealSize'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[goodsImageStorage][]" value="' . $iVal['goodsImageStorage'] . '" /> ';
 
$imageInput .= '<input type="hidden" name="imageDB[imageFolder][]" value="' . $iVal['imageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[thumbImageFolder][]" value="' . $iVal['thumbImageFolder'] . '" /> ';
$imageInput .= '<input type="hidden" name="imageDB[imageUrl][]" value="' . $iVal['imageUrl'] . '" /> ';
 
Admin/marketing/naver_config.php+1-1
변경 전naver_config.php
<span class="notice-ref notice-sm">(동의 일시 : <?= $data['cpaAgreementDt'] ?>)</span> <?php } ?>
</label>
<div class="notice-info mgb10">
네이버에서 CPA 주문수집에 동의하신 경우에만 주문완료시 주문정보를 네이버측으로 전송합니다.<br/> CPA 주문수집이 정상적으로 이루어 져야만 차후 CPA로의 과금전환이 이루어질수 있습니다.<br/> 주문수집에 동의하신뒤에는 반드시 체크하여주시기 바라며, CPA 주문수집에대한 문의는 네이버 쇼핑파트너존으로 문의주시기 바랍니다.<br/> 네이버 쇼핑파트너존 고객센터 : 1588-3819<br/>
 
</div>
</td>
 
변경 후naver_config.php
<span class="notice-ref notice-sm">(동의 일시 : <?= $data['cpaAgreementDt'] ?>)</span> <?php } ?>
</label>
<div class="notice-info mgb10">
네이버에서 CPA 주문수집에 동의하신 경우에만 주문완료시 주문정보를 네이버측으로 전송합니다.<br/> CPA 주문수집이 정상적으로 이루어 져야만 차후 CPA로의 과금전환이 이루어질수 있습니다.<br/> 주문수집에 동의하신뒤에는 반드시 체크하여주시기 바라며, CPA 주문수집에대한 문의는 네이버 쇼핑파트너존으로 문의주시기 바랍니다.<br/> 네이버 쇼핑파트너존 고객센터 : 1599-1598<br/>
 
</div>
</td>
 
Admin/member/sms_send.php+1-1
변경 전sms_send.php
</div>
<div class="row">
<div class="col-xs-12">
<div class="notice-info">URL 삽입 시 플러스샵 [단축 URL] 앱을 이용하시면 짧고 간단하게 URL을 사용하실 수 있습니다. <a href="http://plus.godo.co.kr/goods/view.gd?idx=12" class="btn-link" target="_blank">바로가기</a></div>
<div class="notice-info">치환코드 사용 시 LMS로 발송될 수 있으며 일부 문자가 포인트 부족으로 발송되지 않을 수 있습니다.<br/>- 포인트 충전 후 <a href="../member/sms_log.php" class="btn-link" target="_blank">SMS 발송 내역 보기</a>에서 재발송하실 수 있습니다.</div>
<div class="notice-danger sms-large-caution">발송내용에 이모지 또는 사용 불가능한 특수문자, 맞춤법이 바르지 않은 문자가 포함되어있으면 일부 내용은 삭제되고 발송되오니 주의하시기 바랍니다.<br/>대량 SMS(LMS) 발송 시 이모지를 사용하지 않는 것과 맞춤법에 어긋나는 문자가 입력 되지는 않았는지 확인하시는 것을 권장 드리며,<br/> 발송 내용에 사용가능한 특수문자는 매뉴얼을 참고하시기 바랍니다.</div>
</div>
 
변경 후sms_send.php
</div>
<div class="row">
<div class="col-xs-12">
<div class="notice-info">URL 삽입 시 [단축 URL] 앱을 이용하시면 짧고 간단하게 URL을 사용하실 수 있습니다. <a href="https://apps.godo.co.kr/apps/1519" class="btn-link" target="_blank">바로가기</a></div>
<div class="notice-info">치환코드 사용 시 LMS로 발송될 수 있으며 일부 문자가 포인트 부족으로 발송되지 않을 수 있습니다.<br/>- 포인트 충전 후 <a href="../member/sms_log.php" class="btn-link" target="_blank">SMS 발송 내역 보기</a>에서 재발송하실 수 있습니다.</div>
<div class="notice-danger sms-large-caution">발송내용에 이모지 또는 사용 불가능한 특수문자, 맞춤법이 바르지 않은 문자가 포함되어있으면 일부 내용은 삭제되고 발송되오니 주의하시기 바랍니다.<br/>대량 SMS(LMS) 발송 시 이모지를 사용하지 않는 것과 맞춤법에 어긋나는 문자가 입력 되지는 않았는지 확인하시는 것을 권장 드리며,<br/> 발송 내용에 사용가능한 특수문자는 매뉴얼을 참고하시기 바랍니다.</div>
</div>
 
Admin/order/frame_tax_invoice_register.php+1-1
변경 전frame_tax_invoice_register.php
<tr>
<th class="require">회사명</th>
<td>
<input type="text" name="taxCompany" value="<?php echo gd_isset($orderData['taxCompany'], $memberData['company']); ?>" class="form-control" maxlength="50"/>
</td>
<th class="require">대표자명</th>
<td>
 
변경 후frame_tax_invoice_register.php
<tr>
<th class="require">회사명</th>
<td>
<input type="text" name="taxCompany" value="<?php echo gd_isset($orderData['taxCompany'], $memberData['company']); ?>" class="form-control" maxlength="70"/>
</td>
<th class="require">대표자명</th>
<td>
 
Admin/order/layout_order_search_form.php+3-3
변경 전layout_order_search_form.php
<?php if ($isUserHandle) { ?>
<ul class="nav nav-tabs mgb30" role="tablist">
<li role="presentation" <?=$search['view'] == 'exchange' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=exchange&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">교환신청 관리 (<strong>전체 <?=$userHandleCount['exchangeAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['exchangeRequest']?></strong> | <strong class="text-info">처리완료 <?=$userHandleCount['exchangeAccept']?>)</strong></a>
</li>
<li role="presentation" <?=$search['view'] == 'back' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=back&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">반품신청 관리 (<strong>전체 <?=$userHandleCount['backAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['backRequest']?></strong> | <strong class="text-info">처리완료 <?=$userHandleCount['backAccept']?>)</strong></a>
</li>
<li role="presentation" <?=$search['view'] == 'refund' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=refund&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">환불신청 관리 (<strong>전체 <?=$userHandleCount['refundAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['refundRequest']?></strong> | <strong class="text-info">처리완료 <?=$userHandleCount['refundAccept']?>)</strong></a>
</li>
</ul>
 
 
변경 후layout_order_search_form.php
<?php if ($isUserHandle) { ?>
<ul class="nav nav-tabs mgb30" role="tablist">
<li role="presentation" <?=$search['view'] == 'exchange' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=exchange&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">교환신청 관리 (<strong>전체 <?=$userHandleCount['exchangeAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['exchangeRequest']?></strong> | <strong class="text-info">승인 <?=$userHandleCount['exchangeApprove']?></strong> | <strong class="text-muted">거절 <?=$userHandleCount['exchangeReject']?>)</strong></a>
</li>
<li role="presentation" <?=$search['view'] == 'back' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=back&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">반품신청 관리 (<strong>전체 <?=$userHandleCount['backAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['backRequest']?></strong> | <strong class="text-info">승인 <?=$userHandleCount['backApprove']?></strong> | <strong class="text-muted">거절 <?=$userHandleCount['backReject']?>)</strong></a>
</li>
<li role="presentation" <?=$search['view'] == 'refund' ? 'class="active"' : ''?>>
<a href="../order/order_list_user_exchange.php?view=refund&<?=$queryString ? 'searchFl=y&' . $queryString : ''?>">환불신청 관리 (<strong>전체 <?=$userHandleCount['refundAll']?></strong> | <strong class="text-danger">신청 <?=$userHandleCount['refundRequest']?></strong> | <strong class="text-info">승인 <?=$userHandleCount['refundApprove']?></strong> | <strong class="text-muted">거절 <?=$userHandleCount['refundReject']?>)</strong></a>
</li>
</ul>
 
 
Admin/order/layout_order_view_status_back.php+21-3
변경 전layout_order_view_status_back.php
//$isUseMall = true;
}
?>
<tr id="statusCheck_<?= $statusMode; ?>_<?= $val['sno']; ?>" class="text-center">
<td class="center">
<div class="display-block">
<input type="checkbox" name="back[statusCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
 
<script>
$(document).ready(function () {
 
 
 
 
 
 
 
$("#backForm").validate({
submitHandler: function (form) {
form.target = 'ifrmProcess';
form.submit();
 
 
 
 
 
 
 
 
 
 
 
},
rules: {
mode: {
 
변경 후layout_order_view_status_back.php
//$isUseMall = true;
}
?>
<tr id="statusCheck_<?= $statusMode; ?>_<?= $val['sno']; ?>" class="text-center" data-user-handle-mode="<?=$val['userHandleMode']?>" data-claim-status-name="<?=$val['userHandleFlStr']?>">
<td class="center">
<div class="display-block">
<input type="checkbox" name="back[statusCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
 
<script>
$(document).ready(function () {
var orderSubmitFlag = true;
 
$('iframe[name="ifrmProcess"]').on('load', function () {
orderSubmitFlag = true;
setClaimSubmitDisabled('#backForm', false);
});
 
$("#backForm").validate({
submitHandler: function (form) {
if (orderSubmitFlag === false) {
alert('처리중입니다. 잠시만 기다려주세요.');
return false;
}
 
// 고객 클레임 신청 건과 종류가 다르면 자동 거절 컨펌 모달
confirmCustomerClaimReceipt('back', function () {
setClaimSubmitDisabled(form, true);
orderSubmitFlag = false;
form.target = 'ifrmProcess';
form.submit();
});
return false;
},
rules: {
mode: {
 
Admin/order/layout_order_view_status_exchange.php+21-2
변경 전layout_order_view_status_exchange.php
$rowMultiShipping = 0;
foreach ($sVal as $dKey => $dVal) {
foreach ($dVal as $key => $val) {
 
 
// rowspan 처리
$orderGoodsRowSpan = $rowChk === 0 && $rowCnt > 1 ? 'rowspan="' . $rowCnt . '"' : '';
//$isUseMall = true;
}
?>
<tr data-sno="<?=$val['sno']?>" data-stock-cnt="<?=$val['stockCnt']?>" data-goods-price="<?=$goodsPrice?>" data-goods-sellFl="<?=$goodsSellFl?>" data-order-info-cd="<?=(int)$val['orderInfoCd']?>" data-goods-change-able-option="<?=$val['changeAbleOrderGoodsInfo']?>" data-option-sno="<?=$val['optionSno']?>" data-goods-type="<?=$val['goodsType']?>">
<td class="center">
<div class="display-block">
<input type="checkbox" name="bundle[orderCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
 
$(document).ready(function(){
 
 
 
 
 
 
 
 
// 교환 폼 체크
$('#exchangeForm').validate({
submitHandler: function (form) {
 
 
 
 
 
if($("#formOrderViewExchange>input[name='mode']").val() === 'anotherExchange'){
//다른상품 교환
$.each($("input[name*='bundle[statusCheck]']"), function () {
$("#exchangeForm>input[name='changeOption']").val(changeOptionStr);
}
 
form.submit();
 
 
 
 
 
 
}
});
 
 
변경 후layout_order_view_status_exchange.php
$rowMultiShipping = 0;
foreach ($sVal as $dKey => $dVal) {
foreach ($dVal as $key => $val) {
$statusMode = substr($val['orderStatus'], 0, 1);
 
// rowspan 처리
$orderGoodsRowSpan = $rowChk === 0 && $rowCnt > 1 ? 'rowspan="' . $rowCnt . '"' : '';
//$isUseMall = true;
}
?>
<tr id="statusCheck_<?= $statusMode; ?>_<?= $val['sno']; ?>" data-sno="<?=$val['sno']?>" data-stock-cnt="<?=$val['stockCnt']?>" data-goods-price="<?=$goodsPrice?>" data-goods-sellFl="<?=$goodsSellFl?>" data-order-info-cd="<?=(int)$val['orderInfoCd']?>" data-goods-change-able-option="<?=$val['changeAbleOrderGoodsInfo']?>" data-option-sno="<?=$val['optionSno']?>" data-goods-type="<?=$val['goodsType']?>" data-user-handle-mode="<?=$val['userHandleMode']?>" data-claim-status-name="<?=$val['userHandleFlStr']?>">
<td class="center">
<div class="display-block">
<input type="checkbox" name="bundle[orderCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
 
$(document).ready(function(){
 
var orderSubmitFlag = true;
 
$('iframe[name="ifrmProcess"]').on('load', function () {
orderSubmitFlag = true;
setClaimSubmitDisabled('#exchangeForm', false);
});
 
// 교환 폼 체크
$('#exchangeForm').validate({
submitHandler: function (form) {
if (orderSubmitFlag === false) {
alert('처리중입니다. 잠시만 기다려주세요.');
return false;
}
 
if($("#formOrderViewExchange>input[name='mode']").val() === 'anotherExchange'){
//다른상품 교환
$.each($("input[name*='bundle[statusCheck]']"), function () {
$("#exchangeForm>input[name='changeOption']").val(changeOptionStr);
}
 
// 고객 클레임 신청 건과 종류가 다르면 자동 거절 컨펌 모달
confirmCustomerClaimReceipt('exchange', function () {
setClaimSubmitDisabled(form, true);
orderSubmitFlag = false;
form.submit();
});
return false;
}
});
 
 
Admin/order/layout_order_view_status_refund.php+21-3
변경 전layout_order_view_status_refund.php
//$isUseMall = true;
}
?>
<tr id="statusCheck_<?= $statusMode; ?>_<?= $val['sno']; ?>" class="text-center">
<td class="center">
<div class="display-block">
<input type="checkbox" name="refund[statusCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
var orderChannelFl = "<?=$data['orderChannelFl']?>";
var refundAccountFl = "<?=$easypayVacctRefundFl;?>";
$(document).ready(function () {
 
 
 
 
 
 
 
$("#refundForm").validate({
submitHandler: function (form) {
form.target = 'ifrmProcess';
form.submit();
 
 
 
 
 
 
 
 
 
 
 
},
rules: {
mode: {
 
변경 후layout_order_view_status_refund.php
//$isUseMall = true;
}
?>
<tr id="statusCheck_<?= $statusMode; ?>_<?= $val['sno']; ?>" class="text-center" data-user-handle-mode="<?=$val['userHandleMode']?>" data-claim-status-name="<?=$val['userHandleFlStr']?>">
<td class="center">
<div class="display-block">
<input type="checkbox" name="refund[statusCheck][<?= $val['sno']; ?>]" value="<?= $val['sno']; ?>" class="<?= gd_isset($onclickAction); ?>"/>
var orderChannelFl = "<?=$data['orderChannelFl']?>";
var refundAccountFl = "<?=$easypayVacctRefundFl;?>";
$(document).ready(function () {
var orderSubmitFlag = true;
 
$('iframe[name="ifrmProcess"]').on('load', function () {
orderSubmitFlag = true;
setClaimSubmitDisabled('#refundForm', false);
});
 
$("#refundForm").validate({
submitHandler: function (form) {
if (orderSubmitFlag === false) {
alert('처리중입니다. 잠시만 기다려주세요.');
return false;
}
 
// 고객 클레임 신청 건과 종류가 다르면 자동 거절 컨펌 모달
confirmCustomerClaimReceipt('refund', function () {
setClaimSubmitDisabled(form, true);
orderSubmitFlag = false;
form.target = 'ifrmProcess';
form.submit();
});
return false;
},
rules: {
mode: {
 
Admin/order/order_cart.php+4-2
변경 전order_cart.php
t: 'tax_info',
r: 'cash_receipt_info'
};
var target = eval('useCode.' + $(this).val());
 
$('.js-receipt').addClass('display-none');
$('#' + target).removeClass('display-none');
 
 
 
if ($(this).val() == 'r') {
$('input[name="cashUseFl"]').eq(0).trigger('click');
 
변경 후order_cart.php
t: 'tax_info',
r: 'cash_receipt_info'
};
var target = $(this).val() in useCode ? useCode[$(this).val()] : undefined;
 
$('.js-receipt').addClass('display-none');
if (target !== undefined) {
$('#' + target).removeClass('display-none');
}
 
if ($(this).val() == 'r') {
$('input[name="cashUseFl"]').eq(0).trigger('click');
 
Admin/policy/base_agreement_with_private.php-2
변경 전base_agreement_with_private.php
<input type="hidden" name="mode" value="<?php echo $mode; ?>"/>
<input type="hidden" name="mallSno" value="<?php echo $mallSno; ?>"/>
<input type="hidden" name="newInformFl" value="n"/>
<?php if ($informNm) { ?>
<input type="hidden" name="informNm" value="<?=$informNm;?>"/>
<?php } ?>
<div class="page-header js-affix">
<h3><?= end($naviMenu->location); ?>
<small></small>
 
변경 후base_agreement_with_private.php
<input type="hidden" name="mode" value="<?php echo $mode; ?>"/>
<input type="hidden" name="mallSno" value="<?php echo $mallSno; ?>"/>
<input type="hidden" name="newInformFl" value="n"/>
 
<input type="hidden" name="informNm" value="<?=$informNm;?>"/>
 
<div class="page-header js-affix">
<h3><?= end($naviMenu->location); ?>
<small></small>
 
Admin/policy/order_basic.php+7
변경 전order_basic.php
}
});
 
 
 
$('input[name="userHandleFl"]').click(function(){
switch (this.value) {
case 'y':
$('.user-handle-view').removeClass('display-none');
 
 
 
 
break;
case 'n':
$('.user-handle-view').addClass('display-none');
break;
}
 
});
});
//-->
 
변경 후order_basic.php
}
});
 
// 고객 클레임 신청 주문 표기 기본값 변경: 신규 상점에서 사용안함 → 사용함 변경 시 체크박스 자동 활성화
var prevUserHandleFl = '<?= $data['userHandleFl']; ?>';
$('input[name="userHandleFl"]').click(function(){
switch (this.value) {
case 'y':
$('.user-handle-view').removeClass('display-none');
if (prevUserHandleFl === 'n') {
$('input[name="userHandleAdmFl"]').prop('checked', true);
$('input[name="userHandleScmFl"]').prop('checked', true);
}
break;
case 'n':
$('.user-handle-view').addClass('display-none');
break;
}
prevUserHandleFl = this.value;
});
});
//-->
 
Admin/promotion/comeback_coupon_regist.php+1-1
변경 전comeback_coupon_regist.php
</p>
<div class="notice-info">
링크는 단축 URL로 자동 변환하였습니다.<br/>
플러스샵 [단축 URL] 앱을 이용하여 단축 URL을 생성하면, 조회수 및 통계 자료를 확인하실 수 있습니다. <a href="http://plus.godo.co.kr/goods/view.gd?idx=12" class="btn-link" target="_blank">바로가기</a>
</div>
</div>
</div>
 
변경 후comeback_coupon_regist.php
</p>
<div class="notice-info">
링크는 단축 URL로 자동 변환하였습니다.<br/>
[단축 URL] 앱을 이용하여 단축 URL을 생성하면, 조회수 및 통계 자료를 확인하실 수 있습니다. <a href="https://apps.godo.co.kr/apps/1519" class="btn-link" target="_blank">바로가기</a>
</div>
</div>
</div>
 
Component/Agreement/BuyerInform.php+55-17
변경 전BuyerInform.php
use Component\Mall\Mall;
use Component\AbstractComponent;
use Component\Database\DBTableField;
use Component\Policy\BaseAgreementPolicy;
use Component\Validator\Validator;
use Exception;
use Framework\Database\DBTool;
use Framework\Debug\Exception\LayerException;
use Framework\File\FileHandler;
use Framework\Utility\ArrayUtils;
 
use Framework\Utility\ProducerUtils;
use Framework\Utility\StringUtils;
use Logger;
$informCd = $agreementFl ? $code : $databaseKey[0];
$inform = $this->getInformData($informCd, $mallSno);
 
if ($agreementFl && $inform['modeFl'] === 'y') {
$policy = new BaseAgreementPolicy();
$agreementDate = $policy->getAgreementDate();
// __('0000년 00월 00일')
$agreementDate = $agreementDate['year'] . '년 ' . $agreementDate['month'] . '월 ' . $agreementDate['day'] . '일';
$mallInfo['0000년 00월 00일'] = $agreementDate;
}
 
$inform['content'] = str_replace(gd_array_keys($mallInfo), gd_array_values($mallInfo), $inform['content']);
 
return $inform;
$baseAgreementPath = \UserFilePath::adminSkin('policy', 'base_agreement.txt')->getRealPath();
$fileHandler = new FileHandler();
if ($fileHandler->isExists($baseAgreementPath)) {
$vo->setContent($fileHandler->read($baseAgreementPath));
 
 
 
 
 
 
 
 
 
}
}
$strSQL = "SELECT sno, displayShopFl FROM " . $tableName . " WHERE informCd='" . gd_isset($informCd, BuyerInformCode::AGREEMENT) . "'";
case 'y':
$this->arrWhere[] = '((b.scmNo = '.DEFAULT_CODE_SCMNO.' AND b.scmDisplayFl = "y") OR (b.scmNo = ?))';
$this->db->bind_param_push($this->arrBind, $fieldType['scmNo'], $this->search['scmNo']);
$countWhere = '((scmNo = '.DEFAULT_CODE_SCMNO.' AND scmDisplayFl = "y") OR (scmNo = '. $this->search['scmNo'] .'))';
break;
}
 
 
// 검색 레코드 수
$page->recode['total'] = $total;
$page->recode['amount'] = $this->db->getCount(DB_BUYER_INFORM, 'sno', 'WHERE groupCd = "'.$this->search['groupCd'].'" AND '. $countWhere);
 
$page->setPage();
 
{
$searchIn = gd_array_keys($this->goodsInfo);
$this->db->strWhere = 'groupCd IN (\'' . gd_implode('\', \'', $searchIn) . '\')';
if ($scmNo) $this->db->strWhere .= " AND (scmNo = '" . $scmNo . "' OR (scmNo = ".DEFAULT_CODE_SCMNO." AND scmDisplayFl='y'))";
$this->db->strOrder = 'scmNo ASC , informNm ASC';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_BUYER_INFORM . gd_implode(' ', $query);
$modeInsert = false;
if (empty($getData['informCd'])) {
if ($getData['mallSno'] > DEFAULT_MALL_NUMBER) {
$strSQL = "SELECT if(max(informCd), max(informCd), " . $this->{$groupCd}[0] . ") as newInformCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "' AND mallSno='" . $getData['mallSno'] . "'";
} else {
$strSQL = "SELECT if(max(informCd), max(informCd), " . $this->{$groupCd}[0] . ") as newInformCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "'";
}
$groupCd = $this->goodsInfo[$key];
 
$modeInsert = false;
$strSQL = "SELECT informCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "' AND mallSno='" . $getData['mallSno'] . "'";
list($informCd) = $this->db->fetch($strSQL, 'row');
if (empty($informCd) === true) {
$informCd = $this->{$groupCd}[2] . '001';
'scmNo',
]
);
$strSQL = 'INSERT INTO ' . DB_BUYER_INFORM . ' (scmNo,informCd, ' . gd_implode(', ', $arrField) . ', modeFl, regDt) SELECT \'' . Session::get('manager.scmNo') . '\',\'' . $newInformCd . '\', ' . gd_implode(', ', $arrField) . ', \'n\', now() FROM ' . DB_BUYER_INFORM . ' WHERE informCd = ' . $informCd;
 
$this->db->query($strSQL);
$insertId = $this->db->insert_id();
 
$checked = [];
$checked['modeFl'][$inform['modeFl']] = 'checked="checked"';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
return [
'content' => $inform['content'],
'informNm' => $inform['informNm'],
'checked' => $checked,
];
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* 사용자 정의 이용약관 정보 및 체크박스 처리 반환 함수
*
 
변경 후BuyerInform.php
use Component\Mall\Mall;
use Component\AbstractComponent;
use Component\Database\DBTableField;
 
use Component\Validator\Validator;
use Exception;
use Framework\Database\DBTool;
use Framework\Debug\Exception\LayerException;
use Framework\File\FileHandler;
use Framework\Utility\ArrayUtils;
use Framework\Utility\DateTimeUtils;
use Framework\Utility\ProducerUtils;
use Framework\Utility\StringUtils;
use Logger;
$informCd = $agreementFl ? $code : $databaseKey[0];
$inform = $this->getInformData($informCd, $mallSno);
 
 
 
 
 
 
 
 
 
$inform['content'] = str_replace(gd_array_keys($mallInfo), gd_array_values($mallInfo), $inform['content']);
 
return $inform;
$baseAgreementPath = \UserFilePath::adminSkin('policy', 'base_agreement.txt')->getRealPath();
$fileHandler = new FileHandler();
if ($fileHandler->isExists($baseAgreementPath)) {
$content = $fileHandler->read($baseAgreementPath);
if ($content === false) {
throw new Exception(__('표준약관 원본 파일을 읽을 수 없습니다.'));
}
$date = $postValue['agreementDate'] ?? null;
if (!empty($date['year']) && !empty($date['month']) && !empty($date['day'])) {
$appliedDate = DateTimeUtils::dateFormat(__('Y년 m월 d일'), "{$date['year']}-{$date['month']}-{$date['day']}");
$content = str_replace('0000년 00월 00일', $appliedDate, $content);
}
$vo->setContent($content);
}
}
$strSQL = "SELECT sno, displayShopFl FROM " . $tableName . " WHERE informCd='" . gd_isset($informCd, BuyerInformCode::AGREEMENT) . "'";
case 'y':
$this->arrWhere[] = '((b.scmNo = '.DEFAULT_CODE_SCMNO.' AND b.scmDisplayFl = "y") OR (b.scmNo = ?))';
$this->db->bind_param_push($this->arrBind, $fieldType['scmNo'], $this->search['scmNo']);
$countWhere = '((scmNo = '.DEFAULT_CODE_SCMNO.' AND scmDisplayFl = "y") OR (scmNo = '. intval($this->search['scmNo']) .'))';
break;
}
 
 
// 검색 레코드 수
$page->recode['total'] = $total;
$page->recode['amount'] = $this->db->getCount(DB_BUYER_INFORM, 'sno', 'WHERE groupCd = "'.$this->db->escape($this->search['groupCd']).'" AND '. $countWhere);
 
$page->setPage();
 
{
$searchIn = gd_array_keys($this->goodsInfo);
$this->db->strWhere = 'groupCd IN (\'' . gd_implode('\', \'', $searchIn) . '\')';
if ($scmNo) $this->db->strWhere .= " AND (scmNo = '" . intval($scmNo) . "' OR (scmNo = ".DEFAULT_CODE_SCMNO." AND scmDisplayFl='y'))";
$this->db->strOrder = 'scmNo ASC , informNm ASC';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_BUYER_INFORM . gd_implode(' ', $query);
$modeInsert = false;
if (empty($getData['informCd'])) {
if ($getData['mallSno'] > DEFAULT_MALL_NUMBER) {
$strSQL = "SELECT if(max(informCd), max(informCd), " . $this->{$groupCd}[0] . ") as newInformCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "' AND mallSno='" . intval($getData['mallSno']) . "'";
} else {
$strSQL = "SELECT if(max(informCd), max(informCd), " . $this->{$groupCd}[0] . ") as newInformCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "'";
}
$groupCd = $this->goodsInfo[$key];
 
$modeInsert = false;
$strSQL = "SELECT informCd FROM " . $tableName . " WHERE groupCd='" . $this->{$groupCd}[2] . "' AND mallSno='" . intval($getData['mallSno']) . "'";
list($informCd) = $this->db->fetch($strSQL, 'row');
if (empty($informCd) === true) {
$informCd = $this->{$groupCd}[2] . '001';
'scmNo',
]
);
$safeInformCd = $this->db->escape($informCd);
$strSQL = 'INSERT INTO ' . DB_BUYER_INFORM . ' (scmNo,informCd, ' . gd_implode(', ', $arrField) . ', modeFl, regDt) SELECT \'' . Session::get('manager.scmNo') . '\',\'' . $newInformCd . '\', ' . gd_implode(', ', $arrField) . ', \'n\', now() FROM ' . DB_BUYER_INFORM . ' WHERE informCd = \'' . $safeInformCd . '\'';
$this->db->query($strSQL);
$insertId = $this->db->insert_id();
 
$checked = [];
$checked['modeFl'][$inform['modeFl']] = 'checked="checked"';
 
// 직접입력 약관(modeFl='n')이 있으면 그 본문(자리표시자는 등록일로 치환), 없으면(최초) 표준약관 원본 제공.
$content = $this->getLatestNonStandardContent($mallSno);
if ($content === '') {
$baseAgreementPath = \UserFilePath::adminSkin('policy', 'base_agreement.txt')->getRealPath();
$fileHandler = new FileHandler();
if ($fileHandler->isExists($baseAgreementPath)) {
$base = $fileHandler->read($baseAgreementPath);
if ($base !== false) {
$content = $base;
}
}
}
 
return [
'content' => $content,
'informNm' => $inform['informNm'],
'checked' => $checked,
];
}
 
/**
* 직접입력 약관(modeFl='n') 중 가장 최신 본문 반환. 없으면 빈 문자열.
*
* @param int $mallSno
* @return string
*/
private function getLatestNonStandardContent($mallSno = DEFAULT_MALL_NUMBER)
{
$tableName = $this->mall->getTableName(DB_BUYER_INFORM, $mallSno);
$arrBind = null;
$strSQL = "SELECT content FROM " . $tableName
. " WHERE informCd LIKE concat(?, '%') AND modeFl = 'n'";
$this->db->bind_param_push($arrBind, 's', BuyerInformCode::AGREEMENT);
if ($mallSno > DEFAULT_MALL_NUMBER) {
$strSQL .= " AND mallSno = ?";
$this->db->bind_param_push($arrBind, 'i', $mallSno);
}
$strSQL .= " ORDER BY sno DESC LIMIT 1";
$row = $this->db->secondary()->query_fetch($strSQL, $arrBind, false);
 
return gd_htmlspecialchars_stripslashes(gd_isset($row['content'], ''));
}
 
/**
* 사용자 정의 이용약관 정보 및 체크박스 처리 반환 함수
*
 
Component/Board/Board.php+26-13
변경 전Board.php
public $storageType = ''; //storage 직접 설정
protected $httpStorage;
 
 
 
 
/**
* Board constructor.
*
$getData['data'] = $migrationArticleData;
}
 
// XSS 방지: 글머리(category) 이스케이프 (공통 처리)
 
 
 
if ($getData['data']) {
array_walk($getData['data'], function (&$item) {
if (isset($item['category'])) {
$item['category'] = gd_htmlspecialchars($item['category']);
}
});
}
 
//웹서비스형태로 데이터 가공
$this->applyConfigList($getData['data']);
if (gd_array_empty($getData['data']) === true) return $getData;
 
//페이징에 필요한 데이터 가공
$getData['uploadImageList'] = $uploadImageList;
$getData = gd_htmlspecialchars_stripslashes($getData);
 
// XSS 방지: 글머리(category) 이스케이프 (공통 처리)
if (isset($getData['category'])) {
$getData['category'] = gd_htmlspecialchars($getData['category']);
}
 
$this->applyConfigView($getData); //웹서비스형태로 데이터 가공
 
 
for ($i = 1; $i < gd_count($getData['uploadImgTag']) + 1; $i++) {
$getData['workedContents'] = str_replace('{=uploadImgTag[' . $i . ']}', $getData['uploadImgTag'][$i], $getData['workedContents']);
$getData['workedContents'] = str_replace('{=uploadImgUrl[' . $i . ']}', $getData['uploadImgUrl'][$i], $getData['workedContents']);
return DBTableField::tableCustomAttachments();
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후Board.php
public $storageType = ''; //storage 직접 설정
protected $httpStorage;
 
/** @var array XSS 이스케이프 대상 필드 */
protected array $escapeFields = ['category', 'subject', 'writerId', 'writerNm'];
 
/**
* Board constructor.
*
$getData['data'] = $migrationArticleData;
}
 
//웹서비스형태로 데이터 가공
$this->applyConfigList($getData['data']);
 
// 특정 필드 이스케이프
if ($getData['data']) {
$getData['data'] = array_map([$this, 'escapeOutputFields'], $getData['data']);
 
 
 
 
}
 
 
 
if (gd_array_empty($getData['data']) === true) return $getData;
 
//페이징에 필요한 데이터 가공
$getData['uploadImageList'] = $uploadImageList;
$getData = gd_htmlspecialchars_stripslashes($getData);
 
 
 
 
 
 
$this->applyConfigView($getData); //웹서비스형태로 데이터 가공
$getData = $this->escapeOutputFields($getData); // 특정 필드 이스케이프
 
for ($i = 1; $i < gd_count($getData['uploadImgTag']) + 1; $i++) {
$getData['workedContents'] = str_replace('{=uploadImgTag[' . $i . ']}', $getData['uploadImgTag'][$i], $getData['workedContents']);
$getData['workedContents'] = str_replace('{=uploadImgUrl[' . $i . ']}', $getData['uploadImgUrl'][$i], $getData['workedContents']);
return DBTableField::tableCustomAttachments();
}
}
 
/**
* XSS 방지: 게시판 출력 필드 이스케이프
*
* @param array $data
* @return array
*/
protected function escapeOutputFields(array $data): array
{
foreach ($this->escapeFields as $field) {
if (isset($data[$field])) {
$data[$field] = gd_htmlspecialchars($data[$field]);
}
}
return $data;
}
}
 
Component/Board/BoardFront.php+1-1
변경 전BoardFront.php
$saveFileName = ImageUploadService::getObsSaveFileNm($saveFileNames[$imageFileNum]);
$thumbSaveFileName = str_replace($saveFileName, "thumb/$saveFileName", $saveFileNames[$imageFileNum]);
 
if (ImageUploadService::isExistImageUrl($thumbSaveFileName)) {
$data['attachImageSrc'] = $this->cfg['bdKind'] == Board::KIND_EVENT ? $saveFileNames[$imageFileNum] : $thumbSaveFileName;
} else if ($data['bdUploadPath']) {
$data['attachImageSrc'] = $saveFileNames[$imageFileNum];
 
변경 후BoardFront.php
$saveFileName = ImageUploadService::getObsSaveFileNm($saveFileNames[$imageFileNum]);
$thumbSaveFileName = str_replace($saveFileName, "thumb/$saveFileName", $saveFileNames[$imageFileNum]);
 
if (ImageUploadService::isExistImageUrlOnObs($thumbSaveFileName)) {
$data['attachImageSrc'] = $this->cfg['bdKind'] == Board::KIND_EVENT ? $saveFileNames[$imageFileNum] : $thumbSaveFileName;
} else if ($data['bdUploadPath']) {
$data['attachImageSrc'] = $saveFileNames[$imageFileNum];
 
Component/Database/DBTableField.php+5
변경 전DBTableField.php
['val' => 'migrationDt', 'typ' => 's', 'def' => null], //외부 request 데이터
['val' => 'modDt', 'typ' => 's', 'def' => null], // 수정일
['val' => 'regDt', 'typ' => 's', 'def' => null], // 등록일
 
 
 
 
 
];
// @formatter:on
 
 
변경 후DBTableField.php
['val' => 'migrationDt', 'typ' => 's', 'def' => null], //외부 request 데이터
['val' => 'modDt', 'typ' => 's', 'def' => null], // 수정일
['val' => 'regDt', 'typ' => 's', 'def' => null], // 등록일
['val' => 'external_key', 'typ' => 's', 'def' => null], // 외부 사이트 리뷰등록시 중복 방지 구분값 (NULL: 자체 등록 리뷰)
['val' => 'external_site_name', 'typ' => 's', 'def' => null], // 외부 사이트 리뷰등록시 사용되는 리뷰 사이트 이름 (NULL: 자체 등록 리뷰)
['val' => 'external_site_url', 'typ' => 's', 'def' => null], // 외부 사이트 리뷰등록시 사용되는 상품상세 URL (NULL: 자체 등록 리뷰)
['val' => 'external_naver_review_flag', 'typ' => 's', 'def' => 'N'], // 외부 사이트 리뷰등록시 네이버 인지 판단여부 (Y: 네이버 리뷰, N: 그 외)
['val' => 'app_no', 'typ' => 'i', 'def' => 0], // 리뷰를 저장한 앱 NO
];
// @formatter:on
 
 
Component/Delivery/Delivery.php+3-5
변경 전Delivery.php
 
$traceUrl = str_replace('__INVOICENO__', str_replace('-', '', $invoiceNo), $getData['traceUrl']);
 
// curl 체크시 연결은 정상적으로되나 무한 로딩걸려서 예외처리 (DHL, UPS)
if (!gd_in_array($invoiceCompanySno, array(20, 26, 30))) {
if (!$this->isDomainAvailible($traceUrl)) {
throw new AlertCloseException(sprintf(__('[%s] 배송추적URL이 존재하지 않습니다.%s관리자에게 문의해주세요.'), $getData['companyName'], chr(10)));
}
}
 
return $traceUrl;
 
변경 후Delivery.php
 
$traceUrl = str_replace('__INVOICENO__', str_replace('-', '', $invoiceNo), $getData['traceUrl']);
 
// 배송추적 URL 형식만 검증 (isDomainAvailible 사전 체크 폐기)
if (!filter_var($traceUrl, FILTER_VALIDATE_URL)) {
throw new AlertCloseException(sprintf(__('[%s] 배송추적URL이 존재하지 않습니다.%s관리자에게 문의해주세요.'), $getData['companyName'], chr(10)));
 
 
}
 
return $traceUrl;
 
Component/Excel/ExcelRequest.php+6
변경 전ExcelRequest.php
$excelAddField[] = "</tr></table></td>";
$tmpData[] = gd_implode('', $excelAddField);
break;
 
 
 
case 'goodsType':
if ($val['goodsType'] == 'addGoods') {
$tmpData[] = "<td>추가</td>";
$excelAddField[] = "</tr></table></td>";
$tmpData[] = gd_implode('', $excelAddField);
break;
 
 
 
case 'goodsType':
if ($val['goodsType'] == 'addGoods') {
$tmpData[] = "<td>추가</td>";
 
변경 후ExcelRequest.php
$excelAddField[] = "</tr></table></td>";
$tmpData[] = gd_implode('', $excelAddField);
break;
case 'orderDeliverySno':
$tmpData[] = "<td>" . $val['deliverySno'] . "</td>";
break;
case 'goodsType':
if ($val['goodsType'] == 'addGoods') {
$tmpData[] = "<td>추가</td>";
$excelAddField[] = "</tr></table></td>";
$tmpData[] = gd_implode('', $excelAddField);
break;
case 'orderDeliverySno':
$tmpData[] = "<td>" . $val['deliverySno'] . "</td>";
break;
case 'goodsType':
if ($val['goodsType'] == 'addGoods') {
$tmpData[] = "<td>추가</td>";
 
Component/Goods/GoodsAdmin.php+63-21
변경 전GoodsAdmin.php
}
// 상품아이콘 > obs 카프카 컨슈머 처리 end
 
 
 
 
 
 
 
 
 
if($arrData['soldOutFl'] == 'y') {
$arrData['applyFl'] = 'n';
}
}
unset($arrData);
 
 
 
// 기본 상품의 이미지 정보
$getImage = $this->getGoodsOptionIcon($this->goodsNo);
 
}
 
 
 
 
 
// 기존 이미지 정보와 새로운 이미지 정보를 비교
$getImageCompare = $this->db->get_compare_array_data($getImage, gd_isset($iconInfo));
 
 
// 공통 키값
$arrDataKey = array('goodsNo' => $this->goodsNo);
 
// 이미지 디비 처리
$compareField = ['sno','goodsNo','optionNo','optionValue','colorCode','iconImage','goodsImage','optionImageStorage','obsConvertFl'];
$goodsImageLog = $this->db->set_compare_process(DB_GOODS_OPTION_ICON, gd_isset($iconInfo), $arrDataKey, $getImageCompare, $compareField);
 
// 상품아이콘 > obs 카프카 컨슈머 처리 start
if (gd_in_array($strImageStorage, self::DEFAULT_STORAGE) && !empty($goodsImageLog)) {
unset($goodsImageLog['delete']);
$goodsImageMigrationLog['imageIcon']['imagePath'] = $this->imagePath;
$goodsImageMigrationLog['imageIcon']['prefixGoodsThumbnail'] = PREFIX_GOODS_THUMBNAIL;
 
 
 
 
 
 
 
 
 
if (!empty($goodsImageLog['insert'])) {
 
 
$goodsImageMigrationLog['imageIcon']['insert'] = $goodsImageLog['insert'];
}
}
$tmpInfo['imageName'][] = $fVal;
$tmpInfo['imageRealSize'][] = '';
$tmpInfo['goodsImageStorage'][] = '';
$tmpInfo['obsConvertFl'][] = 'y';
$i++;
}
}
$tmpInfo['imageName'][] = $saveImageName;
$tmpInfo['imageRealSize'][] = implode(',', array());
$tmpInfo['goodsImageStorage'][] = 'local';
$tmpInfo['obsConvertFl'][] = 'y';
 
// GD 이용한 화일 리사이징
$storage->upload($tmpImageFile, $targetImageFile, ['width' => $size[0], 'height' => $size[1]]);
$tmpInfo['imageName'][] = $saveImageName;
$tmpInfo['imageRealSize'][] = gd_implode(',', $tmpSize);
$tmpInfo['goodsImageStorage'][] = 'local';
$tmpInfo['obsConvertFl'][] = 'y';
// 이미지 저장
$storage->upload($tmpImageFile, $targetImageFile);
 
if($imageInfo['imageCode'][$val.$i] && empty($imageInfo['imageUrlFl'][$val.$i]) === true && empty($imageInfo['imageDelFl'][$val.$i]) === true) {
 
$imageIndex = gd_array_search($imageInfo['imageCode'][$val.$i], $imageInfo['sno']);
$obsConvertFl = $this->isValidImagePathUrl($imageInfo['imageName'][$imageIndex]) ? 'y' : $imageInfo['obsConvertFl'][$imageIndex];
 
$tmpInfo['sno'][] = $imageInfo['sno'][$imageIndex];
$tmpInfo['imageNo'][] = $imageNo;
$tmpInfo['imageName'][] = $imageInfo['imageName'][$imageIndex];
$tmpInfo['imageRealSize'][] = $imageInfo['imageRealSize'][$imageIndex];
$tmpInfo['goodsImageStorage'][] = $imageInfo['goodsImageStorage'][$imageIndex];
$tmpInfo['obsConvertFl'][] = $obsConvertFl;
$imageNo++;
}
}
// 엑셀 등록일 때는 따로 delete 프로듀싱 처리 작업 필요
if ($extraArrData['excelFl'] == self::EXCEL_FL && (!empty($fVal) || $imageInfo['imageDelFl'][$val.$i] == 'y')) {
$imageIndex = gd_array_search($imageInfo['imageCode'][$val.$i], $imageInfo['sno']);
$obsConvertFl = $this->isValidImagePathUrl($imageInfo['imageName'][$imageIndex]) ? 'y' : $imageInfo['obsConvertFl'][$imageIndex];
 
$tmpDeleteImageInfo['sno'][] = $imageInfo['sno'][$imageIndex];
$tmpDeleteImageInfo['imageNo'][] = $excelImageNo;
$tmpDeleteImageInfo['imageName'][] = $imageInfo['imageName'][$imageIndex];
$tmpDeleteImageInfo['imageRealSize'][] = $imageInfo['imageRealSize'][$imageIndex];
$tmpDeleteImageInfo['goodsImageStorage'][] = $imageInfo['goodsImageStorage'][$imageIndex];
$tmpDeleteImageInfo['obsConvertFl'][] = $obsConvertFl;
$excelImageNo++;
}
 
foreach ($urlImageTmp as $fKey => $fVal) {
if (strtolower(substr($fVal,0,4)) =='http' && empty($imageInfo['imageUrlDelFl'][$val.$i]) === true) {
$size = explode(INT_DIVISION, $image['size'][$val]);
$obsConvertFl = $this->isValidImagePathUrl($fVal) ? 'y' : 'n';
 
$tmpInfo['sno'][] = gd_isset($imageInfo['imageCode'][$val.$i]);
$tmpInfo['imageNo'][] = $imageNo;
$tmpInfo['imageName'][] = $fVal;
$tmpInfo['imageRealSize'][] = '';
$tmpInfo['goodsImageStorage'][] = '';
$tmpInfo['obsConvertFl'][] = $obsConvertFl;
$imageNo++;
}
$i++;
unset($getImage[$getImageKey]['thumbImageUrl']);
}
 
$compareField = ['sno','goodsNo','imageSize','imageHeightSize','imageNo','imageKind','imageName','imageRealSize','goodsImageStorage','obsConvertFl'];
if (!empty($extraArrData['originalGoodsNo']) && gd_in_array($strImageStorage, self::DEFAULT_STORAGE)) {
array_push($compareField, 'imageUrl', 'thumbImageUrl');
 
unset($tempImageUrl);
}
 
$getImageCompare = $this->db->get_compare_array_data($getImage, gd_isset($tmpInfo));
// 공통 키값
$arrDataKey = array('goodsNo' => $this->goodsNo);
 
// 이미지 디비 처리
$goodsImageLog = $this->db->set_compare_process(DB_GOODS_IMAGE, gd_isset($tmpInfo), $arrDataKey, $getImageCompare, $compareField);
 
if($strImageStorage == 'local' && empty($tmpInfo['imageName']) === false && strpos($this->imagePath, $this->goodsNo) !== false ) {
$goodsImageDir = UserFilePath::data('goods', $this->imagePath);
if ($openDir = opendir($goodsImageDir)) {
 
unset($tmpGoodsImageLog['delete']);
 
if (!empty($tmpGoodsImageLog)) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$goodsImageMigrationLog['image'] = $tmpGoodsImageLog;
$goodsImageMigrationLog['image']['imagePath'] = $this->imagePath;
$goodsImageMigrationLog['image']['prefixGoodsThumbnail'] = PREFIX_GOODS_THUMBNAIL;
$goodsImageMigrationLog['image']['delete'] = $goodsImageMigrationDeleteLog;
}
 
 
 
// openAPI로 상품 등록 시 바로 프로듀싱할 수 있도록
if ($extraArrData['callBy'] == OPEN_API) {
$goodsImageMigrationLog['convertedType'] = 'manage'; // 상품이미지 등록,수정,삭제
\Logger::channel('kafka')->info('process sendMQ - return :', [$result, 'openAPI', $goodsImageMigrationLog]);
if ($result['result'] == 'success') {
// goodsNo obsConvertFl = N 업데이트 필요
$goodsObsConvertStatus = \App::load('\\Component\\Goods\\GoodsObsConvertStatus');
$goodsObsConvertStatus->updateObsConvertFl($this->goodsNo, $goodsImageMigrationLog);
}
}
 
 
 
}
// 상품이미지 > obs 카프카 컨슈머 처리 end
 
// 상품이미지 > obs 카프카 컨슈머 처리 start
if(gd_in_array($data['imageStorage'], self::DEFAULT_STORAGE)) {
 
// 상품이미지가 url 이미지일 경우, obs 전환여부를 'y'로 고정
$goodsImageStorage = $this->isValidImagePathUrl($tempImageUrl) ? 'local' : 'obs';
$obsConvertFl = $goodsImageStorage === 'local' ? 'y' : 'n';
 
}
// 상품이미지 > obs 카프카 컨슈머 처리 end
 
 
 
 
 
 
 
 
// --- 이미지 복사 처리
if($data['imageStorage'] !='url') {
if ($data['imageStorage'] == 'obs') {
 
변경 후GoodsAdmin.php
}
// 상품아이콘 > obs 카프카 컨슈머 처리 end
 
// URL 이미지는 OBS 변환 대상 아님 → 'y' 고정 (legacy 'n' 잠금 해제 포함)
if (gd_in_array($arrData['imageStorage'], self::DEFAULT_STORAGE)) {
if ($arrData['applyGoodsCopy']) {
$goodsObsConvertStatus->setObsConvertFlagForUrlImages($arrData['applyNo']);
}
$goodsObsConvertStatus->setObsConvertFlagForUrlImages($arrData['goodsNo']);
}
 
if($arrData['soldOutFl'] == 'y') {
$arrData['applyFl'] = 'n';
}
}
unset($arrData);
 
 
 
// 기본 상품의 이미지 정보
$getImage = $this->getGoodsOptionIcon($this->goodsNo);
 
}
 
 
// 이미지 디비 처리
$compareField = ['sno','goodsNo','optionNo','optionValue','colorCode','iconImage','goodsImage','optionImageStorage'];
 
// 기존 이미지 정보와 새로운 이미지 정보를 비교
$getImageCompare = $this->db->get_compare_array_data($getImage, gd_isset($iconInfo), true, $compareField);
 
 
// 공통 키값
$arrDataKey = array('goodsNo' => $this->goodsNo);
 
 
 
$goodsImageLog = $this->db->set_compare_process(DB_GOODS_OPTION_ICON, gd_isset($iconInfo), $arrDataKey, $getImageCompare, $compareField);
 
// 상품아이콘 > obs 카프카 컨슈머 처리 start
if (gd_in_array($strImageStorage, self::DEFAULT_STORAGE) && !empty($goodsImageLog)) {
unset($goodsImageLog['delete']);
 
// URL 이미지는 Kafka 전송 대상 아님 → migrationLog 에서 제외
$filterUrlOptionRows = function ($rows) {
return array_values(array_filter($rows, function ($row) {
return filter_var($row['goodsImage'] ?? '', FILTER_VALIDATE_URL) === false;
}));
};
if (!empty($goodsImageLog['insert'])) {
$goodsImageLog['insert'] = $filterUrlOptionRows($goodsImageLog['insert']);
}
 
if (!empty($goodsImageLog['insert'])) {
$goodsImageMigrationLog['imageIcon']['imagePath'] = $this->imagePath;
$goodsImageMigrationLog['imageIcon']['prefixGoodsThumbnail'] = PREFIX_GOODS_THUMBNAIL;
$goodsImageMigrationLog['imageIcon']['insert'] = $goodsImageLog['insert'];
}
}
$tmpInfo['imageName'][] = $fVal;
$tmpInfo['imageRealSize'][] = '';
$tmpInfo['goodsImageStorage'][] = '';
 
$i++;
}
}
$tmpInfo['imageName'][] = $saveImageName;
$tmpInfo['imageRealSize'][] = implode(',', array());
$tmpInfo['goodsImageStorage'][] = 'local';
 
 
// GD 이용한 화일 리사이징
$storage->upload($tmpImageFile, $targetImageFile, ['width' => $size[0], 'height' => $size[1]]);
$tmpInfo['imageName'][] = $saveImageName;
$tmpInfo['imageRealSize'][] = gd_implode(',', $tmpSize);
$tmpInfo['goodsImageStorage'][] = 'local';
 
// 이미지 저장
$storage->upload($tmpImageFile, $targetImageFile);
 
if($imageInfo['imageCode'][$val.$i] && empty($imageInfo['imageUrlFl'][$val.$i]) === true && empty($imageInfo['imageDelFl'][$val.$i]) === true) {
 
$imageIndex = gd_array_search($imageInfo['imageCode'][$val.$i], $imageInfo['sno']);
 
 
$tmpInfo['sno'][] = $imageInfo['sno'][$imageIndex];
$tmpInfo['imageNo'][] = $imageNo;
$tmpInfo['imageName'][] = $imageInfo['imageName'][$imageIndex];
$tmpInfo['imageRealSize'][] = $imageInfo['imageRealSize'][$imageIndex];
$tmpInfo['goodsImageStorage'][] = $imageInfo['goodsImageStorage'][$imageIndex];
 
$imageNo++;
}
}
// 엑셀 등록일 때는 따로 delete 프로듀싱 처리 작업 필요
if ($extraArrData['excelFl'] == self::EXCEL_FL && (!empty($fVal) || $imageInfo['imageDelFl'][$val.$i] == 'y')) {
$imageIndex = gd_array_search($imageInfo['imageCode'][$val.$i], $imageInfo['sno']);
 
 
$tmpDeleteImageInfo['sno'][] = $imageInfo['sno'][$imageIndex];
$tmpDeleteImageInfo['imageNo'][] = $excelImageNo;
$tmpDeleteImageInfo['imageName'][] = $imageInfo['imageName'][$imageIndex];
$tmpDeleteImageInfo['imageRealSize'][] = $imageInfo['imageRealSize'][$imageIndex];
$tmpDeleteImageInfo['goodsImageStorage'][] = $imageInfo['goodsImageStorage'][$imageIndex];
 
$excelImageNo++;
}
 
foreach ($urlImageTmp as $fKey => $fVal) {
if (strtolower(substr($fVal,0,4)) =='http' && empty($imageInfo['imageUrlDelFl'][$val.$i]) === true) {
$size = explode(INT_DIVISION, $image['size'][$val]);
 
 
$tmpInfo['sno'][] = gd_isset($imageInfo['imageCode'][$val.$i]);
$tmpInfo['imageNo'][] = $imageNo;
$tmpInfo['imageName'][] = $fVal;
$tmpInfo['imageRealSize'][] = '';
$tmpInfo['goodsImageStorage'][] = '';
 
$imageNo++;
}
$i++;
unset($getImage[$getImageKey]['thumbImageUrl']);
}
 
$compareField = ['sno','goodsNo','imageSize','imageHeightSize','imageNo','imageKind','imageName','imageRealSize','goodsImageStorage'];
if (!empty($extraArrData['originalGoodsNo']) && gd_in_array($strImageStorage, self::DEFAULT_STORAGE)) {
array_push($compareField, 'imageUrl', 'thumbImageUrl');
 
unset($tempImageUrl);
}
 
$getImageCompare = $this->db->get_compare_array_data($getImage, gd_isset($tmpInfo), true, $compareField);
// 공통 키값
$arrDataKey = array('goodsNo' => $this->goodsNo);
 
// 이미지 디비 처리
$goodsImageLog = $this->db->set_compare_process(DB_GOODS_IMAGE, gd_isset($tmpInfo), $arrDataKey, $getImageCompare, $compareField);
 
if($strImageStorage == 'local' && empty($tmpInfo['imageName']) === false && strpos($this->imagePath, $this->goodsNo) !== false ) {
$goodsImageDir = UserFilePath::data('goods', $this->imagePath);
if ($openDir = opendir($goodsImageDir)) {
 
unset($tmpGoodsImageLog['delete']);
 
// URL 이미지는 Kafka 전송 대상 아님 → migrationLog 에서 제외
$filterUrlImageRows = function ($rows) {
return array_values(array_filter($rows, function ($row) {
return filter_var($row['imageName'] ?? '', FILTER_VALIDATE_URL) === false;
}));
};
if (!empty($tmpGoodsImageLog['insert'])) {
$tmpGoodsImageLog['insert'] = $filterUrlImageRows($tmpGoodsImageLog['insert']);
if (empty($tmpGoodsImageLog['insert'])) {
unset($tmpGoodsImageLog['insert']);
}
}
if (!empty($tmpGoodsImageLog['update'])) {
$tmpGoodsImageLog['update'] = $filterUrlImageRows($tmpGoodsImageLog['update']);
if (empty($tmpGoodsImageLog['update'])) {
unset($tmpGoodsImageLog['update']);
}
}
 
// URL 필터링으로 insert/update 가 모두 비어도 delete 만 있는 경우가 발생할 수 있으므로
// delete log 가 있으면 imagePath / prefixGoodsThumbnail 도 함께 세팅한다.
if (!empty($tmpGoodsImageLog) || !empty($goodsImageMigrationDeleteLog)) {
$goodsImageMigrationLog['image'] = $tmpGoodsImageLog;
$goodsImageMigrationLog['image']['imagePath'] = $this->imagePath;
$goodsImageMigrationLog['image']['prefixGoodsThumbnail'] = PREFIX_GOODS_THUMBNAIL;
$goodsImageMigrationLog['image']['delete'] = $goodsImageMigrationDeleteLog;
}
 
$goodsObsConvertStatus = \App::load('\\Component\\Goods\\GoodsObsConvertStatus');
 
// openAPI로 상품 등록 시 바로 프로듀싱할 수 있도록
if ($extraArrData['callBy'] == OPEN_API) {
$goodsImageMigrationLog['convertedType'] = 'manage'; // 상품이미지 등록,수정,삭제
\Logger::channel('kafka')->info('process sendMQ - return :', [$result, 'openAPI', $goodsImageMigrationLog]);
if ($result['result'] == 'success') {
// goodsNo obsConvertFl = N 업데이트 필요
 
$goodsObsConvertStatus->updateObsConvertFl($this->goodsNo, $goodsImageMigrationLog);
}
}
 
// URL 이미지는 OBS 변환 대상 아님 → 'y' 고정 (legacy 'n' 잠금 해제 포함)
$goodsObsConvertStatus->setObsConvertFlagForUrlImages($this->goodsNo);
}
// 상품이미지 > obs 카프카 컨슈머 처리 end
 
// 상품이미지 > obs 카프카 컨슈머 처리 start
if(gd_in_array($data['imageStorage'], self::DEFAULT_STORAGE)) {
 
// 상품이미지가 url 이미지일 경우, obs 전환여부를 'y'로 고정 (URL은 OBS 변환 대상 아님)
$goodsImageStorage = $this->isValidImagePathUrl($tempImageUrl) ? 'local' : 'obs';
$obsConvertFl = $goodsImageStorage === 'local' ? 'y' : 'n';
 
}
// 상품이미지 > obs 카프카 컨슈머 처리 end
 
// URL 이미지는 OBS 변환 대상 아님 → 'y' 고정 (legacy 'n' 잠금 해제 포함)
if (gd_in_array($data['imageStorage'], self::DEFAULT_STORAGE)) {
$goodsObsConvertStatusForUrl = \App::load('\\Component\\Goods\\GoodsObsConvertStatus');
$goodsObsConvertStatusForUrl->setObsConvertFlagForUrlImages($goodsNo);
$goodsObsConvertStatusForUrl->setObsConvertFlagForUrlImages($newGoodsNo);
}
 
// --- 이미지 복사 처리
if($data['imageStorage'] !='url') {
if ($data['imageStorage'] == 'obs') {
 
Component/Goods/GoodsObsConvertStatus.php+26
변경 전GoodsObsConvertStatus.php
$this->db->bind_query($strSQL, $arrBind);
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후GoodsObsConvertStatus.php
$this->db->bind_query($strSQL, $arrBind);
}
}
 
/**
* URL 이미지는 OBS 변환 대상이 아니므로 obsConvertFl 을 'y' 로 강제 처리하고
* obs → url 직접입력 전환 시 잔존하는 OBS 경로/URL 컬럼을 함께 비운다.
* (legacy 'n' 잔존값 정리 + 신규 작업 후 URL 행 잠금 방지 + stale OBS 컬럼 정리)
*/
public function setObsConvertFlagForUrlImages($goodsNo)
{
// 상품이미지 : URL 직접입력 행은 OBS 폴더/URL 컬럼이 있을 이유가 없으므로 함께 비움
$arrBind = [];
$strSQL = 'UPDATE ' . DB_GOODS_IMAGE
. ' SET obsConvertFl = ?, imageFolder = "", thumbImageFolder = "", imageUrl = "", thumbImageUrl = ""'
. ' WHERE goodsNo = ? AND imageName LIKE "http%" ';
$this->db->bind_param_push($arrBind, 's', 'y');
$this->db->bind_param_push($arrBind, 'i', $goodsNo);
$this->db->bind_query($strSQL, $arrBind);
 
// 상품옵션이미지 : URL 직접입력 행은 goodsImageUrl / goodsThumbImageUrl 도 함께 비움
$arrBind = [];
$strSQL = 'UPDATE ' . DB_GOODS_OPTION_ICON
. ' SET obsConvertFl = ?, goodsImageUrl = "", goodsThumbImageUrl = ""'
. ' WHERE goodsNo = ? AND goodsImage LIKE "http%" ';
$this->db->bind_param_push($arrBind, 's', 'y');
$this->db->bind_param_push($arrBind, 'i', $goodsNo);
$this->db->bind_query($strSQL, $arrBind);
}
}
 
Component/Member/Group/GroupService.php+7
변경 전GroupService.php
ArrayUtils::commaRemover($group, $commaRemoverFilter);
$group = ArrayUtils::jsonEncode($group, $jsonEncodeFilter);
$group['groupCoupon'] = gd_implode(INT_DIVISION, $group['couponNo']);
 
 
 
 
 
 
 
$group['dcBrandInfo'] = str_replace('\'', '', json_encode($group['dcBrandInfo'], JSON_UNESCAPED_UNICODE)); // 추가 할인 브랜드별 할인
 
\Request::post()->setData($group);
 
변경 후GroupService.php
ArrayUtils::commaRemover($group, $commaRemoverFilter);
$group = ArrayUtils::jsonEncode($group, $jsonEncodeFilter);
$group['groupCoupon'] = gd_implode(INT_DIVISION, $group['couponNo']);
 
// 추가할인 할인율 default 0
foreach (($group['dcBrandInfo'] ?? []) as $k => $arr) {
if (trim($k, "'") === 'goodsDiscount' && is_array($arr)) {
$group['dcBrandInfo'][$k] = array_map(fn($v) => ($v === '' || $v === null) ? '0' : $v, $arr);
}
}
$group['dcBrandInfo'] = str_replace('\'', '', json_encode($group['dcBrandInfo'], JSON_UNESCAPED_UNICODE)); // 추가 할인 브랜드별 할인
 
\Request::post()->setData($group);
 
Component/Member/Member.php+7
변경 전Member.php
use Globals;
use Logger;
use Origin\Service\Oauth\Google\GoogleLoginService;
 
use Request;
use Session;
use UserFilePath;
 
$this->saveLoginLog($encryptMember['memNo']);
$this->refreshMemberByLogin($encryptMember['memNo'], $encryptMember['loginCnt']);
 
 
 
$this->refreshBasket($encryptMember['memNo']);
 
if ($encryptMember['loginLimit']['loginFailCount'] ?? 0 > 0) {
$initLimitLoginLog = $this->initLimitLoginLog($encryptMember);
$encryptMember = $initLimitLoginLog['member'];
// 모듈 설정
$cart = \App::load('Component\\Cart\\Cart');
$cart->setMergeCart($encryptMember['memNo']);
 
$this->setSessionByLogin($encryptMember);
}
 
$goodsStatistics->setCartMemberUpdateStatistics($cartStatistics);
}
 
 
/**
* 아이디찾기
*
 
변경 후Member.php
use Globals;
use Logger;
use Origin\Service\Oauth\Google\GoogleLoginService;
use Origin\Service\WebHook\CartWebHookService;
use Request;
use Session;
use UserFilePath;
 
$this->saveLoginLog($encryptMember['memNo']);
$this->refreshMemberByLogin($encryptMember['memNo'], $encryptMember['loginCnt']);
 
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$migratedCartSnos = $cartWebHookService->findGuestCartSnos(Session::get('siteKey'));
$this->refreshBasket($encryptMember['memNo']);
 
if ($encryptMember['loginLimit']['loginFailCount'] ?? 0 > 0) {
$initLimitLoginLog = $this->initLimitLoginLog($encryptMember);
$encryptMember = $initLimitLoginLog['member'];
// 모듈 설정
$cart = \App::load('Component\\Cart\\Cart');
$cart->setMergeCart($encryptMember['memNo']);
$cartWebHookService->sendCartUpdatedWebHook($migratedCartSnos, 'CREATED');
$this->setSessionByLogin($encryptMember);
}
 
$goodsStatistics->setCartMemberUpdateStatistics($cartStatistics);
}
 
 
/**
* 아이디찾기
*
 
Component/Member/MemberDAO.php+15-2
변경 전MemberDAO.php
* 단, 가입일이 2014년 11월 29일 이전일 경우 수신동의일자를 2014년 11월 28일로 적용(수신동의 여부의 확인에 관한 특례)
*
* @param null $standardDt 동의일자와 비교될 기준일 특별한 경우가 아니면 데이터를 넘기지 않도록 한다. 기본은 -2 year -30 days
 
 
*
* @return array|object
*/
public function selectMembersByReceiveNotification($standardDt = null)
{
if ($standardDt == null) {
$standardDt = DateTimeUtils::dateFormat('Y-m-d', '-2 year +30 days');
$this->db->strJoin = ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'SMS수신동의\' GROUP BY memNo) AS mh_sms ON m.memNo = mh_sms.memNo';
$this->db->strJoin .= ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'메일수신동의\' GROUP BY memNo) AS mh_mail ON m.memNo = mh_mail.memNo';
$this->db->strJoin .= ' LEFT JOIN (SELECT DISTINCT memNo FROM ' . DB_MEMBER_NOTIFICATION_LOG . ' WHERE ReasonCode=\'' . MailMimeAuto::AGREEMENT2YPERIOD . '\' AND regDt >= \'' . $standardDt . ' 00:00:00\' AND regDt <= \'' . $nowDt . ' 23:59:59\') AS mnl ON m.memNo = mnl.memNo';
$this->db->strWhere = '((m.smsFl=\'y\' AND m.cellPhone IS NOT NULL AND m.cellPhone != \'\')';
 
 
 
 
 
$this->db->strWhere .= ' OR (m.maillingFl=\'y\' AND m.email IS NOT NULL AND m.email != \'\'))';
$this->db->strWhere .= ' AND m.sleepFl=\'n\'';
$this->db->strWhere .= ' AND mnl.memNo IS NULL';
$this->db->strWhere .= ' OR ';
$this->db->strWhere .= '(COALESCE(mh_mail.maxRegDt, IF(m.entryDt < \'' . $entryDtThreshold . '\', \'' . $entryDtDefault . '\', m.entryDt)) <= \'' . $standardDtEnd . '\' AND m.maillingFl=\'y\')';
$this->db->strWhere .= ')';
 
 
 
 
 
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER . ' AS m ' . gd_implode(' ', $query);
$result = $this->db->query_fetch($strSQL);
 
변경 후MemberDAO.php
* 단, 가입일이 2014년 11월 29일 이전일 경우 수신동의일자를 2014년 11월 28일로 적용(수신동의 여부의 확인에 관한 특례)
*
* @param null $standardDt 동의일자와 비교될 기준일 특별한 경우가 아니면 데이터를 넘기지 않도록 한다. 기본은 -2 year -30 days
* @param int $lastMemNo 마지막으로 처리한 회원번호 (커서, 0이면 커서 미적용)
* @param int $chunkSize 한 번에 조회할 건수 (0이면 전체 조회)
*
* @return array|object
*/
public function selectMembersByReceiveNotification($standardDt = null, int $lastMemNo = 0, int $chunkSize = 0)
{
if ($standardDt == null) {
$standardDt = DateTimeUtils::dateFormat('Y-m-d', '-2 year +30 days');
$this->db->strJoin = ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'SMS수신동의\' GROUP BY memNo) AS mh_sms ON m.memNo = mh_sms.memNo';
$this->db->strJoin .= ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'메일수신동의\' GROUP BY memNo) AS mh_mail ON m.memNo = mh_mail.memNo';
$this->db->strJoin .= ' LEFT JOIN (SELECT DISTINCT memNo FROM ' . DB_MEMBER_NOTIFICATION_LOG . ' WHERE ReasonCode=\'' . MailMimeAuto::AGREEMENT2YPERIOD . '\' AND regDt >= \'' . $standardDt . ' 00:00:00\' AND regDt <= \'' . $nowDt . ' 23:59:59\') AS mnl ON m.memNo = mnl.memNo';
 
$this->db->strWhere = '';
if ($lastMemNo > 0) {
$this->db->strWhere .= 'm.memNo > ' . $lastMemNo . ' AND ';
}
$this->db->strWhere .= '((m.smsFl=\'y\' AND m.cellPhone IS NOT NULL AND m.cellPhone != \'\')';
$this->db->strWhere .= ' OR (m.maillingFl=\'y\' AND m.email IS NOT NULL AND m.email != \'\'))';
$this->db->strWhere .= ' AND m.sleepFl=\'n\'';
$this->db->strWhere .= ' AND mnl.memNo IS NULL';
$this->db->strWhere .= ' OR ';
$this->db->strWhere .= '(COALESCE(mh_mail.maxRegDt, IF(m.entryDt < \'' . $entryDtThreshold . '\', \'' . $entryDtDefault . '\', m.entryDt)) <= \'' . $standardDtEnd . '\' AND m.maillingFl=\'y\')';
$this->db->strWhere .= ')';
 
if ($chunkSize > 0) {
$this->db->strOrder = 'm.memNo ASC';
$this->db->strLimit = $chunkSize;
}
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER . ' AS m ' . gd_implode(' ', $query);
$result = $this->db->query_fetch($strSQL);
 
Component/Member/MemberSnsService.php+9
변경 전MemberSnsService.php
use Framework\Debug\Exception\AlertRedirectCloseException;
use Framework\Utility\DateTimeUtils;
use Framework\Utility\StringUtils;
 
use Origin\Service\WebHook\MemberWebHookService;
use Origin\Exception\Member\MissingMemberDataException;
use Request;
$memberService = new Member();
$memberService->saveLoginLog($encrypt['memNo']);
$memberService->refreshMemberByLogin($encrypt['memNo'], $encrypt['loginCnt']);
 
 
 
$memberService->refreshBasket($encrypt['memNo']);
 
 
 
 
 
$memberService->setSessionByLogin($encrypt);
 
// 로그인 성공 시 웹훅 발송
 
변경 후MemberSnsService.php
use Framework\Debug\Exception\AlertRedirectCloseException;
use Framework\Utility\DateTimeUtils;
use Framework\Utility\StringUtils;
use Origin\Service\WebHook\CartWebHookService;
use Origin\Service\WebHook\MemberWebHookService;
use Origin\Exception\Member\MissingMemberDataException;
use Request;
$memberService = new Member();
$memberService->saveLoginLog($encrypt['memNo']);
$memberService->refreshMemberByLogin($encrypt['memNo'], $encrypt['loginCnt']);
 
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$migratedCartSnos = $cartWebHookService->findGuestCartSnos(\Session::get('siteKey'));
$memberService->refreshBasket($encrypt['memNo']);
 
$cart = \App::load('Component\\Cart\\Cart');
$cart->setMergeCart($encrypt['memNo']);
$cartWebHookService->sendCartUpdatedWebHook($migratedCartSnos, 'CREATED');
 
$memberService->setSessionByLogin($encrypt);
 
// 로그인 성공 시 웹훅 발송
 
Component/Member/PageAccess.php+5
변경 전PageAccess.php
'guest' => '0',
'intro' => 'x',
],
 
 
 
 
 
'member/join_method.php' => [
'member' => 'x',
'guest' => '0',
 
변경 후PageAccess.php
'guest' => '0',
'intro' => 'x',
],
'member/captcha.php' => [
'member' => 'x',
'guest' => 'x',
'intro' => 'x',
],
'member/join_method.php' => [
'member' => 'x',
'guest' => '0',
 
Component/Member/Sleep/SleepDAO.php+34-8
변경 전SleepDAO.php
/**
* 휴면회원안내 SMS 발송 대상자 조회
*
* @param int $expirationFl
 
 
 
*
* @return array|null|object
*/
public function selectSleepSmsReceiver($expirationFl = 1)
{
$period = DateTimeUtils::dateFormat('Y-m-d', '-' . ((SleepService::SLEEP_PERIOD * $expirationFl) - 30) . ' day');
 
 
$where = 'IF(lastLoginDt = \'0000-00-00 00:00:00\' OR lastLoginDt IS NULL, DATE_FORMAT(entryDt, \'%Y-%m-%d\') <= \'' . $period . '\' , DATE_FORMAT(lastLoginDt, \'%Y-%m-%d\') <= \'' . $period . '\')';
$where .= ' AND sleepFl=\'n\' AND sleepSmsFl=\'n\' AND expirationFl=\'' . $expirationFl . '\' AND (cellPhone!=\'\' AND cellPhone IS NOT NULL)';
 
 
 
 
 
 
 
 
 
return $this->getDataByTable(DB_MEMBER, null, $where, '*', true);
}
/**
* 휴면회원안내 메일 발송 대상자 조회
*
* @param int $expirationFl
 
 
 
*
* @return array|null|object
*
* ex) where = IF(lastLoginDt = '0000-00-00 00:00:00' OR lastLoginDt IS NULL, DATE_FORMAT(entryDt, '%Y-%m-%d') <= '2012-03-06' ,
* DATE_FORMAT(lastLoginDt, '%Y-%m-%d') <= '2012-03-06') AND sleepFl='n' AND sleepMailFl='n' AND expirationFl='5'
*/
public function selectSleepMailReceiver($expirationFl = 1)
{
$period = DateTimeUtils::dateFormat('Y-m-d', '-' . ((SleepService::SLEEP_PERIOD * $expirationFl) - 50) . ' day');
 
 
$period .= ' 23:59:59';
$where[] = 'IF(lastLoginDt = \'0000-00-00 00:00:00\' OR lastLoginDt IS NULL, entryDt <= \'' . $period . '\' , lastLoginDt <= \'' . $period . '\')';
$where[] = 'sleepFl=\'n\' AND sleepMailFl=\'n\' AND expirationFl=\'' . $expirationFl . '\' AND (email!=\'\' AND email IS NOT NULL)';
 
 
 
$this->db->strField = '*';
$this->db->strWhere = gd_implode(' AND ', $where);
$this->db->strOrder = 'lastLoginDt ASC';
$this->db->strLimit = '2000';
 
 
 
 
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER . ' ' . gd_implode(' ', $query);
return $this->db->query_fetch($strSQL, false);
 
변경 후SleepDAO.php
/**
* 휴면회원안내 SMS 발송 대상자 조회
*
* @param int $expirationFl
* @param string|null $targetDate 기준 일자 (Y-m-d). null 이면 현재('now') 기준
* @param int $lastMemNo 마지막으로 처리한 회원번호 (커서, 0이면 커서 미적용)
* @param int $limit 한 번에 조회할 건수 (0이면 전체 조회)
*
* @return array|null|object
*/
public function selectSleepSmsReceiver($expirationFl = 1, ?string $targetDate = null, int $lastMemNo = 0, int $limit = 0)
{
$daysOffset = (SleepService::SLEEP_PERIOD * $expirationFl) - 30;
$baseTime = $targetDate ?? 'now';
$period = DateTimeUtils::dateFormat('Y-m-d', $baseTime . ' -' . $daysOffset . ' day');
$where = 'IF(lastLoginDt = \'0000-00-00 00:00:00\' OR lastLoginDt IS NULL, DATE_FORMAT(entryDt, \'%Y-%m-%d\') <= \'' . $period . '\' , DATE_FORMAT(lastLoginDt, \'%Y-%m-%d\') <= \'' . $period . '\')';
$where .= ' AND sleepFl=\'n\' AND sleepSmsFl=\'n\' AND expirationFl=\'' . $expirationFl . '\' AND (cellPhone!=\'\' AND cellPhone IS NOT NULL)';
if ($lastMemNo > 0) {
$where .= ' AND memNo > ' . $lastMemNo;
}
 
if ($limit > 0) {
$this->db->strOrder = 'memNo ASC';
$this->db->strLimit = $limit;
}
 
return $this->getDataByTable(DB_MEMBER, null, $where, '*', true);
}
/**
* 휴면회원안내 메일 발송 대상자 조회
*
* @param int $expirationFl
* @param string|null $targetDate 기준 일자 (Y-m-d). null 이면 현재('now') 기준
* @param int $lastMemNo 마지막으로 처리한 회원번호 (커서, 0이면 커서 미적용)
* @param int $limit 한 번에 조회할 건수 (0이면 기존 LIMIT 2000 유지)
*
* @return array|null|object
*
* ex) where = IF(lastLoginDt = '0000-00-00 00:00:00' OR lastLoginDt IS NULL, DATE_FORMAT(entryDt, '%Y-%m-%d') <= '2012-03-06' ,
* DATE_FORMAT(lastLoginDt, '%Y-%m-%d') <= '2012-03-06') AND sleepFl='n' AND sleepMailFl='n' AND expirationFl='5'
*/
public function selectSleepMailReceiver($expirationFl = 1, ?string $targetDate = null, int $lastMemNo = 0, int $limit = 0)
{
$daysOffset = (SleepService::SLEEP_PERIOD * $expirationFl) - 50;
$baseTime = $targetDate ?? 'now';
$period = DateTimeUtils::dateFormat('Y-m-d', $baseTime . ' -' . $daysOffset . ' day');
$period .= ' 23:59:59';
$where[] = 'IF(lastLoginDt = \'0000-00-00 00:00:00\' OR lastLoginDt IS NULL, entryDt <= \'' . $period . '\' , lastLoginDt <= \'' . $period . '\')';
$where[] = 'sleepFl=\'n\' AND sleepMailFl=\'n\' AND expirationFl=\'' . $expirationFl . '\' AND (email!=\'\' AND email IS NOT NULL)';
if ($lastMemNo > 0) {
$where[] = 'memNo > ' . $lastMemNo;
}
$this->db->strField = '*';
$this->db->strWhere = gd_implode(' AND ', $where);
if ($limit > 0) {
$this->db->strOrder = 'memNo ASC';
$this->db->strLimit = $limit;
} else {
$this->db->strOrder = 'lastLoginDt ASC';
$this->db->strLimit = '2000';
}
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER . ' ' . gd_implode(' ', $query);
return $this->db->query_fetch($strSQL, false);
 
Component/Member/Sleep/SleepService.php+7-3
변경 전SleepService.php
/**
* 휴면회원 전환 안내 SMS 수신 대상 조회 및 전환 예정일 설정
*
 
 
 
* @return array
*/
public function getSleepSmsReceivers()
{
$result = [];
foreach ($this->expirationFlags as $expirationFlag) {
$receivers = $this->sleepDAO->selectSleepSmsReceiver($expirationFlag);
$period = '+' . (SleepService::SLEEP_PERIOD * $expirationFlag) . ' day';
foreach ($receivers as $receiver) {
$baseDate = StringUtils::strIsSet($receiver['lastLoginDt'], '0000-00-00 00:00:00') == '0000-00-00 00:00:00' ? $receiver['entryDt'] : $receiver['lastLoginDt'];
{
$result = [];
foreach ($this->expirationFlags as $expirationFlag) {
$receivers = $this->sleepDAO->selectSleepMailReceiver($expirationFlag);
$period = '+' . (SleepService::SLEEP_PERIOD * $expirationFlag) . ' day';
foreach ($receivers as $receiver) {
$baseDate = StringUtils::strIsSet($receiver['lastLoginDt'], '0000-00-00 00:00:00') == '0000-00-00 00:00:00' ? $receiver['entryDt'] : $receiver['lastLoginDt'];
$replace = [
'name' => $member['memNm'],
'memNm' => $member['memNm'],
 
'memId' => $member['memId'],
'groupNm' => $aMemInfo['groupNm'],
'mileage' => $member['mileage'],
 
변경 후SleepService.php
/**
* 휴면회원 전환 안내 SMS 수신 대상 조회 및 전환 예정일 설정
*
* @param string|null $targetDate 기준 일자 (Y-m-d). null 이면 현재('now') 기준
* @param int $lastMemNo 마지막으로 처리한 회원번호 (커서, 0이면 커서 미적용)
* @param int $limit 한 번에 조회할 건수 (0이면 전체 조회)
* @return array
*/
public function getSleepSmsReceivers(?string $targetDate = null, int $lastMemNo = 0, int $limit = 0)
{
$result = [];
foreach ($this->expirationFlags as $expirationFlag) {
$receivers = $this->sleepDAO->selectSleepSmsReceiver($expirationFlag, $targetDate, $lastMemNo, $limit);
$period = '+' . (SleepService::SLEEP_PERIOD * $expirationFlag) . ' day';
foreach ($receivers as $receiver) {
$baseDate = StringUtils::strIsSet($receiver['lastLoginDt'], '0000-00-00 00:00:00') == '0000-00-00 00:00:00' ? $receiver['entryDt'] : $receiver['lastLoginDt'];
{
$result = [];
foreach ($this->expirationFlags as $expirationFlag) {
$receivers = $this->sleepDAO->selectSleepMailReceiver($expirationFlag, null, 0, 0);
$period = '+' . (SleepService::SLEEP_PERIOD * $expirationFlag) . ' day';
foreach ($receivers as $receiver) {
$baseDate = StringUtils::strIsSet($receiver['lastLoginDt'], '0000-00-00 00:00:00') == '0000-00-00 00:00:00' ? $receiver['entryDt'] : $receiver['lastLoginDt'];
$replace = [
'name' => $member['memNm'],
'memNm' => $member['memNm'],
'memNo' => $member['memNo'],
'memId' => $member['memId'],
'groupNm' => $aMemInfo['groupNm'],
'mileage' => $member['mileage'],
 
Component/Naver/NaverCommonInflowScript.php+13-33
변경 전NaverCommonInflowScript.php
 
namespace Bundle\Component\Naver;
 
 
use Request;
 
class NaverCommonInflowScript
 
// 완성된 주문상품정보를 태그로 변환
foreach ($orderItemSet as $orderItem) {
$orderItemField = [];
foreach ($orderItem as $field => $value) {
switch ($field) {
case 'price':
$orderItemField[] = $field.":". gd_money_format($value,false);
break;
case 'ea': case 'is_parent':
$orderItemField[] = $field.":".$value;
break;
case 'goodsnm':
$orderItemField[] = $field.":'".addslashes($value)."'";
break;
default:
$orderItemField[] = $field.":'".$value."'";
break;
}
}
$orderCompleteData[] = '<input type="hidden" name="naver-common-inflow-script-order-item" value="{'.gd_implode(',', $orderItemField).'}"/>';
}
 
// 주문 정보 조회
$strSQL = 'SELECT totalGoodsPrice AS goodsprice FROM '.DB_ORDER.' WHERE orderNo = ?';
$arrBind = ['s',$orderNo];
$getData = $this->db->query_fetch($strSQL, $arrBind, false);
unset($arrBind);
foreach ($getData as $field => $name) {
switch ($field) {
case 'goodsprice':
$orderField[] = $field.":". gd_money_format($name,false);
break;
default:
$orderField[] = $field.":'".$name."'";
break;
}
}
if (gd_count($orderField) > 0) {
$orderCompleteData[] = '<input type="hidden" id="naver-common-inflow-script-order" value="{'.gd_implode(',', $orderField).'}"/>';
}
}
 
 
변경 후NaverCommonInflowScript.php
 
namespace Bundle\Component\Naver;
 
use Framework\Utility\StringUtils;
use Request;
 
class NaverCommonInflowScript
 
// 완성된 주문상품정보를 태그로 변환
foreach ($orderItemSet as $orderItem) {
$orderItem['price'] = (float) gd_money_format($orderItem['price'], false);
$orderItem['ea'] = (int) $orderItem['ea'];
$orderItem['is_parent'] = ($orderItem['is_parent'] === 'true');
$jsonValue = StringUtils::htmlSpecialChars(json_encode($orderItem, JSON_UNESCAPED_UNICODE));
$orderCompleteData[] = '<input type="hidden" name="naver-common-inflow-script-order-item" value="'.$jsonValue.'"/>';
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
// 주문 정보 조회
$strSQL = 'SELECT totalGoodsPrice AS goodsprice FROM '.DB_ORDER.' WHERE orderNo = ?';
$arrBind = ['s', $orderNo];
$orderData = $this->db->query_fetch($strSQL, $arrBind, false);
unset($arrBind);
if (empty($orderData) === false) {
$orderData['goodsprice'] = (float) gd_money_format($orderData['goodsprice'], false);
$jsonValue = StringUtils::htmlSpecialChars(json_encode($orderData, JSON_UNESCAPED_UNICODE));
$orderCompleteData[] = '<input type="hidden" id="naver-common-inflow-script-order" value="'.$jsonValue.'"/>';
 
 
 
 
 
 
 
 
}
}
 
 
Component/Order/Order.php+18-1
변경 전Order.php
$receipt['requestCellPhone'] = $orderInfo['orderCellPhone'];
$receipt['useFl'] = $orderInfo['cashUseFl'];
$receipt['certFl'] = $orderInfo['cashCertFl'];
$receipt['certNo'] = Encryptor::encrypt($orderInfo['cashCertNo']);
$receipt['settlePrice'] = $order['settlePrice'];
$receipt['pgName'] = $pgConf['pgName'];
$receipt['adminMemo'] = $orderInfo['cashCertNo'];
 
return gd_htmlspecialchars_stripslashes($data);
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후Order.php
$receipt['requestCellPhone'] = $orderInfo['orderCellPhone'];
$receipt['useFl'] = $orderInfo['cashUseFl'];
$receipt['certFl'] = $orderInfo['cashCertFl'];
$receipt['certNo'] = Encryptor::encrypt($this->convertCashCertNo($orderInfo['cashCertNo'], $orderInfo['cashCertFl']));
$receipt['settlePrice'] = $order['settlePrice'];
$receipt['pgName'] = $pgConf['pgName'];
$receipt['adminMemo'] = $orderInfo['cashCertNo'];
 
return gd_htmlspecialchars_stripslashes($data);
}
 
/**
* 현금영수증 인증번호 변환
*
* @param mixed $cashCertNo 현금영수증 인증번호
* @param mixed $cashCertFl 현금영수증 인증종류
*
* @return mixed
*/
protected function convertCashCertNo(mixed $cashCertNo, mixed $cashCertFl): mixed
{
if (is_array($cashCertNo) && isset($cashCertNo[$cashCertFl])) {
return $cashCertNo[$cashCertFl];
}
 
return $cashCertNo;
}
}
 
Component/Order/OrderAdmin.php+12-5
변경 전OrderAdmin.php
// 사용자 신청 테이블 업데이트
if (empty($bundleData['userHandleGoodsNo']) === true) {
// 처리자
if($bundleData['adminHandleReason'] == '자동 환불'){
 
$bundleData['managerNo'] = -1;
}else{
 
 
$bundleData['managerNo'] = Session::get('manager.sno');
}
 
$this->db->strField = '
IFNULL(SUM(IF(userHandleMode=\'b\', 1, 0)), 0) AS backAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backAccept,
 
IFNULL(SUM(IF(userHandleMode=\'r\', 1, 0)), 0) AS refundAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundAccept,
 
IFNULL(SUM(IF(userHandleMode=\'e\', 1, 0)), 0) AS exchangeAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeAccept
 
';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_ORDER_USER_HANDLE . gd_implode(' ', $query);
'od.realTaxFreeDeliveryCharge',
'od.divisionDeliveryUseMileage',
'od.divisionDeliveryUseDeposit',
 
];
if($searchData['statusMode'] === 'o'){
// 입금대기리스트에서 '주문상품명' 을 입금대기 상태의 주문상품명만으로 노출시키기 위해 개수를 구함
 
변경 후OrderAdmin.php
// 사용자 신청 테이블 업데이트
if (empty($bundleData['userHandleGoodsNo']) === true) {
// 처리자
if (isset($bundleData['managerNo']) === true && (int)$bundleData['managerNo'] === -1) {
// 시스템 자동 처리: 명시적으로 -1 로 들어온 경우 그대로 유지 (자동 승인/거절, 자동 환불 등)
$bundleData['managerNo'] = -1;
} else if ($bundleData['adminHandleReason'] == '자동 환불') {
$bundleData['managerNo'] = -1;
} else {
$bundleData['managerNo'] = Session::get('manager.sno');
}
 
$this->db->strField = '
IFNULL(SUM(IF(userHandleMode=\'b\', 1, 0)), 0) AS backAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'b\', 1, 0)), 0) AS backApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'b\', 1, 0)), 0) AS backReject,
IFNULL(SUM(IF(userHandleMode=\'r\', 1, 0)), 0) AS refundAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundReject,
IFNULL(SUM(IF(userHandleMode=\'e\', 1, 0)), 0) AS exchangeAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeReject
';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_ORDER_USER_HANDLE . gd_implode(' ', $query);
'od.realTaxFreeDeliveryCharge',
'od.divisionDeliveryUseMileage',
'od.divisionDeliveryUseDeposit',
'od.deliverySno',
];
if($searchData['statusMode'] === 'o'){
// 입금대기리스트에서 '주문상품명' 을 입금대기 상태의 주문상품명만으로 노출시키기 위해 개수를 구함
 
Component/Order/OrderAdminNew.php+12-5
변경 전OrderAdminNew.php
// 사용자 신청 테이블 업데이트
if (empty($bundleData['userHandleGoodsNo']) === true) {
// 처리자
if($bundleData['adminHandleReason'] == '자동 환불'){
 
$bundleData['managerNo'] = -1;
}else{
 
 
$bundleData['managerNo'] = Session::get('manager.sno');
}
 
$this->db->strField = '
IFNULL(SUM(IF(userHandleMode=\'b\', 1, 0)), 0) AS backAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backAccept,
 
IFNULL(SUM(IF(userHandleMode=\'r\', 1, 0)), 0) AS refundAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundAccept,
 
IFNULL(SUM(IF(userHandleMode=\'e\', 1, 0)), 0) AS exchangeAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeRequest,
IFNULL(SUM(IF(userHandleFl!=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeAccept
 
';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_ORDER_USER_HANDLE . gd_implode(' ', $query);
'od.realTaxFreeDeliveryCharge',
'od.divisionDeliveryUseMileage',
'od.divisionDeliveryUseDeposit',
 
];
if($searchData['statusMode'] === 'o'){
// 입금대기리스트에서 '주문상품명' 을 입금대기 상태의 주문상품명만으로 노출시키기 위해 개수를 구함
 
변경 후OrderAdminNew.php
// 사용자 신청 테이블 업데이트
if (empty($bundleData['userHandleGoodsNo']) === true) {
// 처리자
if (isset($bundleData['managerNo']) === true && (int)$bundleData['managerNo'] === -1) {
// 시스템 자동 처리: 명시적으로 -1 로 들어온 경우 그대로 유지 (자동 승인/거절, 자동 환불 등)
$bundleData['managerNo'] = -1;
} else if ($bundleData['adminHandleReason'] == '자동 환불') {
$bundleData['managerNo'] = -1;
} else {
$bundleData['managerNo'] = Session::get('manager.sno');
}
 
$this->db->strField = '
IFNULL(SUM(IF(userHandleMode=\'b\', 1, 0)), 0) AS backAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'b\', 1, 0)), 0) AS backRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'b\', 1, 0)), 0) AS backApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'b\', 1, 0)), 0) AS backReject,
IFNULL(SUM(IF(userHandleMode=\'r\', 1, 0)), 0) AS refundAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'r\', 1, 0)), 0) AS refundReject,
IFNULL(SUM(IF(userHandleMode=\'e\', 1, 0)), 0) AS exchangeAll,
IFNULL(SUM(IF(userHandleFl=\'r\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeRequest,
IFNULL(SUM(IF(userHandleFl=\'y\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeApprove,
IFNULL(SUM(IF(userHandleFl=\'n\' AND userHandleMode=\'e\', 1, 0)), 0) AS exchangeReject
';
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_ORDER_USER_HANDLE . gd_implode(' ', $query);
'od.realTaxFreeDeliveryCharge',
'od.divisionDeliveryUseMileage',
'od.divisionDeliveryUseDeposit',
'od.deliverySno',
];
if($searchData['statusMode'] === 'o'){
// 입금대기리스트에서 '주문상품명' 을 입금대기 상태의 주문상품명만으로 노출시키기 위해 개수를 구함
 
Component/Order/OrderNew.php+18-1
변경 전OrderNew.php
$receipt['requestCellPhone'] = $orderInfo['orderCellPhone'];
$receipt['useFl'] = $orderInfo['cashUseFl'];
$receipt['certFl'] = $orderInfo['cashCertFl'];
$receipt['certNo'] = Encryptor::encrypt($orderInfo['cashCertNo']);
$receipt['settlePrice'] = $order['settlePrice'];
$receipt['pgName'] = $pgConf['pgName'];
$receipt['adminMemo'] = $orderInfo['cashCertNo'];
 
return gd_htmlspecialchars_stripslashes($data);
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후OrderNew.php
$receipt['requestCellPhone'] = $orderInfo['orderCellPhone'];
$receipt['useFl'] = $orderInfo['cashUseFl'];
$receipt['certFl'] = $orderInfo['cashCertFl'];
$receipt['certNo'] = Encryptor::encrypt($this->convertCashCertNo($orderInfo['cashCertNo'], $orderInfo['cashCertFl']));
$receipt['settlePrice'] = $order['settlePrice'];
$receipt['pgName'] = $pgConf['pgName'];
$receipt['adminMemo'] = $orderInfo['cashCertNo'];
 
return gd_htmlspecialchars_stripslashes($data);
}
 
/**
* 현금영수증 인증번호 변환
*
* @param mixed $cashCertNo 현금영수증 인증번호
* @param mixed $cashCertFl 현금영수증 인증종류
*
* @return mixed
*/
protected function convertCashCertNo(mixed $cashCertNo, mixed $cashCertFl): mixed
{
if (is_array($cashCertNo) && isset($cashCertNo[$cashCertFl])) {
return $cashCertNo[$cashCertFl];
}
 
return $cashCertNo;
}
}
 
Component/Order/Tax.php+12-10
변경 전Tax.php
const TAX_LOCK_EXCEPTION_MESSAGE = '이미 처리 중이거나 발급된 세금 계산서입니다. 잠시 후 다시 확인해 주세요.';
const TAX_EXCEPTION_LOG_MESSAGE = '[세금 계산서 처리 중 예상치 못한 오류가 발생]';
const TAX_EXCEPTION_MESSAGE = '세금 계산서 처리 중 예상치 못한 오류가 발생했습니다.';
 
 
 
 
/**
$arrData['TAXMODE'] = $setData['godobillTaxMode']; // 일반계산서구분
 
 
$arrData['DMDER_MAIN_TX_OFFCR_NM'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['requestNm']));
$arrData['DMDER_MAIN_TX_OFFCR_EMAIL_ADDR'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxEmail']));
$arrData['DMDER_MAIN_TX_OFFCR_MTEL_NO'] = $getData['orderCellPhone'];
$arrData['DMDER_BUSNSECT_NM'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxService']));
$arrData['DMDER_DETAIL_NM'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxItem']));
$arrData['DMDER_CHIEF_NM'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxCeoNm']));
$arrData['DMDER_TRADE_NM'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxCompany']));
$arrData['DMDER_ADDR'] = trim(iconv('UTF-8', 'EUC-KR//IGNORE', $setData['taxAddress'] . ' ' . $setData['taxAddressSub']));
 
$arrData['item'][] = [
'THNG_PURCHS_DT' => gd_date_format('Ymd', $setData['processDt']),
'THNG_SUP_AMT' => $setData['supplyPrice'],
'THNG_TX' => $setData['taxPrice'],
'THNG_NM' => trim(iconv('UTF-8', 'EUC-KR//IGNORE', $getData['orderGoodsNm'])),
];
 
\Logger::channel('service')->info('고도빌전송' , [iconv('EUC-KR', 'UTF-8',(serialize($arrData)))]);
// 고도빌로 전송
$result = $this->sendGodobillHttp($arrData);
 
 
변경 후Tax.php
const TAX_LOCK_EXCEPTION_MESSAGE = '이미 처리 중이거나 발급된 세금 계산서입니다. 잠시 후 다시 확인해 주세요.';
const TAX_EXCEPTION_LOG_MESSAGE = '[세금 계산서 처리 중 예상치 못한 오류가 발생]';
const TAX_EXCEPTION_MESSAGE = '세금 계산서 처리 중 예상치 못한 오류가 발생했습니다.';
const GODOBILL_ENCODING = 'CP949';
const GODOBILL_CHARSET = self::GODOBILL_ENCODING . '//IGNORE';
 
 
/**
$arrData['TAXMODE'] = $setData['godobillTaxMode']; // 일반계산서구분
 
 
$arrData['DMDER_MAIN_TX_OFFCR_NM'] = StringUtils::encodeAndTruncate($setData['requestNm'], 30, self::GODOBILL_CHARSET); // 담당자명 최대 30글자
$arrData['DMDER_MAIN_TX_OFFCR_EMAIL_ADDR'] = StringUtils::encodeAndTruncate($setData['taxEmail'], 40, self::GODOBILL_CHARSET); // 담당자 이메일 최대 40글자
$arrData['DMDER_MAIN_TX_OFFCR_MTEL_NO'] = mb_substr($getData['orderCellPhone'], 0, 20); // 담당자 휴대전화 최대 20글자
$arrData['DMDER_BUSNSECT_NM'] = StringUtils::encodeAndTruncate($setData['taxService'], 40, self::GODOBILL_CHARSET); // 업태명 최대 40글자
$arrData['DMDER_DETAIL_NM'] = StringUtils::encodeAndTruncate($setData['taxItem'], 40, self::GODOBILL_CHARSET); // 종목명 최대 40글자
$arrData['DMDER_CHIEF_NM'] = StringUtils::encodeAndTruncate($setData['taxCeoNm'], 30, self::GODOBILL_CHARSET); // 대표자명 최대 30글자
$arrData['DMDER_TRADE_NM'] = StringUtils::encodeAndTruncate($setData['taxCompany'], 70, self::GODOBILL_CHARSET); // 상호명 최대 70글자
$arrData['DMDER_ADDR'] = StringUtils::encodeAndTruncate($setData['taxAddress'] . ' ' . $setData['taxAddressSub'], 150, self::GODOBILL_CHARSET); // 주소 최대 150글자
 
$arrData['item'][] = [
'THNG_PURCHS_DT' => gd_date_format('Ymd', $setData['processDt']),
'THNG_SUP_AMT' => $setData['supplyPrice'],
'THNG_TX' => $setData['taxPrice'],
'THNG_NM' => trim(iconv('UTF-8', self::GODOBILL_CHARSET, $getData['orderGoodsNm'])),
];
 
\Logger::channel('service')->info('고도빌전송' , [iconv(self::GODOBILL_ENCODING, 'UTF-8',(serialize($arrData)))]);
// 고도빌로 전송
$result = $this->sendGodobillHttp($arrData);
 
 
Component/Order/UserHandleAutoProcess.php+107
변경 전UserHandleAutoProcess.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
변경 후UserHandleAutoProcess.php
<?php
/*
* Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved
*
* Unauthorized copying or redistribution of this file in source and binary forms via any medium
* is strictly prohibited.
*/
 
namespace Bundle\Component\Order;
 
use Component\Order\OrderAdmin;
use Origin\Enum\Order\UserHandleFl;
use Origin\Enum\Order\UserHandleMode;
use Repository\Order\OrderUserHandleRepository;
 
/**
* 관리자 클레임 접수 시 고객 클레임 신청 건의 자동 승인/거절 처리 클래스
*
* 관리자가 주문상세에서 교환/반품/환불을 접수하면, 해당 상품주문번호에
* 승인/거절 처리되지 않은(userHandleFl='r') 고객 클레임 신청 건이 있는지 조회하여
* - 고객 신청 클레임 종류 = 관리자 접수 클레임 종류 → 자동 승인 (userHandleFl='y')
* - 고객 신청 클레임 종류 ≠ 관리자 접수 클레임 종류 → 자동 거절 (userHandleFl='n')
* 처리 후 운영자 메모를 시스템 사유로 저장한다.
*
* 이 클래스는 OrderAdmin / OrderAdminNew 양쪽 흐름에서 공통으로 사용된다.
*
* @package Bundle\Component\Order
*/
class UserHandleAutoProcess
{
/** 시스템 자동 처리 매니저 번호 */
public const SYSTEM_MANAGER_NO = -1;
 
/** 결과 배열 키 */
private const RESULT_APPROVE = 'approve';
private const RESULT_REJECT = 'reject';
 
public function __construct(
private readonly OrderUserHandleRepository $orderUserHandleRepository,
private readonly OrderAdmin $orderAdmin
) {}
 
/**
* 관리자 클레임 접수 시 고객 클레임 신청 건의 자동 승인/거절 처리
*
* 부작용 최소화를 위해 es_orderUserHandle UPDATE 만 수행하며,
* 주문상태 변경/SMS 발송/카운팅 동기화 등 부가 처리는 호출하지 않는다.
* (주문상태 변경은 호출처에서 이미 완료된 상태로 가정)
*
* 업데이트는 OrderAdmin::updateUserHandle() 에 위임하여
* managerNo === -1 시스템 처리 분기 등 기존 정책을 그대로 사용한다.
*
* @param string $orderNo 주문번호
* @param array $orderGoodsSnoList 관리자 클레임 처리된 상품주문번호(es_orderGoods.sno) 배열
* @param UserHandleMode $adminClaimMode 관리자 접수 클레임 종류
*
* @return array 처리 결과 ['approve' => [['userHandleSno'=>X, 'orderGoodsSno'=>Y], ...], 'reject' => [...]]
*/
public function autoApproveOrReject(string $orderNo, array $orderGoodsSnoList, UserHandleMode $adminClaimMode): array
{
$result = [self::RESULT_APPROVE => [], self::RESULT_REJECT => []];
 
if (empty($orderNo) || empty($orderGoodsSnoList)) {
return $result;
}
 
// --- 대상 조회: 승인/거절 처리되지 않은(userHandleFl='r') 고객 클레임 신청 건
$targetList = $this->orderUserHandleRepository->findPendingUserHandlesForAutoProcess($orderNo, $orderGoodsSnoList);
 
if (empty($targetList)) {
return $result;
}
 
$adminLabel = __($adminClaimMode->label());
 
// --- 각 건에 대해 자동 승인/거절 분기 후 업데이트
foreach ($targetList as $row) {
$userHandleSno = $row['sno'];
$isApprove = ($row['userHandleMode'] === $adminClaimMode->value);
 
$newUserHandleFl = $isApprove ? UserHandleFl::APPROVE->value : UserHandleFl::REJECT->value;
$resultKey = $isApprove ? self::RESULT_APPROVE : self::RESULT_REJECT;
$reason = sprintf(
__('%s 접수에 따른 자동 %s'),
$adminLabel,
$isApprove ? __('승인') : __('거절')
);
 
// 업데이트
$bundleData = [
'sno' => $userHandleSno,
'userHandleFl' => $newUserHandleFl,
'adminHandleReason' => $reason,
'managerNo' => self::SYSTEM_MANAGER_NO,
];
$updated = $this->orderAdmin->updateUserHandle($bundleData);
if ($updated !== false) {
$result[$resultKey][] = [
'userHandleSno' => $userHandleSno,
'orderGoodsSno' => $row['userHandleGoodsNo'],
];
}
}
 
return $result;
}
}
 
Component/Scm/ScmAdjust.php+14-11
변경 전ScmAdjust.php
 
class ScmAdjust
{
 
 
 
public $scmAdjustState = [];
public $scmAdjustKind = [];
public $scmAdjustType = [];
$arrData['DMDER_BUSNID'] = str_replace('-', '', $taxBillData['scmBusinessNo']);
//공급받는자 종사업장번호 (필수) 0자리 또는 4자리
$arrData['DMDER_SUB_BD_NO'] = '';
// 공급받는자 업태명 최대 20글자
$arrData['DMDER_BUSNSECT_NM'] = trim(iconv('UTF-8', 'EUC-KR', $taxBillData['scmService']));
// 공급받는자 종목명 최대 20글자
$arrData['DMDER_DETAIL_NM'] = trim(iconv('UTF-8', 'EUC-KR', $taxBillData['scmItem']));
// 공급받는자 대표자명 (필수) 최대 15글자
$arrData['DMDER_CHIEF_NM'] = trim(iconv('UTF-8', 'EUC-KR', $taxBillData['scmCeoNm']));
// 공급받는자 상호명 (필수) 최대 35글자
$arrData['DMDER_TRADE_NM'] = trim(iconv('UTF-8', 'EUC-KR', $taxBillData['scmCompanyNm']));
// 공급받는자 주소 최대 75글자
$arrData['DMDER_ADDR'] = trim(iconv('UTF-8', 'EUC-KR', $taxBillData['scmAddress'] . ' ' . $taxBillData['scmAddressSub']));
// 공급받는자 주담당자 이름 최대 15글자
$arrData['DMDER_MAIN_TX_OFFCR_NM'] = '';
// 공급받는자 주담당자 이메일 최대 40글자
'THNG_PURCHS_DT' => gd_date_format('Ymd', $taxBillData['scmAdjustTaxBillDt']),
'THNG_SUP_AMT' => $taxBillData['scmAdjustTaxPrice'],
'THNG_TX' => $taxBillData['scmAdjustVatPrice'],
'THNG_NM' => trim(iconv('UTF-8', 'EUC-KR//IGNORE', '수수료')),
];
 
// 고도빌로 전송
 
변경 후ScmAdjust.php
 
class ScmAdjust
{
const GODOBILL_ENCODING = 'CP949';
const GODOBILL_CHARSET = self::GODOBILL_ENCODING . '//IGNORE';
 
public $scmAdjustState = [];
public $scmAdjustKind = [];
public $scmAdjustType = [];
$arrData['DMDER_BUSNID'] = str_replace('-', '', $taxBillData['scmBusinessNo']);
//공급받는자 종사업장번호 (필수) 0자리 또는 4자리
$arrData['DMDER_SUB_BD_NO'] = '';
// 공급받는자 업태명 최대 40글자
$arrData['DMDER_BUSNSECT_NM'] = StringUtils::encodeAndTruncate($taxBillData['scmService'], 40, self::GODOBILL_CHARSET);
// 공급받는자 종목명 최대 40글자
$arrData['DMDER_DETAIL_NM'] = StringUtils::encodeAndTruncate($taxBillData['scmItem'], 40, self::GODOBILL_CHARSET);
// 공급받는자 대표자명 (필수) 최대 30글자
$arrData['DMDER_CHIEF_NM'] = StringUtils::encodeAndTruncate($taxBillData['scmCeoNm'], 30, self::GODOBILL_CHARSET);
// 공급받는자 상호명 (필수) 최대 70글자
$arrData['DMDER_TRADE_NM'] = StringUtils::encodeAndTruncate($taxBillData['scmCompanyNm'], 70, self::GODOBILL_CHARSET);
// 공급받는자 주소 최대 150글자
$arrData['DMDER_ADDR'] = StringUtils::encodeAndTruncate($taxBillData['scmAddress'] . ' ' . $taxBillData['scmAddressSub'], 150, self::GODOBILL_CHARSET);
// 공급받는자 주담당자 이름 최대 15글자
$arrData['DMDER_MAIN_TX_OFFCR_NM'] = '';
// 공급받는자 주담당자 이메일 최대 40글자
'THNG_PURCHS_DT' => gd_date_format('Ymd', $taxBillData['scmAdjustTaxBillDt']),
'THNG_SUP_AMT' => $taxBillData['scmAdjustTaxPrice'],
'THNG_TX' => $taxBillData['scmAdjustVatPrice'],
'THNG_NM' => trim(iconv('UTF-8', self::GODOBILL_CHARSET, '수수료')),
];
 
// 고도빌로 전송
 
Component/Storage/AwsStorage.php+3
변경 전AwsStorage.php
}
 
if ($tmpfname) {
 
$this->delete($tmpfname);
 
 
}
fclose($stream);
if ($return) {
 
변경 후AwsStorage.php
}
 
if ($tmpfname) {
// S3 임시 객체 삭제
$this->delete($tmpfname);
// 로컬 임시 파일 삭제
@unlink($tmpfname);
}
fclose($stream);
if ($return) {
 
Component/Validator/Validator.php+24-20
변경 전Validator.php
* @return bool
*/
public static function validateIncludeEval($tmpName) {
$fp = fopen($tmpName, 'rb');
$text = fread($fp, filesize($tmpName));
fclose($fp);
 
/*
* 1차 : preg_math_all 을 통해 php 구문이 존재할 경우 구문안의 문자열 추출
* 2차 : 구문안의 문자열 중 <? 존재할 경우 explode 배열 만든 후 마지막 <? 데이터만 추출 (예 : <? 문자1 <? 문자2 <? 문자3 ?>)
* 3차 : 최종 추출한 문자열에 불가 문자 여부를 검출 (대소문자 구분 x)
*/
$checkContent = nl2br(str_replace(["\r\n", "\r", "\n"], "", $text));
if (preg_match_all('/(?<=\<\?)(.*?)(?=\?>)/', $checkContent, $matches)) {
for ($i = 0; $i < gd_count($matches[0]); $i++) {
$checkText = $matches[1][$i];
$checkTextArr = explode('<?', $checkText);
$checkVal = $checkTextArr[gd_array_last_key($checkTextArr)];
 
// 추출 문자내 불가 문자 검증
if (preg_match('/eval|\<\?php|\$_POST|\$_GET|\$_REQUEST/i', $checkVal)) {
return false;
 
 
}
}
 
 
 
}
return true;
}
 
/**
 
변경 후Validator.php
* @return bool
*/
public static function validateIncludeEval($tmpName) {
try {
$fp = fopen($tmpName, 'rb');
$text = fread($fp, filesize($tmpName));
fclose($fp);
 
/*
* 1차 : preg_math_all 을 통해 php 구문이 존재할 경우 구문안의 문자열 추출
* 2차 : 구문안의 문자열 중 <? 존재할 경우 explode 배열 만든 후 마지막 <? 데이터만 추출 (예 : <? 문자1 <? 문자2 <? 문자3 ?>)
* 3차 : 최종 추출한 문자열에 불가 문자 여부를 검출 (대소문자 구분 x)
*/
$checkContent = nl2br(str_replace(["\r\n", "\r", "\n"], "", $text));
if (preg_match_all('/(?<=\<\?)(.*?)(?=\?>)/', $checkContent, $matches)) {
for ($i = 0; $i < gd_count($matches[0]); $i++) {
$checkText = $matches[1][$i];
$checkTextArr = explode('<?', $checkText);
$checkVal = $checkTextArr[gd_array_last_key($checkTextArr)];
 
// 추출 문자내 불가 문자 검증
if (preg_match('/eval|\<\?php|\$_POST|\$_GET|\$_REQUEST/i', $checkVal)) {
return false;
}
}
}
return true;
} catch (\Throwable) {
return false;
}
 
}
 
/**
 
Component/Wish/Wish.php+9
변경 전Wish.php
use Session;
use Exception;
use App;
 
 
class Wish
{
$this->setWishDelete($sno);
}
 
 
 
 
 
 
 
 
 
return true;
 
}
 
변경 후Wish.php
use Session;
use Exception;
use App;
use Origin\Service\WebHook\CartWebHookService;
 
class Wish
{
$this->setWishDelete($sno);
}
 
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$cartWebHookService->sendCartMigratedWishWebHook(
$cartSno,
Session::get('member.memNo'),
$siteKey,
array_column($changeGoodsNoArray ?? [], 'goodsNo')
);
 
return true;
 
}
 
Component/Worker/NaverDbUrl.php+27-4
변경 전NaverDbUrl.php
protected function getNaverReviewCount(array $data): int
{
$externalNaverReviewCnt = $this->getExternalNaverReviewCnt($data['goodsNo']);
 
 
if ($this->config['naverReviewChannel'] == 'plusReview') {
$reviewCnt = $data['plusReviewCnt'];
} else if ($this->config['naverReviewChannel'] == 'both') {
$reviewCnt = max(0,$data['plusReviewCnt'] + $data['reviewCnt'] - $externalNaverReviewCnt);
} else {
$reviewCnt = max(0,$data['reviewCnt'] - $externalNaverReviewCnt);
}
 
// 크리마리뷰 카운팅 사용
$crema = \App::load('Component\\Service\\Crema');
if ($crema->getUseEpFl()) {
$naverReviewCnt = max(0, $data['naverReviewCnt']);
$reviewCnt = max(0, $data['cremaReviewCnt'] - $naverReviewCnt - $externalNaverReviewCnt); // 네이버 리뷰 카운트는 제외 처리
}
 
return $reviewCnt;
return $this->db->query_fetch($strSQL, $arrBind, false)['cnt'];
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후NaverDbUrl.php
protected function getNaverReviewCount(array $data): int
{
$externalNaverReviewCnt = $this->getExternalNaverReviewCnt($data['goodsNo']);
$externalNaverPlusReviewCnt = $this->getExternalNaverPlusReviewCnt($data['goodsNo']);
 
if ($this->config['naverReviewChannel'] == 'plusReview') {
$reviewCnt = max(0, $data['plusReviewCnt'] - $externalNaverPlusReviewCnt);
} else if ($this->config['naverReviewChannel'] == 'both') {
$reviewCnt = max(0, $data['plusReviewCnt'] + $data['reviewCnt'] - $externalNaverReviewCnt - $externalNaverPlusReviewCnt);
} else {
$reviewCnt = max(0, $data['reviewCnt'] - $externalNaverReviewCnt);
}
 
// 크리마리뷰 카운팅 사용
$crema = \App::load('Component\\Service\\Crema');
if ($crema->getUseEpFl()) {
$naverReviewCnt = max(0, $data['naverReviewCnt']);
$reviewCnt = max(0, $data['cremaReviewCnt'] - $naverReviewCnt - $externalNaverReviewCnt - $externalNaverPlusReviewCnt); // 네이버 리뷰 카운트는 제외 처리
}
 
return $reviewCnt;
return $this->db->query_fetch($strSQL, $arrBind, false)['cnt'];
}
 
/**
* @param int $goodsNo 상품 번호
* @return int 외부 네이버 플러스리뷰 갯수
*/
private function getExternalNaverPlusReviewCnt(int $goodsNo): int
{
if ($this->db === null) {
$this->db = \App::load('DB');
}
 
$arrBind = [];
$table = DB_PLUS_REVIEW_ARTICLE;
$this->db->strField = "COUNT(*) as cnt";
$this->db->strWhere = "goodsNo = ? AND external_naver_review_flag = ?";
$this->db->bind_param_push($arrBind, 'i', $goodsNo);
$this->db->bind_param_push($arrBind, 's', 'Y');
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . $table . ' ' . implode(' ', $query);
return $this->db->query_fetch($strSQL, $arrBind, false)['cnt'];
}
 
}
 
Controller/Admin/Order/OrderChangePsController.php+98-4
변경 전OrderChangePsController.php
 
use App;
use Bundle\Component\Godo\NaverPayAPI;
 
use Exception;
use Request;
use Framework\Debug\Exception\LayerNotReloadException;
use Framework\Debug\Exception\LayerException;
 
 
 
 
/**
* 주문 상태 변경 처리 페이지
$orderReorderCalculation = App::load(\Component\Order\ReOrderCalculation::class);
$dbUrl = \App::load('\\Component\\Marketing\\DBUrl');
$paycoConfig = $dbUrl->getConfig('payco', 'config');
 
 
$postValue = Request::post()->toArray();
switch ($postValue['mode']) {
 
case "back" : // 반품
try {
$return = \DB::transaction(function () use ($orderReorderCalculation, $postValue) {
 
 
 
 
 
 
 
return $orderReorderCalculation->setBackRefundOrderGoods($postValue, 'back');
});
 
 
 
 
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('반품 접수가 되었습니다.'), $script);
} catch (Exception $e) {
 
throw new LayerNotReloadException($e->getMessage());
}
break;
 
case "refund" : // 환불 접수
try {
$return = \DB::transaction(function () use ($orderReorderCalculation, $postValue) {
 
 
 
 
 
 
 
return $orderReorderCalculation->setBackRefundOrderGoods($postValue, 'refund');
});
 
 
 
 
if($postValue['orderChannelFl'] == 'naverpay') {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('환불 처리가 완료되었습니다.'), $script);
$this->layerNotReload(__('환불 접수가 되었습니다.'), $script);
}
} catch (Exception $e) {
 
throw new LayerNotReloadException($e->getMessage());
}
break;
//맞교환
case 'sameExchange' :
try {
$return = \DB::transaction(function () use ($orderReorderCalculation, $postValue) {
 
 
 
 
 
 
 
return $orderReorderCalculation->setSameExchangeOrderGoods($postValue);
});
 
 
 
 
if ($return) {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('동일상품교환 처리가 완료 되었습니다.'), $script);
}
}
catch (Exception $e) {
 
throw new LayerNotReloadException($e->getMessage());
}
break;
//다른상품교환
case 'anotherExchange' :
try {
$return = \DB::transaction(function () use ($orderReorderCalculation, $postValue) {
 
 
 
 
 
 
 
return $orderReorderCalculation->setAnotherExchangeOrderGoods($postValue);
});
 
 
 
 
if ($return) {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('다른상품교환 처리가 완료 되었습니다.'), $script);
}
}
catch (Exception $e) {
 
throw new LayerNotReloadException($e->getMessage());
}
break;
break;
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후OrderChangePsController.php
 
use App;
use Bundle\Component\Godo\NaverPayAPI;
use Component\Order\UserHandleAutoProcess;
use Exception;
use Request;
use Framework\Debug\Exception\LayerNotReloadException;
use Framework\Debug\Exception\LayerException;
use Component\Sms\Code;
use Component\Sms\SmsAutoOrder;
use Origin\Enum\Order\UserHandleMode;
 
/**
* 주문 상태 변경 처리 페이지
$orderReorderCalculation = App::load(\Component\Order\ReOrderCalculation::class);
$dbUrl = \App::load('\\Component\\Marketing\\DBUrl');
$paycoConfig = $dbUrl->getConfig('payco', 'config');
$autoProcess = App::getInstance(UserHandleAutoProcess::class);
 
$postValue = Request::post()->toArray();
switch ($postValue['mode']) {
 
case "back" : // 반품
try {
$autoResult = ['approve' => [], 'reject' => []];
\DB::transaction(function () use ($orderReorderCalculation, $autoProcess, $postValue, &$autoResult) {
// 고객 클레임 신청 건의 자동 승인/거절 처리 (관리자 반품 접수 = 'b')
if (!empty($postValue['back']['statusCheck'])) {
$orderGoodsSnoList = array_keys($postValue['back']['statusCheck']);
$autoResult = $autoProcess->autoApproveOrReject($postValue['orderNo'], $orderGoodsSnoList, UserHandleMode::RETURN);
}
 
return $orderReorderCalculation->setBackRefundOrderGoods($postValue, 'back');
});
 
// 트랜잭션 커밋 후 자동 승인/거절 건의 SMS/알림톡 자동 발송
$this->sendAutoApproveRejectSms($postValue['orderNo'], $autoResult);
 
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('반품 접수가 되었습니다.'), $script);
} catch (Exception $e) {
$autoResult = ['approve' => [], 'reject' => []]; // 롤백 시 참조 변수 초기화
throw new LayerNotReloadException($e->getMessage());
}
break;
 
case "refund" : // 환불 접수
try {
$autoResult = ['approve' => [], 'reject' => []];
\DB::transaction(function () use ($orderReorderCalculation, $autoProcess, $postValue, &$autoResult) {
// 고객 클레임 신청 건의 자동 승인/거절 처리 (관리자 환불 접수 = 'r')
if (!empty($postValue['refund']['statusCheck'])) {
$orderGoodsSnoList = array_keys($postValue['refund']['statusCheck']);
$autoResult = $autoProcess->autoApproveOrReject($postValue['orderNo'], $orderGoodsSnoList, UserHandleMode::REFUND);
}
 
return $orderReorderCalculation->setBackRefundOrderGoods($postValue, 'refund');
});
 
// 트랜잭션 커밋 후 자동 승인/거절 건의 SMS/알림톡 자동 발송
$this->sendAutoApproveRejectSms($postValue['orderNo'], $autoResult);
 
if($postValue['orderChannelFl'] == 'naverpay') {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('환불 처리가 완료되었습니다.'), $script);
$this->layerNotReload(__('환불 접수가 되었습니다.'), $script);
}
} catch (Exception $e) {
$autoResult = ['approve' => [], 'reject' => []]; // 롤백 시 참조 변수 초기화
throw new LayerNotReloadException($e->getMessage());
}
break;
//맞교환
case 'sameExchange' :
try {
$autoResult = ['approve' => [], 'reject' => []];
$return = \DB::transaction(function () use ($orderReorderCalculation, $autoProcess, $postValue, &$autoResult) {
// 고객 클레임 신청 건의 자동 승인/거절 처리 (관리자 교환 접수 = 'e')
if (!empty($postValue['orderGoodsSno'])) {
$orderGoodsSnoList = explode(INT_DIVISION, $postValue['orderGoodsSno']);
$autoResult = $autoProcess->autoApproveOrReject($postValue['orderNo'], $orderGoodsSnoList, UserHandleMode::EXCHANGE);
}
 
return $orderReorderCalculation->setSameExchangeOrderGoods($postValue);
});
 
// 트랜잭션 커밋 후 자동 승인/거절 건의 SMS/알림톡 자동 발송
$this->sendAutoApproveRejectSms($postValue['orderNo'], $autoResult);
 
if ($return) {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('동일상품교환 처리가 완료 되었습니다.'), $script);
}
}
catch (Exception $e) {
$autoResult = ['approve' => [], 'reject' => []]; // 롤백 시 참조 변수 초기화
throw new LayerNotReloadException($e->getMessage());
}
break;
//다른상품교환
case 'anotherExchange' :
try {
$autoResult = ['approve' => [], 'reject' => []];
$return = \DB::transaction(function () use ($orderReorderCalculation, $autoProcess, $postValue, &$autoResult) {
// 고객 클레임 신청 건의 자동 승인/거절 처리 (관리자 교환 접수 = 'e')
if (!empty($postValue['beforeOrderGoodsSno'])) {
$orderGoodsSnoList = explode(INT_DIVISION, $postValue['beforeOrderGoodsSno']);
$autoResult = $autoProcess->autoApproveOrReject($postValue['orderNo'], $orderGoodsSnoList, UserHandleMode::EXCHANGE);
}
 
return $orderReorderCalculation->setAnotherExchangeOrderGoods($postValue);
});
 
// 트랜잭션 커밋 후 자동 승인/거절 건의 SMS/알림톡 자동 발송
$this->sendAutoApproveRejectSms($postValue['orderNo'], $autoResult);
 
if ($return) {
$script = "parent.opener.location.href='./order_view.php?orderNo=".$postValue['orderNo']."';parent.self.close();";
$this->layerNotReload(__('다른상품교환 처리가 완료 되었습니다.'), $script);
}
}
catch (Exception $e) {
$autoResult = ['approve' => [], 'reject' => []]; // 롤백 시 참조 변수 초기화
throw new LayerNotReloadException($e->getMessage());
}
break;
break;
}
}
 
/**
* autoApproveOrReject 결과를 기반으로 SMS/알림톡 자동 발송
*
* 자동 승인/거절된 건에 대해 고객에게 SMS/알림톡을 자동 발송한다.
* (수동 승인/거절 시의 OrderPsController::user_handle_accept / user_handle_reject 흐름과 동일)
*
* @param string $orderNo 주문번호
* @param array $autoResult UserHandleAutoProcess::autoApproveOrReject()의 반환값
* @return void
*/
protected function sendAutoApproveRejectSms(string $orderNo, array $autoResult): void
{
if (empty($orderNo) || empty($autoResult)) {
return;
}
 
// 승인 건 SMS 발송
if (!empty($autoResult['approve'])) {
$smsAutoOrder = new SmsAutoOrder(['smsAutoCodeType' => Code::ADMIN_APPROVAL]);
foreach ($autoResult['approve'] as $row) {
if (empty($row['orderGoodsSno'])) {
continue;
}
$smsAutoOrder->setOrderNo($orderNo);
$smsAutoOrder->setOrderGoodsNo($row['orderGoodsSno']);
$smsAutoOrder->autoSend();
}
}
 
// 거절 건 SMS 발송
if (!empty($autoResult['reject'])) {
$smsAutoOrder = new SmsAutoOrder(['smsAutoCodeType' => Code::ADMIN_REJECT]);
foreach ($autoResult['reject'] as $row) {
if (empty($row['orderGoodsSno'])) {
continue;
}
$smsAutoOrder->setOrderNo($orderNo);
$smsAutoOrder->setOrderGoodsNo($row['orderGoodsSno']);
$smsAutoOrder->autoSend();
}
}
}
}
 
Controller/Admin/Policy/BaseAgreementPsController.php+13-8
변경 전BaseAgreementPsController.php
\DB::begin_tran();
$buyerInform->saveAgreement(Request::post()->get('agreement'), Request::post()->get('agreementModeFl'), $mallSno);
$baseAgreementPolicy->setRequestFiles(Request::files()->all());
if (Request::post()->get('agreementModeFl', '') == 'y') {
 
$baseAgreementPolicy->setFairTradeLogo(
[
'logoFl' => Request::post()->get('logoFl', 'default'),
]
);
$baseAgreementPolicy->saveAgreementDate();
$this->layer(__('저장이 완료되었습니다.'));
} else {
$baseAgreementPolicy->setFairTradeLogo(
[
$kakaoSyncSettingService = \App::getInstance(KakaoSyncSettingService::class);
$kakaoSyncSettingService->syncSettingWhenSaveTerms();
\DB::commit();
$this->json(
[
'message' => __('저장이 완료되었습니다.'),
'code' => 200,
]
);
 
 
 
 
 
break;
}
} catch (\Exception $e) {
 
변경 후BaseAgreementPsController.php
\DB::begin_tran();
$buyerInform->saveAgreement(Request::post()->get('agreement'), Request::post()->get('agreementModeFl'), $mallSno);
$baseAgreementPolicy->setRequestFiles(Request::files()->all());
$isAgreementMode = Request::post()->get('agreementModeFl', '') == 'y';
if ($isAgreementMode) {
$baseAgreementPolicy->setFairTradeLogo(
[
'logoFl' => Request::post()->get('logoFl', 'default'),
]
);
$baseAgreementPolicy->saveAgreementDate();
 
} else {
$baseAgreementPolicy->setFairTradeLogo(
[
$kakaoSyncSettingService = \App::getInstance(KakaoSyncSettingService::class);
$kakaoSyncSettingService->syncSettingWhenSaveTerms();
\DB::commit();
 
if ($isAgreementMode) {
$this->layer(__('저장이 완료되었습니다.'));
} else {
$this->json(
[
'message' => __('저장이 완료되었습니다.'),
'code' => 200,
]
);
}
break;
}
} catch (\Exception $e) {
 
Controller/Admin/Policy/OrderBasicController.php+10-1
변경 전OrderBasicController.php
use Component\Order\OrderMultiShipping;
use Component\Member\Manager;
use Framework\Debug\Exception\Except;
 
use Origin\Enum\Payment\Tosspay\SettingMode;
 
/**
gd_isset($data['autoDeliveryCompleteDay'], '7');
gd_isset($data['autoOrderConfirmFl'], 'n');
gd_isset($data['autoOrderConfirmDay'], '7');
gd_isset($data['userHandleFl'], (gd_is_plus_shop(PLUSSHOP_CODE_USEREXCHANGE) ? 'y' : 'n'));
 
 
 
 
 
 
 
 
gd_isset($data['reagreeConfirmFl'], 'y');
gd_isset($data['handOrderType'], 'online');
gd_isset($data['useMultiShippingFl'], 'n');
 
변경 후OrderBasicController.php
use Component\Order\OrderMultiShipping;
use Component\Member\Manager;
use Framework\Debug\Exception\Except;
use Framework\Utility\GodoUtils;
use Origin\Enum\Payment\Tosspay\SettingMode;
 
/**
gd_isset($data['autoDeliveryCompleteDay'], '7');
gd_isset($data['autoOrderConfirmFl'], 'n');
gd_isset($data['autoOrderConfirmDay'], '7');
// 고객 클레임 신청 기능 사용설정 기본값
// - claim-auto-process 배포일 이후 신규 설치 상점: 무조건 'n'(사용안함)
$claimAutoProcessDate = GodoUtils::getFunctionInstallDateFromYml('claim-auto-process');
$isNewShopAfterClaimAutoProcess = !GodoUtils::getInstalledDate($claimAutoProcessDate);
if ($isNewShopAfterClaimAutoProcess) {
gd_isset($data['userHandleFl'], 'n');
} else {
gd_isset($data['userHandleFl'], (gd_is_plus_shop(PLUSSHOP_CODE_USEREXCHANGE) ? 'y' : 'n'));
}
gd_isset($data['reagreeConfirmFl'], 'y');
gd_isset($data['handOrderType'], 'online');
gd_isset($data['useMultiShippingFl'], 'n');
 
Controller/Front/Board/BoardPsController.php+4
변경 전BoardPsController.php
$this->json(['result' => 'cancel']);
}
 
 
 
 
 
// 파일 업로드 취약점 조치
if (Validator::validateIncludeEval($fileData['tmp_name']) === false) {
throw new AlertBackException('업로드 할 수 없는 파일입니다.');
 
변경 후BoardPsController.php
$this->json(['result' => 'cancel']);
}
 
// 업로드 파일 용량 확인
$boardConfig = new BoardConfig($req['bdId']);
(new ImageUploadService())->validateUploadSize($fileData, $boardConfig->cfg['bdUploadMaxSize']);
 
// 파일 업로드 취약점 조치
if (Validator::validateIncludeEval($fileData['tmp_name']) === false) {
throw new AlertBackException('업로드 할 수 없는 파일입니다.');
 
Controller/Front/Board/WriteController.php+5-3
변경 전WriteController.php
 
use Component\Goods\GoodsCate;
use Component\Page\Page;
use Framework\Debug\Exception\AlertOnlyException;
use Framework\Debug\Exception\RedirectLoginException;
use Framework\Debug\Exception\RequiredLoginException;
 
use Request;
use View\Template;
use Component\Validator\Validator;
use Framework\Debug\Exception\AlertBackException;
use Globals;
use Component\Board\BoardWrite;
use Framework\Utility\Strings;
use Framework\StaticProxy\Proxy\Session;
 
class WriteController extends \Controller\Front\Controller
{
}
}
 
 
 
 
 
$this->setData('bdWrite', $bdWrite);
$this->setData('queryString', $qryStr);
$this->setData('req', gd_htmlspecialchars($boardWrite->req));
 
변경 후WriteController.php
 
use Component\Goods\GoodsCate;
use Component\Page\Page;
 
use Framework\Debug\Exception\RedirectLoginException;
use Framework\Debug\Exception\RequiredLoginException;
use Framework\Utility\FileUtils;
use Request;
use View\Template;
use Component\Validator\Validator;
use Framework\Debug\Exception\AlertBackException;
 
use Component\Board\BoardWrite;
use Framework\Utility\Strings;
 
 
class WriteController extends \Controller\Front\Controller
{
}
}
 
// MB 단위로 저장된 값 byte 단위로 변경
$uploadMaxSize = FileUtils::megabytesToBytes((int)$bdWrite['cfg']['bdUploadMaxSize']);
 
$this->setData('uploadMaxSize', min(FileUtils::getMaxUploadSize(applyDefault: false), $uploadMaxSize));
$this->setData('bdWrite', $bdWrite);
$this->setData('queryString', $qryStr);
$this->setData('req', gd_htmlspecialchars($boardWrite->req));
 
Controller/Front/Order/CartPsController.php+10-1
변경 전CartPsController.php
 
use Component\Cart\Cart;
use Exception;
 
use Framework\Debug\Exception\AlertBackException;
use Framework\Debug\Exception\AlertOnlyException;
use Framework\Debug\Exception\AlertRedirectException;
}
 
// 장바구니 추가
$cart->saveInfoCart($postValue);
 
 
 
 
if ($request->isAjax()) {
$this->json([
'error' => 0,
// 장바구니 추가
try {
$returnData = $cart->saveInfoCart($cartValue, $directBuy, 'related');
 
 
 
 
}catch (Exception $e) {
if (Request::isAjax()) {
$this->json([
 
변경 후CartPsController.php
 
use Component\Cart\Cart;
use Exception;
use Origin\Service\WebHook\CartWebHookService;
use Framework\Debug\Exception\AlertBackException;
use Framework\Debug\Exception\AlertOnlyException;
use Framework\Debug\Exception\AlertRedirectException;
}
 
// 장바구니 추가
$addedGoods = $cart->saveInfoCart($postValue);
 
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$cartWebHookService->sendCartUpdatedWebHook($addedGoods, 'CREATED');
 
if ($request->isAjax()) {
$this->json([
'error' => 0,
// 장바구니 추가
try {
$returnData = $cart->saveInfoCart($cartValue, $directBuy, 'related');
 
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$cartWebHookService->sendCartUpdatedWebHook($returnData, 'CREATED');
 
}catch (Exception $e) {
if (Request::isAjax()) {
$this->json([
 
Controller/Front/Order/ReorderPsController.php+10
변경 전ReorderPsController.php
use Exception;
use Framework\Http\Response;
use Framework\Utility\StringUtils;
 
use Request;
 
/**
$reorderCart->moveDirectToNormalCart($cartSnoList);
}
 
 
 
 
 
 
 
 
 
 
$result = $this->handleReorderResult($cartMode, $reorderCartDataList, $availableReorderCartDataList, $isPurchasable);
 
$this->json([
 
변경 후ReorderPsController.php
use Exception;
use Framework\Http\Response;
use Framework\Utility\StringUtils;
use Origin\Service\WebHook\CartWebHookService;
use Request;
 
/**
$reorderCart->moveDirectToNormalCart($cartSnoList);
}
 
$flatCartSnos = [];
foreach (($cartSnoList ?? []) as $snoArray) {
if (is_array($snoArray)) {
$flatCartSnos = array_merge($flatCartSnos, $snoArray);
}
}
$cartWebHookService = \App::getInstance(CartWebHookService::class);
$cartWebHookService->sendCartUpdatedWebHook($flatCartSnos, 'CREATED');
 
$result = $this->handleReorderResult($cartMode, $reorderCartDataList, $availableReorderCartDataList, $isPurchasable);
 
$this->json([
 
Controller/Mobile/Board/BoardPsController.php+4
변경 전BoardPsController.php
$this->json(['result' => 'cancel']);
}
 
 
 
 
 
// 파일 업로드 취약점 조치
if (Validator::validateIncludeEval($fileData['tmp_name']) === false) {
throw new AlertBackException('업로드 할 수 없는 파일입니다.');
 
변경 후BoardPsController.php
$this->json(['result' => 'cancel']);
}
 
// 업로드 파일 용량 확인
$boardConfig = new BoardConfig($req['bdId']);
(new ImageUploadService())->validateUploadSize($fileData, $boardConfig->cfg['bdUploadMaxSize']);
 
// 파일 업로드 취약점 조치
if (Validator::validateIncludeEval($fileData['tmp_name']) === false) {
throw new AlertBackException('업로드 할 수 없는 파일입니다.');
 
Controller/Mobile/Board/WriteController.php+6-6
변경 전WriteController.php
use Component\Goods\GoodsCate;
use Component\Page\Page;
use Framework\Debug\Exception\AlertCloseException;
use Framework\Debug\Exception\AlertOnlyException;
use Framework\Debug\Exception\AlertRedirectCloseException;
use Framework\Debug\Exception\AlertRedirectException;
use Framework\Debug\Exception\AlertReloadException;
use Framework\Debug\Exception\RedirectLoginException;
use Framework\Debug\Exception\RequiredLoginException;
 
use Request;
use View\Template;
use Component\Validator\Validator;
use Framework\Debug\Exception\AlertBackException;
use Globals;
use Component\Board\BoardWrite;
use Framework\Utility\Strings;
use Framework\StaticProxy\Proxy\Session;
 
class WriteController extends \Controller\Mobile\Controller
{
$bdWrite['cfg']['bdFooter'] = str_replace('title="'.$title.'"', 'title="'.$title.'" alt="'.$title.'"', $bdWrite['cfg']['bdFooter']);
}
}
 
} catch (RequiredLoginException $e) {
$url = '../member/login.php?returnUrl='.urlencode('/board/write.php?bdId='.Request::get()->get('bdId'));
$this->js("alert('".$e->getMessage()."');location.href='".$url."';");
$this->getView()->setDefine('header', 'outline/_share_header.html');
$this->getView()->setDefine('footer', 'outline/_share_footer.html');
}
 
 
 
 
 
$this->setData('bdWrite', $bdWrite);
$this->setData('goodsNo', $goodsNo);
$this->setData('queryString', $qryStr);
 
변경 후WriteController.php
use Component\Goods\GoodsCate;
use Component\Page\Page;
use Framework\Debug\Exception\AlertCloseException;
 
 
use Framework\Debug\Exception\AlertRedirectException;
 
use Framework\Debug\Exception\RedirectLoginException;
use Framework\Debug\Exception\RequiredLoginException;
use Framework\Utility\FileUtils;
use Request;
use View\Template;
use Component\Validator\Validator;
use Framework\Debug\Exception\AlertBackException;
 
use Component\Board\BoardWrite;
use Framework\Utility\Strings;
 
 
class WriteController extends \Controller\Mobile\Controller
{
$bdWrite['cfg']['bdFooter'] = str_replace('title="'.$title.'"', 'title="'.$title.'" alt="'.$title.'"', $bdWrite['cfg']['bdFooter']);
}
}
 
} catch (RequiredLoginException $e) {
$url = '../member/login.php?returnUrl='.urlencode('/board/write.php?bdId='.Request::get()->get('bdId'));
$this->js("alert('".$e->getMessage()."');location.href='".$url."';");
$this->getView()->setDefine('header', 'outline/_share_header.html');
$this->getView()->setDefine('footer', 'outline/_share_footer.html');
}
 
// MB 단위로 저장된 값 byte 단위로 변경
$uploadMaxSize = FileUtils::megabytesToBytes((int)$bdWrite['cfg']['bdUploadMaxSize']);
 
$this->setData('uploadMaxSize', min(FileUtils::getMaxUploadSize(applyDefault: false), $uploadMaxSize));
$this->setData('bdWrite', $bdWrite);
$this->setData('goodsNo', $goodsNo);
$this->setData('queryString', $qryStr);
 
Repository/Order/OrderUserHandleRepository.php+51
변경 전OrderUserHandleRepository.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
변경 후OrderUserHandleRepository.php
<?php
/*
* Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved
*
* Unauthorized copying or redistribution of this file in source and binary forms via any medium
* is strictly prohibited.
*/
 
namespace Bundle\Repository\Order;
 
use Origin\Enum\Order\UserHandleFl;
use Origin\Enum\Order\UserHandleMode;
use Origin\Model\Order\OrderUserHandle;
 
class OrderUserHandleRepository
{
/**
* 자동 승인/거절 대상이 되는 고객 클레임 신청 건 조회
*
* SELECT sno, userHandleMode, userHandleGoodsNo
* FROM es_orderUserHandle
* WHERE orderNo = ?
* AND userHandleGoodsNo IN (...)
* AND userHandleFl = 'r'
* AND userHandleMode IN (...)
*
* @param string $orderNo 주문번호
* @param int[] $orderGoodsSnoList userHandleGoodsNo (es_orderGoods.sno) 목록
* @return array<int, array{sno:int, userHandleMode:string, userHandleGoodsNo:int}>
*/
public function findPendingUserHandlesForAutoProcess(string $orderNo, array $orderGoodsSnoList): array
{
if (empty($orderNo) || empty($orderGoodsSnoList)) {
return [];
}
 
$allowedModes = array_map(
static fn(UserHandleMode $m) => $m->value,
UserHandleMode::cases()
);
 
return OrderUserHandle::query()
->select(['sno', 'userHandleMode', 'userHandleGoodsNo'])
->where('orderNo', $orderNo)
->whereIn('userHandleGoodsNo', array_map('intval', $orderGoodsSnoList))
->where('userHandleFl', UserHandleFl::REQUEST->value)
->whereIn('userHandleMode', $allowedModes)
->get()
->toArray();
}
}
 
Widget/Front/Proc/GlobalSelectWidget.php+4
변경 전GlobalSelectWidget.php
public function index()
{
$mallIcon = gd_policy('design.mallIconType');
 
 
 
 
gd_isset($mallIcon['mallIcon'][1], 'ico_kr.png');
gd_isset($mallIcon['mallIcon'][2], 'ico_us.png');
gd_isset($mallIcon['mallIcon'][3], 'ico_cn.png');
 
변경 후GlobalSelectWidget.php
public function index()
{
$mallIcon = gd_policy('design.mallIconType');
if (!isset($mallIcon['mallIcon']) || !is_array($mallIcon['mallIcon'])) {
$mallIcon['mallIcon'] = [];
}
 
gd_isset($mallIcon['mallIcon'][1], 'ico_kr.png');
gd_isset($mallIcon['mallIcon'][2], 'ico_us.png');
gd_isset($mallIcon['mallIcon'][3], 'ico_cn.png');
 
Widget/Mobile/Proc/GlobalSelectWidget.php+4
변경 전GlobalSelectWidget.php
public function index()
{
$mallIcon = gd_policy('design.mallIconType');
 
 
 
 
gd_isset($mallIcon['mallIconMobile'][1], 'ico_kr.png');
gd_isset($mallIcon['mallIconMobile'][2], 'ico_us.png');
gd_isset($mallIcon['mallIconMobile'][3], 'ico_cn.png');
 
변경 후GlobalSelectWidget.php
public function index()
{
$mallIcon = gd_policy('design.mallIconType');
if (!isset($mallIcon['mallIconMobile']) || !is_array($mallIcon['mallIconMobile'])) {
$mallIcon['mallIconMobile'] = [];
}
 
gd_isset($mallIcon['mallIconMobile'][1], 'ico_kr.png');
gd_isset($mallIcon['mallIconMobile'][2], 'ico_us.png');
gd_isset($mallIcon['mallIconMobile'][3], 'ico_cn.png');
 
data/skin/front/moment/board/skin/default/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/skin/event/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/skin/gallery/write.html+5-3
변경 전write.html
<textarea id="editor" name="contents" style="width:100%; min-width:510px;" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
 
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
 
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
<textarea id="editor" name="contents" style="width:100%; min-width:510px;" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
<!--{? bdWrite.cfg.bdUploadFl == 'y'}-->
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
<!--{/}-->
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/skin/qa/write.html+4-4
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
data/skin/front/moment/board/template/default/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/template/event/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/template/gallery/write.html+5-3
변경 전write.html
<textarea id="editor" name="contents" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
 
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
 
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
<textarea id="editor" name="contents" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
<!--{? bdWrite.cfg.bdUploadFl == 'y'}-->
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
<!--{/}-->
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/moment/board/template/qa/write.html+4-4
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
data/skin/front/moment/js/gd_common.js+41-2
변경 전gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
var index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
formData.append('uploadFile', data.thisObj[0].files[0]);
 
$.ajax({
}
else if(returnData.result == 'cancel'){
if ($("input[name='uploadFileNm[" + index + "]']").length > 0) {
 
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
}
else {
gdAjaxUpload.isSuccess = false;
$('label[for=attach' + (index + 1) + '] .text').val(''); //파일시스템 텍스트 빈값 처리
 
 
 
alert(returnData.errorMsg);
if(typeof data.failAfter == 'function') {
data.failAfter(returnData);
}
}
 
 
 
 
 
 
 
 
 
 
}
});
}
 
변경 후gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
let index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
 
// 파일이 존재했다가 파일이 선택되지 않은 경우 처리 중단
if (!data.thisObj[0].files || !data.thisObj[0].files[0]) {
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
let maxSize = data.thisObj.data('upload-max-size');
let uploadFile = data.thisObj[0].files[0];
let fileSize = uploadFile.size;
 
if (maxSize !== undefined && maxSize !== null && fileSize > maxSize) {
alert(`파일 1개당 최대 업로드 용량은 ${Math.floor(maxSize / (1024 * 1024))}MByte(s)입니다.`);
$('label[for=attach' + (index + 1) + '] .file_text').val('');
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
formData.append('uploadFile', data.thisObj[0].files[0]);
 
$.ajax({
}
else if(returnData.result == 'cancel'){
if ($("input[name='uploadFileNm[" + index + "]']").length > 0) {
$('label[for=attach' + (index + 1) + '] .file_text').val(''); //파일시스템 텍스트 빈값 처리
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
}
else {
gdAjaxUpload.isSuccess = false;
$('label[for=attach' + (index + 1) + '] .file_text').val(''); //파일시스템 텍스트 빈값 처리
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
alert(returnData.errorMsg);
if(typeof data.failAfter == 'function') {
data.failAfter(returnData);
}
}
},
error: function () {
alert(__('업로드에 실패하였습니다.'));
$('label[for=attach' + (index + 1) + '] .file_text').val('');
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
});
}
 
data/skin/front/moment/js/gd_gettext.js+1-1
변경 전gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return eval('(' + data + ')');
}
 
 
 
변경 후gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return JSON.parse(data);
}
 
 
 
data/skin/front/moment/js/gd_multi_select_box.js+9-1
변경 전gd_multi_select_box.js
$(tmpID).trigger('chosen:updated');
}
}
data = eval(data);
 
 
 
 
 
 
 
 
if (data !='' && data != null && $(targetID).length != 0) {
$(targetID).html('');
var k = 1;
 
변경 후gd_multi_select_box.js
$(tmpID).trigger('chosen:updated');
}
}
 
try {
data = JSON.parse(data);
} catch (e) {
$(targetID).html('<option value="">' + emptyText + '</option>');
$(targetID).trigger('chosen:updated');
return;
}
 
if (data !='' && data != null && $(targetID).length != 0) {
$(targetID).html('');
var k = 1;
 
data/skin/front/moment/js/naver/naverCommonInflowScript.js+16-8
변경 전naverCommonInflowScript.js
if (commonScriptOrderItem.length > 0) {
_nao["order"] = new Array();
for (var a = 0; a < commonScriptOrderItem.length; a++) {
var
orderItem = eval("(" + commonScriptOrderItem[a].value + ")"),
cpaOrderItem = new Object();
 
 
 
 
 
cpaOrderItem["oid"] = orderItem.ordno;
cpaOrderItem["poid"] = orderItem.sno;
if (NCISP.Path === "/order/order_end.php" ) {
var commonScriptOrder = document.getElementById("naver-common-inflow-script-order");
if (commonScriptOrder && commonScriptOrder !== null) {
var
saNao = new Object(),
serviceType = "1",
orderInfo = eval("("+commonScriptOrder.value+")");
saNao["cnv"] = wcs.cnv(serviceType, orderInfo.goodsprice);
wcs_do(saNao);
 
 
 
 
 
}
}
else {
 
변경 후naverCommonInflowScript.js
if (commonScriptOrderItem.length > 0) {
_nao["order"] = new Array();
for (var a = 0; a < commonScriptOrderItem.length; a++) {
var orderItem;
try {
orderItem = JSON.parse(commonScriptOrderItem[a].value);
} catch (e) {
continue;
}
var cpaOrderItem = new Object();
 
cpaOrderItem["oid"] = orderItem.ordno;
cpaOrderItem["poid"] = orderItem.sno;
if (NCISP.Path === "/order/order_end.php" ) {
var commonScriptOrder = document.getElementById("naver-common-inflow-script-order");
if (commonScriptOrder && commonScriptOrder !== null) {
var saNao = new Object(),
 
serviceType = "1",
orderInfo;
try {
orderInfo = JSON.parse(commonScriptOrder.value);
} catch (e) {
return;
}
saNao["cnv"] = wcs.cnv(serviceType, orderInfo.goodsprice);
wcs_do(saNao);
}
}
else {
 
data/skin/front/moment/mypage/_order_goods_list.html+12-4
변경 전_order_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' || ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' || ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' || ..handleMode == 'e'}-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' || ..handleMode == 'c'}-->
 
 
 
 
 
 
 
 
{=__('취소사유')}
<!--{ / }-->
</span>
 
변경 후_order_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</span>
 
data/skin/front/moment/mypage/_reorder_goods_list.html+12-4
변경 전_reorder_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' || ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' || ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' || ..handleMode == 'e'}-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' || ..handleMode == 'c'}-->
 
 
 
 
 
 
 
 
{=__('취소사유')}
<!--{ / }-->
</span>
 
변경 후_reorder_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</span>
 
data/skin/front/moment/mypage/layer_order_refund_reason.html+9-3
변경 전layer_order_refund_reason.html
<div class="layer_wrap_cont">
<div class="ly_tit">
<h4>
<!--{ ? substr(handleInfo.orderStatus, 0, 1) == 'b' || handleInfo.userHandleMode == 'b'}-->
{=__('반품 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' || handleInfo.userHandleMode == 'r'}-->
{=__('환불 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' || handleInfo.userHandleMode == 'e'}-->
 
 
 
 
 
 
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소 상세 정보')}
 
변경 후layer_order_refund_reason.html
<div class="layer_wrap_cont">
<div class="ly_tit">
<h4>
<!--{ ? handleInfo.userHandleMode == 'b' }-->
{=__('반품 상세 정보')}
<!--{ : handleInfo.userHandleMode == 'r' }-->
{=__('환불 상세 정보')}
<!--{ : handleInfo.userHandleMode == 'e' }-->
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'b' }-->
{=__('반품 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' }-->
{=__('환불 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' }-->
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소 상세 정보')}
 
data/skin/front/moment/mypage/order_view.html+1-1
변경 전order_view.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
 
변경 후order_view.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
 
data/skin/front/moment/order/order.html+5-3
변경 전order.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
r: 'cash_receipt_info'
};
var checkedBox = $('input[name=receiptFl]:checked');
var target = eval('useCode.' + checkedBox.val());
 
$('.js_receipt').addClass('dn');
$('#' + target).removeClass('dn');
 
 
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
변경 후order.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
r: 'cash_receipt_info'
};
var checkedBox = $('input[name=receiptFl]:checked');
var target = checkedBox.val() in useCode ? useCode[checkedBox.val()] : undefined;
 
$('.js_receipt').addClass('dn');
if (target !== undefined) {
$('#' + target).removeClass('dn');
}
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
data/skin/front/mygreek/board/skin/default/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/skin/event/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/skin/gallery/write.html+5-3
변경 전write.html
<textarea id="editor" name="contents" style="width:100%; min-width:510px;" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
 
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
 
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
<textarea id="editor" name="contents" style="width:100%; min-width:510px;" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
<!--{? bdWrite.cfg.bdUploadFl == 'y'}-->
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
<!--{/}-->
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/skin/qa/write.html+4-4
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
data/skin/front/mygreek/board/template/default/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/template/event/write.html+3-3
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/template/gallery/write.html+5-3
변경 전write.html
<textarea id="editor" name="contents" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
 
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
 
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
변경 후write.html
<textarea id="editor" name="contents" cols="30" rows="10">{=bdWrite.data.contents}</textarea>
</td>
</tr>
<!--{? bdWrite.cfg.bdUploadFl == 'y'}-->
<tr>
<th scope="row">{=__('첨부파일')}</th>
<td id="uploadBox">
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
 
</td>
</tr>
<!--{/}-->
<!--{? bdWrite.cfg.bdSpamBoardFl&2 }-->
<tr>
<th scope="row">{=__('자동등록방지')}</th>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
 
data/skin/front/mygreek/board/template/qa/write.html+4-4
변경 전write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}"/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
변경 후write.html
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach{=.index_+1}" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</div>
</div>
<!--{/}-->
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" id="addUploadBtn" class="btn_gray_big"><span>+ {=__('추가')}</span></button></span>
</div>
</div>
</label>
<div class="btn_upload_box">
<button type="button" class="btn_upload" title="{=__('찾아보기')}"><em>{=__('찾아보기')}</em></button>
<input type="file" id="attach<%=idx%>" name="upfiles[]" class="file" title="{=__('찾아보기')}" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
<span class="btn_gray_list"><button type="button" class="btn_gray_big" onclick="gd_remove_upload(this)"><span>- {=__('삭제')}</span></button></span>
</div>
</div>
<button type="button" class="btn_goods_item_del js_select_remove"><img src="../../../img/common/btn/btn_goods_del.png" alt="{=__('선택 상품 삭제')}"></button>
</span>
</div>
</script>
 
data/skin/front/mygreek/js/gd_common.js+41-2
변경 전gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
var index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
formData.append('uploadFile', data.thisObj[0].files[0]);
 
$.ajax({
}
else if(returnData.result == 'cancel'){
if ($("input[name='uploadFileNm[" + index + "]']").length > 0) {
 
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
}
else {
gdAjaxUpload.isSuccess = false;
$('label[for=attach' + (index + 1) + '] .text').val(''); //파일시스템 텍스트 빈값 처리
 
 
 
alert(returnData.errorMsg);
if(typeof data.failAfter == 'function') {
data.failAfter(returnData);
}
}
 
 
 
 
 
 
 
 
 
 
}
});
}
 
변경 후gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
let index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
 
// 파일이 존재했다가 파일이 선택되지 않은 경우 처리 중단
if (!data.thisObj[0].files || !data.thisObj[0].files[0]) {
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
let maxSize = data.thisObj.data('upload-max-size');
let uploadFile = data.thisObj[0].files[0];
let fileSize = uploadFile.size;
 
if (maxSize !== undefined && maxSize !== null && fileSize > maxSize) {
alert(`파일 1개당 최대 업로드 용량은 ${Math.floor(maxSize / (1024 * 1024))}MByte(s)입니다.`);
$('label[for=attach' + (index + 1) + '] .file_text').val('');
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
formData.append('uploadFile', data.thisObj[0].files[0]);
 
$.ajax({
}
else if(returnData.result == 'cancel'){
if ($("input[name='uploadFileNm[" + index + "]']").length > 0) {
$('label[for=attach' + (index + 1) + '] .file_text').val('');
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
}
else {
gdAjaxUpload.isSuccess = false;
$('label[for=attach' + (index + 1) + '] .file_text').val(''); //파일시스템 텍스트 빈값 처리
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
alert(returnData.errorMsg);
if(typeof data.failAfter == 'function') {
data.failAfter(returnData);
}
}
},
error: function () {
alert(__('업로드에 실패하였습니다.'));
$('label[for=attach' + (index + 1) + '] .file_text').val('');
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
});
}
 
data/skin/front/mygreek/js/gd_gettext.js+1-1
변경 전gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return eval('(' + data + ')');
}
 
 
 
변경 후gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return JSON.parse(data);
}
 
 
 
data/skin/front/mygreek/js/gd_multi_select_box.js+9-1
변경 전gd_multi_select_box.js
$(tmpID).trigger('chosen:updated');
}
}
data = eval(data);
 
 
 
 
 
 
 
 
if (data !='' && data != null && $(targetID).length != 0) {
$(targetID).html('');
var k = 1;
 
변경 후gd_multi_select_box.js
$(tmpID).trigger('chosen:updated');
}
}
 
try {
data = JSON.parse(data);
} catch (e) {
$(targetID).html('<option value="">' + emptyText + '</option>');
$(targetID).trigger('chosen:updated');
return;
}
 
if (data !='' && data != null && $(targetID).length != 0) {
$(targetID).html('');
var k = 1;
 
data/skin/front/mygreek/js/naver/naverCommonInflowScript.js+16-8
변경 전naverCommonInflowScript.js
if (commonScriptOrderItem.length > 0) {
_nao["order"] = new Array();
for (var a = 0; a < commonScriptOrderItem.length; a++) {
var
orderItem = eval("(" + commonScriptOrderItem[a].value + ")"),
cpaOrderItem = new Object();
 
 
 
 
 
cpaOrderItem["oid"] = orderItem.ordno;
cpaOrderItem["poid"] = orderItem.sno;
if (NCISP.Path === "/order/order_end.php" ) {
var commonScriptOrder = document.getElementById("naver-common-inflow-script-order");
if (commonScriptOrder && commonScriptOrder !== null) {
var
saNao = new Object(),
serviceType = "1",
orderInfo = eval("("+commonScriptOrder.value+")");
saNao["cnv"] = wcs.cnv(serviceType, orderInfo.goodsprice);
wcs_do(saNao);
 
 
 
 
 
}
}
else {
 
변경 후naverCommonInflowScript.js
if (commonScriptOrderItem.length > 0) {
_nao["order"] = new Array();
for (var a = 0; a < commonScriptOrderItem.length; a++) {
var orderItem;
try {
orderItem = JSON.parse(commonScriptOrderItem[a].value);
} catch (e) {
continue;
}
var cpaOrderItem = new Object();
 
cpaOrderItem["oid"] = orderItem.ordno;
cpaOrderItem["poid"] = orderItem.sno;
if (NCISP.Path === "/order/order_end.php" ) {
var commonScriptOrder = document.getElementById("naver-common-inflow-script-order");
if (commonScriptOrder && commonScriptOrder !== null) {
var saNao = new Object(),
 
serviceType = "1",
orderInfo;
try {
orderInfo = JSON.parse(commonScriptOrder.value);
} catch (e) {
return;
}
saNao["cnv"] = wcs.cnv(serviceType, orderInfo.goodsprice);
wcs_do(saNao);
}
}
else {
 
data/skin/front/mygreek/mypage/_order_goods_list.html+12-4
변경 전_order_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_refund_state btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' || ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' || ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' || ..handleMode == 'e'}-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' || ..handleMode == 'c'}-->
 
 
 
 
 
 
 
 
{=__('취소사유')}
<!--{ / }-->
</span>
 
변경 후_order_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_refund_state btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</span>
 
data/skin/front/mygreek/mypage/_reorder_goods_list.html+12-4
변경 전_reorder_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_refund_state btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' || ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' || ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' || ..handleMode == 'e'}-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' || ..handleMode == 'c'}-->
 
 
 
 
 
 
 
 
{=__('취소사유')}
<!--{ / }-->
</span>
 
변경 후_reorder_goods_list.html
<span class="btn_gray_list">
<a href="#lyReason" class="btn_gray_small btn_refund_state btn_open_layer">
<span>
<!--{ ? ..userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ..handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ..handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ..handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ..handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</span>
 
data/skin/front/mygreek/mypage/layer_order_refund_reason.html+9-3
변경 전layer_order_refund_reason.html
<div class="layer_wrap_cont">
<div class="ly_tit">
<h4>
<!--{ ? substr(handleInfo.orderStatus, 0, 1) == 'b' || handleInfo.userHandleMode == 'b'}-->
{=__('반품 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' || handleInfo.userHandleMode == 'r'}-->
{=__('환불 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' || handleInfo.userHandleMode == 'e'}-->
 
 
 
 
 
 
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소 상세 정보')}
 
변경 후layer_order_refund_reason.html
<div class="layer_wrap_cont">
<div class="ly_tit">
<h4>
<!--{ ? handleInfo.userHandleMode == 'b' }-->
{=__('반품 상세 정보')}
<!--{ : handleInfo.userHandleMode == 'r' }-->
{=__('환불 상세 정보')}
<!--{ : handleInfo.userHandleMode == 'e' }-->
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'b' }-->
{=__('반품 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' }-->
{=__('환불 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' }-->
{=__('교환 상세 정보')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소 상세 정보')}
 
data/skin/front/mygreek/mypage/order_view.html+1-1
변경 전order_view.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
 
변경 후order_view.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
 
data/skin/front/mygreek/order/order.html+5-3
변경 전order.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
r: 'cash_receipt_info'
};
var checkedBox = $('input[name=receiptFl]:checked');
var target = eval('useCode.' + checkedBox.val());
 
$('.js_receipt').addClass('dn');
$('#' + target).removeClass('dn');
 
 
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
변경 후order.html
</tr>
<tr>
<th scope="row">{=__('회사명')}</th>
<td><input type="text" name="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
<th scope="row">{=__('대표자명')}</th>
<td><input type="text" name="taxCeoNm" value="{=gd_isset(memberInvoiceInfo['tax']['ceo'])}"/></td>
</tr>
r: 'cash_receipt_info'
};
var checkedBox = $('input[name=receiptFl]:checked');
var target = checkedBox.val() in useCode ? useCode[checkedBox.val()] : undefined;
 
$('.js_receipt').addClass('dn');
if (target !== undefined) {
$('#' + target).removeClass('dn');
}
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
data/skin/mobile/moment/board/skin/default/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/skin/event/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/skin/gallery/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/skin/qa/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/template/default/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/template/event/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/template/gallery/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/board/template/qa/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/moment/js/gd_common.js+34-1
변경 전gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
var index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
formData.append('uploadFile', data.thisObj[0].files[0]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$.ajax({
url: data.actionUrl,
type: 'POST',
}
else {
gdAjaxUpload.isSuccess = false;
 
 
 
if (returnData.errorMsg) {
alert(returnData.errorMsg);
}
data.failAfter(returnData);
}
}
 
 
 
 
 
 
 
}
});
}
 
변경 후gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
let index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
formData.append('uploadFile', data.thisObj[0].files[0]);
 
let maxSize = data.thisObj.data('upload-max-size');
 
if (!data.thisObj[0].files || !data.thisObj[0].files[0]) {
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return; // 파일이 선택되지 않은 경우 처리 중단
}
 
let uploadFile = data.thisObj[0].files[0];
let fileSize = uploadFile.size;
 
if (maxSize !== undefined && maxSize !== null && fileSize > maxSize) {
alert(`파일 1개당 최대 업로드 용량은 ${Math.floor(maxSize / (1024 * 1024))}MByte(s)입니다.`);
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
$.ajax({
url: data.actionUrl,
type: 'POST',
}
else {
gdAjaxUpload.isSuccess = false;
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
if (returnData.errorMsg) {
alert(returnData.errorMsg);
}
data.failAfter(returnData);
}
}
},
error: function () {
alert(__('업로드에 실패하였습니다.'));
$('input[name="upfiles[]"]').eq(index).val('');
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
});
}
 
data/skin/mobile/moment/js/gd_gettext.js+1-1
변경 전gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return eval('(' + data + ')');
}
 
 
 
변경 후gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return JSON.parse(data);
}
 
 
 
data/skin/mobile/moment/js/gd_member2.js+3-2
변경 전gd_member2.js
if (isComCertificationRequired && hasDeleteSno && isFileEmpty && !isDeleteChecked) {
$comCertification.rules("remove");
}
$(form).find('select').prop('disabled', false);
validate.settings.submitHandler = func;
}
if (validate.form()) {
 
 
 
$('.join_ok_btn').attr("disabled", true);
form.submit();
} else {
 
변경 후gd_member2.js
if (isComCertificationRequired && hasDeleteSno && isFileEmpty && !isDeleteChecked) {
$comCertification.rules("remove");
}
 
 
}
if (validate.form()) {
$(form).find('select').prop('disabled', false);
validate.settings.submitHandler = func;
 
$('.join_ok_btn').attr("disabled", true);
form.submit();
} else {
 
data/skin/mobile/moment/mypage/_order_goods_list.html+12-4
변경 전_order_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' || ...handleMode == 'b' }-->
 
 
 
 
 
 
 
 
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' || ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' || ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' || ...handleMode == 'c'}-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
변경 후_order_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ...handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
data/skin/mobile/moment/mypage/_reorder_goods_list.html+12-4
변경 전_reorder_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' || ...handleMode == 'b' }-->
 
 
 
 
 
 
 
 
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' || ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' || ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' || ...handleMode == 'c'}-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
변경 후_reorder_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ...handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
data/skin/mobile/moment/mypage/layer_order_refund_reason.html+9-3
변경 전layer_order_refund_reason.html
<div class="layer_order_refund_reason">
<div class="ly_head">
<h1 class="h_tit">
<!--{ ? substr(handleInfo.orderStatus, 0, 1) == 'b' || handleInfo.userHandleMode == 'b'}-->
{=__('반품사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' || handleInfo.userHandleMode == 'r'}-->
{=__('환불사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' || handleInfo.userHandleMode == 'e'}-->
 
 
 
 
 
 
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소사유')}
 
변경 후layer_order_refund_reason.html
<div class="layer_order_refund_reason">
<div class="ly_head">
<h1 class="h_tit">
<!--{ ? handleInfo.userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : handleInfo.userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : handleInfo.userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'b' }-->
{=__('반품사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' }-->
{=__('환불사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' }-->
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소사유')}
 
data/skin/mobile/moment/mypage/layer_tax_invoice_request.html+1-1
변경 전layer_tax_invoice_request.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" class="text" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
 
변경 후layer_tax_invoice_request.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" class="text" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
 
data/skin/mobile/moment/order/order.html+5-3
변경 전order.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
r: 'cash_receipt_info'
};
var checkedBox = $('input:radio[name=receiptFl]:checked');
var target = eval('useCode.' + checkedBox.val());
 
$('.js_receipt').addClass('dn');
$('#' + target).removeClass('dn');
 
 
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
변경 후order.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
r: 'cash_receipt_info'
};
var checkedBox = $('input:radio[name=receiptFl]:checked');
var target = checkedBox.val() in useCode ? useCode[checkedBox.val()] : undefined;
 
$('.js_receipt').addClass('dn');
if (target !== undefined) {
$('#' + target).removeClass('dn');
}
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
data/skin/mobile/mygreek/board/skin/default/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/skin/event/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/skin/gallery/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/skin/qa/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/template/default/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/template/event/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/template/gallery/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/board/template/qa/write.html+1-1
변경 전write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" />
</li>
</ul>
</div>
 
변경 후write.html
<ul id="boardAttach">
<li class="item template">
<button class="file_face" type="button">{=__('파일첨부')}</button>
<input class="file_hidden" type="file" name="upfiles[]" accept="image/*" <!--{? uploadMaxSize}-->data-upload-max-size="{=uploadMaxSize}"<!--{/}-->/>
</li>
</ul>
</div>
 
data/skin/mobile/mygreek/js/gd_common.js+34-1
변경 전gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
var index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
formData.append('uploadFile', data.thisObj[0].files[0]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$.ajax({
url: data.actionUrl,
type: 'POST',
}
else {
gdAjaxUpload.isSuccess = false;
 
 
 
if (returnData.errorMsg) {
alert(returnData.errorMsg);
}
data.failAfter(returnData);
}
}
 
 
 
 
 
 
 
}
});
}
 
변경 후gd_common.js
if(data.formObj.find('[name=uploadType][value=ajax]').length < 1) {
data.formObj.append('<input type="hidden" name="uploadType" value="ajax" >');
}
let index = data.thisObj.closest('form').find('input:file').index(data.thisObj);
formData.append('uploadFile', data.thisObj[0].files[0]);
 
let maxSize = data.thisObj.data('upload-max-size');
 
if (!data.thisObj[0].files || !data.thisObj[0].files[0]) {
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return; // 파일이 선택되지 않은 경우 처리 중단
}
 
let uploadFile = data.thisObj[0].files[0];
let fileSize = uploadFile.size;
 
if (maxSize !== undefined && maxSize !== null && fileSize > maxSize) {
alert(`파일 1개당 최대 업로드 용량은 ${Math.floor(maxSize / (1024 * 1024))}MByte(s)입니다.`);
let uploadFileInput = $('input[name="upfiles[]"]').eq(index);
uploadFileInput.wrap('<form>').closest('form')[0].reset();
uploadFileInput.unwrap();
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
return;
}
 
$.ajax({
url: data.actionUrl,
type: 'POST',
}
else {
gdAjaxUpload.isSuccess = false;
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
if (returnData.errorMsg) {
alert(returnData.errorMsg);
}
data.failAfter(returnData);
}
}
},
error: function () {
alert(__('업로드에 실패하였습니다.'));
$('input[name="upfiles[]"]').eq(index).val('');
// 기존 업로드 정보 제거
$("input[name='uploadFileNm[" + index + "]']").remove();
$("input[name='saveFileNm[" + index + "]']").remove();
}
});
}
 
data/skin/mobile/mygreek/js/gd_gettext.js+1-1
변경 전gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return eval('(' + data + ')');
}
 
 
 
변경 후gd_gettext.js
}
 
Gettext.prototype.JSON = function (data) {
return JSON.parse(data);
}
 
 
 
data/skin/mobile/mygreek/js/gd_member2.js+4-2
변경 전gd_member2.js
if (isComCertificationRequired && hasDeleteSno && isFileEmpty && !isDeleteChecked) {
$comCertification.rules("remove");
}
$(form).find('select').prop('disabled',false);
validate.settings.submitHandler = func;
}
if (validate.form()) {
 
$('.join_ok_btn').attr("disabled", true);
 
 
form.submit();
} else {
go_to_by_scroll($('div.c_red:first', form));
 
변경 후gd_member2.js
if (isComCertificationRequired && hasDeleteSno && isFileEmpty && !isDeleteChecked) {
$comCertification.rules("remove");
}
 
 
}
if (validate.form()) {
$(form).find('select').prop('disabled',false);
$('.join_ok_btn').attr("disabled", true);
 
validate.settings.submitHandler = func;
form.submit();
} else {
go_to_by_scroll($('div.c_red:first', form));
 
data/skin/mobile/mygreek/mypage/_order_goods_list.html+12-4
변경 전_order_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' || ...handleMode == 'b' }-->
 
 
 
 
 
 
 
 
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' || ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' || ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' || ...handleMode == 'c'}-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
변경 후_order_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ...handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
data/skin/mobile/mygreek/mypage/_reorder_goods_list.html+12-4
변경 전_reorder_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' || ...handleMode == 'b' }-->
 
 
 
 
 
 
 
 
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' || ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' || ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' || ...handleMode == 'c'}-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
변경 후_reorder_goods_list.html
<!--{ ? gd_is_plus_shop(c.PLUSSHOP_CODE_USEREXCHANGE) === true && (...userHandleSno > 0 || (...handleSno > 0 && ...handleDetailReasonShowFl == 'y') ) }-->
<li>
<a href="../mypage/layer_order_refund_reason.php?orderNo={..orderNo}&orderGoodsNo={...sno}&userHandleSno={...userHandleSno}&orderStatus={...orderStatus}" data-toggle="modal" data-target="#popupReason" data-type="post" data-cache="false" class="order_etc_btn">
<!--{ ? ...userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...userHandleMode == 'c' }-->
{=__('취소사유')}
<!--{ : ...handleMode == 'b' }-->
{=__('반품사유')}
<!--{ : ...handleMode == 'r' }-->
{=__('환불사유')}
<!--{ : ...handleMode == 'e' }-->
{=__('교환사유')}
<!--{ : ...handleMode == 'c' }-->
{=__('취소사유')}
<!--{ / }-->
</a>
 
data/skin/mobile/mygreek/mypage/layer_order_refund_reason.html+9-3
변경 전layer_order_refund_reason.html
<div class="layer_order_refund_reason">
<div class="ly_head">
<h1 class="h_tit">
<!--{ ? substr(handleInfo.orderStatus, 0, 1) == 'b' || handleInfo.userHandleMode == 'b'}-->
{=__('반품사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' || handleInfo.userHandleMode == 'r'}-->
{=__('환불사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' || handleInfo.userHandleMode == 'e'}-->
 
 
 
 
 
 
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소사유')}
 
변경 후layer_order_refund_reason.html
<div class="layer_order_refund_reason">
<div class="ly_head">
<h1 class="h_tit">
<!--{ ? handleInfo.userHandleMode == 'b' }-->
{=__('반품사유')}
<!--{ : handleInfo.userHandleMode == 'r' }-->
{=__('환불사유')}
<!--{ : handleInfo.userHandleMode == 'e' }-->
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'b' }-->
{=__('반품사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'r' }-->
{=__('환불사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'e' }-->
{=__('교환사유')}
<!--{ : substr(handleInfo.orderStatus, 0, 1) == 'c' }-->
{=__('취소사유')}
 
data/skin/mobile/mygreek/mypage/layer_tax_invoice_request.html+1-1
변경 전layer_tax_invoice_request.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" class="text" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
 
변경 후layer_tax_invoice_request.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" class="text" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
 
data/skin/mobile/mygreek/order/order.html+5-3
변경 전order.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="50" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
r: 'cash_receipt_info'
};
var checkedBox = $('input:radio[name=receiptFl]:checked');
var target = eval('useCode.' + checkedBox.val());
 
$('.js_receipt').addClass('dn');
$('#' + target).removeClass('dn');
 
 
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();
 
변경 후order.html
</tr>
<tr>
<th scope="row"><label for="taxCompany">{=__('회사명')}</label></th>
<td><input type="text" name="taxCompany" id="taxCompany" value="{=gd_isset(memberInvoiceInfo['tax']['company'])}" maxlength="70" data-pattern="gdMemberNmGlobal"/></td>
</tr>
<tr>
<th scope="row"><label for="taxCeoNm">{=__('대표자명')}</label></th>
r: 'cash_receipt_info'
};
var checkedBox = $('input:radio[name=receiptFl]:checked');
var target = checkedBox.val() in useCode ? useCode[checkedBox.val()] : undefined;
 
$('.js_receipt').addClass('dn');
if (target !== undefined) {
$('#' + target).removeClass('dn');
}
 
if (checkedBox.val() == 'r') {
gd_cash_receipt_toggle();