@AbapCatalog.sqlViewName: 'IPPMPROJCOPI'
@EndUserText.label: 'Project header info for Copilot'
@VDM.viewType: #COMPOSITE
@AbapCatalog.compiler.compareFilter: true
@ObjectModel.usageType.serviceQuality: #X
@ObjectModel.usageType.sizeCategory: #L
@ObjectModel.usageType.dataClass: #MIXED
@ClientHandling.algorithm: #SESSION_VARIABLE
@AccessControl.authorizationCheck: #CHECK
@AccessControl.personalData.blocking: #NOT_REQUIRED
@ObjectModel.semanticKey: [ 'Project' ]
@ObjectModel.representativeKey: 'ProjectUUID'
@ObjectModel.alternativeKey: [{
id: 'ProjectSummaryTaskUUID',
element: ['ProjectSummaryTaskUUID'],
uniqueness: #UNIQUE
}]
@VDM.lifecycle.contract.type: #SAP_INTERNAL_API
define view I_PPM_ProjectCopilot
as select from I_PPM_Project as Project
// next relevant milestones
// essential milestone
left outer join I_PPM_ProjectMilestEssent as MilestEssent on(
Project.ProjectUUID = MilestEssent.ProjectUUID
)
left outer join I_PPM_Task as MilestEssentTask on(
MilestEssentTask.TaskUUID = MilestEssent.TaskUUID
)
// left outer join I_PPM_TaskText as NextEssentialMlstnName on NextEssentialMlstnName.TaskUUID = MilestEssent.TaskUUID
// current phase
left outer join I_PPM_ProjectPhaseCurrent as PhaseCurrent on(
Project.ProjectUUID = PhaseCurrent.ProjectUUID
)
left outer join I_PPM_Task as PhaseCurrentTask on(
PhaseCurrentTask.TaskUUID = PhaseCurrent.TaskUUID
)
left outer join I_PPM_Text as PhaseCurrentTextUserLang on (
PhaseCurrentTextUserLang.LanguageCode = $session.system_language
)
and(
PhaseCurrentTextUserLang.ReferencedObjectUUID = PhaseCurrent.TaskUUID
)
left outer join I_PPM_Text as PhaseCurrentTextMasterLang on (
PhaseCurrentTextMasterLang.LanguageCode = Project.MasterLanguage
)
and(
PhaseCurrentTextMasterLang.ReferencedObjectUUID = PhaseCurrent.TaskUUID
)
// Severity
left outer join I_PPM_ObjectSeverity as Severity on(
Project.ProjectSummaryTaskUUID = Severity.ReferencedObjectUUID
)
// Responsible
left outer join I_PPM_SingleResponsibleForObj as ProjectResponsible on ProjectResponsible.ReferencedObjectUUID = Project.ProjectSummaryTaskUUID
association [0..*] to I_PPM_CriticalityText as _CriticalityText on _CriticalityText.CriticalityCode = $projection.CriticalityCode
{
// @Consumption.semanticObject: 'EnterpriseProject'
key Project.ProjectUUID,
Project.ProjectSummaryTaskUUID,
Project.ProjectInternalID,
Project.WBSElementInternalID,
Project.IsProjectSteeringCommitteeMbr,
Project.IsMyProject,
Project.IsMyProjectAsSubstitute,
Project.ProjectManagerUUID,
cast(
case
when Project._ProjectName.ObjectNameUserLanguage > '' then
Project._ProjectName.ObjectNameUserLanguage
else (
case
when Project._ProjectName.ObjectNameMasterLanguage > '' then
Project._ProjectName.ObjectNameMasterLanguage
else Project.Project
end
)
end as dpr_project_name ) as ProjectName,
Project._ProjectName.ObjectNameUserLanguage as ProjectNameUserLanguage,
Project._ProjectName.ObjectNameMasterLanguage as ProjectNameMasterLanguage,
@Consumption.semanticObject: 'EnterpriseProject'
Project.Project,
ProjectType as ProjectType,
Project._ProTypeName[1: LanguageCode = $session.system_language].ProjectTypeName,
ProjectStartDate,
ProjectEndDate,
Project.ProjectElementDuration as ProjectElementDuration,
ProcessingStatus,
_ProcessingStatusText[1: Language = $session.system_language].ProcessingStatusText,
cast(
case
when PhaseCurrentTextUserLang.ObjectName > '' then
PhaseCurrentTextUserLang.ObjectName
else (
case
when PhaseCurrentTextMasterLang.ObjectName > '' then
PhaseCurrentTextMasterLang.ObjectName
else PhaseCurrentTask.ExternalId
end
)
end as cgpl_text1 ) as CurrentPhaseName,
PhaseCurrentTextUserLang.ObjectName as CurrentPhaseNameUserLanguage,
PhaseCurrentTextMasterLang.ObjectName as CurrentPhaseNameMasterLanguage,
PhaseCurrentTask.ExternalId as CurrentPhase,
@Semantics.businessDate.to: true
case when PhaseCurrentTask.ProjectElementDuration > 0 then
dats_add_days( tstmp_to_dats( PhaseCurrentTask.LatestFinishDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' ), -1, 'NULL')
else
tstmp_to_dats( PhaseCurrentTask.LatestFinishDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' )
end as CurrentPhaseEndDate,
@Semantics.businessDate.at: true
case
//if the duration is initial, don't substract one day.
//Case 1: int-constraint_time = int-latest_start
when MilestEssentTask.ProjectElementDuration = 0 and MilestEssentTask.StartConstraintDateTime = MilestEssentTask.LatestStartDateTime then
tstmp_to_dats(MilestEssentTask.LatestStartDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' ) //WebDynpro takes latest start
//Case 2: int-constraint_time_fin = int-lates_start
when MilestEssentTask.ProjectElementDuration = 0 and MilestEssentTask.FinishConstraintDateTime = MilestEssentTask.LatestStartDateTime then
dats_add_days(
tstmp_to_dats( MilestEssentTask.LatestFinishDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' ),
-1, 'FAIL')
//TODO: Case 3: not sure if this will work in CDS: number of successor MilestEssentTasks is > 0
//Case 4: this is the "else" for the duration = 0 logic
when MilestEssentTask.ProjectElementDuration = 0 then
dats_add_days(
tstmp_to_dats( MilestEssentTask.LatestFinishDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' ),
-1, 'FAIL')
else //this should only happen if the duration is > 0
dats_add_days(
tstmp_to_dats( MilestEssentTask.LatestFinishDateTime, abap_system_timezone( $session.client,'NULL' ), $session.client, 'NULL' ),
-1, 'FAIL')
end as LaunchDate,
NextEssentialMlstnName,
NextRelevantMlstnDate,
NextRelevantMlstnName,
// criticality
cast (Severity.CriticalityCode as abap.char(10) ) as CriticalityCode,
Severity.Severity as Severity,
Severity.SeverityText as SeverityText,
// Severity._SeverityText.SeverityText as SeverityText,
// Responsible
ProjectResponsible.BusinessPartnerName as ProjectManager,
_ProjectManager,
_Substitute,
_ProTypeName,
Project._AuthUser,
Project._AuthSubst,
Project._AuthRole,
Project._AuthGroup,
_ProcessingStatusText,
_ProjObjRoot,
_CriticalityText
}