od_status 값 명칭 변경시, od_cart_price 값 0 으로 변경되는 이유?
본문
관리자 모드의 주문내역 상세 페이지에서 (orderform.php)
,
<input type="submit" name="ct_status" value="주문" onclick="document.pressed=this.value" class="btn_02 color_01">
<input type="submit" name="ct_status" value="입금" onclick="document.pressed=this.value" class="btn_02 color_02">
<input type="submit" name="ct_status" value="준비" onclick="document.pressed=this.value" class="btn_02 color_03">
<input type="submit" name="ct_status" value="배송" onclick="document.pressed=this.value" class="btn_02 color_04">
<input type="submit" name="ct_status" value="완료" onclick="document.pressed=this.value" class="btn_02 color_05">
<input type="submit" name="ct_status" value="취소" onclick="document.pressed=this.value" class="btn_02 color_06">
<input type="submit" name="ct_status" value="반품" onclick="document.pressed=this.value" class="btn_02 color_06">
<input type="submit" name="ct_status" value="품절" onclick="document.pressed=this.value" class="btn_02 color_06">
주문상태 값을 본사 홈페이지 형식에 맞추어
<input type="submit" name="ct_status" value="예약접수" onclick="document.pressed=this.value" class="btn_02 color_01">
<input type="submit" name="ct_status" value="상담중" onclick="document.pressed=this.value" class="btn_02 color_02">
<input type="submit" name="ct_status" value="입금확인중" onclick="document.pressed=this.value" class="btn_02 color_03">
<input type="submit" name="ct_status" value="예약확정" onclick="document.pressed=this.value" class="btn_02 color_04">
<input type="submit" name="ct_status" value="정산완료" onclick="document.pressed=this.value" class="btn_02 color_05">
<input type="submit" name="ct_status" value="취소" onclick="document.pressed=this.value" class="btn_02 color_06">
<input type="submit" name="ct_status" value="환불" onclick="document.pressed=this.value" class="btn_02 color_06">
<input type="submit" name="ct_status" value="보류" onclick="document.pressed=this.value" class="btn_02 color_06">
변경 사용중입니다.
재고처리 관리가 필요한 홈페이지가 아니다 보니, 굳이 상세 수정은 필요없을듯하고,
orderformcartupdate.php
페이지에서
$status_normal = array('예약접수','상담중','입금확인중','예약확정','정산완료');
$status_cancel = array('취소','환불','보류');
이부분만 수정해서 사용중입니다.
하지만 이렇게 사용시, 관리자모드에서 주문상태를 변경하게되면, 주문합계금액 (od_cart_price) 값이 0원으로 초기화 되어 버립니다.
주문상태를 수정하지 않은 상태에서는 정상이온데, 이유를 알수 있을까요?
혹시 관련 문제로 해결 보신분이 있다면 고맙겟씁니다.
제가 초창기에 만든 영카트 버전 5.2.9.1 에서는 이상이 없습니다. 그 후 버젼에서 문제가 발생합니다.
어느 부분 때문인지 도통 알수가 없네요.
아래는 수정한 orderformcartupdate.php 페이지 입니다.
<?php
$sub_menu = '400400';
include_once('./_common.php');
auth_check($auth[$sub_menu], "w");
check_admin_token();
$ct_chk_count = count($_POST['ct_chk']);
if(!$ct_chk_count)
alert('처리할 자료를 하나 이상 선택해 주십시오.');
$status_normal = array('예약접수','상담중','입금확인중','예약확정','정산완료');
$status_cancel = array('취소','환불','보류');
if (in_array($_POST['ct_status'], $status_normal) || in_array($_POST['ct_status'], $status_cancel)) {
; // 통과
} else {
alert('변경할 상태가 올바르지 않습니다.');
}
$mod_history = '';
$cnt = count($_POST['ct_id']);
$arr_it_id = array();
for ($i=0; $i<$cnt; $i++)
{
$k = $_POST['ct_chk'][$i];
$ct_id = $_POST['ct_id'][$k];
if(!$ct_id)
continue;
$sql = " select * from {$g5['g5_shop_cart_table']} where od_id = '$od_id' and ct_id = '$ct_id' ";
$ct = sql_fetch($sql);
if(!$ct['ct_id'])
continue;
// 수량이 변경됐다면
$ct_qty = $_POST['ct_qty'][$k];
if($ct['ct_qty'] != $ct_qty) {
$diff_qty = $ct['ct_qty'] - $ct_qty;
// 재고에 차이 반영.
if($ct['ct_stock_use']) {
if($ct['io_id']) {
$sql = " update {$g5['g5_shop_item_option_table']}
set io_stock_qty = io_stock_qty + '$diff_qty'
where it_id = '{$ct['it_id']}'
and io_id = '{$ct['io_id']}'
and io_type = '{$ct['io_type']}' ";
} else {
$sql = " update {$g5['g5_shop_item_table']}
set it_stock_qty = it_stock_qty + '$diff_qty'
where it_id = '{$ct['it_id']}' ";
}
sql_query($sql);
}
// 수량변경
$sql = " update {$g5['g5_shop_cart_table']}
set ct_qty = '$ct_qty'
where ct_id = '$ct_id'
and od_id = '$od_id' ";
sql_query($sql);
$mod_history .= G5_TIME_YMDHIS.' '.$ct['ct_option'].' 수량변경 '.$ct['ct_qty'].' -> '.$ct_qty."\n";
}
// 재고를 이미 사용했다면 (재고에서 이미 뺐다면)
$stock_use = $ct['ct_stock_use'];
if ($ct['ct_stock_use'])
{
if ($ct_status == '예약접수' || $ct_status == '취소' || $ct_status == '폐기' || $ct_status == '보류')
{
$stock_use = 0;
// 재고에 다시 더한다.
if($ct['io_id']) {
$sql = " update {$g5['g5_shop_item_option_table']}
set io_stock_qty = io_stock_qty + '{$ct['ct_qty']}'
where it_id = '{$ct['it_id']}'
and io_id = '{$ct['io_id']}'
and io_type = '{$ct['io_type']}' ";
} else {
$sql = " update {$g5['g5_shop_item_table']}
set it_stock_qty = it_stock_qty + '{$ct['ct_qty']}'
where it_id = '{$ct['it_id']}' ";
}
sql_query($sql);
}
}
else
{
// 재고 오류로 인한 수정
if ($ct_status == '예약확정' || $ct_status == '정산완료')
{
$stock_use = 1;
// 재고에서 뺀다.
if($ct['io_id']) {
$sql = " update {$g5['g5_shop_item_option_table']}
set io_stock_qty = io_stock_qty - '{$ct['ct_qty']}'
where it_id = '{$ct['it_id']}'
and io_id = '{$ct['io_id']}'
and io_type = '{$ct['io_type']}' ";
} else {
$sql = " update {$g5['g5_shop_item_table']}
set it_stock_qty = it_stock_qty - '{$ct['ct_qty']}'
where it_id = '{$ct['it_id']}' ";
}
sql_query($sql);
}
/* 주문 수정에서 "품절" 선택시 해당 상품 자동 품절 처리하기
else if ($ct_status == '품절') {
$stock_use = 1;
// 재고에서 뺀다.
$sql =" update {$g5['g5_shop_item_table']} set it_stock_qty = 0 where it_id = '{$ct['it_id']}' ";
sql_query($sql);
} */
}
$point_use = $ct['ct_point_use'];
// 회원이면서 포인트가 0보다 크면
// 이미 포인트를 부여했다면 뺀다.
if ($mb_id && $ct['ct_point'] && $ct['ct_point_use'])
{
$point_use = 0;
//insert_point($mb_id, (-1) * ($ct[ct_point] * $ct[ct_qty]), "주문번호 $od_id ($ct_id) 취소");
delete_point($mb_id, "@delivery", $mb_id, "$od_id,$ct_id");
}
// 히스토리에 남김
// 히스토리에 남길때는 작업|아이디|시간|IP|그리고 나머지 자료
$now = G5_TIME_YMDHIS;
$ct_history="\n$ct_status|{$member['mb_id']}|$now|$REMOTE_ADDR";
$sql = " update {$g5['g5_shop_cart_table']}
set ct_point_use = '$point_use',
ct_stock_use = '$stock_use',
ct_status = '$ct_status',
ct_history = CONCAT(ct_history,'$ct_history')
where od_id = '$od_id'
and ct_id = '$ct_id' ";
sql_query($sql);
// it_id를 배열에 저장
if($ct_status == '예약접수' || $ct_status == '취소' || $ct_status == '환불' || $ct_status == '보류' || $ct_status == '정산완료')
$arr_it_id[] = $ct['it_id'];
}
// 상품 판매수량 반영
if(is_array($arr_it_id) && !empty($arr_it_id)) {
$unq_it_id = array_unique($arr_it_id);
foreach($unq_it_id as $it_id) {
$sql2 = " select sum(ct_qty) as sum_qty from {$g5['g5_shop_cart_table']} where it_id = '$it_id' and ct_status = '정산완료' ";
$row2 = sql_fetch($sql2);
$sql3 = " update {$g5['g5_shop_item_table']} set it_sum_qty = '{$row2['sum_qty']}' where it_id = '$it_id' ";
sql_query($sql3);
}
}
// 장바구니 상품 모두 취소일 경우 주문상태 변경
$cancel_change = false;
if (in_array($_POST['ct_status'], $status_cancel)) {
$sql = " select count(*) as od_count1,
SUM(IF(ct_status = '취소' OR ct_status = '환불' OR ct_status = '보류', 1, 0)) as od_count2
from {$g5['g5_shop_cart_table']}
where od_id = '$od_id' ";
$row = sql_fetch($sql);
if($row['od_count1'] == $row['od_count2']) {
$cancel_change = true;
$pg_res_cd = '';
$pg_res_msg = '';
$pg_cancel_log = '';
// PG 신용카드 결제 취소일 때
if($pg_cancel == 1) {
$sql = " select * from {$g5['g5_shop_order_table']} where od_id = '$od_id' ";
$od = sql_fetch($sql);
if($od['od_tno'] && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '간편결제' || $od['od_settle_case'] == 'KAKAOPAY')) {
switch($od['od_pg']) {
case 'lg':
include_once(G5_SHOP_PATH.'/settle_lg.inc.php');
$LGD_TID = $od['od_tno'];
$xpay = new XPay($configPath, $CST_PLATFORM);
// Mert Key 설정
$xpay->set_config_value('t'.$LGD_MID, $config['cf_lg_mert_key']);
$xpay->set_config_value($LGD_MID, $config['cf_lg_mert_key']);
$xpay->Init_TX($LGD_MID);
$xpay->Set('LGD_TXNAME', 'Cancel');
$xpay->Set('LGD_TID', $LGD_TID);
if ($xpay->TX()) {
$res_cd = $xpay->Response_Code();
if($res_cd != '0000' && $res_cd != 'AV11') {
$pg_res_cd = $res_cd;
$pg_res_msg = $xpay->Response_Msg();
}
} else {
$pg_res_cd = $xpay->Response_Code();
$pg_res_msg = $xpay->Response_Msg();
}
break;
case 'inicis':
include_once(G5_SHOP_PATH.'/settle_inicis.inc.php');
$cancel_msg = iconv_euckr('쇼핑몰 운영자 승인 취소');
/*********************
* 3. 취소 정보 설정 *
*********************/
$inipay->SetField("type", "cancel"); // 고정 (절대 수정 불가)
$inipay->SetField("mid", $default['de_inicis_mid']); // 상점아이디
/**************************************************************************************************
* admin 은 키패스워드 변수명입니다. 수정하시면 안됩니다. 1111의 부분만 수정해서 사용하시기 바랍니다.
* 키패스워드는 상점관리자 페이지(https://iniweb.inicis.com)의 비밀번호가 아닙니다. 주의해 주시기 바랍니다.
* 키패스워드는 숫자 4자리로만 구성됩니다. 이 값은 키파일 발급시 결정됩니다.
* 키패스워드 값을 확인하시려면 상점측에 발급된 키파일 안의 readme.txt 파일을 참조해 주십시오.
**************************************************************************************************/
$inipay->SetField("admin", $default['de_inicis_admin_key']); //비대칭 사용키 키패스워드
$inipay->SetField("tid", $od['od_tno']); // 취소할 거래의 거래아이디
$inipay->SetField("cancelmsg", $cancel_msg); // 취소사유
/****************
* 4. 취소 요청 *
****************/
$inipay->startAction();
/****************************************************************
* 5. 취소 결과 *
* *
* 결과코드 : $inipay->getResult('ResultCode') ("00"이면 취소 성공) *
* 결과내용 : $inipay->getResult('ResultMsg') (취소결과에 대한 설명) *
* 취소날짜 : $inipay->getResult('CancelDate') (YYYYMMDD) *
* 취소시각 : $inipay->getResult('CancelTime') (HHMMSS) *
* 현금영수증 취소 승인번호 : $inipay->getResult('CSHR_CancelNum') *
* (현금영수증 발급 취소시에만 리턴됨) *
****************************************************************/
$res_cd = $inipay->getResult('ResultCode');
$res_msg = $inipay->getResult('ResultMsg');
if($res_cd != '00') {
$pg_res_cd = $res_cd;
$pg_res_msg = iconv_utf8($res_msg);
}
break;
case 'KAKAOPAY':
include_once(G5_SHOP_PATH.'/settle_kakaopay.inc.php');
$_REQUEST['TID'] = $od['od_tno'];
$_REQUEST['Amt'] = $od['od_receipt_price'];
$_REQUEST['CancelMsg'] = '쇼핑몰 운영자 승인 취소';
$_REQUEST['PartialCancelCode'] = 0;
include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php';
break;
default:
include_once(G5_SHOP_PATH.'/settle_kcp.inc.php');
require_once(G5_SHOP_PATH.'/kcp/pp_ax_hub_lib.php');
// locale ko_KR.euc-kr 로 설정
setlocale(LC_CTYPE, 'ko_KR.euc-kr');
$c_PayPlus = new C_PP_CLI_T;
$c_PayPlus->mf_clear();
$tno = $od['od_tno'];
$tran_cd = '00200000';
$g_conf_home_dir = G5_SHOP_PATH.'/kcp';
$g_conf_key_dir = '';
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
$g_conf_log_dir = G5_SHOP_PATH.'/kcp/log';
$g_conf_key_dir = G5_SHOP_PATH.'/kcp/bin/pub.key';
}
$g_conf_site_cd = $default['de_kcp_mid'];
if (preg_match("/^T000/", $g_conf_site_cd) || $default['de_card_test']) {
$g_conf_gw_url = "testpaygw.kcp.co.kr";
} else {
$g_conf_gw_url = "paygw.kcp.co.kr";
}
$cancel_msg = iconv_euckr('쇼핑몰 운영자 승인 취소');
$cust_ip = $_SERVER['REMOTE_ADDR'];
$bSucc_mod_type = "STSC";
$c_PayPlus->mf_set_modx_data( "tno", $tno ); // KCP 원거래 거래번호
$c_PayPlus->mf_set_modx_data( "mod_type", $bSucc_mod_type ); // 원거래 변경 요청 종류
$c_PayPlus->mf_set_modx_data( "mod_ip", $cust_ip ); // 변경 요청자 IP
$c_PayPlus->mf_set_modx_data( "mod_desc", $cancel_msg ); // 변경 사유
$c_PayPlus->mf_do_tx( $tno, $g_conf_home_dir, $g_conf_site_cd,
$g_conf_site_key, $tran_cd, "",
$g_conf_gw_url, $g_conf_gw_port, "payplus_cli_slib",
$ordr_idxx, $cust_ip, "3" ,
0, 0, $g_conf_key_dir, $g_conf_log_dir);
$res_cd = $c_PayPlus->m_res_cd;
$res_msg = $c_PayPlus->m_res_msg;
if($res_cd != '0000') {
$pg_res_cd = $res_cd;
$pg_res_msg = iconv_utf8($res_msg);
}
// locale 설정 초기화
setlocale(LC_CTYPE, '');
break;
}
// PG 취소요청 성공했으면
if($pg_res_cd == '') {
$pg_cancel_log = ' PG 신용카드 승인취소 처리';
$sql = " update {$g5['g5_shop_order_table']}
set od_refund_price = '{$od['od_receipt_price']}'
where od_id = '$od_id' ";
sql_query($sql);
}
}
}
// 관리자 주문취소 로그
$mod_history .= G5_TIME_YMDHIS.' '.$member['mb_id'].' 예약접수'.$_POST['ct_status'].' 처리'.$pg_cancel_log."\n";
}
}
// 미수금 등의 정보
$info = get_order_info($od_id);
if(!$info)
alert('예약자료가 존재하지 않습니다.');
$sql = " update {$g5['g5_shop_order_table']}
set od_cart_price = '{$info['od_cart_price']}',
od_cart_coupon = '{$info['od_cart_coupon']}',
od_coupon = '{$info['od_coupon']}',
od_send_coupon = '{$info['od_send_coupon']}',
od_cancel_price = '{$info['od_cancel_price']}',
od_send_cost = '{$info['od_send_cost']}',
od_misu = '{$info['od_misu']}',
od_tax_mny = '{$info['od_tax_mny']}',
od_vat_mny = '{$info['od_vat_mny']}',
od_free_mny = '{$info['od_free_mny']}' ";
if ($mod_history) { // 주문변경 히스토리 기록
$sql .= " , od_mod_history = CONCAT(od_mod_history,'$mod_history') ";
}
if($cancel_change) {
$sql .= " , od_status = '{$_POST['ct_status']}' "; // 주문상품 모두 취소, 반품, 품절이면 주문 취소
// $sql .= " , od_status = '취소' "; // 주문상품 모두 취소, 반품, 품절이면 주문 취소
} else {
if (in_array($_POST['ct_status'], $status_normal)) { // 정상인 주문상태만 기록
$sql .= " , od_status = '{$_POST['ct_status']}' ";
}
}
$sql .= " where od_id = '$od_id' ";
sql_query($sql);
$qstr = "sort1=$sort1&sort2=$sort2&sel_field=$sel_field&search=$search&page=$page";
$url = "./orderform.php?od_id=$od_id&$qstr";
// 신용카드 취소 때 오류가 있으면 알림
if($pg_cancel == 1 && $pg_res_cd && $pg_res_msg) {
alert('오류코드 : '.$pg_res_cd.' 오류내용 : '.$pg_res_msg, $url);
} else {
// 1.06.06
$od = sql_fetch(" select od_receipt_point from {$g5['g5_shop_order_table']} where od_id = '$od_id' ");
if ($od['od_receipt_point'])
alert("포인트로 결제한 예약은,\\n\\n예약상태 변경으로 인해 포인트의 가감이 발생하는 경우\\n\\n회원관리 > 포인트관리에서 수작업으로 포인트를 맞추어 주셔야 합니다.", $url);
else
goto_url($url);
}
?>
답변 2
다음 부분이 문제해결에 도움이 될지 모르겠습니다.
https://github.com/gnuboard/gnuboard5/blob/master/lib/shop.lib.php#L1597
ct_status IN ( '주문', '입금', '준비', '배송', '완료' )
https://github.com/gnuboard/gnuboard5/blob/master/lib/shop.lib.php#L1693
ct_status IN ( '취소', '반품', '품절' )
베르만 님에 답변과 관련 있는데요.
/lib/shop.lib.php에 보면
function get_order_info($od_id)
이 있습니다. 이부분에서
// 장바구니 주문금액정보
$sql = " select SUM(IF(io_type = 1, (io_price * ct_qty), ((ct_price + io_price) * ct_qty))) as price,
SUM(cp_price) as coupon,
SUM( IF( ct_notax = 0, ( IF(io_type = 1, (io_price * ct_qty), ( (ct_price + io_price) * ct_qty) ) - cp_price ), 0 ) ) as tax_mny,
SUM( IF( ct_notax = 1, ( IF(io_type = 1, (io_price * ct_qty), ( (ct_price + io_price) * ct_qty) ) - cp_price ), 0 ) ) as free_mny
from {$g5['g5_shop_cart_table']}
where od_id = '$od_id'
and ct_status IN ( '주문', '입금', '준비', '배송', '완료' ) ";
$sum = sql_fetch($sql);
이 부분에 ct_status를 변경하신 걸로 바꾸시면 되실껍니다.
!-->!-->