Tech/Django

[Django] Naver Cloud Platform의 SENS API 서비스를 이용해 문자보내기 2 (문자 메시지 발송 후 status 변경하기/특정 상태일 때 체크박스)

싱브이 2024. 4. 1. 13:34
728x90
반응형

SENS API를 이용해서 문자 보내는 방법은 아래의 링크를 통해 확인해주세요.

 

SENS API 서비스를 이용해 문자 보내기 

 

 

앞서 말했듯이 우리는 자동화가 목표였기 때문에 아래와 같은 흐름이 필요했다.

1. 고객의 VOC 접수

2. 수리 완료

3. 문자 메시지를 보내서 확인하기

4. 답변을 분류해서 저장

5-1. 진짜 수리 완료면 끝

5-2. 수리가 되지 않았다면 확인필요로 저장

 

즉, repair의 상태가 수리중, 수리 완료, 수리 전 3개로 나뉘어져 있는데 '수리 완료'가 되었을 때 우리의 자동화가 시작되는 것이다.

또 여기서 더 필요한건 즉각적인 상태변화!  voc의 상태는 확인중, 확인완료, 추가조치필요, 발송전 4개로 분류되는데 '수리 완료'가 되면 '확인 전'이었던 voc_status를 고객에서 문자를 보냄과 동시에 '확인 중'으로 변경한다.

그리고 고객에게 답변을 받음과 동시에 추가조치가 필요하지 않음을 판단하면 '확인완료', 필요하다면 '추가조치필요'로 변경한다.

 

즉, 문자 메시지를 자동화 시키는건 아래의 조건과 같다.

1. repaire_status가 '수리 완료'이고, voc_status가 '확인 전'

2. 문자가 전송되면 voc_status를 '확인 중'으로 변경

 


 

1. repaire_status가 '수리 완료'이고, voc_status가 '확인 전' 일 때 문자 전송

 

html 각 tr에서 '수리완료'상태인 전화번호를 가져와서 배열에 추가한다.

<tbody>

      {% for voc in voc_data %}
      <tr class='tr-table-content'>
		<td class='column'><input type="checkbox" class="check-voc" data-phone="{{ voc.phone }}" data-repair-status="{{ voc.repair_status }}"></td>
			<td class='voc_content'>{{ voc.tt }}</td>
			<td class='voc_content'>{{ voc.phone }}</td>
			<td class='voc_content phone'>{{ voc.phone }}</td>
            . . .

<script>
	function sendMMS() {
    	. . .
          var vocElements = document.getElementsByClassName('tr-table-content');
      	  var selectedPhoneNumbers = [];

          for (var i = 0; i < vocElements.length; i++) {
            var repairStatusElement = vocElements[i].querySelector('.repair-status');
            var repairStatus = repairStatusElement.textContent.trim();

            if (repairStatus === '수리완료') {
              var phoneNumElement = vocElements[i].querySelector('.phone');
              var phoneNum = phoneNumElement.textContent.trim();
              selectedPhoneNumbers.push(phoneNum);
            }

 

 


2. 문자 보내면 확인중으로 변경

 

try-except 를 사용해 voc 객체를 찾았다.

VOC.obejcts.filter(phone=phone_number)을 사용해 넘어온 전화번호를 통해 db 정보를 가져오고, voc 객체가 존재한다면 '확인중'으로 저장하고, voc 객체를 찾을 수 없는 경우 예외를 발생시켰다.

지금 다시 생각해보면 굳이 voc_status로 빼지 않고 그냥 voc.voc_status = '확인중'으로 변경하고 싶단 생각이 든다ㅠ

그 때는 너무 급해서 깔끔한 코드가 아닌 그냥 그냥 하기 바빴는데 이제와서 보니 후회만 가득하군 ㅠ 

def send_mms_proxy(request):
	. . .
    voc_status = '확인중'
    
    data = json.loads(request.body)
    selected_phone_numbers = data.get('phone_numbers', [])
    
    for phone_number in selected_phone_numbers:
    	. . .
             }
           ]
        }
     
        try:
            vocs = VOC.objects.filter(phone=phone_number)
            for voc in vocs:
                voc.voc_status = voc_status
                voc.save()
        except VOC.DoesNotExist:
            return JsonResponse({"status": "error", "message": "VOC 객체를 찾을 수 없습니다."})

        body = json.dumps(body)
        response = requests.post(api_url, headers=headers, data=body)

    message = f"메시지가 전송되었습니다."
    return JsonResponse({"status": "error", 'message': message}, status=200)

 


3. (수동 전송 기능) 체크박스를 이용해서 체크한 뒤 버튼을 통해 전송

 

근데, 바쁜 직장인들이 언제 그 많은 걸 보고 체크를 할까 싶어서 전체 체크 선택을할 때 '수리완료'인 상태만 체크 가능하도록 설정하였다. 

<script>
function checkAllVoc() {
	  var checkAllCheckbox = document.querySelector('.check-all-voc');
      var vocCheckboxes = document.querySelectorAll('.check-voc');
      var repairStatuses = document.querySelectorAll('.repair-status');
    
      var isCheckAllChecked = checkAllCheckbox.checked;
      
      vocCheckboxes.forEach(function (checkbox, index) {
        var repairStatus = repairStatuses[index].textContent.trim();
        // 수리완료 상태인 경우만 체크박스를 선택
        if (repairStatus === '수리완료') {
          checkbox.checked = isCheckAllChecked;
        } else {
          checkbox.checked = false;
        }
      });
    }
    . . .
    // 수리완료 상태가 아님 체크 취소
        if (repairStatus !== '수리완료') {
          checkbox.checked = false;
        }
        . . .
728x90
반응형