CDS-View Abschlagsplan

Kopiervorlage: die künftigen Abschlagsraten als OData-Service, damit sie in Bilendo als offene Posten stehen.

Warum ein eigener View

Die Raten eines Abschlagsplans stehen in FI-CA als statistische Posten (Abschlagsanforderung, DFKKOP.STAKZ) und werden von der Standard-API des FI-CA-Belegs zwar geliefert, aber im Mapping als „keine Forderung" ausgeschlossen. Für das Utilities-Paket gibt es keine freigegebene API, die die Raten mit Plan, Zyklus und Periode verbindet. Der View unten liefert genau diese Sicht — eine Zeile je Rate — und wird als OData-V4-Service freigegeben, den der Datenhandler wie die sechs Standard-Services liest.

Drei Annahmen sind im QA-System des Kunden zu prüfen, bevor der View transportiert wird: (1) der Wert von STAKZ für die Abschlagsanforderung (Standard: 'G'), (2) dass EABP.OPBEL die Belegnummer der Abschlagsanforderung in DFKKOP ist, (3) dass DFKKOP.VTREF den Versorgungsvertrag trägt.

1 · Interface-View

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Bilendo: Abschlagsraten (Budget Billing Instalments)'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType: {
  serviceQuality: #X,
  sizeCategory: #L,
  dataClass: #TRANSACTIONAL
}
define view entity ZI_BILENDO_BBP_INSTALLMENT
  as select from dfkkop as Item
    inner join   eabp   as Plan on Plan.opbel = Item.opbel
{
  key Item.opbel                         as DocumentNumber,
  key Item.opupw                         as RepetitionItemNumber,
  key Item.opupk                         as ItemNumber,
  key Item.opupz                         as SubItemNumber,

      Item.bukrs                         as CompanyCode,
      Item.gpart                         as BusinessPartner,
      Item.vkont                         as ContractAccount,
      Item.vtref                         as Contract,
      Item.spart                         as Division,

      Plan.abszyk                        as BudgetBillingCycle,
      Plan.begperiode                    as PeriodStartDate,
      Plan.endperiode                    as PeriodEndDate,
      Plan.ercHzbelnr                    as BillingDocument,

      Item.faedn                         as DueDate,
      Item.budat                         as PostingDate,
      Item.bldat                         as DocumentDate,

      @Semantics.amount.currencyCode: 'Currency'
      Item.betrw                         as Amount,
      @Semantics.currencyCode: true
      Item.waers                         as Currency,

      Item.hvorg                         as MainTransaction,
      Item.tvorg                         as SubTransaction,
      Item.stakz                         as StatisticalItemCode,

      Item.augst                         as ClearingStatus,
      Item.augdt                         as ClearingDate,
      Item.augbl                         as ClearingDocument,
      Item.augrd                         as ClearingReason,

      Item.mansp                         as DunningLockReason,
      Item.studt                         as DeferralDate,

      cast( 'ABSCHLAG' as abap.char( 8 ) ) as ExternalDocumentType
}
where
  Item.stakz = 'G'   // Abschlagsanforderung (statistischer Posten) — Wert im QA-System pruefen

Hinweis: Plan.ercHzbelnr heißt in der Tabelle ERCHZBELNR (Abrechnungsbeleg, der dem Plan zugrunde liegt) — Schreibweise im ABAP Dictionary des Systems übernehmen. Ist die Tabelle in Ihrem Release als Released View I_... verfügbar, ist der View auf diesen zu setzen; für On-Premise ist der Direktzugriff auf DFKKOP/EABP der Regelfall.

2 · Consumption-View

@EndUserText.label: 'Bilendo: Abschlagsraten (API)'
@AccessControl.authorizationCheck: #CHECK
@Metadata.allowExtensions: true
@ObjectModel.semanticKey: [ 'DocumentNumber', 'RepetitionItemNumber', 'ItemNumber', 'SubItemNumber' ]
define view entity ZC_BILENDO_BBP_INSTALLMENT
  as select from ZI_BILENDO_BBP_INSTALLMENT
{
  key DocumentNumber,
  key RepetitionItemNumber,
  key ItemNumber,
  key SubItemNumber,
      CompanyCode,
      BusinessPartner,
      ContractAccount,
      Contract,
      Division,
      BudgetBillingCycle,
      PeriodStartDate,
      PeriodEndDate,
      BillingDocument,
      DueDate,
      PostingDate,
      DocumentDate,
      @Semantics.amount.currencyCode: 'Currency'
      Amount,
      Currency,
      MainTransaction,
      SubTransaction,
      StatisticalItemCode,
      ClearingStatus,
      ClearingDate,
      ClearingDocument,
      ClearingReason,
      DunningLockReason,
      DeferralDate,
      ExternalDocumentType
}

3 · Service-Definition und Service-Binding

@EndUserText.label: 'Bilendo: Abschlagsraten'
define service ZSD_BILENDO_BBP_INSTALLMENT {
  expose ZC_BILENDO_BBP_INSTALLMENT as BudgetBillingInstalment;
}

Service-Binding in ADT anlegen: ZAPI_BILENDO_BBP_INSTALLMENT_O4, Binding-Typ OData V4 – Web API, Service-Definition ZSD_BILENDO_BBP_INSTALLMENT; dann Publish. Der Service-Pfad lautet danach /sap/opu/odata4/sap/zapi_bilendo_bbp_installment_o4/srvd_a2x/sap/zsd_bilendo_bbp_installment/0001/. Ein API-Management-Proxy wird darauf wie auf die Standard-Services gelegt.

4 · Zugriffskontrolle (DCL)

@EndUserText.label: 'Bilendo: Abschlagsraten - Buchungskreis'
@MappingRole: true
define role ZI_BILENDO_BBP_INSTALLMENT {
  grant select on ZI_BILENDO_BBP_INSTALLMENT
    where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

5 · Wie der Datenhandler den View liest

FrageAntwort
Delta-AnkerPostingDate für neue Raten; ClearingDate für Raten, die fällig wurden und in einen echten Posten übergegangen sind. DFKKOP hat keinen Änderungsstempel — dieselbe Regel wie beim FI-CA-Beleg.
MappingDocumentNumberreceipt_number · ItemNumber-Kette → external_position · Contracterp_reference · ContractAccountimported_customer_number · DueDatedue_date · Amount/Currency · ExternalDocumentTypeexternal_doctype = ABSCHLAG · Divisionexternal_sales_unit
Übergang zur echten ForderungWird die Rate fällig gebucht, entsteht ein nicht-statistischer Posten mit eigener Belegnummer; der Plan-Posten kommt mit delete_indicator (ClearingStatus gesetzt), der echte Posten neu. Korrelation: Vertragskonto + Fälligkeit + Betrag.
Nicht mahnbar bis FälligkeitDie Bilendo-Belegart ABSCHLAG ist in der Mahnstrategie so konfiguriert, dass vor due_date nichts geschieht.