if(재능이 없으면 시간으로 극복하라){return 성공;}

SAP BTP - SAP 비즈니스 로직 커스텀하기

우린 앞서 service 파일을 옮김으로서 화면을 바꾸거나 로직을 추가하였다. 이번엔 있던 서비스를 직접 변경해보도록 하자.

cpapp의 srv에 risk-service.js를 추가해보자. 기존은 cds 파일 기반으로 데이터나 ui를 수정했다면 javascript로 로직을 수정

risk의 impact 값이 10000 이하면 정상, 20만 초과면 불가, 10000초과 20만 미만이면 주의

const cds = require('@sap/cds')
/**
 * Implementation for Risk Management service defined in ./risk-service.cds
 */
module.exports = cds.service.impl(async function() {
    this.after('READ', 'Risks', risksData => {
        const risks = Array.isArray(risksData) ? risksData : [risksData];
        risks.forEach(risk => {
            if (risk.impact <= 10000) {
                risk.criticality = 0;       //정상
            } else if(risk.impact >= 200000) {
                risk.criticality = 1;       //불가
            } else {
                risk.criticality = 2;       //주의
            }
            
        });
    });
});


image

예제 데이터를 보면 아래와 같이 되어 있는데 해당 데이터들은

image

risks-service-ui.cds에 따라 표현 하는 방법이 정해져 있는 것이다.

using RiskService from './risk-service';

annotate RiskService.Risks with {
	title       @title: 'Title';
	prio        @title: 'Priority';
	descr       @title: 'Description';
	miti        @title: 'Mitigation';
	impact      @title: 'Impact';
}

annotate RiskService.Mitigations with {
	ID @(
		UI.Hidden,
		Common: {
		Text: description
		}
	);
	description  @title: 'Description';
	owner        @title: 'Owner';
	timeline     @title: 'Timeline';
	risks        @title: 'Risks';
}

annotate RiskService.Risks with @(
	UI: {
		HeaderInfo: {
			TypeName: 'Risk',
			TypeNamePlural: 'Risks',
			Title          : {
                $Type : 'UI.DataField',
                Value : title
            },
			Description : {
				$Type: 'UI.DataField',
				Value: descr
			}
		},
		SelectionFields: [prio],
		LineItem: [
			{Value: title},
			{Value: miti_ID},
			{
				Value: prio,
				Criticality: criticality
			},
			{
				Value: impact,
				Criticality: criticality
			}
		],
		Facets: [
			{$Type: 'UI.ReferenceFacet', Label: 'Main', Target: '@UI.FieldGroup#Main'}
		],
		FieldGroup#Main: {
			Data: [
				{Value: miti_ID},
				{
					Value: prio,
					Criticality: criticality
				},
				{
					Value: impact,
					Criticality: criticality
				}
			]
		}
	},
) {

};

annotate RiskService.Risks with {
	miti @(
		Common: {
			//show text, not id for mitigation in the context of risks
			Text: miti.description  , TextArrangement: #TextOnly,
			ValueList: {
				Label: 'Mitigations',
				CollectionPath: 'Mitigations',
				Parameters: [
					{ $Type: 'Common.ValueListParameterInOut',
						LocalDataProperty: miti_ID,
						ValueListProperty: 'ID'
					},
					{ $Type: 'Common.ValueListParameterDisplayOnly',
						ValueListProperty: 'description'
					}
				]
			}
		}
	);
}

특정 조건에 따라 Criticality를 설정해주면 prio와 impact 필드가 표시되게 해준다는건데, 그렇다면 prio값에 따라 Criticality를 설정하고 title필드에도 표현해보자.

risks-service-ui.cds에서 LineItem 부분을 변경해보자.

		LineItem: [
			{	Value: title,
				Criticality: criticality
			},
			{Value: miti_ID},
			{
				Value: prio,
				Criticality: criticality
			},
			{
				Value: impact,
				Criticality: criticality
			}
		],

그리고 자바스크립트 단에서 prio에 따른 위험도를 설정해준다.


const cds = require('@sap/cds')

/**
 * Implementation for Risk Management service defined in ./risk-service.cds
 */
module.exports = cds.service.impl(async function() {
    this.after('READ', 'Risks', risksData => {
        const risks = Array.isArray(risksData) ? risksData : [risksData];
        risks.forEach(risk => {
            if (risk.prio === '3') {
                risk.criticality = 3;
            } else if(risk.prio === '2') {
                risk.criticality = 4;
            } else {
                risk.criticality = 5;
            }
            
        });
    });
});

image

요러한 옵션들은 odata-vocabularies에서 제공하는데 https://github.com/SAP/odata-vocabularies/blob/main/vocabularies/UI.md#CriticalityType

위를 보면 위험도에 따른 표현이 정해져있다.