53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

101
DAART Software Design Specification Doc. ID.: DD-SYD-013- 2.0 DAART Software Design Specification Author: Signature / Date: Ravi Pasupuleti Approval: Signature / Date: DD-SYD-013-2.0 Page: 1 / 101 document.doc Last printed 9/10/2010 4:36 PM

Upload: homeworkping2

Post on 15-Jan-2017

129 views

Category:

Education


1 download

TRANSCRIPT

Page 1: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DAART

Software Design Specification

Author: Signature / Date:

Ravi Pasupuleti

Approval: Signature / Date:

DD-SYD-013-2.0 Page: 1 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 2: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Document history:

Version Date Author Comments

1.0 31-Aug-2010 Ravi Pasupuleti Initial Version

1.5 21-Oct-2010 Ravi Pasupuleti Updated – Contract Cube and SAP Staging Cube

1.6 1-Nov-2010 Ravi Pasupuleti Updated – Archive Cube

1.7 18-Nov-2010 Ravi Pasupuleti Updated - Final

DD-SYD-013-2.0 Page: 2 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 3: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Table of Contents

1 INTRODUCTION...........................................................................................................51 PURPOSE...................................................................................................................52 DESIGN OVERVIEW.......................................................................................................53 INPUT CUBE - APPLICATION / SYSTEM SOFTWARE DESIGN SPECIFICATION...................................7

3.1 INPUT DATA............................................................................................................73.2 INPUT CUBE............................................................................................................83.3 DIMENSIONS........................................................................................................83.3.1 Therapeutic Area..........................................................................................83.3.2 Measures...................................................................................................8

3.3.2.1 The following fields are the Hidden fields that are used in the Input Cube Rules 13

3.3.3 System ID.................................................................................................173.3.3.1 Process to build System IDs Dynamically.............................................................17

3.4 DATA LOAD – INPUT CUBE....................................................................................204 CONTRACT CUBE - APPLICATION / SYSTEM SOFTWARE DESIGN SPECIFICATION.. .21

4.1 DIMENSIONS......................................................................................................214.1.1 TA..........................................................................................................214.1.2 Type......................................................................................................214.1.3 Compound.............................................................................................224.1.4 Project...................................................................................................224.1.5 TM1 ContractID......................................................................................224.1.6 Measure_Contract..................................................................................26

4.1.6.1 Measure Elements.....................................................................................264.1.6.2 Hidden Fields.............................................................................................53

4.2 DATA LOAD.......................................................................................................644.3 LOOKUP CUBES..................................................................................................664.3.1 Contract_Cube_PastData_Monthly.........................................................664.3.2 Contract_Cube_PastData_Yearly............................................................67

5 SAP STAGING CUBE...............................................................................................675.1 SAP STAGING DATA............................................................................................675.2 DIMENSIONS...................................................................................................675.2.1 PONumber.............................................................................................685.2.2 PostDate................................................................................................685.3 DATA LOAD.......................................................................................................68

DD-SYD-013-2.0 Page: 3 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 4: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

6 GL ACCOUNT LOOKUP CUBE.................................................................................706.1 GL ACCOUNT DATA............................................................................................706.2 DIMENSIONS......................................................................................................706.2.1 Ariba GL Account...................................................................................706.2.2 Invoice GL Account................................................................................706.3 DATA LOAD.......................................................................................................70

7 ARCHIVE CUBE......................................................................................................707.1 ARCHIVE CUBE DATA...........................................................................................717.2 DIMENSIONS......................................................................................................717.2.1 TM1 ContractID Archive.........................................................................717.3 Data Load.......................................................................................................72

DD-SYD-013-2.0 Page: 4 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 5: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

1 Introduction

1 PurposeThis document is a Software Design Specification for project DAART (Development Accrual Automation and Reporting Tool). DAART will be used by the Novartis Oncology and General Medicine Development Finance groups for managing their Accrual Generation and Reporting process

2 Design Overview

The above diagram shows the detailed flow of data through the TM1 interface of the DAART Application.

The following is the detailed explanation for each individual process:

DD-SYD-013-2.0 Page: 5 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 6: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

INPUT CUBE:

The user interface for the Input cube will be in an excel template

There will be 2 data sources for the INPUT CUBE – ARIBA and Manual Data Entry

Ariba will ftp the data file in a .csv format to a shared server on a daily basis.

This data will be loaded in the TM1 Input Cube through a Turbo Integrator Process.

An INPUT TEMPLATE is created where this Ariba data can be edited and also new manual records can be entered to the Input cube. User will have the option of selecting an action from a drop down box that can be performed on each of the records - Hold/Process/Delete.

CONTRACT CUBE:

Data is loaded in the in the Contract Cube from the input cube once the user clicks the submit button. This is achieved by using Active forms in the Excel template which runs a Turbo integrator process to load the data as per the user’s requirement.

User also has a provision to delete the Manual Records from the Contract cube and Input Cube. This delete action is performed while loading the data to the Contract Cube. A set of TI processes are run to achieve all the desired results.

The Contract Cube has two sources of data – 1) Data from the Input Cube based on the user submission.2) Data from SAP –SAP sends the invoice data at a lower granularity (Document ID, Year,

Comp Code) than PO. This data will be fed to the Contract cube through the Staging Cube

STAGING CUBE:

SAP will send Month to date invoice data in .csv format on a daily basis . This data needs to be aggregated before it is loaded in the Contract Cube. The Staging cube will maintain all the historical transactions at any given time and will never be truncated.

The staging cube will hold this data and aggregate the cash pay outs at the PO level.

ARCHIVE CUBE:

The archive Cube facilitates audit trail by storing every change / record processed from Input Cube to Contract Cube.

DD-SYD-013-2.0 Page: 6 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 7: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Any new record that is processed from Input Cube to Contract Cube triggers for immediate update of the Archive Cube with the changes. The entire Contract with a new timestamp is archived.

GL ACCOUNT LOOKUP CUBE:

The source file has the mapping between Ariba GL Account and Invoice GL Account. This mapping is maintained by the Application Power users/business users.

The mapping between Ariba GL Account and Invoice GL Account is populated in the GL Account Cube, and is used to assign the Invoice GL Accounts automatically to the records in the Input Cube.

3 INPUT CUBE - Application / System Software Design Specification

3.1 Input DataInput File Location: __________________________________________

File name: AccrualsAriba.csv

The file containing the following data fields from Ariba is ‘FTPed’ to the shared path.

1 PONumber2 RequisitionNumber3 CreateDate4 SubmitDate5 ApprovedDate6 Status7 Organization8 TherapeuticArea9 ContractStartDate10 ContractEndDate11 AmendmentStartDate12 AmendmentEndDate13 Requisitionamount14 AmendmentAmount15 AmendmentNumber16 TAMedicalContact

DD-SYD-013-2.0 Page: 7 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 8: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

17 ContractManager18 Services19 SupplierName20 SupplierID21 Costcenter22 GLAccount23 Project

3.2 Input Cube Source – Ariba Source file and Manual inputUser Interface – Excel Template

3.3 DimensionsThe following are the Dimensions for the Input Cube

1. Therapeutic Area2. Measures3. System ID

3.3.1 Therapeutic Area This dimension has two elements: Oncology and Non Oncology

3.3.2 MeasuresThe following elements are a part of the Measures Dimension

S No Element Name Type Description1 TM1 Contract ID S ‘TM1 Contract ID’ is equal to ‘PO Number’ if exists else equal to ‘Requisition

Number’ else equal to ‘System ID’. Since system id is not generated until the data is manually input, we have to opt for a Rule instead of defining the formula for the variable.

In order to implement the above logic the following RULE is written in the Rules editor

['Oncology','TM1 Contract ID']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TA')@='Oncology',IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number')@<>'',

'PO'|DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number'),

IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number')@<>'',

DD-SYD-013-2.0 Page: 8 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 9: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

S No Element Name Type Description'RE'|SubSt(DB('INPUT CUBE',!SystemID,!

TherapeuticArea,'Requisition Number'),1,IF(SCAN('-',DB('INPUT CUBE',!SystemID,!

TherapeuticArea,'Requisition Number'))=0,Long(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition

Number')),SCAN('-',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition

Number'))-1)),'MA'| DIMNM('Systemid',DIMIX('Systemid',!Systemid)))),continue);

['Nononcology','TM1 Contract ID']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TA')@='nononcology',IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number')@<>'',

'PO'|DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number'),

IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number')@<>'',

'RE'|SubSt(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'),1,

IF(SCAN('-',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'))=0,

Long(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number')),

SCAN('-',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'))-1)),

'MA'| DIMNM('Systemid',DIMIX('Systemid',!Systemid)))),continue);2 Compound S 3 digit code after applying a substring to Ariba Project field. The 3 characters from

the 3rd digit onwards.In order to implement the above logic the following rule is written in the TI Process.vCompound=SUBST(Project,3,3);

3 Purchase Order Number

S PO Number is directly taken from the Ariba feed. But if Purchase order number does not exists for the record, then the PO number of Core contract from the Contract cube will be copied

The following rule is applied to get the PO number.

['Purchase Order Number']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_Ariba')@='' & DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_Copy')@<>'',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_Copy'),CONTINUE);

4 Old PO # S User Input (if required)5 Requisition Number S Ariba Feed6 Contract Type S User Input (Picklist – Core, Amendment, Adjustment)

If Amendment Number is blank, it is Core else Amendment.

DD-SYD-013-2.0 Page: 9 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 10: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

S No Element Name Type DescriptionUser can change the value using the Dropdown

7 Cost Center S Ariba Feed8 Ariba GL Account S Ariba Feed10 Vendor Name S Ariba Feed11 Vendor Number S Ariba Feed12 Therapeutic Area S Ariba Feed

User can also select the value from dropdown13 Project S The third digit from the Ariba Project field (after D-) to the ‘/’

In order to implement the above logic the following rule is written in the TI Process.vProject=SUBST(Project,3,Long(project)-(Long(Project)-Long(SUBST(Project,1,SCAN('/',Project))))-3);

14 Type S User Input (Picklist – CRO,IVRS,LAB,HEOR,Post-Poc)15 Study S Last digits after the ‘/’of the Project ID from Ariba

vStudy=SUBST(Project,SCAN('/',Project)+1,Long(project)-Long(SUBST(Project,1,SCAN('/',Project))));

16 Function/Services S Ariba Feed17 Contract Start Date S Format conversion to mm/dd/yyyy from YYYYMMDD

In order to implement the above logic the following rule is written in the TI ProcessIf(ContractStartDate@<>'');vContractStartDate=SUBST(ContractStartDate,5,2)|'/'|SUBST(ContractStartDate,7,2)|'/'|SUBST(ContractStartDate,1,4);endif;

18 Contract End Date S Format conversion to mm/dd/yyyy from YYYYMMDDIn order to implement the above logic the following rule is written in the TI ProcessIf(ContractEndDate@<>'');vContractEndDate=SUBSt(ContractEndDate,5,2)|'/'|SUBST(ContractEndDate,7,2)|'/'|SUBST(ContractEndDate,1,4);endif;

19 Amendment Start Date

S Format conversion to mm/dd/yyyy from YYYYMMDDIn order to implement the above logic the following rule is written in the TI ProcessIF(AmendmentStartDate@<>'' );vAmendmentStartDate=SUBST(AmendmentStartDate,5,2)|'/'|SUBST(AmendmentStartDate,7,2)|'/'|SUBST(AmendmentStartDate,1,4);else;vAmendmentStartDate='';endif;

20 Amendment End Date S Format conversion to mm/dd/yyyy from YYYYMMDDIn order to implement the above logic the following rule is written in the TI ProcessIF(AmendmentEndDate@<>'');vAmendmentEndDate=SUBST(AmendmentEndDate,5,2)|'/'|SUBST(AmendmentEndDate,7,2)|'/'|SUBST(AmendmentEndDate,1,4);else;

DD-SYD-013-2.0 Page: 10 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 11: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

S No Element Name Type DescriptionvAmendmentEndDate='';endif;

21 Amendment Number S Ariba Feed22 Contract Amount N Ariba Feed (Requisition Amount)23 Amendment Amount N Ariba Feed24 TA/Medical Contact S Ariba Feed25 Contract Manager S Ariba Feed26 Ariba Status S Ariba Feed27 WBS S Ariba Feed - Project ID28 Initial Source S Initial Source = Ariba if the record is loaded from Ariba else Manual.

To populate this field automatically, a variable Temp Source is used in the TI process.vSourcetemp='Ariba';

The following rule is written in the Rules Editor['Source']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Sourcetemp')@= 'Ariba','Ariba', IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TM1 Contract ID')@='','','Manual'));

29 Rejected S The Rejected field is set to a ‘YES’ if any of the fields required for a record to be processed to Contract Cube is missing. The following fields are mandatory to have values for a record in the input cube if it has to be processed to Contract Cube - Contract Type, Cost center, GL Account, Vendor name, Project, Study, Contract Start Date, Contract End Date, Amendment Start Date and Amendment End Date in case of Amendments, WBS, Source, Compound, Type or Contract Cube Status is Inactive

Also Rejects for the following scenarios If the PO number for the record in INPUT Cube and CONTRACT Cube & to reject the row if both are not equalIf the Core Contract comes from Ariba without a PO NUmber and it has a PO Number in Contract Cube If the Core Contract comes from Ariba with a PO NUmber different from what it has in Contract Cube If the user tries to process 2 cores for the same PO If an Amendment comes from Ariba and the PO Number on the core contract in contract cube is different from the PO number on the amendment

In order to implement the above logic the following RULE is written in the rule editor['Rejected']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Cost Center')@=''% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Ariba GL Account')@=''

% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@=''% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Vendor Name')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project')@=''% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area')@=''

DD-SYD-013-2.0 Page: 11 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 12: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

S No Element Name Type Description% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Study')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type')@=''% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound')@=''% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Start Date')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract End Date')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'WBS')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Source')@=''

%((DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Core') & elcompn('TM1 ContractID',DB('INPUT CUBE',!SystemID,!

TherapeuticArea,'TM1 Contract ID'))>0 & elcomp('TM1 ContractID',DB('INPUT CUBE',!SystemID,!

TherapeuticArea,'TM1 Contract ID'),1) @<> DB('INPUT CUBE',!SystemID,!TherapeuticArea,'SystemIDData'))%((DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Core')%(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Adjustment')) & DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_ContractCube')@<>'' & DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_ContractCube')@<> (DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number'))

% ((DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Amendment') & (DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number')@<>DB('INPUT CUBE',!SystemID,!TherapeuticArea,'PO Number_ContractCube')) )

% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Cube Status')@='Inactive'

% DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Cube Status')@='Suspended'

% (DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Amendment') & ( DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment Start Date')@='' % DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment End Date')@='' )

% ((DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Amendment') & elcompn('TM1 ContractID',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TM1 Contract ID')) < 1),

'YES',CONTINUE);30 Contract Cube Status S The status of the Contract in the Contract Cube by using TM1 Contract ID as

reference.

The below rule is written in the Rules Editor to get the status of the Contract from the Contract Cube

['Contract Cube Status']= S:DB('Test_Contract',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'),

DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'),

DD-SYD-013-2.0 Page: 12 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 13: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

S No Element Name Type DescriptionDB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TM1 Contract ID'),'Status');

31 Action S User Input (Picklist - Process, Hold, Delete). Blank Values are treated as HOLD32 Accrual GL Account S To Calculate the Invoice GL Account, a lookup Cube GL_Account_Lookup_Cube is

created. The process is explained in the later pages

Ariba GL Account is Converted to the Invoice GL Account using the rule

['Invoice GL Account']=S:DB('GL_Account_Lookup_Cube',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Ariba GL Account'),'Invoice GL Account');

33 Old PO#1 S Legacy Feed 34 Carry Forward Legacy N Legacy Feed35 Comments S User Input

3.3.2.1 The following fields are the Hidden fields that are used in the Input Cube Rules

S No Fields Description1 ContractStartDateYYYY-MM-DD ContractStartDateYYYY-MM-DD is an intermediate field that is used

to convert the Contract Start Date given in the Input format to the TM1 Date format for calculation purposes.

['ContractStartDateYYYY-MM-DD']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Start Date')@<>'',DATES(NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Start Date'),7,4)),NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Start Date'),1,2)), NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Start Date'),4,2))), CONTINUE);

DD-SYD-013-2.0 Page: 13 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 14: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

2 ContractEndDateYYYY-MM-DD ContractEndDateYYYY-MM-DD is an intermediate field that is used to convert the Contract End Date given in the Input format to the TM1 Date format for calculation purposes.

['ContractEndDateYYYY-MM-DD']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract End Date')@<>'',DATES(NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract End Date'),7,4)),NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract End Date'),1,2)), NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract End Date'),4,2))), CONTINUE);

3 AmendmentStartDateYYYY-MM-DD AmendmentStartDateYYYY-MM-DD is an intermediate field that is used to convert the Aemendment Start Date given in the Input format to the TM1 Date format for calculation purposes.

['AmendmentStartDateYYYY-MM-DD']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment Start Date')@<>'',DATES(NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment Start Date'),7,4)),NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment Start Date'),1,2)), NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment Start Date'),4,2))), CONTINUE);

4 AmendmentEndDateYYYY-MM-DD AmendmentEndDateYYYY-MM-DD is an intermediate field that is used to convert the Amendment End Date given in the Input format to the TM1 Date format for calculation purposes.

['AmendmentEndDateYYYY-MM-DD']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment End Date')@<>'',DATES(NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment End Date'),7,4)),NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment End Date'),1,2)), NUMBR(SUBST(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Amendment End Date'),4,2))), CONTINUE);

5 PO Number_ContractCube PO Number_ContractCube is the Intermediate field that Copies the Core Contract's PO Number of Contract Cube (Based on Requisition Number) to the all row's of Input Cube's Contract

['PO Number_ContractCube']=S:IF (DB('CONTRACT CUBE',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'),

DD-SYD-013-2.0 Page: 14 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 15: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'),elcomp('TM1 ContractID',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TM1 Contract ID'),1),'Purchase Order Number')@='',DB('CONTRACT CUBE',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'),'AR'| subst(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'),1,if(scan('-',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'))=0, long(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number')),scan('-',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Requisition Number'))-1)) | '-0','Purchase Order Number'),DB('CONTRACT CUBE',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'),DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'),elcomp('TM1 ContractID',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'TM1 Contract ID'),1),'Purchase Order Number'));

6 Core PO Status Core PO Status flags the status as NO if PO number for the core in contrat cube is null and PO exists in Input cube, will assign the status as 'No'

This field is used to delete the records with NO PO number from Contract Cube when the user processes the records with PO number.

['Core PO Status']=S:IF(DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Contract Type')@='Core' &DB('CONTRACT CUBE',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'), DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'), DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'), DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'), !SystemID,'Contract Type')@='Core' &DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Purchase Order Number')@<>'' &DB('CONTRACT CUBE',DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Compound'), DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Type'),

DD-SYD-013-2.0 Page: 15 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 16: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Project'), DB('INPUT CUBE',!SystemID,!TherapeuticArea,'Therapeutic Area'), !SystemID,'Purchase Order Number')@='', 'No', CONTINUE);

Code for the derived variables in Turbo Integrator Process:

The formula for each of the variables derived in the Turbo Integrator are mentioned below

S No Variable Formula1 vCompound vCompound=SUBST(Project,3,3);2 vProject vProject=SUBST(Project,3,Long(project)-(Long(Project)-

Long(SUBST(Project,1,SCAN('/',Project))))-3);3 vStudy vStudy=SUBST(Project,SCAN('/',Project)+1,Long(project)-

Long(SUBST(Project,1,SCAN('/',Project))));4

vContractStartDate

If(CreateDate@<>'');vContractStartDate=SUBST(CreateDate,5,2)|'/'|SUBST(CreateDate,7,2)|'/'|SUBST(CreateDate,1,4);endif;

5

vAmendmentStartDate

IF(AmendmentStartDate@<>'' );vAmendmentStartDate=SUBST(AmendmentStartDate,5,2)|'/'|SUBST(AmendmentStartDate,7,2)|'/'|SUBST(AmendmentStartDate,1,4);else;vAmendmentStartDate='';endif;

6

vAmendmentEndDate

IF(AmendmentEndDate@<>'');vAmendmentEndDate=SUBST(AmendmentEndDate,5,2)|'/'|SUBST(AmendmentEndDate,7,2)|'/'|SUBST(AmendmentEndDate,1,4);endif;

7vSystemID

vsystemid=subst(RequisitionNumber,1,if(scan('-',RequisitionNumber)=0, long(RequisitionNumber),scan('-',RequisitionNumber)-1) )|'-'|IF(AmendmentNumber@='','0',AmendmentNumber);

8

vTA

IF(TherapeuticArea@='ONC');vTA='Oncology';else;vTA='NonOncology';endif;

9 vContractAmount vContractAmount=Requisitionamount;10

vContractEndDate

If(SubmitDate@<>'');vContractEndDate=SUBSt(SubmitDate,5,2)|'/'|SUBST(SubmitDate,7,2)|'/'|SUBST(SubmitDate,1,4);endif;

11 vWBS vWBS=Project;12 SystemIDData vSystemIDData=vSystemID;

DD-SYD-013-2.0 Page: 16 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 17: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

3.3.3 System IDThis dimension is invisible to the user in the Input Cube Template. The additional dimension is created to have a unique record id for each of the records that exist in the Input cube (Ariba and Manual Data Entry)

1) It is a unique id for each of the records that exist in the DAART system. It is important to have a unique record id because the records coming from ARIBA may not have a PO and Manual records may not have both PO and Requisition Id.

2) System ids are generated dynamically so that they are updated into the cube every time the user loads the data from the Ariba or Manually Input records.

3.3.3.1 Process to build System IDs DynamicallySystemID for Ariba records

For Ariba records, system ID is the concatenation of the ‘AR ’, Requisition number (without version) and Amendment No# . This creates a unique ID for each of the record in the input cube which is later moved to the contract cube (System Id uniquely identifies Core Contract / Amendments). To implement this functionality a new variable ‘vsystemid’ is created with the following formula.

vsystemid='AR'|subst(RequisitionNumber,1,if(scan('',RequisitionNumber)=0,long(RequisitionNumber),scan('-',RequisitionNumber)-1) )|'-'|IF(AmendmentNumber@='','0',AmendmentNumber);

SystemID for Manually Entered Records

1. Add new SystemID For Manual entry, the user has a provision to add a record by just clicking a button on the Template. The user clicks on the ‘Add New Record’ button. The TI process adds one system id to the SystemID dimension and the input cube then automatically re-calculates the template so that the new system id is available for the user to manually enter the record.

In order to implement this functionality, a subset ManualSysID_subset is created on the dimension using below MDX query in the Expression Window of the Subset Editor to filter for all the Manual records.

except({TM1SUBSETALL( [systemid] ) } , {TM1FILTERBYPATTERN( {TM1FILTERBYLEVEL( {TM1SUBSETALL( [systemid] ) } , 0 )} , "AR*")})

DD-SYD-013-2.0 Page: 17 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 18: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

A TI processes is run to create (later recreate) dimension by name Manual_SysID to load the manually created SystemID’s. This dimension is used to separate the system ids for Manual records from all the system ids and to retrieve the last used manual SystemId , so that new SystemIDs can be generated incrementally from here.

TI process – To_Create_SystemID_Dim is a parameterized dimension that is run to run to update the SystemID with the new Record for Manual Entry. In order to implement this functionality, the following script is written in the Metadata tab of the Process.

This initially executes the Process To_Create_Manual_SysID_Dim checks the dimension size of the Manual SystemID and adds an element to it.

Prolog tab of To_Create_SystemID_Dim

ExecuteProcess('To_Create_ManualSysID_Dim');

vsystemid=DIMNM('ManualSysID',DIMSIZ('ManualSysID'));index=stringtonumber(vSystemID);dimensionelementinsert('ManualSysID','',numbertostring(index+1),'s');dimensionelementinsert('Systemid','',numbertostring(index+1),'s');

2. Assigning System ID to respective TA Groups

The field TA in the Measure_Input Dimension is loaded with the values Oncology and NonOncology for Oncology and NonOncology records respectively so as to filter the Systemids in the corresponding views. To implement this functionality, the following script is written in the epilog tab of the TI Process

Epilog tab of To_Create_SystemID_Dim

CellPutS(pTA,'INPUT CUBE',numbertostring(index+1),pTA,'TA');CellPutS(numbertostring(index+1),'INPUT CUBE',numbertostring(index+1),pTA,'SystemIDData');

3. Creating subsets on System id

Oncology and NonOncology subsets are created on the SystemID dimension using below MDX query to filter the records based on the Therapeutic Area in the Expression window of subset

DD-SYD-013-2.0 Page: 18 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 19: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

editor to use in the cube views based on TA’s. A sort is also applied so that the Ariba records are always on the top and the manual records are at the bottom.

Filter Condition for Oncology Subset used in Oncology View (Oncology_View_Subset)

{UNION(FILTER( {TM1FILTERBYLEVEL( {TM1SUBSETALL( [SystemId] )}, 0)}, ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[TA])='Oncology') AND ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[Source])='Ariba'))

,

FILTER( {TM1FILTERBYLEVEL( {TM1SUBSETALL( [SystemId] )}, 0)}, ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[TA])='Oncology') AND ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[Source])='Manual')))}

Filter Condition for NonOncology Subset used in NonOncology view (NonOncology_View_Subset)

{UNION(FILTER( {TM1FILTERBYLEVEL( {TM1SUBSETALL( [SystemId] )}, 0)}, ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[TA])='NonOncology') AND ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[Source])='Ariba'))

,

FILTER( {TM1FILTERBYLEVEL( {TM1SUBSETALL( [SystemId] )}, 0)}, ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[TA])='NonOncology') AND ([INPUT CUBE].([TherapeuticArea].currentmember.nextmember,[Measure_Input].[Source])='Manual')))}

DD-SYD-013-2.0 Page: 19 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 20: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

3.4 Data Load – Input CubeThe TI process ‘To_Load_INPUT_CUBE_from_Ariba’ loads the data into the input cube from ‘AribaAccruals.csv’ as the source.

The SUBMIT button on the Input Template triggers the following

All the Ariba records except the ones with HOLD/Blank in Action button move to the contract cube and are removed from the Input Cube

Any record Ariba/Manual, which has a value missing in atleast one of the required fields in the Contract Cube is not processed and retained in Input cube with Rejected status.

Any Amendment record that does not have a core contract in the Contract Cube will also be retained in the Input Cube with Rejected status of Yes.

The Ariba records with HOLD or Blank in the action status just remain in the Input Cube until the status is selected as PROCESS

The Manual records with PROCESS action are copied to the Contract Cube and retained in the Input Cube as well.

If there no Core in the Contract Cube and an amendment is inserted in the Input Cube, the Rejected flag is updated to Yes and the record is not copied to the Contract Cube

If there is an Incorrect PO to the Amendment (different to that of the Core in the Contract Cube) then the status would be Rejected.

If there is a Core Contract with PO number in the Input Cube but No PO associated in the Contract Cube, the new record is updated in the Contract Cube deleting the existing Core Contract from the Contract Cube

4 CONTRACT CUBE - Application / System Software Design Specification

Source – Input Cube and SAP Staging CubeInterface – TM1 Web

4.1 DimensionsThe following are the dimensions present in the Contract Cube

1. TA2. Type3. TM1 ContractID 4. Compound5. Project6. Measure_Contract

4.1.1 TADD-SYD-013-2.0 Page: 20 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 21: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

TA dimension is a manually created dimension that has the set of following static values.

1. CVM2. ED3. HE&OR4. IID5. M&S6. MP7. NONE8. NSO9. RESP10. SP&A11. TS12. ONCO

4.1.2 TypeType dimension is a manually created dimension that has the set of following static values.

1. CRO2. IVRS3. LAB4. HEOR5. Post-Poc

4.1.3 CompoundProcess : To_Create_Compound_Project_Dim

Compound is a dynamically generated dimension that is created by using the TI process.

This Process uses the data values in the Input Cube from the Compound Element in the Input_Measure dimension and converts them into elements of the Compound Dimension.

4.1.4 ProjectProcess : To_Create_Compound_Project_Dim

Project is a dynamically generated dimension that is created by using the TI process.

This Process uses the data values in the Input Cube from the Project Element in the Input_Measure dimension and converts them into elements of the Project Dimension.

4.1.5 TM1 ContractID

DD-SYD-013-2.0 Page: 21 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 22: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

TM1 ContractID Dimension is a dynamically built dimension with the values of SystemID as child and TM1 ContractID as parent.

The SystemID is the hidden dimension in Input Cube TM1 ContractIDs are the values of the TM1 ContractID measure from the Measure_Input

of the Input Cube

Building the TM1 ContractID HierarchyProcess: To_Create_TM1ContractID_ Dim

This process is a parameter driven process and is triggered by clicking the SUBMIT button in the Input Template. Depending on the template that is submitted, this process is triggered with the parameter value as Oncology or NonOncology.

Dimension order is important as all further calculations are based on the index of each of the elements of the TM1 ContractID Dimension.

Since the TM1 ContractID data values are converted to Consolidation elements with SystemID as children, a looping procedure as mentioned below is written to capture the data and build the elements with hierarchy.

Records that have Delete as the Action will have the respective system ids deleted from SystemID and TM1 ContractID dimensions. The records would not exist in both the cubes.

a) Ariba Records that have Process as the Action will be deleted from the INPUT CUBE once processed to the CONTRACT CUBEb) Manual Records that have Process as the Action will be just processed to the CONTRACT CUBE

The following code is written in the Prolog to build the TM1 Contract ID Hierarchy.

Prolog tab of To_Create_TM1ContractID_ Dim

DimensionSortOrder ('TM1 ContractID', 'ByInput','', 'ByHierarchy','');

## Building the TM1 ContractID Dim with hierarchy getting the SystemID from Elements and TM1 ContractID from Data values##

v_index = 1;v_dimcount = DIMSIZ('SystemId');while (v_index <= v_dimcount);v_syselement = dimnm('SystemId',v_index);

DD-SYD-013-2.0 Page: 22 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 23: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

v_TM1_Contract_Id = cellgets('INPUT CUBE', v_syselement , pTA, 'TM1 Contract ID');v_PO=cellgets('INPUT CUBE', v_syselement , pTA, 'Purchase Order Number');v_Rejected= cellgets('INPUT CUBE',v_syselement , pTA, 'Rejected');v_Action= cellgets('INPUT CUBE',v_syselement , pTA, 'Action');v_TA= cellgets('INPUT CUBE',v_syselement , pTA, 'TA');v_source= cellgets('INPUT CUBE',v_syselement , pTA, 'Source');

v_TherapeuticArea= cellgets('INPUT CUBE',v_syselement , pTA, 'Therapeutic Area');v_Type = cellgets('INPUT CUBE', v_syselement , pTA, 'Type');v_Compound= cellgets('INPUT CUBE', v_syselement , pTA, 'Compound');v_Project= cellgets('INPUT CUBE', v_syselement , pTA,'Project');v_Contract_Type=cellgets('INPUT CUBE', v_syselement , pTA,'Contract Type');

## Deletes the SystemID from the dimension if Action is DELETE ###

if (v_Action@='Delete' & v_TA@=pTA & v_source@='Manual');if((DIMIX('TM1 Contract ID',v_syselement) > 0 & v_Rejected@<>'Yes') % DIMIX('TM1 Contract ID',v_syselement) = 0 );dimensionelementdelete('SystemId',v_syselement);endif;v_dimcount = DIMSIZ('SystemId');v_index =v_index -1;if (DIMIX('TM1 Contract ID',v_syselement) > 0 & v_Rejected@<>'Yes');v_TM1_Contract_ID_Contract_Cube=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_syselement,'TM1 Contract ID');

##asciioutput('\\Phuseh-s9669\tm1\AccrualAutomation\inbound\hi.txt',v_Compound,v_Type,v_Project,v_TherapeuticArea);

ExecuteProcess ('To_Load_Archive_Cube','p_contractid',v_TM1_Contract_ID_Contract_Cube,'pTA',pTA,'v_Compound',v_Compound,'v_Type',v_Type,'v_Project',v_Project,'v_TherapeuticArea',v_TherapeuticArea);

dimensionelementdelete('TM1 Contract ID',v_syselement);endif;endif;

## Processes the records that have the Action as PROCESS###

if (v_Rejected @<> 'YES' & v_TA@=pTA & v_Action @= 'Process');

DD-SYD-013-2.0 Page: 23 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 24: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

## The values captured below are used to move the core contract to a new PO ####if the contract has been approved and now comes with a PO which was null before ##

v_TM1_Contract_ID_Contract_Cube='Not Found';if(dimix('TM1 ContractID',v_syselement)>0);v_TM1_Contract_ID_Contract_Cube=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_syselement,'TM1 Contract ID');v_TM1_PO_Contract_Cube=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_syselement,'Purchase Order Number');v_records=elcompn('TM1 ContractID',v_TM1_Contract_ID_Contract_Cube);endif;

dimensionelementinsert('TM1 ContractID','',v_syselement,'n');dimensionelementinsert('TM1 ContractID','',v_TM1_Contract_Id,'c');DimensionElementComponentAdd('TM1 ContractID', v_TM1_Contract_Id,v_syselement,1);

## Code to move the contract to new PO if the contract has been approved and now comes with a PO which was null before##

if(v_Contract_Type@='Core' & v_TM1_PO_Contract_Cube@='' & v_PO@<>'');

index2=1;

while(index2<=v_records);

v_old_syselement=elcomp('TM1 ContractID',v_TM1_Contract_ID_Contract_Cube,index2);DimensionElementComponentAdd('TM1 ContractID', v_TM1_Contract_Id,v_old_syselement,1);index2=index2+1;end;index2=1;

while(index2<=v_records);v_old_syselement=elcomp('TM1 ContractID',v_TM1_Contract_ID_Contract_Cube,index2);CellputS(v_PO ,'CONTRACT CUBE', v_Compound , v_Type , v_Project, v_TherapeuticArea ,v_old_syselement ,'Purchase Order Number');

DimensionElementComponentDelete('TM1 ContractID', v_TM1_Contract_ID_Contract_Cube,v_old_syselement);v_records=elcompn('TM1 ContractID',v_TM1_Contract_ID_Contract_Cube);

DD-SYD-013-2.0 Page: 24 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 25: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

end;if (dimix('TM1 ContractID',v_TM1_Contract_ID_Contract_Cube)>0);dimensionelementdelete('TM1 Contract ID',v_TM1_Contract_ID_Contract_Cube);endif;endif;

## END OF Code to move the contract to new PO if the contract has been approved and now comes with a PO which was null before##

endif;

v_index=v_index+1;

end;

The TM1 ContractID is generated once this process is executed until this code. The following code is written under Epilog to Trigger processes to create the Compound and Project dimensions, Load the Contract cube and then Delete the Processed Ariba records from Input Cube.

Epilog tab of To_Create_TM1ContractID_ Dim

## Run the Process to create the Compound and Project Dimension##ExecuteProcess ('To_Create_Compound_Project_Dim');

## Loads the Contract Cube based on the parameter pTA ##ExecuteProcess ('To_Load_CONTRACT_CUBE_from_INPUT_CUBE','pTA',pTA’);

## Deletes the Processed Ariba records from Input Cube##ExecuteProcess ('To_Delete_Processed_Records_from_INPUT_CUBE');

Process: To_Load_CONTRACT_CUBE_from_INPUT_CUBE

This process is explained under the data loading process.

Process: To_Delete_Processed_Records_from_INPUT_CUBE

The process deletes the processed ARIBA records from the Input Cube.

DD-SYD-013-2.0 Page: 25 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 26: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

The process is run AFTER excuting the process -To_Load_CONTRACT_CUBE_from_INPUT_CUBE so that the elements could be deleted only after the data is loaded to the CONTRACT CUBE

4.1.6 Measure_Contract

4.1.6.1 Measure Elements

The following fields are taken as the measure elements for the Contract Cube. The Rules and logic implemented are detailed in the table given below.

A few hidden fields are created to attain the logic and calculations. The explanation and rules for these hidden elements are mentioned in the next table.

S No

Contract Cube Measures Comments

1 Purchase Order Number Loaded from the Input Cube2 Old PO# Loaded from the Input Cube3 Requisition Number Loaded from the Input Cube4 Compound Loaded from the Input Cube5 Project Loaded from the Input Cube6 Study Loaded from the Input Cube7 WBS Loaded from the Input Cube8 Contract Type Loaded from the Input Cube9 Cost Center Loaded from the Input Cube

10 Ariba GL Account Loaded from the Input Cube11 Vendor Name Loaded from the Input Cube12 Vendor Id Loaded from the Input Cube13 Contract Start Date Loaded from the Input Cube14 Contract End Date Loaded from the Input Cube15 Amendment Start Date Loaded from the Input Cube16 Amendment End Date Loaded from the Input Cube17 Amendment Number Loaded from the Input Cube18 Contract Amount Loaded from the Input Cube19 Amendment Amount Loaded from the Input Cube

DD-SYD-013-2.0 Page: 26 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 27: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

20 Cost/Month Cost/Month is calculated by Total Contract Value/Contract Months of the Record.Total Contract value (defined later) is the sum of the Contract Amount at the start of the Contract and Carry Forward Amount from the previous contract if exists.Contract months is the total duration of the contract defined at the start of the contract

The following rule is applied

['Cost/Month']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Total Contract value')/DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Months'),CONTINUE);

21 Carry Forward Amount Carry Forward Amount is defined as the remaining amount that is carried to the next amendment.If the Amendment starts in a future date, Carry Forward Amount = 0

Remaining Amount is the Intermediate field that is used in the Calculation of Carry Forward Amount. Remaining Amount is the amount that is remaining at that time.

['Carry Forward Amount']=N:IF(DAYNO(TODAY(1))<DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD')),0,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DIMNM('TM1 ContractID',(DIMIX('TM1 ContractID',!TM1 ContractID))-1),'Remaining Amount'),0)); C:0;

22 Total Contract value Total Contract Value is the sum of the Contract Amount and the Carry Forward Amount.If Carry Forward Legacy exists then Contract Amount + Carry Forward Legacy else Contract Amount + Carry Forward Amount

The complexity here is to check 1) if the record is at leaf level and the contract type of the record is

Core/adjustment and next record is amendment, apply the calculation

2) if the record is at leaf level and the contract type of the record is amendment and next record is amendment, apply the calculation

3) else ignore

DD-SYD-013-2.0 Page: 27 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 28: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

['Total Contract value']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' & ISLEAF=1,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'CarryForward Legacy')<>0,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Amendment Amount')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'CarryForward Legacy'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Carry Forward Amount')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Amendment Amount'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Amount'))),CONTINUE); C:0;

23 Net Contract Amount Net Contract Amount is the total Contract Amount that is actually being spent on the Contract considering the amendments.

['Net Contract Amount']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month') * DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'), 0);

24 Type Loaded from the Input Cube

25 Functions/Services Loaded from the Input Cube

26 TA/Medical Contact Loaded from the Input Cube

27 Contract Manager Loaded from the Input Cube

28 Therapeutic Area Loaded from the Input Cube

29 Ariba Status Loaded from the Input Cu

30 Source Loaded from the Input Cube

31 Status The Status displays the following values Active – If there below three fields are empty

DD-SYD-013-2.0 Page: 28 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 29: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Inactive – if there is a date value in Inactivated Month/Year Suspended – If there is a date value in Suspended Month/Year Withdrawn – if there is a date value in Withdrawn Month/Year

32 InactivatedMonth/Year User input field in the format MM/YY

33 SuspendedMonth/year User input field in the format MM/YY

34 Contract Months Contract Months is the duration of the contract as per initial entry into the system irrespective of the amendment start and end dates. Two intermediate fields are created StartDate_ContractMonths and EndDate_ContractMonths_Calc to convert the MM/DD/YYYY format to TM1 date format YYYY-MM-DD. The conversion follows the 15 day rule.

['Contract Months']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')@<>'', ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths_Calc'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))/30), CONTINUE);

35 Elapsed Months Elapsed Months is the total number of elapsed for each record. 1) If Today’s date is greater than Contract Start Date and Contract

End Date then End Date – Start Date2) If today’s date is less than End Date then Current month – Start

Date3) If Today’s date is less than Start Date, then no calculation.

['Elapsed Months']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'', IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)) ,ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ElapsedMonths_Today'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))/30),IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) < DAYNO(TODAY(1)),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'),CONTINUE)),

DD-SYD-013-2.0 Page: 29 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 30: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

CONTINUE);36 Actual Months Actual Months is the actual number of months a contract is actually Active

based on amendments.Actual Months can be calculated by subtracting the intermediate field ContractMonths_CF from Contract Months

['Actual Months']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' & ISLEAF=1,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Months')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Months_CF'), CONTINUE);

37 Cumulative Months Cumulative Months is the actual number of months a contract is Active till date based on amendments and status.

The rule checks for the least value among Today, Inactivated Date, Contract End date and subtracts Contract Start date from it.

If Today is lesser than Contract Start Date then it is ignored. if Temp Status = NO, i.e., if contract doesn't have negative

amendment, calculate cumulative months. Else for negative amendment, if Least Date Status = YES then calculate cumulative months, else 0

EndDate_ElapsedMonths_Today is an intermediate field to apply 15 day rule to the current day.

['Cumulative Months']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' ,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Temp Status')@='No',IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')@<>'' &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')) < DAYNO(TODAY(1))) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')@<>'' &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')) < DAYNO(TODAY(1))) &

DD-SYD-013-2.0 Page: 30 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 31: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ElapsedMonths_Today'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) < DAYNO(TODAY(1)),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'),CONTINUE)))),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least Date Status')@='Yes',IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')@<>'' &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')) < DAYNO(TODAY(1))) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')@<>'' &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')) < DAYNO(TODAY(1))) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date'))

DD-SYD-013-2.0 Page: 31 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 32: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) > DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ElapsedMonths_Today'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) < DAYNO(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) < DAYNO(TODAY(1)),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'),CONTINUE)))),0)),CONTINUE);

38 Past Commitment (before 2 years) Past Commitment (before 2 years) value is the sum of all the core/amendment contracts under a contractid prior to 2 years. Cost/month * no of active months in the years

If start date < = today’s year -3 and end date <= today’s year - 3 then active months is end date – start date

If start date <= today’s year -3 and end date > today’s year - 3 then active months is End of the year – start date

If Cumulative Months = 0, then the value is 0

['Past Commitment (before 2 years)']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0, 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))<=YEAR(TODAY(1))-3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >=YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))-3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<=YEAR(TODAY(1))-3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 32 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 33: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1))-3, 12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))/30.42),0)) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

39 Past Commitment Prev Year -1 Past Commitment Prev Year -1 value is the sum of all the core/amendment contracts under a contractid prior to prev year. Cost/month * no of active months in the year

If start date year < today’s year-2 and end date year = today’s year – 2 then end date – beginning of the year

If start date year = today’s year -2 and End date year = today’s year - 2 then end date – start date

If start date year < today’s year - 2 and End date year > today’s year -2 then 12 months

If start date year = today’s year – 2 and End date year > today’s year -2 then End of the year – start date

If Cumulative Months = 0, then the value is 0

['Past Commitment Prev Year-1']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0, 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),12,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1))-2,12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))-2 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 33 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 34: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))-2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))-2 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1))-2,01,01)))\30.42), 0)))) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

40 Past Commitment Prev Year Past Commitment Prev Year value is the sum of all the core/amendment contracts under a ContractId the prev year.Cost/month * no of active months in the year

If start date year < today’s year-1 and end date year = today’s year – 1 then end date – beginning of the year

If start date year = today’s year -1 and End date year = today’s year - 1 then end date – start date

If start date year < today’s year - 1 and End date year > today’s year -1 then 12 months

If start date year = today’s year - 1and End date year > today’s year -1 then End of the year – start date

If Cumulative Months = 0, then the value is 0

['Past Commitment Prev Year']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0, 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),12,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 34 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 35: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1))-1,12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))-1 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))-1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))-1 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1))-1,01,01)))\30.42), 0)))) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

41 Current Commitment Current Commitment is the sum of all the core/amendment contracts under a ContractId the year.Cost/month * no of active months in the year

If start date year < today’s year and end date year = today’s year then today – start date

If start date year = today’s year and End date year = today’s year then end date – start date

If start date year < today’s year and End date year > today’s year then 12 months

DD-SYD-013-2.0 Page: 35 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 36: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

If start date year = today’s year and End date year > today’s year then End of the year – start date

If Cumulative Months = 0, then the value is 0

['Current Commitment']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<DAYNO(TODAY(1)), 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),12,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1)),12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1)) &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1)) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 36 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 37: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1)),01,01)))\30.42), 0)))) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

42 Future Commitment Next year Future Commitment next year is the calculation of all the commitments for the contract next year.Cost/month * no of active months in the years

If start date year < today’s year +1 and end date year > today’s year + 1 then contract months is 12

If start date year = today’s year +1 and End date year > today’s year +1 then end of the year – start date

If start date year = today’s year +1 and End date year = today’s year +1 then End date – start date

If start date year < today’s year +1 and End date year = today’s year +1 then End date – beginning of the year

If Cumulative Months = 0, then the value is 0

['Future Commitment Next year']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<DAYNO(TODAY(1)), 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),12,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1))+1,12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 37 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 38: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))+1 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))+1 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))+1 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1))+1,01,01)))\30.42), 0)))) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

43 Future Commitment Next year + 1 Future Commitment next year + 1 is the calculation of all the commitments for the contract next year + 1.Cost/month * no of active months in the years

If start date year < today’s year +2 and end date > today’s year + 2 then contract months is 12

If start date year = today’s year +2 and End date year > today’s year +2 then end of the year – start date

If start date year = today’s year +2 and End date year = today’s year +2 then End date – start date

If start date year < today’s year +2 and End date year = today’s year +2 then End date – beginning of the year

If Cumulative Months = 0, then the value is 0

['Future Commitment Next year + 1']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<DAYNO(TODAY(1)), 0,

DD-SYD-013-2.0 Page: 38 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 39: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),12,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))>YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DATES(YEAR(TODAY(1))+2,12,31))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))=YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))+2 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))+2 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))=YEAR(TODAY(1))+2 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1))+2,01,01)))\30.42),0)))) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

44 Future Commitments (beyond 2 years) Future Commitments is the calculation of all the commitments of the contract beyond 2 years.

DD-SYD-013-2.0 Page: 39 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 40: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Cost/month * no of active months in the years

If start date < today’s year +3 and end date >= today’s year + 3 then active months is end date – beginning of the year

If start date >= today’s year +3 then active months is End date – start date

If Cumulative Months = 0, then the value is 0

['Future Commitment (beyond 2 years)']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')=0 &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<DAYNO(TODAY(1)), 0,IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))>=YEAR(TODAY(1))+3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >=YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))\30.42),IF(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))<YEAR(TODAY(1))+3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >= YEAR(TODAY(1))+3 &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date')) >YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least End Date'))-DAYNO(DATES(YEAR(TODAY(1))+3,01,01)))\30.42), 0)) *DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month'));

45 Total Commitment Total Commitment is the sum of all the past, current and future commitments.

['Total Commitment']=N:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Past Commitment (before 2 years)')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Past Commitment Prev Year-1')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 40 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 41: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'Past Commitment Prev Year')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Commitment')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Future Commitment Next year')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Future Commitment Next year + 1')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Future Commitments');

46 Commitment validation Commitment validation is Valid if Total Contract Value is equal to the Total Contract value, else Not Valid Value at Consolidated level

ContractAmount_Actual is the intermediate field that gives the amount that is actually being spent on the Contract at the Consolidated level

['Commitment validation']=S: IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TempStatus')@<>'',IF(ISLEAF=0,IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Total Commitment')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractAmount_Actual'))=0,'Valid','NotValid'),''),CONTINUE);

47 Cumulative months validation Validates if the Cumulative months is less than Actual monthsValid if less else Not validValue at Consolidated Level

['Cumulative months validation']=S:IF(ISLEAF=1,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TempStatus')@<>'',IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months') >DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'), 'Not Valid', 'Valid'),CONTINUE),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,ELCOMP('TM1 ContractID',!TM1 ContractID,ELCOMPN('TM1 ContractID',!TM1 ContractID)),'Cumulative months validation'));

48 Current Period Cumulative WIP Current Period Cumulative WIP is the product of Cumulative Months and Cost/month

Value is rolled upto the Consolidated Level

['Current Period Cumulative WIP']=N:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months')*

DD-SYD-013-2.0 Page: 41 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 42: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cost/Month');

49 Prior Period Cumulative WIP Prior Period Cumulative WIP is the last month’s Current Period Cumulative WIP

The process To_Load_ContractCubePastData_Monthly runs at the end of every month and loads the cube Contract_Cube_PastData_Monthly.Prior Period Cumulative WIP = Past data Monthly cube Current Period Cumulative WIP

['Prior Period Cumulative WIP']= C:DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project, !TA,!TM1ContractID,'Current Period Cumulative WIP');

50 Current Month WIP Current Month WIP is the calculated by subtracting Prior Period Cumulative WIP from Current period Cumulative WIP

['Current Month WIP']=C:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Period Cumulative WIP')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Prior Period Cumulative WIP');

51 Prior Year-Year End Accrual Prior Year-Year End Accrual is the amount that was accrued at the end of the previous year.

In order to capture and retain the value which was at the end of the year, the lookup cube Contract_Cube_PastData_Yearly is loaded on a yearly basis through the process To_Load_ContractCubePastData_Yearly

Prior Year-Year End Accrual = LTD Accrual Current Period of the Contract_Cube_PastData_Yearly

Rule:['Prior Year-Year End Accrual']= C:DB('Contract_Cube_PastData_Yearly',!Compound,!Type, !Project,!TA,!TM1ContractID,'LTD Accrual Current Period');

52 Current Year Cash Paid Current Year Cash Paid is the Cash paid in the Current Year. This data is loaded directly from SAP Staging cube.

Data from the Lookup Cube Contract_Cube_PastData_Monthly is used in case of Inactivation as Cash Paid should not be considered for Inactivated records

To get the inactivation date, the hidden field Inactivated_DATE is used

DD-SYD-013-2.0 Page: 42 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 43: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

The rule checks If the Inactivated Year = Today’s Year & Inactivated Month <

Today’s Month then Current Year Cash paid = Lookup Cube’s Current year Cash Paid.

If the Inactivated Year < Today’s Year, then Zero If ACTIVE, then Current Year Cash Paid from SAP Staging Cube

['Current Year Cash Paid']= IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@= 'Inactive' &(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))=YEAR(TODAY(1)) &MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<MONTH(TODAY(1))),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Current Year Cash Paid'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<YEAR(TODAY(1)),0,DB('SAP STAGING CUBE',DIMNM('TM1 Contract ID', DIMIX('TM1 Contract ID', !TM1 ContractID)),'Current Year Cash Paid')));

53 Past Year (beyond 2 years) Cash Paid Past Year(beyond 2 years) Cash Paid is the amount of Cash Paid in the all the years Prior to 2 years. This data is loaded directly from SAP Staging cube.

Data from the Lookup Cube Contract_Cube_PastData_Monthly is used in case of Inactivation as Cash Paid should not be considered for Inactivated records

To get the inactivation date, the hidden field Inactivated_DATE is used

The rule checks If the Inactivated Year = Today’s Year & Inactivated Month <

Today’s Month then value = Lookup Cube’s Past Year (beyond 2 years) Cash Paid

If the Inactivated Year < Today’s Year, then Lookup Cube’s Prior Year Cash-1 Paid + Past Year (beyond 2 years) Cash Paid

If ACTIVE, then Past Year (Beyond 2 years) Cash Paid from SAP Staging Cube

['Past Year (beyond 2 years) Cash Paid']=IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))=YEAR(TODAY(1)) &

DD-SYD-013-2.0 Page: 43 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 44: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<MONTH(TODAY(1))),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Past Year (beyond 2 years) Cash Paid'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<YEAR(TODAY(1)),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Prior Year-1 Cash Paid')+DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Past Year (beyond 2 years) Cash Paid'),DB('SAP STAGING CUBE',DIMNM('TM1 Contract ID', DIMIX('TM1 Contract ID', !TM1 ContractID)),'Past Year (beyond 2 years) Cash Paid')));

54 Prior Year-1 Cash Paid Prior Year-1 Cash Paid is the amount of Cash Paid in the Previous Year -1. This data is loaded directly from SAP Staging cube.

Data from the Lookup Cube Contract_Cube_PastData_Monthly is used in case of Inactivation as Cash Paid should not be considered for Inactivated records

To get the inactivation date, the hidden field Inactivated_DATE is used

The rule checks If the Inactivated Year = Today’s Year & Inactivated Month <

Today’s Month then value = Lookup Cube’s Prior year-1 Cash Paid. If the Inactivated Year < Today’s Year, then Lookup Cube’s Prior

Year Cash Paid If ACTIVE, then Prior Year-1 Cash Paid from SAP Staging Cube

['Prior Year-1 Cash Paid']=IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))=YEAR(TODAY(1)) &MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<MONTH(TODAY(1))),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Prior Year-1 Cash Paid'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<YEAR(TODAY(1)),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Prior Year Cash Paid'),DB('SAP STAGING CUBE',DIMNM('TM1 Contract ID', DIMIX('TM1 Contract ID', !TM1 ContractID)),'Prior-1 Year Cash Paid')));

DD-SYD-013-2.0 Page: 44 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 45: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

55 Prior Year Cash Paid Prior Year Cash Paid is the amount of Cash Paid in the Previous Year.This data is loaded directly from SAP Staging cube.

Data from the Lookup Cube Contract_Cube_PastData_Monthly is used in case of Inactivation as Cash Paid should not be considered for Inactivated records

To get the inactivation date, the hidden field Inactivated_DATE is used

The rule checks If the Inactivated Year = Today’s Year & Inactivated Month <

Today’s Month then Prior Year Cash paid = Lookup Cube’s Prior year Cash Paid.

If the Inactivated Year < Today’s Year, then Lookup Cube’s Current Year Cash Paid

If ACTIVE, then Prior Year Cash Paid from SAP Staging Cube

['Prior Year Cash Paid']=IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))=YEAR(TODAY(1)) &MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<MONTH(TODAY(1))),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Prior Year Cash Paid'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' &YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<YEAR(TODAY(1)),DB('Contract_Cube_PastData_Monthly',!Compound,!Type,!Project,!TA,!TM1ContractID,'Current Year Cash Paid'),DB('SAP STAGING CUBE',DIMNM('TM1 Contract ID', DIMIX('TM1 Contract ID', !TM1 ContractID)),'Prior Year Cash Paid')));

56 Cash Paid Adjustment User Input Numeric Field at the Core Contract LevelValue rolls upto the Contract Level

57 LTD Cash Paid End of Current Period LTD Cash Paid End of Current Period is the sum of all the cash Paids until the end of this month.

The rule sums up Past Year (beyond 2 years) Cash Paid + Prior Year -1 Cash Paid + Prior Year Cash Paid + Current Year Cash Paid + Cash Paid Adjustment

['LTD Cash Paid End of Current Period']=N:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Past Year (beyond 2 years)

DD-SYD-013-2.0 Page: 45 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 46: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Cash Paid')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Prior Year Cash Paid')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Prior Year-1 Cash Paid')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Year Cash Paid')+DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cash Paid Adjustment');

58 LTD Cash Paid End of Prior Period LTD Cash Paid End of Prior Period is the total cash paid until the previous month.

The calculates the subtraction of LTD Cash Paid End of Current Period - Current Month Cash Paid

['LTD Cash Paid End of Prior Period']=N:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Cash Paid End of Current Period')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Month Cash Paid');

59 Current Month Cash Paid Current Month Cash Paid is directly pulled from the SAP Staging Cube by comparing Today’s month with the SAP month.

The rule checks If the Inactivated Year = Today’s Year & Inactivated Month <

Today’s Month then Current Month Cash paid = 0 If the Inactivated Year < Today’s Year, then Current Month Cash

Paid = 0 If ACTIVE, then Prior Year Cash Paid from SAP Staging Cube

['Current Month Cash Paid']=IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Status')@='Inactive' & ((YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))=YEAR(TODAY(1)) &MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<MONTH(TODAY(1))) %YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'))<YEAR(TODAY(1)) ), 0,DB('SAP STAGING CUBE',DIMNM('TM1 Contract ID', DIMIX('TM1 Contract ID', !TM1 ContractID)),'Current Month Cash Paid'));

60 LTD Accrual Current Period LTD Accrual Current Period is the difference between 'Current Period Cumulative WIP and Cash Paid End of Current Period.

['LTD Accrual Current Period']=C:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Period Cumulative WIP')-

DD-SYD-013-2.0 Page: 46 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 47: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Cash Paid End of Current Period');

61 LTD Accrual Prior Period LTD Accrual Prior Period is the Accrual Amount that was accrued in the last month. The process To_Load_ContractCubePastData_Monthly runs at the end of every month and loads the cube Contract_Cube_PastData_Monthly. LTC Accrual Prior period = Past data Monthly cube LTD Accrual Current Period

Rule['LTD Accrual Prior Period']= C:DB('Contract_Cube_PastData_Monthly', !Compound,!Type,!Project,!TA,!TM1ContractID,'LTD Accrual Current Period');

62 Current Month Accrual Variance Current Month Accrual Variance is the difference between LTD Accrual Current Period and LTD Accrual Prior period

['Current Month Accrual Variance']=C:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Accrual Current Period')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Accrual Prior Period')

63 Accrual > $1MM or Accrual <$(1)MM Populates a value of YES if LTD Accrual Current Period is greater than 1 MM $ else NO.

['Accrual > $1MM or Accrual <$(1)MM']=S:IF(ISLEAF=0,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TempStatus')@<>'',IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Accrual Current Period') > 1000000, 'Yes', 'No'), CONTINUE),'');

64 Balance To be Spent Balance to be Spent is the difference between ContractAmount_Actual and LTD Cash Paid End of Current Period

['Balance To be Spent']=N:0; C:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractAmount_Actual')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'LTD Cash Paid End of Current Period');

65 Remaining Months On Contract Remaining Months On Contract is the difference between Actual months and Cumulative Months

['Remaining Months On Contract']=C:DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months')-DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Cumulative Months');

DD-SYD-013-2.0 Page: 47 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 48: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

66 Accrual Months Past the End Date Accrual Months Past the End Date is the number of months elapsed after the Contract has past the end date.

The rule checks if today is greater than contract end date then month of today – contract end month

['Accrual Months Past the End Date']=N:IF((((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment' ) & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') %(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='')) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')) < DAYNO(TODAY(1)),ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ElapsedMonths_Today')) - DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')))/30.42),0);

67 Life of Study Elapsed Life of study elapsed is the percentage contract duration completed.

The rule calculates the percentage by dividing the Elapsed Months by Total Contract months in % format

['Life of Study Elapsed']=N:0; C:(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Elapsed Months')\DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Actual Months'));

68 Cumulative WIP/Contract Amount Cumulative WIP/Contract amount is the percentage of Cumulative WIP/Contract amount

['Cumulative WIP/Contract Amount']=N:0; C:(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Current Period Cumulative WIP')\DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractAmount_Actual'));

69 LTD Cash/Contract Amount LTD Cash/Contract Amount is the percentage of LTD Cash/Contract Amount

['LTD Cash/Contract Amount']=N:0; C:(DB('CONTRACT CUBE',!Compound,!

DD-SYD-013-2.0 Page: 48 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 49: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Type,!Project,!TA,!TM1 ContractID,'LTD Cash Paid End of Current Period')\DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractAmount_Actual'));

70 Invoice GL_Account To Calculate the Invoice GL_Account, a lookup Cube GL_Account_Lookup_Cube is used. Ariba GL Account is Converted to the Invoice GL Account using the rule

['Invoice GL_Account'] = S:DB('GL_Account_Lookup_Cube',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Ariba GL Account'),'Invoice GL Account');

71 Actual End Date Actual End Date of the Contract is defined at the Record level based on the Start of the Next AmendmentEndDate_ContractMonths is the Intermediate field that is used.

Rule to convert the format to User desired format['Actual End Date']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')@<>'',SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'),6,2)|'/'|SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'),9,2)|'/'|SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'),1,4),'');

72 WithdrawnMonth/year User input field in the format MM/YY

73 Old PO#1 Loaded from the Input Cube

74 CarryForward Legacy Loaded from the Input Cube

75 Inactivated Date Inactivated Date is a record level field that shows captures the history of inactivation on that record.

The user input the data at the ContractID level in the Inactivated Month/Year.This data is copied to the last record under that contract using the Intermediate field Inactivated_DATEThe process To_Copy_Inactivated_Suspended_Dates copies the data from Inactivated_DATE to Inactivated_Date History

Inactivated Date copies the value in the Inactivated_Date History using the following rule

['Inactivated Date'] = S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year')@<>'',

DD-SYD-013-2.0 Page: 49 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 50: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE'), IF(((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment' ) & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') %(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TM1 Contract ID'),'Inactivated_DATE'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated_DATE History')));

76 Suspended Date Suspended Date is a record level field that shows captures the history of suspension on that record.

The user input the data at the ContractID level in the Suspended Month/Year.This data is copied to the last record under that contract using the Intermediate field Suspended_DATEThe process To_Copy_Inactivated_Suspended_Dates copies the data from Suspended_DATE to Suspended_Date History

Suspended Date copies the value in the Suspended_Date History using the following rule

['Suspended Date'] = S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'SuspendedMonth/Year')@<>'',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended_DATE'), IF(((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment' ) & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') %(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TM1 Contract

DD-SYD-013-2.0 Page: 50 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 51: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ID'),'Suspended_DATE'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended_DATE History')));

77 Comments Loaded from the Input Cube. User can add further comments

4.1.6.2 Hidden FieldsThe following fields are the Hidden fields that are used in the above calculations

S No

Fields Description

1 EndDate_ContractMonths_Calc EndDate_ContractMonths_Calc is used as intermediate field for the calculation of Contract End Date for Core OR Amendment End Date for an amendment. It applies the 15 day logic on end dates to use in End Date_Contract Months

If the date of the Contract End Date is less than 15, then the previous month end date is displayed. The previous month end date is displayed based on the month and year. For eg, if the Contract End date is 12-Mar-2012, since it is a leap year, the date for calculation would be 2012-02-29.

['EndDate_ContractMonths_Calc']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' & ISLEAF=1,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment', IF(DAY(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))<=15, DATES(IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=1,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=1, 12,MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=1,31,

DD-SYD-013-2.0 Page: 51 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 52: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1=4 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1=6 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1=9 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1=11,30,IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))-1=2,IF(MOD(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD')), 4)=0,29,28), 31)))), DATES(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD')), MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD')), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=4 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=6 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=9 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=11,30,IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD'))=2,IF(MOD(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD')), 4)=0,29,28), 31)))), IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' &DAY(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))<=15,DATES(IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=1,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=1, 12,MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=1,31,IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1=4 %

DD-SYD-013-2.0 Page: 52 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 53: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1=6 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1=9 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1=11,30,IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))-1=2,IF(MOD(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD')), 4)=0,29,28), 31)))), DATES(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD')),MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD')), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=4 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=6 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=9 % MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=11,30,IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD'))=2,IF(MOD(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD')), 4)=0,29,28), 31))))),CONTINUE);

2 StartDate_ContractMonths StartDate_ContractMonths is used as an intermediate field which has the 15 day end date logic applied on the start of the Contract for a Core or an Amendment.

The rule checks checks if the Contract is a core or amendment and applies the 15 day logic to the Start Date of the Contract

['StartDate_ContractMonths']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' & ISLEAF=1,IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment', IF(DAY(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD'))>15, DATES(IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD'))=12,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 53 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 54: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'ContractStartDateYYYY-MM-DD'))+1, YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD'))), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD'))=12,1, MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD'))+1), 1), DATES(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD')), MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD')), 1)), IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' &DAY(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))>15,DATES(IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))=12,YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))+1, YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))), IF(MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))=12,1, MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD'))+1), 1), DATES(YEAR(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD')), MONTH(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD')), 1))),CONTINUE);

3 EndDate_ContractMonths End Date_Contract Months is the Intermediate field that calculates the ACTUAL end of the Core/Amendment based on the Amendment. This field is used in the calculations as the Contract End Date displayed would be different from the Actual Contract End if there an Amendment on it.

The rule checks if the Contract is Core/ Amendment and uses the DNEXT to check if the next record is an Amendment , If yes and the Contract End Date is greater than Amendment Start Date then uses the EndDate_ContractMonths_Calc and StartDate_ContractMonths to get the date of the actual Contract End Date.

['EndDate_ContractMonths']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'' & ISLEAF=1,IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 54 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 55: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'Contract Type')@='Adjustment') &DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='Amendment',IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractEndDateYYYY-MM-DD')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'AmendmentStartDateYYYY-MM-DD')) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'AmendmentStartDateYYYY-MM-DD')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'ContractStartDateYYYY-MM-DD')),DATE(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'StartDate_ContractMonths'))-1,1),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths_Calc')),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' &DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='Amendment',IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentEndDateYYYY-MM-DD')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'AmendmentStartDateYYYY-MM-DD')) &DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'AmendmentStartDateYYYY-MM-DD')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'AmendmentStartDateYYYY-MM-DD')),DATE(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'StartDate_ContractMonths'))-1,1),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths_Calc')),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' &DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths_Calc'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths_Calc')))), '');

4 Inactivated_DATE Inactivated_DATE is used as an intermediate field that has the logic to convert "Inactivated Month/Year" to Date String by adding last day of the month

The user enters the date in the format of the MM/YYYY and it converts into DD-SYD-013-2.0 Page: 55 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 56: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Date with End of the Month as the Inactivated Month.

['Inactivated_DATE']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year')@<>'', DATES(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),4,4)),NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2)),IF(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2))=4 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2))=6 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2))=9 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2))=11,30,IF(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),1,2))=2,IF(MOD(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'InactivatedMonth/Year'),4,4)), 4)=0,29,28), 31))),IF(((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment' ) & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') %(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TM1 Contract ID'),'Inactivated_DATE'),''));

5 Inactivated_DATE History Inactivated_DATE History is an intermediate field that is used to capture the history of inactivity.

The TI process To_Copy_Inactivated_Suspended_Dates copies the data in the Inactivated_DATE if it exists.

This field is compared to Inactivated Date field to Archive the Contract Cube. If there is Date in Inactivated_Date History and No value mentioned in Inactivated Date field, it triggers the Archive process .

6 Suspended_DATE Suspended_DATE is used as an intermediate field that has the logic to convert "Suspended Month/Year" to Date String by adding last day of the

DD-SYD-013-2.0 Page: 56 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 57: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

month

The user enters the date in the format of the MM/YYYY and it converts into Date with End of the Month as the Suspended Month.

['Suspended_DATE']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year')@<>'', DATES(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),4,4)),NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2)),IF(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2))=4 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2))=6 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2))=9 %NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2))=11,30,IF(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),1,2))=2,IF(MOD(NUMBR(SUBST(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Month/Year'),4,4)), 4)=0,29,28), 31))),IF(((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment' ) & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') %(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@='') ,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TM1 Contract ID'),'Suspended_DATE'),''));

DD-SYD-013-2.0 Page: 57 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 58: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

7 Suspended_DATE History Suspended_DATE History is an intermediate field that is used to capture the history of Suspension.

The TI process To_Copy_Inactivated_Suspended_Dates copies the data in the Suspended_DATE if it exists.

This field is compared to Suspended Date field to Archive the Contract Cube. If there is Date in Suspended_Date History and No value mentioned in Suspended Date field, it triggers the Archive process .

6 Contract Months_CF Contract Months_CF is an intermediate field used for the calculation of Carry Forward Amount, gives the value of the number of months remaining in the initial contract at the start of the amendment.

This field uses the intermediate fields EndDate_ContractMonths and StartDate_ContractMonths to find out the actual duration of the contract and subtracts from Contract Months.

['Contract Months_CF']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')@<>'', DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Months')-ROUND((DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'))-DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')))/30), CONTINUE);

8 Status This is to lock the Status field at the leaf level as the user makes a Contract Inactive at the Contract ID level

['Status']=S:IF(ISLEAF=1,'',CONTINUE);

9 ContractAmount _Actual ContractAmount _Actual is the total Contract Amount that is actually being spent on the Contract considering the amendments.

It is the sum of the Contract Amount and all the Amendment Amounts

['ContractAmount_Actual']=N:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' % DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Adjustment',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Amount'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1

DD-SYD-013-2.0 Page: 58 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 59: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

ContractID,'Contract Type')@='Amendment',DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Amendment Amount'),0));

10 EndDate_ElapsedMonths_Today EndDate_ElapsedMonths_Today is an intermediate field used for the calculation for Cumulative Months, Elapsed Months, Accrual Months Past Accrual Date

The field calculates Today’s end months based on the 15 day logic.

['EndDate_ElapsedMonths_Today']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')@<>'',DATES(YEAR(TODAY(1)), MONTH(TODAY(1)), IF(MONTH(TODAY(1))=4 % MONTH(TODAY(1))=6 % MONTH(TODAY(1))=9 % MONTH(TODAY(1))=11,30,IF(MONTH(TODAY(1))=2,IF((YEAR(TODAY(1))/4)=0,29,28), 31))),CONTINUE);

11 Least Date Least Date is an intermediate field to get the Least Start Date of all the Contract/Amendment’s start dates. It compares the Start date of the record with the previous record’s start date and gives the least value.

The logic of Least Date, Least Date Status and Temp Status is used to calculate the cumulative months in case of reannualization.

['Least Date']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'',IF((DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment' &DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@=''&DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DIMNM('TM1 ContractID',(DIMIX('TM1 ContractID',!TM1 ContractID))-1),'StartDate_ContractMonths'))),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DIMNM('TM1 ContractID',(DIMIX('TM1 ContractID',!TM1 ContractID))-1),'StartDate_ContractMonths'),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Amendment'&DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DNEXT('TM1 ContractID',!TM1 ContractID),'Contract Type')@<>''&DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')) >DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DIMNM('TM1 ContractID',(DIMIX('TM1 ContractID',!TM1 ContractID))-1),'StartDate_ContractMonths')),

DD-SYD-013-2.0 Page: 59 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 60: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DIMNM('TM1 ContractID',(DIMIX('TM1 ContractID',!TM1 ContractID))-1),'StartDate_ContractMonths'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))), DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'));

12 Least Date Status Least Date Status is the intermediate field that gives the value of Yes or No - if Least date less than start date then status wil be 'NO' else 'YES'

The logic of Least Date, Least Date Status and Temp Status is used to calculate the cumulative months in case of reannualization.

['Least Date Status']=S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@<>'',IF(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least Date')) < DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths')),'No',IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Contract Type')@='Core' &(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Least Date')) <= DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'StartDate_ContractMonths'))),'No', 'Yes')),'');

13 Temp Status Temp Status is the intermediate field to get the last amendment's value of Least Date Status to leaf and consolidated levels of Temp Status to identify the contract with negative dates

The logic of Least Date, Least Date Status and Temp Status is used to calculate the cumulative months in case of reannualization.

['TempStatus']=S:IF(ISLEAF=0,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,ELCOMP('TM1 ContractID',!TM1 ContractID,ELCOMPN('TM1 ContractID',!TM1 ContractID)),'Least Date Status'),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'TM1 Contract ID'),'Temp Status'));

14 Least End Date Least End Date is the intermediate field that is used to get the least date among EndDate_ContractMonths, Inactivated Date and Suspended DateIt is used in the calculation for cumulative months.

['Least End Date'] = S:IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!

DD-SYD-013-2.0 Page: 60 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 61: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

TA,!TM1 ContractID,'Contract Type')@<>'',IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')@<>'' & DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')@<>'',DATE(MIN(MIN(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')), DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date'))),DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'))),1),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')@<>'',DATE(MIN(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Inactivated Date')), DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'))),1),IF(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')@<>'',DATE(MIN(DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'Suspended Date')), DAYNO(DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths'))),1),DB('CONTRACT CUBE',!Compound,!Type,!Project,!TA,!TM1 ContractID,'EndDate_ContractMonths')))), '');

4.2 Data Load

The data flow from the Input Cube to the Contract Cube starts once the user clicks on the Submit button on the respective template.

The Submit button triggers the TI process To_Create_TM1ContractID_Dim. The process is a parameterized process wherein when the user clicks the submit button,

the value in the C11 cell ie Oncology or NonOncology is used as a parameter.

The following three processes are executed in order

ExecuteProcess ('To_Create_Compound_Project_Dim');ExecuteProcess ('To_Load_CONTRACT_CUBE_from_INPUT_CUBE','pTA',pTA);ExecuteProcess ('To_Delete_Processed_Records_from_INPUT_CUBE');

To_Load_CONTRACT_CUBE_from_INPUT_CUBE

DD-SYD-013-2.0 Page: 61 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 62: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

The dimension count of the Input Cube and Contract Cube is different and the data values of the Input Cube are the elements of the Dimensions in the Contract Cube. So, data is loaded into the Contract Cube by using the WHILE Loop with the help of indexes.

Only the records which are not Rejected and with Action as Process are loaded into the Contract Cube.

The following code is defined under the Prolog of the TI Process

Prolog tab of To_Load_CONTRACT_CUBE_from_INPUT_CUBE

v_index = 2;v_dimcount = DIMSIZ('SystemId');

while (v_index <= v_dimcount);v_syselement = dimnm('SystemId',v_index);v_Rejected= cellgets('INPUT CUBE',v_syselement , pTA, 'Rejected');v_TherapeuticArea= cellgets('INPUT CUBE',v_syselement , pTA, 'Therapeutic Area');v_TA= cellgets('INPUT CUBE',v_syselement , pTA, 'TA');v_Action= cellgets('INPUT CUBE',v_syselement , pTA, 'Action');

If (v_Rejected @<> 'YES' & v_TA@=pTA & v_Action@='Process');v_Type = cellgets('INPUT CUBE', v_syselement , pTA, 'Type');v_Compound1= cellgets('INPUT CUBE', v_syselement , pTA, 'Compound');v_Project1= cellgets('INPUT CUBE', v_syselement , pTA,'Project');

v_index2 = 1;while (v_index2 <=dimsiz('Measure_Input'));v_measure_contract = dimnm('Measure_Input',v_index2);

if (DTYPE('Measure_Input',v_measure_contract)@='N');v_valuen= cellgetn('INPUT CUBE',v_syselement , pTA, v_measure_contract);elseif (DTYPE('Measure_Input',v_measure_contract)@='S');v_values= cellgets('INPUT CUBE',v_syselement , pTA, v_measure_contract);endif;

if (DTYPE('Measure_Input',v_measure_contract)@='N');CellputN(v_valuen ,'CONTRACT CUBE', v_Compound1 , v_Type , v_Project1, v_TherapeuticArea ,v_syselement ,v_measure_contract);elseif (DTYPE('Measure_Input',v_measure_contract)@='S');CellputS(v_values ,'CONTRACT CUBE', v_Compound1 , v_Type , v_Project1, v_TherapeuticArea ,v_syselement ,v_measure_contract);endif;

DD-SYD-013-2.0 Page: 62 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 63: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

v_index2=v_index2+1;

end;

Endif;

v_index=v_index+1;

end;

4.3 LookUp Cubes

Two lookup cubes are created for calculations to retain the data for next month/year calculations

Contract_Cube_PastData_Monthly Contract_Cube_PastData_Yearly are created

4.3.1 Contract_Cube_PastData_Monthly The TI Process To_Load_ContractCubePastData_Monthly loads data to

Contract_Cube_PastData_Monthly with the source as the Contract Cube. It is the snapshot of the Contract Cube at the end of each month.

The TM1 Contract ID Dimension is required only at the consolidated level. A new dimension TM1 ContractID_L1 is created at the level 1 of TM1 ContractID Dimension for this purpose.

This process is run once in a month to hold the values the previous month.

4.3.2 Contract_Cube_PastData_Yearly

The TI Process To_Load_ContractCubePastData_Yearly loads data to Contract_Cube_PastData_Yearly with the source as the Contract Cube. It is the snapshot of the Contract Cube at the end of each Year.

The TM1 Contract ID Dimension is required only at the consolidated level. A new dimension TM1 ContractID_L1 is created at the level 1 of TM1 ContractID Dimension for this purpose.

DD-SYD-013-2.0 Page: 63 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 64: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

This process is run once in a Year to hold the values the previous Year

5 SAP Staging Cube

5.1 SAP Staging DataSource - DAART_SAP.datPath : ___________________________

DAART_SAP file contains the daily cash paid data with respect to the PO number. So the staging cube accumulates the values and divides the SAP Cash paid data on a Monthly and yearly basis, so that the data can be directly fed to the Contract Cube at the TM1 ContractID level.

The file containing the following data fields from SAP is FTPed to the Shared path 1. BELNR2. GJAHR3. KSTAR4. OBJID5. BUDAT6. EBELN7. EBELN8. WTGBTR

The TI process To_Load_SAP_Staging_Cube_from_SAP loads the data from SAP to the Staging Cube.

5.2 DIMENSIONSThe following are the dimensions for the SAP Staging Cube

1. PONumber2. PostDate

5.2.1 PONumberPONumber is a dynamically created dimension by using the EBELN of the SAP data. Variable PONumber is created to get the value of the PONumber in the same format as that of the Contract Cube.

The formula for PONumber is defined in Variable of the process asDD-SYD-013-2.0 Page: 64 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 65: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

PONumber='PO' | subst(EBELN,3,long(EBELN)-2);

5.2.2 PostDatePostDate contains the following elements at the Consolidation level

Current Year Cash Paid Past Year (beyond 2 years) Cash Paid Prior-1 Year Cash Paid Prior Year Cash Paid

5.3 Data LoadProcess: To_Load_SAP_Staging_Cube_from_SAP

The following variables are created and Code is applied to dynamically split the dates and assign to the respective Date fields.

Based on the Dates given in the BUDAT field of the DAART_SAP file, Dates are split using the formulae given below for the variables

S No Variable Formula1 Post_Year Post_Year=subst(BUDAT,1,4);2 PostMonth PostMonth=subst(BUDAT,1,6);3 PostDate PostDate=BUDAT;4 Amount Amount=if(scan('-',wtgbtr)>0, -1*stringtonumber

(subst(wtgbtr,1,long(wtgbtr)-1)),stringtonumber(wtgbtr));

The option accumulate values should be selected under MAPS tab so that the values are added as the file is loaded daily The following code is written under the Prolog of the TI process to dynamically assign the dates to Previous years and Current year respectively. This approach automatically assigns the Previous years to each of the respective Cash paid years and consolidates the values at Month and Year basis.

Prolog tab of To_Load_SAP_Staging_Cube_from_SAP

##To delete all the existing dates under Consolidations to define the Current and Past years based on Dates##if (DIMIX('PostTime', 'Current Year Cash Paid')>0);dimensionelementdelete('PostTime','Current Year Cash Paid');

DD-SYD-013-2.0 Page: 65 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 66: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

elseif(DIMIX('PostTime', 'Prior Year Cash Paid')>0);dimensionelementdelete('PostTime','Prior Year Cash Paid');elseif(DIMIX('PostTime' ,'Prior-1 Year Cash Paid')>0);dimensionelementdelete('PostTime','Prior-1 Year Cash Paid');elseif(DIMIX('PostTime', 'Past Year (beyond 2 years) Cash Paid')>0);dimensionelementdelete('PostTime','Past Year (beyond 2 years) Cash Paid');endif;

##Assisgn the dates to the Past years and Current years respectively##v_current_year=numbertostring(year(today(1)));v_prior_year=numbertostring(year(today(1))-1);v_prior_1_year=numbertostring(year(today(1))-2);dimensionelementinsert('PostTime','','Current Year Cash Paid','n');dimensionelementinsert('PostTime','','Prior Year Cash Paid','n');dimensionelementinsert('PostTime','','Prior-1 Year Cash Paid','n');dimensionelementinsert('PostTime','','Past Year (beyond 2 years) Cash Paid','n');DimensionElementComponentAdd('PostTime','Current Year Cash Paid',v_current_year,-1);DimensionElementComponentAdd('PostTime','Prior Year Cash Paid',v_prior_year,-1);DimensionElementComponentAdd('PostTime','Prior-1 Year Cash Paid',v_prior_1_year,-1);

##For all the dates before past2 years##i=3;while (i<=22);v_past_years=numbertostring(year(today(1))-i);DimensionElementComponentAdd('PostTime','Past Year (beyond 2 years) Cash Paid',v_past_years,-1);i=i+1;end;

Once the SAP data is loaded, this cube can be used to get the Cash paid values in the Contract Cube at the TM1 Contract ID level.

6 GL Account Lookup Cube

6.1 GL Account Data

DD-SYD-013-2.0 Page: 66 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 67: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

File – GL Lookup.csvPath - _______________________________

The source file has the Ariba GL accounts mapped to the Invoice GL Accounts. This mapping is maintained by the Application Power users/business users.

6.2 Dimensions Ariba GL Account Measures

6.2.1 Ariba GL AccountThe elements of the Ariba GL Account are Ariba GL Account numbers that are in the source file.

6.2.2 Invoice GL AccountThe following elements are taken measures in the Invoice GL Account dimensionAriba GL Account Invoice GL Account

6.3 Data Load

• The TI process To_Load_GLAccount_lookup_Cube is run manually everytime the source file is modified

• The cube is recreated every time the process runs

7 Archive CubeThe archive Cube facilitates audit trail by storing every change / record processed from Input Cube to Contract Cube.

Any new record that is processed from Input Cube to Contract Cube triggers for immediate update of the Archive Cube with the changes. The entire Contract with a new timestamp is archived.

7.1 Archive Cube DataSource: Contract Cube

The Archive cube maintains the history of the contract cube. It has the same cube structure as that of the Contract Cube and contains the data with a timestamp concatenated to the TM1 Contract ID. The Archive is updated everytime there is any change in the data of the Contract

DD-SYD-013-2.0 Page: 67 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 68: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Cube whether it is by adding new records or updating the records or even changing the status of existing records.

7.2 Dimensions

The following are the dimensions present in the Archive Cube

1. TA2. Type3. TM1 ContractID Archive4. Compound5. Project6. Measure_Contract

All the dimensions of the Archive Cube are same as that of the Contract Cube except the TM1 ContractID Archive dimension.

7.2.1 TM1 ContractID Archive

TM1 ContractID Archive dimension is a dynamically built dimension with the TimeStamp concatenated to the elements of the TM1 ContractID dimension.

The timestamp is in the format YYYYMMDDHHMMSS The consolidation level of the TM1 ContractID is taken at the leaf level to copy the

calculated values as they are to the Archive Cube

The Process To_Load_Archive_Cube is a parameterized process based on 2 parameters - pTA : Defines the Therapeutic Area based on the Template- p_ContractID : triggers which of the TM1 ContractIDs need to be taken a

backup of- v_Type: Defines the Type as parameter- v_Compound: Defines the Compound as parameter- v_Project: Defines Project as parameter- v_TherapeuticArea: Defines TherapeuticArea as parameter

The following code is written in the Prolog Tab of the the TI process To_Load_Archive_Cube to create the TM1 ContractID Archive dimension

Prolog Tab of To_Load_Archive_Cubev_records_in_contract=elcompn('TM1 ContractID',p_ContractId);v_counter=1;

DD-SYD-013-2.0 Page: 68 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 69: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

v_now=timst(now,'\Y\m\d\h\i\s');v_parent=v_now | '-' | p_ContractId;dimensionelementinsert('TM1 Contract ID Archive','',v_parent | '-P','c');dimensionelementinsert('TM1 Contract ID Archive','',v_parent ,'n');DimensionElementComponentAdd ('TM1 Contract ID Archive',v_parent | '-P',v_parent,1);while (v_counter <= v_records_in_contract);

v_child=v_now | '-' | elcomp('TM1 ContractID',p_ContractId,v_counter);dimensionelementinsert('TM1 Contract ID Archive','',v_child,'n');DimensionElementComponentAdd ('TM1 Contract ID Archive',v_parent | '-P',v_child,0);

v_counter=v_counter+1;end;

7.3 Data Load

Process: To_Load_Archive_Cube

The Epilog Tab of the process To_Load_Archive_Cube loads the data from the Contract Cube to the Archive Cube.

The Process is triggered every time data is loaded from the Input Cube to the Contract Cube. Hence, the process To_Create_TM1_ContractID_Dim triggers the To_Load_Archive_Cube process

The process is executed just before the deletion of the elements from the Input Cube so as to have an archive of all the records.

Any status changes in the Contract Cube also triggers the process (defined later)

The following code is written in the Epilog process of To_Load_Archive_Cube to load the data from the Contract Cube to the Archive Cube.

Epilog tab of To_Load_Archive_Cube

v_records_in_contract=elcompn('TM1 ContractID',p_ContractId);v_counter=1;v_now=timst(now,'\Y\m\d\h\i\s');DD-SYD-013-2.0 Page: 69 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 70: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

v_parent=v_now | '-' | p_ContractId;

while (v_counter <= v_records_in_contract);

v_child_element=elcomp('TM1 ContractID',p_ContractId,v_counter);v_child=v_now | '-' | v_child_element;v_index=1;

while(v_index<=dimsiz('Measure_Contract'));v_measure=dimnm('Measure_Contract',v_index);

if (DTYPE('Measure_Contract',v_measure)@='N');v_num_value=cellgetn('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,p_ContractId,v_measure);elseif (DTYPE('Measure_Contract',v_measure)@='S');v_string_value=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,p_ContractId,v_measure);endif;

if (DTYPE('Measure_Contract',v_measure)@='N');cellputn(v_num_value,'ARCHIVE CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_parent,v_measure);elseif (DTYPE('Measure_Contract',v_measure)@='S');cellputs(v_string_value,'ARCHIVE CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_parent,v_measure);endif;v_index=v_index+1;end;

v_index=1;

while (v_index<=dimsiz('Measure_Contract'));

v_measure=dimnm('Measure_Contract',v_index);

if (DTYPE('Measure_Contract',v_measure)@='N');v_num_value=cellgetn('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_child_element,v_measure);elseif (DTYPE('Measure_Contract',v_measure)@='S');v_string_value=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_child_element,v_measure);

DD-SYD-013-2.0 Page: 70 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 71: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

endif;

if (DTYPE('Measure_Contract',v_measure)@='N');cellputn(v_num_value,'ARCHIVE CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_child,v_measure);elseif (DTYPE('Measure_Contract',v_measure)@='S');cellputs(v_string_value,'ARCHIVE CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_child,v_measure);endif;

v_index=v_index+1;

end;v_counter=v_counter+1;end;

Process: To_Copy_Inactive_Suspended_Dates

The To_Copy_Inactive_Suspended_Dates process triggers the Archiving process if there is a date is that is copied to the Inactived_Date_History and Suspended_Date_History.

The process runs every night to copy the data from Inactivated_DATE and Suspended_DATE to Inactived_Date_History and Suspended_Date_History respectively in the Contract Cube.

To increase the performance of the process, another dimension TM1ContractID_Inac_Susp is created which contains only the records that are Inactivated or Suspended. This is dimension is created using the process To_Create_TM1ContractID_Inac_Susp_Dim.

A variable ID is created in this process which is defined as

IF(Measure_Contract@='Status' & Value@='Inactive' % Value@='Suspended');ID=vTM1ContractID;endif;

The process To_Copy_Inactive_Suspended_Dates uses the while loop logic to check the values in all the Inactivated/Suspended ContractIDs and copies the values from Inactivated_Date_History and Suspended_Date_History.

If the values in History are not same as the values in Inactivated/Suspended Date, it triggers the Archive Process To_Load_Archive_Cube with the parameters.

DD-SYD-013-2.0 Page: 71 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 72: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

The following code is written in the Prolog tab of the process To_Copy_Inactive_Suspended_Dates

Prolog tab of To_Copy_Inactive_Suspended_Dates

v_index_ContractID = 1;

##Creates an Intermediate Dimension with only the Inactive and Suspended Records##ExecuteProcess ('To_Create_TM1ContractID_Inac_Susp_Dim');

#while (v_index_ContractID <= 1);

while (v_index_ContractID <= DIMSIZ ('TM1 ContractID'));

if ( DTYPE('TM1 ContractID',DIMNM('TM1 ContractID', v_index_ContractID))@='C');v_ContractId=dimnm('TM1 ContractID',v_index_ContractID );v_index_compound = 1;while (v_index_compound <= DIMSIZ ('Compound'));v_Compound=dimnm('Compound',v_index_compound );v_index_Type = 1;while (v_index_Type <= DIMSIZ ('Type'));v_Type=dimnm('Type',v_index_Type );v_index_project = 1;while (v_index_project <= DIMSIZ ('Project'));v_Project=dimnm('Project',v_index_project );v_index_TA = 1;while ( v_index_TA<= DIMSIZ ('TA'));v_TherapeuticArea=dimnm('TA',v_index_TA );

v_last_record=elcomp('TM1 ContractID',v_ContractId,elcompn('TM1 ContractID',v_ContractId));v_Status=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_ContractId,'Status');v_archive='No';if (v_Status@='Inactive' % v_Status@='Suspended');v_archive='Yes';endif;

v_string_value=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Inactivated Date');v_string_value_hist=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Inactivated_DATE History');

DD-SYD-013-2.0 Page: 72 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 73: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

cellputs(v_string_value,'CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Inactivated_DATE History');

v_string_value_sus=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Suspended Date');v_string_value_hist_sus=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Suspended_DATE History');cellputs(v_string_value_sus,'CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'Suspended_DATE History');

v_TA=cellgets('CONTRACT CUBE',v_Compound,v_Type,v_Project,v_TherapeuticArea,v_last_record,'TA');

if (v_archive@='Yes' & (v_string_value@<>v_string_value_hist % v_string_value_sus@<>v_string_value_hist_sus));ExecuteProcess ('To_Load_Archive_Cube','p_contractid',v_ContractId,'pTA',v_TA,'v_Compound',v_Compound,'v_Type',v_Type,'v_Project',v_Project,'v_TherapeuticArea',v_TherapeuticArea);endif;

v_index_TA=v_index_TA+1;end;

v_index_project =v_index_project +1;end;

v_index_Type=v_index_Type+1;end;

v_index_compound=v_index_compound+1;end;

endif;v_index_ContractID = v_index_ContractID + 1;end;

DD-SYD-013-2.0 Page: 73 / 74 document.doc Last printed 9/10/2010 4:36 PM

Page 74: 53805991 dd-syd-013-2-0-daart-software-design-specification-v1-7

DAARTSoftware Design SpecificationDoc. ID.: DD-SYD-013-2.0Version: 1.7

Research Paper helphttps://www.homeworkping.com/

DD-SYD-013-2.0 Page: 74 / 74 document.doc Last printed 9/10/2010 4:36 PM