@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: 'Enterprise Project Time Recording'
@AccessControl: {
authorizationCheck: #MANDATORY,
personalData.blocking: #REQUIRED
}
@Metadata.ignorePropagatedAnnotations: true
@Metadata.allowExtensions: true
@ObjectModel.usageType:{
serviceQuality: #D,
sizeCategory: #XL,
dataClass: #TRANSACTIONAL
}
@VDM.viewType: #CONSUMPTION
define view entity C_EntProjProfnlSrvcTimeRecg
as select from R_EnterpriseProjectTimeSheet as TimeSheet
inner join R_WorkAssignmentKeyMap as Worker on Worker.WorkforceAssignment = TimeSheet.WorkAssignment
inner join I_BusinessPartner as Person on Person.BusinessPartner = Worker.BusinessPartner
association [0..1] to I_EntProjProfnlSrvcBillgElmnt as _BillingElement on _BillingElement.ProjectUUID = TimeSheet.ProjectUUID
and _BillingElement.SalesOrder = TimeSheet.LeadingSalesOrder
and _BillingElement.SalesOrderItem = TimeSheet.LeadingSalesOrderItem
association [0..1] to C_EntProjMemberContactCard as _WorkerContactCard on _WorkerContactCard.BusinessPartnerUUID = $projection.BusinessPartnerUUID
association [1..1] to C_EntProjPrftCtrCntctCard as _ProfitCenterContactCard on _ProfitCenterContactCard.ProfitCenter = $projection.WBSElementProfitCenter
{
key TimeSheet.ProjectUUID,
key TimeSheet.ReferencedObjectUUID,
key TimeSheet.WBSElementInternalID,
@ObjectModel.text.element: [ 'CostCtrActivityTypeName' ]
key TimeSheet.ActivityType,
key TimeSheet.WorkAssignment,
@ObjectModel.text.element: [ 'EntProjElmntWorkItemName' ]
key TimeSheet.WorkItem,
@ObjectModel.text.element: [ 'BillingControlCategoryText' ]
key TimeSheet.BillableControl,
case TimeSheet.BillableControl
when 'S1' then 'NON_BILL' else '' end as ProjDmndBillingControlCategory,
// Project element
@ObjectModel.text.element: [ 'ProjectElementDescription' ]
TimeSheet.ProjectElement,
@Semantics.text: true
TimeSheet.ProjectElementDescription,
// Worker
@ObjectModel.text.element: [ 'PersonFullName' ]
@ObjectModel.foreignKey.association: '_WorkerContactCard'
Person.BusinessPartnerUUID,
Worker.WorkforcePersonExternalID,
//For DCL
Worker.IsBlocked,
@Semantics.booleanIndicator: true
Person.IsBusinessPurposeCompleted,
// Billing
_BillingElement.WBSElementExternalID,
_BillingElement.WBSDescription,
_BillingElement.Product,
_BillingElement.BillingPlanUsageCategoryName,
@ObjectModel :{
foreignKey.association: '_ProfitCenterContactCard',
text.element: [ 'ProfitCenterName' ]
}
_BillingElement.ProfitCenter as WBSElementProfitCenter,
_BillingElement._ProfitCenter[1: ValidityEndDate >= $session.system_date
and ValidityStartDate <= $session.system_date]._Text[1: Language = $session.system_language ].ProfitCenterName,
// Text
@Semantics.text: true
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as abap.char( 70 )) as EntProjElmntWorkItemName,
@Semantics.text: true
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as val_text ) as BillingControlCategoryText,
@Semantics.text: true
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as fis_costctractivitytypename ) as CostCtrActivityTypeName,
@Semantics.text: true
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as /cpd/pws_ws_org_unit_id_desc ) as EngmtProjectServiceOrgName,
// Supplied resource
@ObjectModel.text.element: [ 'EngmtProjectServiceOrgName' ]
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as tv_proj_dmnd_supply_dlvry_id ) as ProjectDemandSupplyDeliveryOrg,
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '' as bu_name1tx ) as PersonFullName,
// KPI
TimeSheet.HoursUnitOfMeasure,
// Previous month
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as PreviousMonthRecordedHours,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as PreviousMonthStaffedEfforts,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as PreviousMonthMissingHours,
// Current month
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as CurrentMonthRecordedHours,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as CurrentMonthStaffedEfforts,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as CurrentMonthMissingHours,
// Till current month
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as RecordedHoursTillCurrentMonth,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as StaffedEffortsTillCurrentMonth,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as MissingHoursTillCurrentMonth,
// Total
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as TotalRecordedHours,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as TotalStaffedEfforts,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as TotalMissingHours,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as TotalApprovedHours,
@Semantics.quantity.unitOfMeasure: 'HoursUnitOfMeasure'
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy:'ABAP:CL_EPPM_PROJ_CTRL_PROFNL_SRVC'
cast( '00.00' as abap.quan( 21, 3 )) as TotalUnapprovedHours,
// Association
TimeSheet._EnterpriseProject,
_ProfitCenterContactCard,
_WorkerContactCard
}