고도몰5 추천인 프로모션 튜닝

·2021년 3월 24일
0

고도몰5 튜닝

목록 보기
3/4

고도몰5 pro / 21년 03월 원본소스 기준 튜닝입니다.

추천인 등록시 추천인 아이디를 입력하고 가입한 회원과 추천인을 데려온 기존 회원 모두에게 정해진 일정금액의 마일리지를 지급하는 기능은 고도몰 솔루션의 기본 기능으로 제공된다.

튜닝목적은 추천인을 입력하고 가입한 회원이 첫구매를 마치는 시점(해당 주문의 상태값이 '구매확정'으로 변경되는 시점)에 첫구매 금액의 일정비율(ex. 10%)의 마일리지를 제공하는 방식의 프로모션을 하기 위함이다.

핵심사항:
1. 지급시점 변경(회원가입시 -> 가입 후 첫번째 주문의 구매확정시)
2. 지급금액 설정방식 변경(일정금액 -> 첫주문 구매금액의 일정비율 %)
3. 관리자페이지의 마일리지 지급설정에 추천인 프로모션 관련 설정기능 추가
4. 지급횟수 제한 기능

1. 지급시점 변경

지급시점 변경에 대해서는 기존에 지급되고 있는 구매금액에 대한 마일리지가 지급되는 곳을 찾아 같이 넣으면 될 것이라 판단, 해당 코드를 찾아보았다.

module/Component/Order/Order.php
(고도몰 튜닝 기본 > 튜닝한 적이 없는 부분은 아예 소스코드 파일이 없습니다. 해당하는 파일이 없거나 메소드가 없을 경우 우선 원본소스에서 가져와야합니다.)


public function statusChangeCodeS //주문 상태값이 '구매확정'으로 변경될 때 동작하는 메소드 내에 아래와 같은 코드가 있다.
$this->setPlusMileageVariation

public function setPlusMileageVaration
//이 메소드에서 구매금액의 일부를 마일리지로 적립해주는 기능을 수행하고 있음을 알 수 있다. 내부를 보면,

foreach ($this->getOrderGoodsData($orderNo, null, null, null, null, false) as $key => $val) {
//es_orderGoods 테이블에서 주문정보를 불러와서 지급해야할 마일리지 금액을 계산한다.
//주문 당시에 지급해야할 마일리지 금액을 위 테이블 goodsMileage 컬럼에 입력해두었기 때문

(이렇게 한 이유는 주문 당시의 마일리지 정책(주문금액의 2%, 5% 등)에 따라 미리 적립할 마일리지를 계산해둬야 배송받는 도중에 마일리지 정책이 바뀌어도 주문 당시의 정책대로 받을 수 있기 때문일까?)

위 foreach문에서 조건을 만족하면 주문에 속한 각 상품별로 계산된 마일리지지급 금액을 $totalMileage 변수에 저장하고, 그 뒤 이 값이 0보다 크면 마일리지를 지급한다.
마지막에 마일리지를 지급하는 코드는 아래와 같이 시작한다.

if ($mileage->setMemberMileage($val['memNo'], $totalMileage, Mileage::REASON_CODE_GROUP . Mileage::REASON_CODE_ADD_GOODS_BUY, 'o', $orderNo)) {

//이 if문 내에 구매에 따른 마일리지 지급 관련 코드가 끝난 뒤( unset($arrBind); ) 추천인 마일리지 지급을 위한 코드를 아래와 같이 추가하였다.

$orderDataForRecomm = $this->getOrderData($orderNo); //위에서는 es_orderGoods 테이블의 정보만 쓰고 있어서, es_order테이블의 주문정보를 불러오기 위한 코드
if($orderDataForRecomm['firstSaleFl'] == 'y'){ //이 주문이 첫 주문일 경우
    $member = App::load('\\Component\\Member\\Member');
    $memberData = $member->getMember($val['memNo'],'memNo','memNo, memId, recommFl, recommId'); //es_member테이블에서 가입시 입력한 추천인 정보 불러오기
    $mileageGivePolicy = gd_policy('member.mileageGive'); // es_config테이블에서 관리자페이지에서 관리자가 설정해둔 값을 가져와서 쓰기
    $recommAmountPercent = $mileageGivePolicy['recommAmountPercent'] / 100; //추천인을 입력하고 가입한 신규가입자에 대한 마일리지 지급비율 계산
    $recommJoinAmountPercent = $mileageGivePolicy['recommJoinAmountPercent'] / 100; //추천으로 신규가입자를 데려온 기존회원에 대한 마일리지 지급비율 계산
     if($memberData['recommFl'] == 'y' && $memberData['recommId'] != ""){ //추천인입력여부가 y이고 입력된 추천인 아이디정보가 존재할 경우
           $recommJoinMileage = round($orderDataForRecomm['settlePrice'] * $recommJoinAmountPercent);
           $recommMileage = round($orderDataForRecomm['settlePrice'] * $recommAmountPercent); //할인, 마일리지분을 제외한 고객 현금 결제 금액의 일정비율, 반올림해서 정수단위로.
           $mileageRecommJoin = \App::load('\\Component\Mileage\Mileage');
           $mileageRecommJoin->setMemberMileage($memberData['memNo'], $recommJoinMileage,  Mileage::REASON_CODE_GROUP . Mileage::REASON_CODE_REGISTER_RECOMMEND, 'r', null, null, '추천인 정보입력 (추천인 ID: ' . $memberData['recommId'] .')');
           //Mileage::REASON_CODE_GROUP . Mileage::REASON_CODE_REGISTER_RECOMMEND 이 '01005' + '006' es_code에서의 코드값을 const로 저장해둔 것 - Mileage class에 정의되어 있음.
           $memberRecomm = App::load('\\Component\\Member\\Member');
           $memberRecommData = $memberRecomm->getMember($memberData['recommId'],'memId','memNo');
           $mileageRecomm = \App::load('\\Component\Mileage\Mileage');
           $mileageRecomm->setMemberMileage($memberRecommData['memNo'], $recommMileage, '01005006', 'r', null, null, '추천해서 가입시킨 회원 ID: ' . $memberData['memId']);                    

     }
}      

2, 3. 지급금액 설정방식 변경 및 관리자페이지 설정기능 추가

관리자페이지의 회원탭 > 마일리지/예치금 관리 > 마일리지 지급설정 페이지 주소
admin/member/member_mileage_give.php
여기서 기존 추천인 등록에 대한 코드를 복사해서 아래와 같이 약간 수정하였다.(기존코드는 복사한 뒤 우선 주석처리해두었음.)

                        <li class="form-inline">
                            <label>
                                추천인 아이디를 등록한 회원에게 첫구매금액의
                                <input type="text" name="recommJoinAmountPercent" value="<?php echo $data['recommJoinAmountPercent']; ?>" class="form-control width-2xs js-number">%
                                <?php echo Globals::get('gSite.member.mileageBasic.unit'); ?> 지급
                            </label>
                        </li>
                        <li class="form-inline mgt10">
                            추천인으로 등록된 회원에게 가입자 첫구매금액의
                            <input type="text" name="recommAmountPercent" value="<?php echo $data['recommAmountPercent']; ?>" class="form-control width-2xs js-number">%
                            <?php echo Globals::get('gSite.member.mileageBasic.unit'); ?> 지급
                            <label class="checkbox-inline">
                                <input type="checkbox" name="recommCountPercentFl" value="y" <?php echo $tchecked['recommCountPercentFl']['y']; ?>>
                                지급횟수
                            </label>
                            <input type="text" name="recommCountPercent" value="<?php echo $data['recommCountPercent']; ?>" class="form-control width-2xs js-number" data-number="5,99999,0">
                            회로 제한
                        </li>

튜닝 과정에서 위와 같이 처리하기만 해도 es_config 테이블에 있는 member . mileageGive 에 값이 잘 insert됨을 알 수 있었다.
단, 저장돼있는 값이 관리자페이지에서 잘 보여지게 하기 위해서는 연결돼있는 컨트롤러인
module/Controller/Admin/Member/MemberMileageGiveController.php 에 코드를 추가해주었다.
(고도몰 튜닝 기본 > 튜닝한 적이 없는 부분은 아예 소스코드 파일이 없습니다. 해당하는 파일이 없거나 메소드가 없을 경우 우선 원본소스에서 가져와야합니다.)

<?php
namespace Controller\Admin\Member;

/**
 * 회원의 마일리지 지급 설정 관리 페이지
 *
 */
class MemberMileageGiveController extends \Bundle\Controller\Admin\Member\MemberMileageGiveController
{
	public function index()
	{
		try {
			parent::index();

			
			$tdata = gd_policy('member.mileageGive');

			//추가기능 소스 삽입
			$tchecked['recommCountPercentFl'][$tdata['recommCountPercentFl']] ='checked="checked"';
			$this->setData('tchecked', $tchecked);

			
		} catch (\Exception $e) {
			throw $e;		
		}
	}
}

4. 지급횟수 제한

기본 기능에 있던 지급횟수 제한 기능도 같이 구현해두는 게 필요하여 원본소스에서 기본 기능으로 제공된 추천인 마일리지 지급 기능이 작동하는 코드를 찾아보았다.
Member class에서 회원가입 혜택 지급을 하는
public function benefitJoin 이라는 메소드가 있었고, 여기서 보니
Component/Member/Benefit 클래스를 로드하고 있었다.
Benefit 클래스를 찾아 Benefit.php로 들어갔더니 역시나 여기서 회원가입시 추천인 마일리지를 제공하는 기능에 해당하는 코드들을 찾을 수 있었고, 지급횟수 제한과 관련된 소스코드를 복사해와서 조건문을 걸고 내가 튜닝한 상황에 맞게 조금씩 고쳐주었다.
아래와 같이 추가.

                        $memberRecomm = App::load('\\Component\\Member\\Member');
                        $memberRecommData = $memberRecomm->getMember($memberData['recommId'],'memId','memNo');
                        
                        $recommCount = $mileageGivePolicy['recommCount'];
                        $recommendeeCount = $memberRecomm->getRecommendCount($memberData['recommId']);
                        
                        $mileageRecomm = \App::load('\\Component\Mileage\Mileage');
                        if ($mileageGivePolicy['recommCountFl'] === 'y' && $recommendeeCount >= $recommCount) {
                            $msg = sprintf('%s 회원의 추천을 받았으나 적립횟수[%s]가 초과되어 적립안됨', $memberData['memId'], number_format($recommCount));
                            $mileageRecomm->setMemberMileage($memberRecommData['memNo'], 0, Mileage::REASON_CODE_GROUP . Mileage::REASON_CODE_ETC, 'r', null, null, $msg);
                        } else {
                            
                            $mileageRecomm->setMemberMileage($memberRecommData['memNo'], $recommMileage, Mileage::REASON_CODE_GROUP . Mileage::REASON_CODE_RECEIVE_RECOMMEND, 'r', null, null, '추천해서 가입시킨 회원 ID: ' . $memberData['memId']);
                        }
                    

  • 혹여라도 잘못 알고 있는 부분, 잘못된 용어 사용 등이 있으면 댓글 부탁드립니다. 감사합니다!
profile
백엔드 개발자. 공동의 목표를 함께 이해한 상태에서 솔직하게 소통하며 일하는 게 가장 즐겁고 효율적이라고 믿는 사람.

2개의 댓글

comment-user-thumbnail
2022년 3월 1일

혹시 고도몰 튜닝에 대해 여쭤보고 의뢰드리고 싶은게 있는데 상담도 가능할까요? ㅠㅠ
카톡 아이디 : picaz 입니다. 꼭 좀 부탁드립니다...

1개의 답글