두번째 프로젝트 리뷰 3일전 날아온 요청사항이 아직 6개나 남았기 때문에

빠르게 요청사항부터 처리하기로 했다.

 

권한, 템플릿 등의 변경은 큰 문제가 없었지만

한국말로 출력된 값을 영어로 바꿔달라는 부분에서 문제가 생겼다.

 

해당 부분은 PickList였는데 Label이 아닌 APIName이 강제적으로 출력되기 때문에

vf page에서는 무슨 수를 쓰더라도 선택된 데이터의 label 값을 가져올 수 없었다.

 

결국 controller로 시선을 돌려야 했는데

전달해주는 Object List 자체를 원하는대로 변형시켜서 보내야 했다.

 

값을 변경해서 전달하려면 보통은 Wrapper를 생성한 다음

규격에 맞춰야 해서 상당히 까다로운데

다행히 해당 PickList는 Restrict가 지정되어 있지 않았기 때문에

new Object() 형태로 새로 만든 데이터 내부에 값을 덮어씌우는 방식으로 진행했다.

 

값을 변경하는 것보다 가져오는 것이 더 귀찮았는데

이런 사용을 굳이 하지 않기 때문인지 자료가 없어서 더 힘들었다.

 

쿼리로 가능하다면 Select 후 return으로 끝났었는데

해당 값을 보내주기 위해 새로 return할 List를 만들고

values와 api를 매칭시킬 map을 만든 다음

map에 가져온 value, label을 담아주고

List를 for문으로 순회하며 나머지 값들은 그대로 덮어쓰게 새로운 데이터를 만들어서

newList에 담아줬다.

Public void getDataList(Id rId){
        List<ObjectName> ItemList = [SELECT Id
                                            , Field1
                                            , Field2
                                            , Field3
                                            , Field4
                                            , Field5
                                            , Field6
                                         FROM ObjectName
                                        WHERE ParentObjectName=: rId
                                     ORDER BY CreatedDate ASC];
                             
        List<ObjectName> newList = new List<ObjectName>();
        Map<String, String> picklistMap = new Map<String, String>();
        Schema.DescribeFieldResult fieldResult = ObjectName.SuppliedFailureIssue__c.getDescribe();
        List<Schema.PicklistEntry> picklistValues = fieldResult.getPicklistValues();
        for(Schema.PicklistEntry entry : picklistValues) {
            picklistMap.put(entry.getValue(), entry.getLabel());
        }
        for (ObjectName Item: ItemList) {
            newList.add(new ObjectName(Id= Item.Id
                                      , Field1 = Item.Field1
                                      , Field2  = Item.Field2
                                      , Field3= Item.Field3
                                      , Field4= Item.Field4
                                      , Field5= picklistMap.get(Item.Field5)
                                      , Field6= Item.Field6
                                      ));
        }
        
        this.DataList = newList;
    }

 

고객이 거절할 경우 해당 케이스를 닫아달라는 요청을 해결하고 싶었지만

완료만 있고 종료는 없었기 때문에 최종에 closed 상태를 추가했다.

 

해당 상태로 변경했지만 계속 변경이 되지 않아서

Debug Log에서 해당 게스트 유저의 로그를 조회했는데

Validation Rull에 걸려서 진행이 되지 않는 것이었다.

 

이전에 고객이 수락할 경우

고객이 거절을 누르더라도 수정이 되지 않도록 요청받았었는데

수락 시점을 기록하며 수락일이 존재하고 수락여부가 거절로 된 경우 등록을 막았는데

거절에도 수락일을 넣어주다보니 수락일이 존재하는 거절이라 업데이트는 진행했지만

validation rull에 막혀서 로그를 찍지 않으면 확인이 되지 않는 것이었다.

 

거절은 굳이 수락한 시점을 기록할 필요가 없기 때문에

상태만 closed로 변경한 다음 문제를 해결할 수 있었다.

 

또한 거절을 한 다음 굳이 페이지를 남길 필요가 없기 때문에

script를 사용해 제출을 알린 다음 페이지를 닫게 만들었다.

 

주의할 점은 onclick이 아닌 oncomplete로 진행해야 하는데

Apex의 action이 진행된 다음 닫아야 하기 때문이다.

function submitForm() {
                alert("Form has been submitted.");
                window.close();
}

<apex:form >
	<apex:selectRadio value="{!sendYN}" layout="" styleClass="">
		<apex:selectOptions value="{!items}"/>
	</apex:selectRadio>
	<div class="btn-box">
		<apex:commandButton styleClass="btn-style" value="Save" action="{!save}" oncomplete="submitForm()"/>
	</div>
</apex:form>

 

이런 이치로 Apex에서 조건에 따른 페이지 이동을 걸어뒀을 경우

해당 조건을 만족하면 oncomplete보다 먼저 발동하기 때문에

별도의 알람 없이 페이지가 바로 이동되어버리는 것을 알 수 있다.

 

가능한 모든 요청사항을 처리했지만

불가능하거나 정보가 부족한 요청들에 대해서는 추가 문의를 넣었는데

추가적인 개발들이 필요한 것 같았다.

 

특히 특정 상태를 고객이 변경한 경우

해당 상황에 대해 담당자에게 안내를 보내야 헀고

자동으로 진행되는 사이에 사람이 확인하는 과정을 넣고 싶다고 하는데

그렇게 처리하기 위해서는 다시 수동으로 발신할 때 필요한 템플릿이 필요했다.

 

담당자 안내는 내부 알림 용도기 때문에 큰 문제는 없지만

고객에게 보내야 하는 외부 발신용 템플릿은 마음대로 작성해봤자 수정요청이 올게 뻔했기 때문에

해당 사항에 대한 정의를 해달라고 답신을 보냈다.

 

메일을 자동으로 처리하려고 하는데 뭔가 문제가 생겼고

문제는 해결했지만 정석 방법이 아니기도 하고 8시가 훌쩍 넘어서 메모도 하지 못했다.

 

어쩄거나 Classic template을 사용하면 User Id를 넣어서 메일을 보낼 경우

relatedTo와 비슷한 WhatId? 같은 것을 사용할 수 없어져 버리는데

템플릿은 해당 관련 데이터가 필수기 때문에

해결법으로 Contact에 동일 이메일 주소를 임시로 만들고

해당 주소로 메일을 보내고 다시 삭제하는 방법이 전반적으로 추천받았다.

 

해당 방법으로 간신히 해결하고 팀장님에게 말씀드렸지만

그렇게 해결하는 것은 상당히 좋지 못한 방법이라고 하셔서

내일 다시 해결하기로 했다.

 

오늘은 인터페이스 테스트도 계속 진행하면서 해서 더 헷갈렸는데

사례도 작성하지 못하고 요청사항은 내일까지 끝내야 하는데 상당히 바쁜 것 같다.

 

 

(1).백준 20282번 Game Show!는 계속해서 점수를 획득할 때

어떤 점수에서 멈췄어야 하는지를 묻는 문제였다.

 

간단히 게속 점수를 더해가며 max값과 비교했고

Math.max로 저장했기 때문에 항상 최대값을 저장할 수 있었다.

const input = `5
-10
20
-30
40
-50`.split('\n').map(Number)

let now = 100
let max = 100

for(let i = 1 ; i < input.length ; i++){
    now += input[i]
    max = Math.max(max, now)
}

console.log(max)

'회고' 카테고리의 다른 글

[개발일지] - 125  (0) 2023.11.02
[개발일지] - 124  (1) 2023.11.01
[개발일지] - 122  (1) 2023.10.30
[개발일지] - 121(주말)  (0) 2023.10.29
[개발일지] - 120(주말)  (0) 2023.10.28

+ Recent posts