본문 바로가기

Salesforce/미니과제

<미니과제_완료> Sales Activities by Type

2024-06-17 화면테스트까지 완료

18일에 관련 클래스 파일 내용 전달드리기

구현해야 하는 결과화면 / 화면테스트


 

데이터 확인

데이터를 확인하는 방법은 크게 2가지 이다. 첫 번째는 Developer Console 에서 쿼리로 데이터를 조회해 보는 방법, 두 번째는 Report에서 확인하는 방법이다.

 

먼저 현재 시점의 데이터를 확인한다. 그리고 필요한 데이터를 추가하는 등의 작업을 진행한다

여기서도 어떤 Report를 사용해야 원하는 결과를 뽑아낼 수 있을지  생각하고 리포트 타입을 선택 후 오른쪽 파란 버튼의 'Start Report'를 누른다


시간시점에 대하여서는 프로젝트의 경우 이미 정해져있을 것이다.

여기서는 지정하고 진행해야 한다.

큰 범주에서 보면 Date : Previous FQ (전분기) 이렇게 해도 되지 않나 싶긴 한다...

전체 대시보드들의 기준이 어떤지 통일시키는 작업이 필요하겠지?...

 

 

일단은 지금 데이터가 없기 때문에..

All Time을 기준으로 조회하면서 데이터를 확인하면서 어느 정도 갖춰지면 시간변경을 고려해봐야 할 것 같다


데이터 2개 생성함!

 

데이터 추가하기

각 옵티에 들어가서 태스크를 생성하는 방법으로 2개 액티비티 데이터를 만들었다.

그런데 lead 탭으로 오니까 이렇게 no activitiy라고 되어 있고 action을 바로 할 수 있는 것 같다

Subject 내용을 결과 화면에 있는 항목에 해당하도록 선택 후 'Save'

 

리포트에서 조회했을 때 데이터가 없어서 다시 확인해보니 No Upcoming에 가있다. Actions에 메일모양 버튼을 누르니 팝업창이 나온다.

Subject 아까 입력했는데.. 새로 입력해야 함..

BCC 빼고, Subject 타이핑, 메일내용 타이핑 후 'Send'


Log a Call - Task - Event

의 각각 팝업창 모습이다 한번에 이렇게도 띄워진다


아니... 액티비티 오브젝트에는 사실 데이터가 없고

이게 다 TASK 오브젝트, EVENT 오브젝트에서 가져온 거임.

근데 셀포는 JOIN 안되지 않냐고 이거 확률로 보여줘야 하는데

얘네 데이터 조인해서 필드하나 만들거나 그래서 그거 합산해서 확률로 하거나 그래야 하는데

아놔,,

 

스키마 빌더 그려보니까 액티비티는 아무것도 아님..ㅜㅜㅜ


여기에서는 아무것도 안 보이지만!

그리고 task edit 에서도 subtype은 편집이 불가하게 설정되어 있는 상태이지만 New Task를 눌렀을 때 이렇게 보이는 애들이 있음.. 얘네들은 대체 어디서 가져오는것인가!!!


Task Subtype은 어떻게 이 데이터가 생성된 것인지를 추적해서 그 값을 넣어주는 것 같다.

여기에는 임의의 값을 추가하는 작업이 불가능하다.

 

Subject에 있는 데이터는 수정이 가능하여 Subject 필드 사용 시 화면과 더 비슷하게 구현이 가능하지만, 실제로 넘어오는 값을 보여주는 것을 더 중요하게 생각했을 때는 이대로 가는 게 더 맞는 것 같다.


결과가 잘 출력됨. 기쁨!!

이제 퍼센테이지로 어떻게 보여주나. 이 파트는 나의 영역은 맞나 생각했는데..

이거를 커스텀 필드하나 만들어서 formula 해볼까 했는데..

task는 필드 추가가 불가능함..

이거를 쿼리로 구현하는 것은 또 복잡해보임..

또 새로운 난관에 봉착했다..


해결완료.

테스트 때 작성한 lwc 코드까지 코드모음!

import { LightningElement } from 'lwc';
import calculate_TaskSubtype from "@salesforce/apex/KpiSalesActivityController.calculate_TaskSubtype";

export default class KpiSalesActivity extends LightningElement {
    nTotal;
    nCall;
    nEmail;
    nLinkedIn;        
    nListEmail;    
    nOthers;

    connectedCallback() {
        calculate_TaskSubtype({
        }).then(data => {
            if(data) { 
                
                console.log('data ====>>' +data); // 데이터 로드 확인용 로그
                var dataResult = JSON.parse( data); //여기서 json화 시킴
                this.nTotal =  dataResult.nTotal ;
                
                //Percentage 출력을 위해 백분율 계산 
                this.nCall = (dataResult.nCall/ dataResult.nTotal)*100 ; 
                this.nEmail =(dataResult.nEmail/dataResult.nTotal)*100 ;  
                this.nLinkedIn =(dataResult.nLinkedIn/dataResult.nTotal)*100 ;
                this.nListEmail =(dataResult.nListEmail/dataResult.nTotal)*100 ;
                this.nOthers =(dataResult.nOthers/dataResult.nTotal)*100 ;
                
                console.log('nTotal====>' + nTotal); 
            }
        }).catch(error => {
            if(error && error.body && error.body.message) {
                this.showToast('Error', 'error', error.body.message);
            }
        });
    
    }
      
}

<template>
    <!--KPI_SalesActibity by type -->
    <lightning-card title="SALSE ACTIVITY by type">
        <lightning-card>
            <p> Total : {nTotal}  </p>
            <p> Call :  {nCall}  </p>
            <p> Email :  {nEmail} </p>
            <p> LinkedIn : {nLinkedIn} </p>
            <p> ListEmail : {nListEmail}  </p>
            <p> Other : {nOthers} </p>
        </lightning-card>
    </lightning-card>
</template>
 

 


public with sharing class KpiSalesActivityController {

    @AuraEnabled(cacheable = false)
    public static String calculate_TaskSubtype(){
        RetResult retVal = new RetResult();
        List<AggregateResult> aggrList = [SELECT TaskSubtype, Count(Id)countId FROM Task GROUP BY TaskSubtype];

        for(AggregateResult oItem : aggrList )
        {
            decimal nCnt =(decimal) oItem.get('countId');
            switch on (String) oItem.get('TaskSubtype')     {
                       
                when  'Call' {
                    retVal.nCall =(decimal) oItem.get('countId');
                    System.debug('call');
                }

                when  'Email' {
                    retVal.nEmail = (decimal) oItem.get('countId');
                    System.debug('Email');
                }
                when  'LinkedIn' {
                    retVal.nLinkedIn = (decimal) oItem.get('countId');
                    System.debug('LinkedIn');
                }

                when  'ListEmail' {
                    retVal.nListEmail =(decimal) oItem.get('countId');
                    System.debug('ListEmail');
                }

                when else {  //나머지 데이터는 여기에 쌓는다
                    retVal.nOthers += (decimal) oItem.get('countId');  //retVal.nOthers =  retVal.nOthers + oItem.countId
                    System.debug('other');
                }
            }
           
            retVal.nTotal = retVal.nCall + retVal.nEmail + retVal.nLinkedIn + retVal.nListEmail + retVal.nOthers;
         
        }
        System.debug('retVal.nTotal : ' + retVal.nTotal);
        return JSON.serialize(retVal); // json구조로 문자열로 넘김
     
    }
 
    public class RetResult{
             
        public decimal nTotal = 0;
        public decimal nCall =0;
        public decimal nEmail=0;
        public decimal nLinkedIn=0;        
        public decimal nListEmail=0;    
        public decimal nOthers=0;

    }
}

어려웠던 점.

클래스 부분에서 캐스팅하고 json 구조로 문자열 넘기고, 그거를 자바스크립트에서 받는 것 등등

이번에도 어려운 부분이 많았다.

이전에 작업한 opptycontroller와 동일한 구조로 진행해도 되었지만, 다른 방식을 이사님이 제안해주셔서 이번에는 이러한 구조로 도움을 받아 작업을 진행했다.