@AccessControl.authorizationCheck: #NOT_REQUIRED
// @EndUserText.label: 'Revenue Schedule: Distinct/Compound POB'
@VDM.private: true
@VDM.viewType: #COMPOSITE
define view entity P_RASchedDistinctItem
// Cumulative Amount
as select from P_RASchedAllocatedAmtPerPerd as RevAcctgAllocatedAmtPerPerd
// POB
inner join I_RAPerformanceObligation as RAPerformanceObligation
on RAPerformanceObligation.PerformanceObligation = RevAcctgAllocatedAmtPerPerd.PerformanceObligation
and RAPerformanceObligation.RevenueAccountingContract = RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract
// Delta Amount
left outer to one join P_RASchedPerfOblgnAmtPerd as RAPerfOblgnTotalAmtPerPeriod
on RevAcctgAllocatedAmtPerPerd.PerformanceObligation = RAPerfOblgnTotalAmtPerPeriod.PerformanceObligation
and RevAcctgAllocatedAmtPerPerd.FiscalYear = RAPerfOblgnTotalAmtPerPeriod.FiscalYear
and RevAcctgAllocatedAmtPerPerd.FiscalPeriod = RAPerfOblgnTotalAmtPerPeriod.FiscalPeriod
and RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract = RAPerfOblgnTotalAmtPerPeriod.RevenueAccountingContract
// Cumulative Quantity
left outer to one join P_RASchedCumltvPerfOblgnQtyPer as RACumFulfilledQtyPerPerd
on RevAcctgAllocatedAmtPerPerd.PerformanceObligation = RACumFulfilledQtyPerPerd.PerformanceObligation
and RevAcctgAllocatedAmtPerPerd.FiscalYear = RACumFulfilledQtyPerPerd.FiscalYear
and RevAcctgAllocatedAmtPerPerd.FiscalPeriod = RACumFulfilledQtyPerPerd.FiscalPeriod
and RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract = RACumFulfilledQtyPerPerd.RevenueAccountingContract
// Delta Quantity
left outer to one join P_RASchedPerfOblgnQtyPerd as RAInvcAndFulfilledQtyPerPerd
on RAInvcAndFulfilledQtyPerPerd.PerformanceObligation = RevAcctgAllocatedAmtPerPerd.PerformanceObligation
and RAInvcAndFulfilledQtyPerPerd.FiscalYear = RevAcctgAllocatedAmtPerPerd.FiscalYear
and RAInvcAndFulfilledQtyPerPerd.FiscalPeriod = RevAcctgAllocatedAmtPerPerd.FiscalPeriod
and RAInvcAndFulfilledQtyPerPerd.RevenueAccountingContract = RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract
// Posted Amount
left outer to one join P_RASchedPerfOblgnPostdAmtPerd as RAPerfOblgnPostedRevnPerPerd
on RevAcctgAllocatedAmtPerPerd.PerformanceObligation = RAPerfOblgnPostedRevnPerPerd.PerformanceObligation
and RevAcctgAllocatedAmtPerPerd.FiscalYear = RAPerfOblgnPostedRevnPerPerd.FiscalYear
and RevAcctgAllocatedAmtPerPerd.FiscalPeriod = RAPerfOblgnPostedRevnPerPerd.FiscalPeriod
and RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract = RAPerfOblgnPostedRevnPerPerd.RevenueAccountingContract
{
/*======Key===============================================*/
key RevAcctgAllocatedAmtPerPerd.PerformanceObligation,
key RevAcctgAllocatedAmtPerPerd.FiscalYear,
key RevAcctgAllocatedAmtPerPerd.FiscalPeriod,
key RevAcctgAllocatedAmtPerPerd.RevenueAccountingContract,
/*======Associated Key====================================*/
RAPerformanceObligation.RAHigherLevelPerfOblgn,
cast(concat(RevAcctgAllocatedAmtPerPerd.FiscalYear, RevAcctgAllocatedAmtPerPerd.FiscalPeriod)
as fis_jahrper_conv) as FiscalYearPeriod,
cast(concat(RevAcctgAllocatedAmtPerPerd.FiscalPeriod, concat('.', RevAcctgAllocatedAmtPerPerd.FiscalYear))
as fis_fiscalyearperiod_c preserving type) as FiscalYearPeriodCompoundText,
/*======POB Data==========================================*/
RAPerformanceObligation.CompanyCode,
RAPerformanceObligation.PerformanceObligationClass,
RAPerformanceObligation.PerformanceObligationStartDate,
RAPerformanceObligation.PerformanceObligationEndDate,
RAPerformanceObligation.PerfObligationDeferralMethod,
RAPerformanceObligation.PerfOblgnStartDateType,
RAPerformanceObligation.PerfOblgnIsFullyFulfilled,
RAPerformanceObligation.PerfOblgnIsFinallyInvoiced,
RAPerformanceObligation.PerfOblgnEventType,
RAPerformanceObligation.PerfOblgnFulfillmentType,
RAPerformanceObligation.Customer,
// @ObjectModel.foreignKey.association: 'RAPerformanceObligation._PerfOblgnDistinctType'
RAPerformanceObligation.RAPerfOblgnDistinctType,
// UoM
RAPerformanceObligation.SalesDocumentCurrency,
RAPerformanceObligation.PerfOblgnEffectiveQuantityUnit,
RAPerformanceObligation.PerfOblgnContractualQtyUnit,
cast('%' as farr_quantity_unit) as RatioUnit,
// Price and Quantity
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RAPerformanceObligation.PerUnitSSPriceInSlsDocCrcy,
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RAPerformanceObligation.SSPriceInSalesDocCrcy,
@Semantics.quantity.unitOfMeasure: 'PerfOblgnContractualQtyUnit'
RAPerformanceObligation.PerfOblgnContractualQuantity,
/*======Cumulative Amount==========================================*/
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy as farr_allocated_amt preserving type) as AllocatedPriceInSalesDocCrcy,
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RevAcctgAllocatedAmtPerPerd.TotalDocAmtContractual as farr_price preserving type) as ContractualPrcInSlsDocCrcy,
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RevAcctgAllocatedAmtPerPerd.TotalDocAmtAllocatedEffect as farr_corr_amt preserving type) as CumltvEffectiveAmtInSlsDocCrcy,
@Semantics. amount.currencyCode: 'SalesDocumentCurrency'
cast(RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy
- RevAcctgAllocatedAmtPerPerd.TolRecgdAmtCatchupPerPerd
- RevAcctgAllocatedAmtPerPerd.TolRecognizedAmtPerPerd
as farr_open_revenue) as RAOpenRevnInSlsDocCrcy,
// total cost
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RevAcctgAllocatedAmtPerPerd.TolEffectiveCostPerPerd,
// Open Cost
@Semantics. amount.currencyCode: 'SalesDocumentCurrency'
cast(RevAcctgAllocatedAmtPerPerd.TolEffectiveCostPerPerd
- RevAcctgAllocatedAmtPerPerd.TolRecognizedCostPerPerd
as farr_open_cost) as RAOpenCostInSlsDocCrcy,
/*======Delta Amount==========================================*/
// Delta Invoiced Amount
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RAPerfOblgnTotalAmtPerPeriod.DeltaInvoicedAmtPerPerd as farr_cds_invoiced_amount preserving type) as PerPerdInvoicedAmtInSlsDocCrcy,
// Delta Recognized Amount
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast( RAPerfOblgnTotalAmtPerPeriod.DeltaRecognizedAmtPerPerd
+ RAPerfOblgnTotalAmtPerPeriod.DeltaRecgdAmtCatchupPerPerd as farr_recog_amt) as DeltaRecognizedAmtInSlsDocCrcy,
// Delta Catch Up Amount
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RAPerfOblgnTotalAmtPerPeriod.DeltaRecgdAmtCatchupPerPerd as farr_cds_rev_catchup_amt preserving type) as RecgdCatchUpAmtInSlsDocCrcy,
// Delta Posted Amount
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RAPerfOblgnPostedRevnPerPerd.TotalPostgAmtInSlsDocCrcy * -1 as farr_post_price) as PostedRevnInSlsDocCrcy,
// Delta Recognized Cost
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RAPerfOblgnTotalAmtPerPeriod.DeltaRecognizedCostPerPerd as farr_recog_cost preserving type) as DeltaRecgdCostInSlsDocCrcy,
// Delta Posted Cost
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
cast(RAPerfOblgnPostedRevnPerPerd.TotalPostgCostInSlsDocCrcy as farr_post_cost preserving type) as PostedCostInSlsDocCrcy,
/*======Cumulative Quantity==========================================*/
// Cumulative Fulfilled Quantity
@Semantics.quantity.unitOfMeasure: 'PerfOblgnEffectiveQuantityUnit'
cast(RACumFulfilledQtyPerPerd.PerfOblgnCumltvFulfilledQty as farr_fulfilled_qty_to_cur_perd preserving type) as UpToCurPeriodFulfilledQty,
// Cumulative Effective Quantity
@Semantics.quantity.unitOfMeasure: 'PerfOblgnEffectiveQuantityUnit'
cast(RACumFulfilledQtyPerPerd.PerfOblgnCumltvEffectiveQty as farr_cds_effective_quantity preserving type) as PerfOblgnEffectiveQuantity,
/*======Delta Quantity==========================================*/
// Delta Fulfilled Quantity
@Semantics.quantity.unitOfMeasure: 'PerfOblgnEffectiveQuantityUnit'
cast(RAInvcAndFulfilledQtyPerPerd.DeltaPerfOblgnFulfilledQty as farr_cds_fulfilled_quantity) as PerfOblgnPerPeriodFulfilledQty,
// Delta Invoiced Quantity
@Semantics.quantity.unitOfMeasure: 'PerfOblgnContractualQtyUnit'
cast(RAInvcAndFulfilledQtyPerPerd.PerfOblgnDeltaInvoicedQuantity as farr_cds_invoiced_quantity) as PerfOblgnDeltaInvoicedQuantity,
/*======Calculated Fields==========================================*/
// Revenue Fulfilled Progress = Recognized Revenue / Total Revenue
@Semantics.quantity.unitOfMeasure: 'RatioUnit'
cast(case RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy
when 0 then 100
// TODO: after setting the reference @Semantics.amount.currencyCode: 'SalesDocumentCurrency' to the underlying field in P_RASchedAllocatedAmtPerPerd,
// use the commented-out code below!
else round(100 * division(cast( RevAcctgAllocatedAmtPerPerd.TolRecognizedAmtPerPerd
+ RevAcctgAllocatedAmtPerPerd.TolRecgdAmtCatchupPerPerd as abap.dec(23,6)),
cast(RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy as abap.dec(23,6)), 6), 2)
// else round(100 * ( curr_to_decfloat_amount(RevAcctgAllocatedAmtPerPerd.TolRecognizedAmtPerPerd)
// + curr_to_decfloat_amount(RevAcctgAllocatedAmtPerPerd.TolRecgdAmtCatchupPerPerd))
// / curr_to_decfloat_amount(RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy), 2)
end as farr_fulfilled_rev_progress) as RecognizedRevnUpToCurPerdPct,
// FulfilledQtyUpToCurPerdRatio = Cumulative Fulfilled Quantity / Effective Quantity
@Semantics.quantity.unitOfMeasure: 'RatioUnit'
cast(case RACumFulfilledQtyPerPerd.PerfOblgnCumltvEffectiveQty
when 0 then 0
else round(100 * get_numeric_value(RACumFulfilledQtyPerPerd.PerfOblgnCumltvFulfilledQty)
/ get_numeric_value(RACumFulfilledQtyPerPerd.PerfOblgnCumltvEffectiveQty), 2)
end as farr_fulfilled_qty_progress) as FulfilledQtyUpToCurPerdRatio,
/*======DPC Fields==========================================*/
cast('' as farr_cds_rai_srcco) as RevnAcctgSenderComponent,
cast('' as farr_operational_doc) as RevnAcctgOperationalDocument,
cast('' as farr_item_id) as RAOperationalDocumentItem,
cast(0 as farr_num_of_oprational_doc) as RANumberOfOperationalDocument,
/*======Additional Fields for Consumer==========================================*/
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RevAcctgAllocatedAmtPerPerd.TotalEffectiveAmtInSlsDocCrcy,
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RevAcctgAllocatedAmtPerPerd.TolRecognizedAmtPerPerd,
@Semantics.amount.currencyCode: 'SalesDocumentCurrency'
RevAcctgAllocatedAmtPerPerd.TolRecgdAmtCatchupPerPerd,
/*======Associated View=====================================*/
// RAPerformanceObligation._RevenueAccountingContract,
RAPerformanceObligation._PerfOblgnStartDateType,
RAPerformanceObligation._PerfObligationEventType,
RAPerformanceObligation._FulfillmentType,
RAPerformanceObligation._Customer,
RAPerformanceObligation._PerfOblgnDistinctType,
RAPerformanceObligation._Currency,
RAPerformanceObligation._PerfOblgnContractualQtyUnit,
RAPerformanceObligation._PerfOblgnEffectiveQtyUnit
}
where RAPerformanceObligation.RAPerfOblgnDistinctType = 'D' // Distinct
and RAPerformanceObligation.PerfOblgnIsSoftDeleted is initial