카테고리 없음

26_공동구매 게시물 상세보기 ⑤ 버튼 관련_2

yong_ღ'ᴗ'ღ 2022. 9. 17. 20:01

① 공동구매에 관련된 정보들 가져오기

② 참여자목록 (참여자들 프로필사진 및 닉네임)

③ 댓글(등록, 수정, 삭제, 고정 처리)

④ 신고팝업, 신고처리(게시물, 댓글)

⑤ 찜(♡) 

⑥ 버튼 관련

 

 

이제 얼마 안 남은 버튼 다시 ㄱㄱ,,!


 

4) <참여 취소>

참여 취소는 공동구매참여자테이블 DELETE + 환불테이블 INSERT 해주면 된다.

*신경써야 했던 부분은 참여자가 <추가 참여> 했을 때의 경우이다.

<추가 참여>했을 때에는 공동구매테이블의 구매수량은 UPDATE를 해주지만 결제테이블에는 UPDATE가 아니라 새로운 결제 내역을 계속 INSERT 해준다.환불테이블에서는 결제 코드를 참조해서 해당 결제건을 환불테이블에 INSERT해주면서 회원의 포인트에 더해준다.

그래서 결제테이블에 여러 건이 있는 경우를 신경써줘야 한다!

 

어떻게 할까 생각하다가 일단 환불테이블에서 해당 회원의 해당 공동구매 관련 환불이유가 '참여자취소'인 결제 건 중에 코드번호가 가장 작은 결제 건을 먼저 찾았다.그 이후에 해당 결제 건보다 하나 더 큰 결제 건을 계속 해서 가져오면서 있으면 환불시켜주고 없으면 반복문을 종료하도록 처리했다.아래는 프로시저 코드이다.

--▷ 참여상태 - <참여취소>
---- (공동구매참여자DELETE + 환불INSERT)
CREATE OR REPLACE PROCEDURE PRC_BP_PARTICIPANT_CANCEL
( V_BUYPOST_CODE    IN  BUYPOST.CODE%TYPE
, V_MEMBER_CODE     IN  MEMBER.CODE%TYPE
)
IS
    PAYMENT_CODE        PAYMENT.CODE%TYPE;
    AMOUNT              PAYMENT.AMOUNT%TYPE;
    REFUND_REASON_CODE  REFUND_REASON.CODE%TYPE;
BEGIN

    -- 공동구매참여자 DELETE
    DELETE BUYPOST_PARTICIPANT
    WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = V_MEMBER_CODE;
      
    -- 환불 INSERT 
    --(추가결제해서 결제 정보 여러개 있을 수 있음)
    SELECT CODE INTO REFUND_REASON_CODE
    FROM REFUND_REASON
    WHERE REASON LIKE '%참여자취소%';
    
    --반복문 돌기 전 해당 회원의 해당 공동구매관련 가장 먼저 결제 건 찾기
    SELECT MIN(CODE) INTO PAYMENT_CODE
    FROM PAYMENT
    WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = V_MEMBER_CODE
      AND TO_NUMBER(SUBSTR(CODE, 2)) > 0;
    
    LOOP
        --해당 결제코드의 결제금액 가져옴
        SELECT AMOUNT INTO AMOUNT
        FROM PAYMENT
        WHERE CODE = PAYMENT_CODE;
        
        INSERT INTO REFUND(CODE, AMOUNT, DATETIME, PAYMENT_CODE, REFUND_REASON_CODE)
        VALUES('R'||REFUND_SEQ.NEXTVAL, AMOUNT, SYSDATE, PAYMENT_CODE, REFUND_REASON_CODE);
        
        --전에 찾은거보다 하나 더 큰 결제 건 찾기
        SELECT MIN(CODE) INTO PAYMENT_CODE
        FROM PAYMENT
        WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = V_MEMBER_CODE
          AND TO_NUMBER(SUBSTR(CODE, 2)) > TO_NUMBER(SUBSTR(PAYMENT_CODE, 2));

        EXIT WHEN PAYMENT_CODE IS NULL;  
    END LOOP;
END;

- dao Inteface.java 코드

//--▷ <참여취소>
public void deleteParticipant(HashMap<String, String> params);

- dao.xml 코드

<!-- <참여취소> -->
<select id="deleteParticipant" statementType="CALLABLE">
    {CALL PRC_BP_PARTICIPANT_CANCEL (#{buypost_code}, #{member_code})}	
</select>

berry 회원은 회원번호가 M151번으로 장조림을 3개 구매했었음!

berry 회원이 참여한 장조림 공구에 <참여 취소>를 누르면 다음과 같이 알림 팝업이 뜬다.

참여취소를 하고 난 후에는, 다음과 같은 알림이 뜨고, 화면 뒤에 보면 berry회원이 구매한 3개가 빠져서

현재 구매된 상품개수가 3개로 줄어있고, 

berry회원이 이제는 미참여자이기 때문에 <추가참여><참여취소> 버튼이 → <참여하기> 로 바뀐 걸 확인할 수 있다.

취소 후에, 포인트 내역을 보면! 장조림 공구에 참여할 때 1개사고, 추가참여로 2개를 샀기 때문에 환불도 같은 방법으로 2번 이루어졌다..! 금액을 더해서 한 번에 환불할 수 있지만 뭐 나중에 처음에는 카드결제하고 두 번째에는 계좌이체로 했으면 따로 해줘야 될 것이기 때무네,,,! ㅎㅅㅎ

 

 

5) 진행자: <수정> → 수정폼으로 연결

<수정>버튼은 클릭 시, 아직 수정폼을 만들지는 않아서 onclick 속성에 수정폼 주소만 연결해줬다.

<button type="button" class="primary-btn two-btn buypostUpdateBtn hostBtn buypostBtn"
	onclick="buypostupdateform.lion">수정</button>

 

 

6) 진행자: <진행 취소>

<진행 취소> 프로시저는 나중에 모집실패, 게시물 신고 승인으로 인한 공동구매 취소에서도 같이 쓰일 프로시저이다.

<진행 취소> 했을 때에는 취소된 공동구매 게시물 테이블 INSERT + 참여자 모두 환불테이블 INSERT를 해줘야 한다.

이 프로시저는 <참여 취소> 와 고려해야할 부분이 비슷했다. 하지만 <진행 취소>는 한 회원의 결제 내역만 취소하는 게 아니라, 해당 공동구매에 참여한 모든 참여자들의 결제 내역을 확인 후 취소해줘야 한다!그래서 이중 반복문으로 [회원반복 -> 결제내역반복] 이런식으로 돌았다.

 

아래는 프로시저 코드이다.

--▷ 진행자 - 진행취소 / 모집실패 / 신고취소
---- (취소공동구매게시물INSERT + 참여자 모두 환불처리)
--(참여자들 추가결제 했으면 결제 정보 여러개 있음...)
CREATE OR REPLACE PROCEDURE PRC_BP_HOST_CANCEL
( V_BUYPOST_CODE    IN  BUYPOST.CODE%TYPE
)
IS
    PARTICIPANT_CODE    BUYPOST_PARTICIPANT.CODE%TYPE;
    MEMBER_CODE         MEMBER.CODE%TYPE;
    PAYMENT_CODE        PAYMENT.CODE%TYPE;
    AMOUNT              PAYMENT.AMOUNT%TYPE;
    REFUND_REASON_CODE  REFUND_REASON.CODE%TYPE;
BEGIN
    
    -- 취소공동구메게시물 INSERT
    INSERT INTO BUYPOST_CANCEL(CODE, DATETIME, BUYPOST_CODE)
    VALUES('BPC'||BUYPOST_CANCEL_SEQ.NEXTVAL, SYSDATE, V_BUYPOST_CODE);
   
    -- 환불 INSERT 
    SELECT CODE INTO REFUND_REASON_CODE
    FROM REFUND_REASON
    WHERE REASON LIKE '%진행자취소%';
    
    /*
    해당 공동구매의 참여자 테이블에서 참여자테이블코드 가장 작은 거 부터 회원코드 찾음
    → 해당 회원코드의 결제코드 중 가장 작은거 ~ 큰거 순으로 환불해줌
    → (결제코드 NULL 이면 해당 회원 환불 끝)
    → 그리고 다음 회원으로 넘어가는 식으로 진행
    → (회원코드 NULL 이면 모든 회원 환불 끝)
    */
    
    --참여자코드 최솟값 먼저 찾고
    SELECT MIN(CODE) INTO PARTICIPANT_CODE
    FROM BUYPOST_PARTICIPANT
    WHERE BUYPOST_CODE = V_BUYPOST_CODE
    AND TO_NUMBER(SUBSTR(CODE, 5)) > 0;
    
    --그 참여자코드의 회원코드 찾기
    SELECT MEMBER_CODE INTO MEMBER_CODE
    FROM BUYPOST_PARTICIPANT
    WHERE CODE = PARTICIPANT_CODE;
    
    --공동구매에서 회원의 결제코드 중 최솟값 먼저 찾음
    SELECT MIN(CODE) INTO PAYMENT_CODE
    FROM PAYMENT
    WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = MEMBER_CODE
      AND TO_NUMBER(SUBSTR(CODE, 2)) > 0;
    
    LOOP
        --공동구매참여자 DELETE
        DELETE BUYPOST_PARTICIPANT
        WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = MEMBER_CODE;
        
        LOOP
            --해당 결제코드의 결제금액 가져옴
            SELECT AMOUNT INTO AMOUNT
            FROM PAYMENT
            WHERE CODE = PAYMENT_CODE;
            
            -- 환불 INSERT 
            INSERT INTO REFUND(CODE, AMOUNT, DATETIME, PAYMENT_CODE, REFUND_REASON_CODE)
            VALUES('R'||REFUND_SEQ.NEXTVAL, AMOUNT, SYSDATE, PAYMENT_CODE, REFUND_REASON_CODE);
            
            --전에 찾은거보다 하나 더 큰 결제 건 찾기
            SELECT MIN(CODE) INTO PAYMENT_CODE
            FROM PAYMENT
            WHERE BUYPOST_CODE = V_BUYPOST_CODE AND MEMBER_CODE = MEMBER_CODE
              AND TO_NUMBER(SUBSTR(CODE, 2)) > TO_NUMBER(SUBSTR(PAYMENT_CODE, 2));
              
            --결제코드 NULL이면 해당 회원 환불 종료
            EXIT WHEN PAYMENT_CODE IS NULL;  
        END LOOP;
    
        --전에 찾은거보다 하나 더 큰 참여자 코드 찾기
        SELECT MIN(CODE) INTO PARTICIPANT_CODE
        FROM BUYPOST_PARTICIPANT
        WHERE BUYPOST_CODE = V_BUYPOST_CODE
        AND TO_NUMBER(SUBSTR(CODE, 5)) > TO_NUMBER(SUBSTR(MEMBER_CODE, 5));
        
        --참여자코드 NULL이면 모든 회원 환불 끝
        EXIT WHEN PARTICIPANT_CODE IS NULL;
        
        --그 참여자코드의 회원코드 찾기
        SELECT MEMBER_CODE INTO MEMBER_CODE
        FROM BUYPOST_PARTICIPANT
        WHERE CODE = PARTICIPANT_CODE;
            
    END LOOP;
END;

 

그럼 coco 회원이 진행하고 있는 '키위' 공동구매를 <진행취소> 해보자

일단 지금은 각 회원 모두 1개씩 구매한 상황인데, 제대로 전체 환불처리가 되는지 확인하기 위해서 추가참여를 진행!

추가참여 후, db상태이다.

용짱회원은 1개, kbt2회원은 2개, coco회원은 3개를 더 추가구매했다.

<진행 취소>를 누르면 다음과 같은 알림 팝업이 뜬다.

<진행취소>를 하면 메인으로 이동한다.

이제 제대로 환불처리가 됐는지 coco(7000+21000원), 용짱(7000+7000원), kbt2(7000+14000원) 회원의 포인트 내역을 차례로 보자

🔥 용짱 회원의 7000원 2번 환불내역이 1번 밖에 안떴다...이번엔 빨리 파악했다.

저번에 결제 후 포인트 잔액 뜨는 거에서도 같은 문제가 있었어서..!!

포인트 내역을 UNION 하는 과정에서 UNION ALL을 해줬어야 했는데 UNION 을 해서 중복이 제거되었다.

UNION → UNION ALL 로 고쳐서 해결!

 

고럼 문제 해결했으니,

coco회원 포인트 환불 내역 (7000+21000원)

용짱회원 포인트 환불 내역 (7000+7000원)

kbt2회원 포인트 환불 내역 (7000+14000원) 

 

그리고 포인트 내역에 있는 공동구매 게시물 이름을 통해서 [키위] 공동구매 게시물로 들어오면,

<마감된 공동구매> 버튼이 보인다.

🔥 <마감된 공동구매> 버튼이 보여져야 하는데 .jsp 화면이 아예 안떴다.

참여자가 없어서 참여자 목록 때문에 그런가했더니 그것도 아니였다.

DB를 보니 해당 게시물의 상태가 [cancel]로 나와야하는데 [recruit]로 나왔다.

case when 구문에서 cancel 게시물을 먼저 체크하고 recruit 를 했어야 했는데, recruit 를 먼저 체크하고 cancel을 나중에 체크해서 그랬다...!! 해당 게시물의 모집 마감일이 아직 남아있는 상태이기 때문에!

case when 구문 순서 잘 작성하기!!

 

 

7) 공동구매 상태 안내 버튼: <진행 중인 공동구매>

8) 공동구매 상태 안내 버튼: <마감된 공동구매>

7) 8) 번 버튼은 상태만 안내해주는 버튼이라 disabled 처리했다.

예시 사진은 전에 게시물에서 이미 올렸으니까 여기선 패스!

 


휴우 공동구매 게시물 버튼 작업까지 끝,,,!!!