RuleResult_e BR_LLSC_0_1a( MYKI_BR_ContextData_t *pData ) { int i = 0; MYKI_CAIssuer_t *pMYKI_CAIssuer = NULL; MYKI_TAControl_t *pMYKI_TAControl = NULL; MYKI_TACapping_t *pMYKI_TACapping = NULL; MYKI_TAProduct_t *pMYKI_TAProduct = NULL; MYKI_Directory_t *pDirectory = NULL; int hasDailyCappingReset = FALSE; int hasWeeklyCappingReset = FALSE; int nResult = 0; CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Start (Card Integrity Check - Part A)" ); if ( ! pData ) { CsErrx( "BR_LLSC_0_1a : Invalid argument(s)" ); return RULE_RESULT_ERROR; } // // Check Pre-conditions // // 1. The card is a transit card i.e Dynamic.IsTransit = true if ( ! pData->DynamicData.isTransit ) // Application decides whether the card is a transit card or not based on device mode and card details { CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Pre-condition BR_LLSC_0_1.1 not met." ); CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Bypass - ! pData->DynamicData.isTransit" ); pData->ReturnedData.bypassCode = BYPASS_CODE( 0, 1, 1, 0 ); return RULE_RESULT_BYPASSED; } if ( ( nResult = MYKI_CS_CAIssuerGet( &pMYKI_CAIssuer ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : MYKI_CS_CAIssuerGet() failed (%d)", nResult ); return RULE_RESULT_ERROR; } if ( ( pMYKI_CAIssuer->OperationMode & OPERATION_MODE_TEST ) != 0 && pData->TestData.condition == TEST_CONDITION_BYPASS_BR_LLSC_0_1 ) { // Bypass BR_LLSC_0_1 (card integrity check) to simulate BR_LLSC_99_1 // (pre-commit check) conditions // CsWarnx( "BR_LLSC_0_1a : Bypass - TEST mode, bypass card integrity check" ); pData->ReturnedData.bypassCode = BYPASS_CODE( 0, 1, 2, 0 ); return RULE_RESULT_BYPASSED; } // // Execute Rule // if ( ( nResult = MYKI_CS_TAControlGet( &pMYKI_TAControl ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : MYKI_CS_TAControlGet() failed(%d)", nResult ); return RULE_RESULT_ERROR; } for ( i = 1; i < DIMOF( pMYKI_TAControl->Directory ); i++ ) // Check all dir entries that map to products (ie, not the purse (0) entry) { ProductType_e productType; if ( ( nResult = myki_br_GetCardProduct( i, &pDirectory, NULL ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_GetCardProduct(%d) failed(%d)", i, nResult ); return RULE_RESULT_ERROR; } // 1. For every product that has a status of Activated if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_ACTIVATED ) { CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Product %d is activated", i ); if ( ( nResult = myki_br_GetCardProduct( i, &pDirectory, &pMYKI_TAProduct ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : Failed to get product %d details(%d)", i, nResult ); return RULE_RESULT_ERROR; } productType = myki_br_cd_GetProductType( pDirectory->ProductId ); // a. If the start time2 is greater than the expiry time3 then // i. On condition being found create card snapshot // ii. Perform a Product Update/Invalidate On the affected product if ( pMYKI_TAProduct->StartDateTime > pMYKI_TAProduct->EndDateTime ) { CsWarnx( "BR_LLSC_0_1a : Product %d : StartDateTime(%d) > EndDateTime(%d)", i, pMYKI_TAProduct->StartDateTime, pMYKI_TAProduct->EndDateTime ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } continue; /* for-loop */ } // b. Else if the product is of type Daily or Single Trip and further the difference between the start date2 and expiry time3 is greater than a 24 hours // i. On condition being found create card snapshot // ii. Perform a Product Update/Invalidate On the affected product else if ( ( productType == PRODUCT_TYPE_DAILY || productType == PRODUCT_TYPE_SINGLE ) && ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + HOURS_TO_SECONDS( 24 ) ) ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : %s and EndDateTime(%d) > StartDateTime(%d) + 24 hours", i, myki_br_GetProductTypeName( productType ), pMYKI_TAProduct->EndDateTime, pMYKI_TAProduct->StartDateTime ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } continue; /* for-loop */ } // c. Else if the product is of type Weekly and the difference between the start date2 end expiry time3 is greater than 8 days // i. On condition being found create card snapshot // ii. Perform a Product Update/Invalidate On the affected product else if ( ( productType == PRODUCT_TYPE_WEEKLY ) && ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + DAYS_TO_SECONDS( 8 ) ) ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : Weekly and EndDateTime(%d) > StartDateTime(%d) + 8 days", i, pMYKI_TAProduct->EndDateTime, pMYKI_TAProduct->StartDateTime ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } continue; /* for-loop */ } // d. Else if the product is of type e-Pass and ID = 2 and the instance count4 is not zero then if (either) // i. the start date plus2 the instance count4 plus 1 is less than product end date3 // ii. or the instance count4 greater than 1825 (5 years) // (1) On condition being found create card snapshot else if ( ( productType == PRODUCT_TYPE_EPASS ) && ( pDirectory->ProductId == 2 ) && // KWS: Need a named constant for this ( pMYKI_TAProduct->InstanceCount != 0 ) && ( ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + DAYS_TO_SECONDS( pMYKI_TAProduct->InstanceCount + 1 ) ) ) || ( pMYKI_TAProduct->InstanceCount > 1825 ) // KWS: Need a named constant for this ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : ePass and InstanceCount(%d) / StartDateTime(%d) / EndDateTime(%d) invalid", i, pMYKI_TAProduct->InstanceCount, pMYKI_TAProduct->StartDateTime, pMYKI_TAProduct->EndDateTime ); myki_br_CreateCardSnapshot( pData ); } // e. Else if the product is of type n-hour and either of the following is true // i. The difference between start date2 and expiry time3 is greater than 24 hours // ii. On condition being found create card snapshot // iii. Perform a Product Update/Invalidate On the affected product else if ( ( productType == PRODUCT_TYPE_NHOUR ) && ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + HOURS_TO_SECONDS( 24 ) ) ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : nHour and EndDateTime(%d) > StartDateTime(%d) + 24 hours", i, pMYKI_TAProduct->EndDateTime, pMYKI_TAProduct->StartDateTime ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } continue; /* for-loop */ } } // 2. For every product that has a status of Issued else if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_ISSUED ) { CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Product %d is issued", i ); if ( ( nResult = myki_br_GetCardProduct( i, &pDirectory, &pMYKI_TAProduct ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : Failed(%d) to get product %d details", nResult, i ); return RULE_RESULT_ERROR; } productType = myki_br_cd_GetProductType( pDirectory->ProductId ); // a. If the the product is not of type e-pass (i.e only e-pass support issued products) // i. On condition being found create card snapshot if ( productType != PRODUCT_TYPE_EPASS ) { CsWarnx( "BR_LLSC_0_1a : Product %d : Invalid ISSUED %s(%d) product", i, myki_br_GetProductTypeName( productType ), productType ); myki_br_CreateCardSnapshot( pData ); } // b. Else if the issued product is of type e-pass and the instance count is not zero check the // i. the start time2 is greater than the expiry time3 - or // ii. The instance count greater than 1825 (5 years) // iii. On condition being found create card snapshot else if ( ( productType == PRODUCT_TYPE_EPASS ) && ( pMYKI_TAProduct->InstanceCount != 0 ) && ( ( pMYKI_TAProduct->StartDateTime > pMYKI_TAProduct->EndDateTime ) || ( pMYKI_TAProduct->InstanceCount > 1825 ) // KWS: Need a named constant for this ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : ePass and InstanceCount(%d) / StartDateTime(%d) / EndDateTime(%d) invalid", i, pMYKI_TAProduct->InstanceCount, pMYKI_TAProduct->StartDateTime, pMYKI_TAProduct->EndDateTime ); myki_br_CreateCardSnapshot( pData ); } } // Not strictly part of BR, but print it for info else { CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Product %d is neither issued nor activated (status = %d)", i, pDirectory->Status ); continue; // No further processing of this product, go on to next product } // 3. For every product where Product.ControlBitmap6 provisional bit is set, where the product is not of type n-hour // i. On condition being found create card snapshot // ii. Perform a Product Update/Invalidate On the affected product // Assumes product is either Issued or Activated, or else this would be meaningless. if ( ( pMYKI_TAProduct->ControlBitmap & TAPP_TPRODUCT_CONTROL_PROVISIONAL_BITMAP ) && ( productType != PRODUCT_TYPE_NHOUR ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : PROVISIONAL set on %s(%d) product", i, myki_br_GetProductTypeName( productType ), productType ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } continue; /* for-loop */ } // 4. For every product where the Product Control bitmap provisional6 bit is set, where they are not the product in use. // a. On condition being found create card snapshot // b. Perform a Product Update/Invalidate // Assumes product is either Issued or Activated, or else this would be meaningless. if ( ( pMYKI_TAProduct->ControlBitmap & TAPP_TPRODUCT_CONTROL_PROVISIONAL_BITMAP ) && ( i != pMYKI_TAControl->ProductInUse ) ) { CsWarnx( "BR_LLSC_0_1a : Product %d : PROVISIONAL product but not in use(%d)", i, pMYKI_TAControl->ProductInUse ); myki_br_CreateCardSnapshot( pData ); if ( ( nResult = myki_br_ldt_ProductUpdate_Invalidate( pData, pDirectory ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_ProductUpdate_Invalidate() failed(%d)", nResult ); return RULE_RESULT_ERROR; } } } // 5. If the product in use16 refers to a product slot17 that is unused then perform TAppUpdate/SetProductInUse // Implies we should only perform this check if there is a product in use (ie, ProductInUse > 0) if ( pMYKI_TAControl->ProductInUse > 0 ) { if ( myki_br_GetCardProduct( pMYKI_TAControl->ProductInUse, &pDirectory, NULL ) < 0 ) { CsErrx( "BR_LLSC_0_1a : Failed to get product %d details", pMYKI_TAControl->ProductInUse ); return RULE_RESULT_ERROR; } if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_UNUSED ) { CsWarnx( "BR_LLSC_0_1a : In Use Product (%d) not in use", pMYKI_TAControl->ProductInUse ); // Clear product in use if ( ( nResult = myki_br_ldt_AppUpdate_SetProductInUse( pData, NULL ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_AppUpdate_SetProductInUse() failed(%d)", nResult ); return RULE_RESULT_ERROR; } } } // 6. If the daily capping counter expiry7 less 2 days is greater than than the current business date15 // i. Create a card snapshot // ii. Perform a CappingUpdate/None // (1) Set the low daily capping zone9 and high daily capping zone10 to 0. // (2) Set the daily capping fares total8 to 0. // (3) Set the daily capping counter expiry7 to end of business day time15 on the following day. if ( ( nResult = MYKI_CS_TACappingGet( &pMYKI_TACapping ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : MYKI_CS_TACappingGet() failed(%d)", nResult ); return RULE_RESULT_ERROR; } if ( pMYKI_TACapping->Daily.Expiry > ( pData->DynamicData.currentBusinessDate + 2 ) ) { CsWarnx( "BR_LLSC_0_1a : Daily capping counter expiry(%d) > current(%d) + 2", pMYKI_TACapping->Daily.Expiry, pData->DynamicData.currentBusinessDate ); myki_br_CreateCardSnapshot( pData ); hasDailyCappingReset = TRUE; } // 7. If the weekly capping counter expiry11 less 8 days is greater than the current business day15: // i. Create a card snapshot // ii. Perform a CappingUpdate/None // (1) Set the low weekly capping zone13 and high weekly capping zone14 to 0. // (2) Set the weekly capping fares total12 to 0. // (3) Set the weekly capping counter expiry11 to end of business day time15 of the following Monday. if ( pMYKI_TACapping->Weekly.Expiry > ( pData->DynamicData.currentBusinessDate + 8 ) ) { CsWarnx( "BR_LLSC_0_1a : Weekly capping counter expiry(%d) > current(%d) + 8", pMYKI_TACapping->Weekly.Expiry, pData->DynamicData.currentBusinessDate ); myki_br_CreateCardSnapshot( pData ); hasWeeklyCappingReset = TRUE; } if ( hasDailyCappingReset == TRUE || hasWeeklyCappingReset == TRUE ) { if ( ( nResult = myki_br_ldt_PerformCappingReset( pData, hasDailyCappingReset, hasWeeklyCappingReset ) ) < 0 ) { CsErrx( "BR_LLSC_0_1a : myki_br_ldt_PerformCappingReset() failed(%d)", nResult ); return RULE_RESULT_ERROR; } } CsDbg( BRLL_RULE, "BR_LLSC_0_1a : Executed" ); return RULE_RESULT_EXECUTED; }
int test_BR_VIX_OSC_3_1_001b( MYKI_BR_ContextData_t *pData ) { MYKI_CAControl_t *pMYKI_CAControl = NULL; MYKI_OAControl_t *pMYKI_OAControl = NULL; MYKI_OAShiftDataControl_t *pMYKI_OAShiftDataControl = NULL; RuleResult_e RuleResult = RULE_RESULT_ERROR; MYKI_BR_ShiftData_t MYKI_BR_ShiftData = { 0 }; Time_t StartTime = TIME_NOT_SET; int ShiftId_High = 2; int ShiftId_Low = 871; int ShiftId = ( ( ShiftId_High << 16 ) | ShiftId_Low ); if ( pData == NULL || MYKI_CS_OpenCard( MYKI_CS_OPEN_OPERATOR_APP, NULL /*DONTCARE*/ ) != MYKI_CS_OK || MYKI_CS_CAControlGet( &pMYKI_CAControl ) != MYKI_CS_OK || MYKI_CS_OAControlGet( &pMYKI_OAControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataControlGet( &pMYKI_OAShiftDataControl ) != MYKI_CS_OK ) { return FALSE; } /* GIVEN */ { /* Card image */ { pMYKI_CAControl->Status = CARD_CONTROL_STATUS_ACTIVATED; pMYKI_OAControl->Status = OAPP_CONTROL_STATUS_ACTIVATED; pMYKI_OAShiftDataControl->Status = OAPP_SHIFT_DATA_STATUS_ACTIVATED; /* != "SUSPENDED" or "CLOSED" */ pMYKI_OAShiftDataControl->ShiftId = ShiftId_Low; pMYKI_OAShiftDataControl->ShiftSeqNo = ShiftId_High; pMYKI_OAShiftDataControl->StartTime = \ StartTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( 1 ); pMYKI_OAShiftDataControl->CloseTime = TIME_NOT_SET; } /* BR context data */ { pData->DynamicData.pShiftData = &MYKI_BR_ShiftData; } } /* WHEN */ { /* Executes business rule */ RuleResult = BR_VIX_OSC_3_1( pData ); } /* THEN */ { UT_Start( ); /* Make sure business rule is bypassed */ UT_Assert( RuleResult == RULE_RESULT_BYPASSED ); UT_Assert( pData->ReturnedData.bypassCode == BYPASS_CODE( 3, 1, 2, 0 ) ); /* Make sure card image is unchanged */ UT_Assert( pMYKI_OAShiftDataControl->Status == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( pMYKI_OAShiftDataControl->ShiftId == ShiftId_Low ); UT_Assert( pMYKI_OAShiftDataControl->ShiftSeqNo == ShiftId_High ); UT_Assert( pMYKI_OAShiftDataControl->StartTime == StartTime ); UT_Assert( pMYKI_OAShiftDataControl->CloseTime == TIME_NOT_SET ); return UT_Result( ); } } /* test_BR_VIX_OSC_3_1_001b( ) */
int test_BR_VIX_OSC_3_1_002b( MYKI_BR_ContextData_t *pData ) { MYKI_CAControl_t *pMYKI_CAControl = NULL; MYKI_OAControl_t *pMYKI_OAControl = NULL; MYKI_OAShiftDataControl_t *pMYKI_OAShiftDataControl = NULL; MYKI_OAShiftDataRecordList_t *pMYKI_OAShiftDataRecordList = NULL; RuleResult_e RuleResult = RULE_RESULT_ERROR; MYKI_BR_ShiftData_t MYKI_BR_ShiftData = { 0 }; Time_t StartTime = TIME_NOT_SET; Time_t CloseTime = TIME_NOT_SET; int ShiftId_High = 2; int ShiftId_Low = 871; int ShiftId = ( ( ShiftId_High << 16 ) | ShiftId_Low ); int SalesCountCash = 3; int SalesValueCash = 1300; int ReversalsCountCash = 2; int ReversalsValueCash = 760; int SalesCountTPurse = 8; int SalesValueTPurse = 980; int ReversalsCountTPurse = 4; int ReversalsValueTPurse = 320; if ( pData == NULL || MYKI_CS_OpenCard( MYKI_CS_OPEN_OPERATOR_APP, NULL /*DONTCARE*/ ) != MYKI_CS_OK || MYKI_CS_CAControlGet( &pMYKI_CAControl ) != MYKI_CS_OK || MYKI_CS_OAControlGet( &pMYKI_OAControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataControlGet( &pMYKI_OAShiftDataControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataRecordsGet( 0, &pMYKI_OAShiftDataRecordList ) != MYKI_CS_OK ) { return FALSE; } /* GIVEN */ { /* Card image */ { pMYKI_CAControl->Status = CARD_CONTROL_STATUS_ACTIVATED; pMYKI_OAControl->Status = OAPP_CONTROL_STATUS_ACTIVATED; pMYKI_OAShiftDataControl->Status = OAPP_SHIFT_DATA_STATUS_CLOSED; pMYKI_OAShiftDataControl->ActiveRecordCount = 2; pMYKI_OAShiftDataControl->ShiftId = ShiftId_Low; pMYKI_OAShiftDataControl->ShiftSeqNo = ShiftId_High; pMYKI_OAShiftDataControl->StartTime = \ StartTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( 4 ); pMYKI_OAShiftDataControl->CloseTime = \ CloseTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( 1 ); pMYKI_OAShiftDataRecordList->NumberOfRecords = 2; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].RecordType = PAYMENT_METHOD_CASH; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesCount = SalesCountCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesValue = SalesValueCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsCount = ReversalsCountCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsValue = ReversalsValueCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].RecordType = PAYMENT_METHOD_TPURSE; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesCount = SalesCountTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesValue = SalesValueTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsCount = ReversalsCountTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsValue = ReversalsValueTPurse; } /* BR context data */ { pData->DynamicData.pShiftData = &MYKI_BR_ShiftData; } } /* WHEN */ { /* Executes business rule */ RuleResult = BR_VIX_OSC_3_1( pData ); } /* THEN */ { UT_Start( ); /* Make sure business rule is bypassed */ UT_Assert( RuleResult == RULE_RESULT_EXECUTED ); /* Make sure card image updated correctly */ UT_Assert( pMYKI_OAShiftDataControl->Status == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( pMYKI_OAShiftDataControl->ActiveRecordCount == 2 ); UT_Assert( pMYKI_OAShiftDataControl->ShiftId == ShiftId_Low ); UT_Assert( pMYKI_OAShiftDataControl->ShiftSeqNo == ShiftId_High ); UT_Assert( pMYKI_OAShiftDataControl->StartTime == StartTime ); UT_Assert( pMYKI_OAShiftDataControl->CloseTime == TIME_NOT_SET ); UT_Assert( pMYKI_OAShiftDataRecordList->NumberOfRecords == 2 ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].RecordType == PAYMENT_METHOD_CASH ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesCount == SalesCountCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesValue == SalesValueCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsCount == ReversalsCountCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsValue == ReversalsValueCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].RecordType == PAYMENT_METHOD_TPURSE ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesCount == SalesCountTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesValue == SalesValueTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsCount == ReversalsCountTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsValue == ReversalsValueTPurse ); /* Make sure returned shift data is correct */ UT_Assert( MYKI_BR_ShiftData.shiftStatus == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( MYKI_BR_ShiftData.shiftId == ShiftId ); UT_Assert( MYKI_BR_ShiftData.shiftStartTime == StartTime ); UT_Assert( MYKI_BR_ShiftData.shiftEndTime == TIME_NOT_SET ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].RecordType == PAYMENT_METHOD_TPURSE ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].SalesCount == SalesCountTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].SalesValue == SalesValueTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].ReversalsCount == ReversalsCountTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].ReversalsValue == ReversalsValueTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].RecordType == PAYMENT_METHOD_CASH ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].SalesCount == SalesCountCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].SalesValue == SalesValueCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].ReversalsCount == ReversalsCountCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].ReversalsValue == ReversalsValueCash ); UT_Assert( MYKI_BR_ShiftData.shiftPortionStatus == SHIFT_PORTION_BROUGHT_FORWARD ); return UT_Result( ); } } /* test_BR_VIX_OSC_3_1_002b( ) */
int test_BR_VIX_OSC_3_2_002c( MYKI_BR_ContextData_t *pData ) { MYKI_CAControl_t *pMYKI_CAControl = NULL; MYKI_OAControl_t *pMYKI_OAControl = NULL; MYKI_OAShiftDataControl_t *pMYKI_OAShiftDataControl = NULL; RuleResult_e RuleResult = RULE_RESULT_ERROR; MYKI_BR_ShiftData_t MYKI_BR_ShiftData = { 0 }; int NumberOfHoursBetweenShifts = 12; int MaxShiftDownTime = 2; Time_t StartTime = 0; Time_t CloseTime = 0; if ( pData == NULL || MYKI_CS_OpenCard( MYKI_CS_OPEN_OPERATOR_APP, NULL /*DONTCARE*/ ) != MYKI_CS_OK || MYKI_CS_CAControlGet( &pMYKI_CAControl ) != MYKI_CS_OK || MYKI_CS_OAControlGet( &pMYKI_OAControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataControlGet( &pMYKI_OAShiftDataControl ) != MYKI_CS_OK ) { return FALSE; } /* GIVEN */ { /* Card image */ { pMYKI_CAControl->Status = CARD_CONTROL_STATUS_ACTIVATED; pMYKI_OAControl->Status = OAPP_CONTROL_STATUS_ACTIVATED; pMYKI_OAShiftDataControl->Status = OAPP_SHIFT_DATA_STATUS_SUSPENDED; pMYKI_OAShiftDataControl->ShiftId = 9999; pMYKI_OAShiftDataControl->ShiftSeqNo = 88; pMYKI_OAShiftDataControl->StartTime = \ StartTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( NumberOfHoursBetweenShifts + 1 ); pMYKI_OAShiftDataControl->CloseTime = \ CloseTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( MaxShiftDownTime ) - 1; } /* BR context data */ { pData->StaticData.numberOfHoursBetweenShifts = NumberOfHoursBetweenShifts; pData->StaticData.maxShiftDownTime = MaxShiftDownTime; pData->DynamicData.pShiftData = &MYKI_BR_ShiftData; } } /* WHEN */ { /* Executes business rule */ RuleResult = BR_VIX_OSC_3_2( pData ); } /* THEN */ { UT_Start( ); /* Make sure business rule is bypassed */ UT_Assert( RuleResult == RULE_RESULT_EXECUTED ); /* Make sure card image is updated correctly */ UT_Assert( pMYKI_OAShiftDataControl->Status == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( pMYKI_OAShiftDataControl->ShiftId == 0 ); UT_Assert( pMYKI_OAShiftDataControl->ShiftSeqNo == 0 ); UT_Assert( pMYKI_OAShiftDataControl->StartTime == pData->DynamicData.currentDateTime ); UT_Assert( pMYKI_OAShiftDataControl->CloseTime == 0 ); /* Make sure shift data set correctly */ UT_Assert( MYKI_BR_ShiftData.shiftStatus == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( MYKI_BR_ShiftData.shiftId == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftStartTime == pData->DynamicData.currentDateTime ); UT_Assert( MYKI_BR_ShiftData.shiftEndTime == TIME_NOT_SET ); UT_Assert( MYKI_BR_ShiftData.paperTicketReturns == 0 ); UT_Assert( MYKI_BR_ShiftData.sundryItemReturns == 0 ); UT_Assert( MYKI_BR_ShiftData.cardReturns == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsTPurse.RecordType == PAYMENT_METHOD_TPURSE ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsTPurse.SalesCount == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsTPurse.SalesValue == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsTPurse.ReversalsCount == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsTPurse.ReversalsValue == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsCash.RecordType == PAYMENT_METHOD_CASH ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsCash.SalesCount == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsCash.SalesValue == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsCash.ReversalsCount == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftTotalsCash.ReversalsValue == 0 ); UT_Assert( MYKI_BR_ShiftData.shiftPortionStatus == SHIFT_PORTION_RESET ); return UT_Result( ); } } /* test_BR_VIX_OSC_3_2_002c( ) */
int test_BR_VIX_OSC_3_2_001c( MYKI_BR_ContextData_t *pData ) { MYKI_CAControl_t *pMYKI_CAControl = NULL; MYKI_OAControl_t *pMYKI_OAControl = NULL; MYKI_OAShiftDataControl_t *pMYKI_OAShiftDataControl = NULL; RuleResult_e RuleResult = RULE_RESULT_ERROR; MYKI_BR_ShiftData_t MYKI_BR_ShiftData = { 0 }; int NumberOfHoursBetweenShifts = 12; int MaxShiftDownTime = 2; Time_t StartTime = 0; Time_t CloseTime = 0; if ( pData == NULL || MYKI_CS_OpenCard( MYKI_CS_OPEN_OPERATOR_APP, NULL /*DONTCARE*/ ) != MYKI_CS_OK || MYKI_CS_CAControlGet( &pMYKI_CAControl ) != MYKI_CS_OK || MYKI_CS_OAControlGet( &pMYKI_OAControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataControlGet( &pMYKI_OAShiftDataControl ) != MYKI_CS_OK ) { return FALSE; } /* GIVEN */ { /* Card image */ { pMYKI_CAControl->Status = CARD_CONTROL_STATUS_ACTIVATED; pMYKI_OAControl->Status = OAPP_CONTROL_STATUS_ACTIVATED; pMYKI_OAShiftDataControl->Status = OAPP_SHIFT_DATA_STATUS_ACTIVATED; pMYKI_OAShiftDataControl->StartTime = \ StartTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( NumberOfHoursBetweenShifts ); pMYKI_OAShiftDataControl->CloseTime = \ CloseTime = TIME_NOT_SET; } /* BR context data */ { pData->StaticData.numberOfHoursBetweenShifts = NumberOfHoursBetweenShifts; pData->StaticData.maxShiftDownTime = MaxShiftDownTime; pData->DynamicData.pShiftData = &MYKI_BR_ShiftData; } } /* WHEN */ { /* Executes business rule */ RuleResult = BR_VIX_OSC_3_2( pData ); } /* THEN */ { UT_Start( ); /* Make sure business rule is bypassed */ UT_Assert( RuleResult == RULE_RESULT_BYPASSED ); UT_Assert( pData->ReturnedData.bypassCode == BYPASS_CODE( 3, 2, 2, 0 ) ); /* Make sure card image is unchanged */ UT_Assert( pMYKI_OAShiftDataControl->Status == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( pMYKI_OAShiftDataControl->StartTime == StartTime ); UT_Assert( pMYKI_OAShiftDataControl->CloseTime == CloseTime ); return UT_Result( ); } } /* test_BR_VIX_OSC_3_2_001c( ) */
static void ok_button_clicked (GtkWidget *button, DialogData *data) { GthChangeFields change_fields; GthChangeType change_type; GthDateTime *date_time; int time_adjustment; GthTask *task; date_time = NULL; change_fields = 0; if (IS_ACTIVE (GET_WIDGET ("change_last_modified_checkbutton"))) change_fields |= GTH_CHANGE_LAST_MODIFIED_DATE; if (IS_ACTIVE (GET_WIDGET ("change_comment_checkbutton"))) change_fields |= GTH_CHANGE_COMMENT_DATE; change_type = 0; time_adjustment = 0; if (IS_ACTIVE (GET_WIDGET ("to_following_date_radiobutton"))) { change_type = GTH_CHANGE_TO_FOLLOWING_DATE; date_time = gth_datetime_new (); gth_time_selector_get_value (GTH_TIME_SELECTOR (data->date_selector), date_time); } else if (IS_ACTIVE (GET_WIDGET ("to_last_modified_date_radiobutton"))) change_type = GTH_CHANGE_TO_FILE_MODIFIED_DATE; else if (IS_ACTIVE (GET_WIDGET ("to_creation_date_radiobutton"))) change_type = GTH_CHANGE_TO_FILE_CREATION_DATE; else if (IS_ACTIVE (GET_WIDGET ("to_photo_original_date_radiobutton"))) change_type = GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE; else if (IS_ACTIVE (GET_WIDGET ("adjust_time_radiobutton"))) { change_type = GTH_CHANGE_ADJUST_TIME; time_adjustment = (HOURS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_h_spinbutton")))) + MINS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_m_spinbutton")))) + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_s_spinbutton")))); if (gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("adjust_sign_combobox"))) == 1) time_adjustment = -time_adjustment; } /* save the preferences */ g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_LAST_MODIFIED_DATE, (change_fields & GTH_CHANGE_LAST_MODIFIED_DATE) == GTH_CHANGE_LAST_MODIFIED_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_COMMENT_DATE, (change_fields & GTH_CHANGE_COMMENT_DATE) == GTH_CHANGE_COMMENT_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FOLLOWING_DATE, change_type == GTH_CHANGE_TO_FOLLOWING_DATE); if (change_type == GTH_CHANGE_TO_FOLLOWING_DATE) { char *s; s = gth_datetime_to_exif_date (date_time); g_settings_set_string (data->settings, PREF_CHANGE_DATE_DATE, s); g_free (s); } g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_MODIFIED_DATE, change_type == GTH_CHANGE_TO_FILE_MODIFIED_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_CREATION_DATE, change_type == GTH_CHANGE_TO_FILE_CREATION_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_PHOTO_ORIGINAL_DATE, change_type == GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_ADJUST_TIME, change_type == GTH_CHANGE_ADJUST_TIME); if (change_type == GTH_CHANGE_ADJUST_TIME) g_settings_set_int (data->settings, PREF_CHANGE_DATE_TIME_ADJUSTMENT, time_adjustment); /* exec the task */ task = gth_change_date_task_new (gth_browser_get_location (data->browser), data->file_list, change_fields, change_type, date_time, time_adjustment); gth_browser_exec_task (data->browser, task, FALSE); gtk_widget_destroy (data->dialog); g_object_unref (task); gth_datetime_free (date_time); }
int test_SEQ_OSC_ValidatePin_001( MYKI_BR_ContextData_t *pData ) { MYKI_CAControl_t *pMYKI_CAControl = NULL; MYKI_CAIssuer_t *pMYKI_CAIssuer = NULL; MYKI_OAControl_t *pMYKI_OAControl = NULL; MYKI_OAPIN_t *pMYKI_OAPIN = NULL; MYKI_OARoles_t *pMYKI_OARoles = NULL; MYKI_OAShiftDataControl_t *pMYKI_OAShiftDataControl = NULL; MYKI_OAShiftDataRecordList_t *pMYKI_OAShiftDataRecordList = NULL; int EntryPointId = 53; int LineId = 66; int StopId = 79; int ServiceProviderId = 100; int MaxPinRetries = 10; int InvalidPinCount = 5; char *OperatorPin = "12345678"; MYKI_BR_ShiftData_t MYKI_BR_ShiftData = { 0 }; U8_t RoleType_Driver = 1; U8_t RoleProfile_Driver = 2; int NumberOfHoursBetweenShifts = 12; int MaxShiftDownTime = 2; int ShiftId_Low = 761; int ShiftId_High = 912; int ShiftId = ( ( ShiftId_High << 16 ) | ShiftId_Low ); Time_t ShiftStartTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( 3 ); Time_t ShiftEndTime = pData->DynamicData.currentDateTime - HOURS_TO_SECONDS( 1 ); int SalesCountCash = 3; int SalesValueCash = 1300; int ReversalsCountCash = 2; int ReversalsValueCash = 760; int SalesCountTPurse = 8; int SalesValueTPurse = 980; int ReversalsCountTPurse = 4; int ReversalsValueTPurse = 320; BusinessRulesResult_e RuleResult = MYKI_BR_RESULT_ERROR; if ( pData == NULL || MYKI_CS_OpenCard( MYKI_CS_OPEN_OPERATOR_APP, NULL /*DONTCARE*/ ) != MYKI_CS_OK || MYKI_CS_CAControlGet( &pMYKI_CAControl ) != MYKI_CS_OK || MYKI_CS_CAIssuerGet( &pMYKI_CAIssuer ) != MYKI_CS_OK || MYKI_CS_OAControlGet( &pMYKI_OAControl ) != MYKI_CS_OK || MYKI_CS_OAPINGet( &pMYKI_OAPIN ) != MYKI_CS_OK || MYKI_CS_OARolesGet( &pMYKI_OARoles ) != MYKI_CS_OK || MYKI_CS_OAShiftDataControlGet( &pMYKI_OAShiftDataControl ) != MYKI_CS_OK || MYKI_CS_OAShiftDataRecordsGet( 0, &pMYKI_OAShiftDataRecordList ) != MYKI_CS_OK ) { return FALSE; } /* GIVEN */ { /* Card image */ { pMYKI_CAControl->Status = CARD_CONTROL_STATUS_ACTIVATED; pMYKI_CAControl->ExpiryDate = pData->DynamicData.currentBusinessDate + DAYS_TO_SECONDS( 2 ); pMYKI_CAIssuer->OperationMode = 0; pMYKI_OAControl->Status = OAPP_CONTROL_STATUS_ACTIVATED; pMYKI_OAControl->BlockingReason = OAPP_CONTROL_BLOCKING_REASON_RESERVED; pMYKI_OAControl->ExpiryDate = pData->DynamicData.currentBusinessDate + DAYS_TO_SECONDS( 1 ); pMYKI_OAControl->StaffProviderId = ServiceProviderId; pMYKI_OAControl->InvalidPinCount = InvalidPinCount; pMYKI_OAControl->RolesCount = 1; memcpy( pMYKI_OAPIN->Pin, OperatorPin, sizeof( pMYKI_OAPIN->Pin ) ); pMYKI_OARoles->Role[ 0 ].Type = RoleType_Driver; pMYKI_OARoles->Role[ 0 ].Profile = RoleProfile_Driver; pMYKI_OAShiftDataControl->Status = OAPP_SHIFT_DATA_STATUS_SUSPENDED; pMYKI_OAShiftDataControl->ActiveRecordCount = 2; pMYKI_OAShiftDataControl->ShiftId = ShiftId_Low; pMYKI_OAShiftDataControl->ShiftSeqNo = ShiftId_High; pMYKI_OAShiftDataControl->StartTime = ShiftStartTime; pMYKI_OAShiftDataControl->CloseTime = ShiftEndTime; pMYKI_OAShiftDataRecordList->NumberOfRecords = 2; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].RecordType = PAYMENT_METHOD_CASH; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesCount = SalesCountCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesValue = SalesValueCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsCount = ReversalsCountCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsValue = ReversalsValueCash; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].RecordType = PAYMENT_METHOD_TPURSE; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesCount = SalesCountTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesValue = SalesValueTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsCount = ReversalsCountTPurse; pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsValue = ReversalsValueTPurse; } /* BR context data */ { pData->DynamicData.entryPointId = EntryPointId; pData->DynamicData.lineId = LineId; pData->DynamicData.stopId = StopId; pData->DynamicData.isOperator = TRUE; pData->DynamicData.pShiftData = &MYKI_BR_ShiftData; pData->StaticData.serviceProviderId = ServiceProviderId; pData->StaticData.maxPinRetries = MaxPinRetries; memset( pData->StaticData.staffRoles, 0, sizeof( pData->StaticData.staffRoles ) ); pData->StaticData.staffRoles[ 0 ].type = RoleType_Driver; pData->StaticData.staffRoles[ 0 ].profile = RoleProfile_Driver; pData->StaticData.staffRoles[ 0 ].operatorType = OperatorType_DRIVER; pData->StaticData.numberOfHoursBetweenShifts = NumberOfHoursBetweenShifts; pData->StaticData.maxShiftDownTime = MaxShiftDownTime; } } /* WHEN */ { /* Valid PIN entered */ { memcpy( pData->DynamicData.operatorPin, OperatorPin, sizeof( pData->DynamicData.operatorPin ) ); } /* Executes business sequence */ RuleResult = (BusinessRulesResult_e)MYKI_BR_ExecuteSequence( pData, SEQ_FUNCTION_VALIDATE_PIN ); } /* THEN */ { UT_Start( ); /* Make sure business rule is bypassed */ UT_Assert( RuleResult == MYKI_BR_RESULT_SUCCESS ); /* Make sure card image is correctly updated */ UT_Assert( pMYKI_OAControl->InvalidPinCount == 0 ); UT_Assert( pMYKI_OAShiftDataControl->Status == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( pMYKI_OAShiftDataControl->ActiveRecordCount == 2 ); UT_Assert( pMYKI_OAShiftDataControl->ShiftId == ShiftId_Low ); UT_Assert( pMYKI_OAShiftDataControl->ShiftSeqNo == ShiftId_High ); UT_Assert( pMYKI_OAShiftDataControl->StartTime == ShiftStartTime ); UT_Assert( pMYKI_OAShiftDataControl->CloseTime == TIME_NOT_SET ); UT_Assert( pMYKI_OAShiftDataRecordList->NumberOfRecords == 2 ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].RecordType == PAYMENT_METHOD_CASH ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesCount == SalesCountCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].SalesValue == SalesValueCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsCount == ReversalsCountCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 0 ].ReversalsValue == ReversalsValueCash ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].RecordType == PAYMENT_METHOD_TPURSE ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesCount == SalesCountTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].SalesValue == SalesValueTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsCount == ReversalsCountTPurse ); UT_Assert( pMYKI_OAShiftDataRecordList->MYKI_ShiftDataRecord[ 1 ].ReversalsValue == ReversalsValueTPurse ); /* Make sure accept/reject code is correct */ UT_Assert( pData->ReturnedData.rejectReason == MYKI_BR_REJECT_REASON_NOT_APPLICABLE ); UT_Assert( pData->ReturnedData.acceptReason == MYKI_BR_ACCEPT_REASON_NOT_APPLICABLE ); /* Make sure returned shift data is correct */ UT_Assert( MYKI_BR_ShiftData.shiftStatus == OAPP_SHIFT_DATA_STATUS_ACTIVATED ); UT_Assert( MYKI_BR_ShiftData.shiftId == ShiftId ); UT_Assert( MYKI_BR_ShiftData.shiftStartTime == ShiftStartTime ); UT_Assert( MYKI_BR_ShiftData.shiftEndTime == TIME_NOT_SET ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].RecordType == PAYMENT_METHOD_TPURSE ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].SalesCount == SalesCountTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].SalesValue == SalesValueTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].ReversalsCount == ReversalsCountTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_TPURSE ].ReversalsValue == ReversalsValueTPurse ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].RecordType == PAYMENT_METHOD_CASH ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].SalesCount == SalesCountCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].SalesValue == SalesValueCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].ReversalsCount == ReversalsCountCash ); UT_Assert( MYKI_BR_ShiftData.shiftTotals[ PAYMENT_METHOD_CASH ].ReversalsValue == ReversalsValueCash ); UT_Assert( MYKI_BR_ShiftData.shiftPortionStatus == SHIFT_PORTION_BROUGHT_FORWARD ); return UT_Result( ); } } /* test_SEQ_OSC_ValidatePin_001( ) */
RuleResult_e BR_LLSC_99_1( MYKI_BR_ContextData_t *pData ) { int dirIndex = 0; MYKI_TAControl_t *pMYKI_TAControl = NULL; MYKI_TACapping_t *pMYKI_TACapping = NULL; MYKI_TAProduct_t *pMYKI_TAProduct = NULL; MYKI_TAPurseBalance_t *pMYKI_TAPurseBalance = NULL; MYKI_TAPurseControl_t *pMYKI_TAPurseControl = NULL; MYKI_Directory_t *pDirectory = NULL; ProductType_e productType = PRODUCT_TYPE_UNKNOWN; Currency_t minTPurseBalance = 0; Currency_t maxTPurseBalance = 0; int nResult = 0; CsDbg( BRLL_RULE, "BR_LLSC_99_1 : Start (LLSC Pre-commit Check)" ); if ( pData == NULL ) { CsErrx( "BR_LLSC_99_1 : Invalid argument(s)" ); return RULE_RESULT_ERROR; } if ( ( nResult = MYKI_CS_TAControlGet( &pMYKI_TAControl ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : MYKI_CS_TAControlGet() failed (%d)", nResult ); return RULE_RESULT_ERROR; } if ( ( nResult = MYKI_CS_TACappingGet( &pMYKI_TACapping ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : MYKI_CS_TACappingGet() failed (%d)", nResult ); return RULE_RESULT_ERROR; } if ( ( nResult = MYKI_CS_TAPurseBalanceGet( &pMYKI_TAPurseBalance ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : MYKI_CS_TAPurseBalanceGet() failed (%d)", nResult ); return RULE_RESULT_ERROR; } if ( ( nResult = MYKI_CS_TAPurseControlGet( &pMYKI_TAPurseControl ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : MYKI_CS_TAPurseControlGet() failed (%d)", nResult ); return RULE_RESULT_ERROR; } /* PRE-CONDITIONS */ { for ( dirIndex = 1; dirIndex < DIMOF( pMYKI_TAControl->Directory ); dirIndex++ ) { if ( ( nResult = myki_br_GetCardProduct( dirIndex, &pDirectory, NULL ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : myki_br_GetCardProduct(%d) failed (%d)", dirIndex, nResult ); return RULE_RESULT_ERROR; } /* end-of-if */ /* 1. For each product that is allocated (TAppControl.Directory[n].Status not Unused) */ if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_UNUSED ) { continue; } /* end-of-if */ if ( ( nResult = myki_br_GetCardProduct( dirIndex, &pDirectory, &pMYKI_TAProduct ) ) < 0 ) { CsErrx( "BR_LLSC_99_1 : myki_br_GetCardProduct(%d) failed (%d)", dirIndex, nResult ); return RULE_RESULT_ERROR; } /* end-of-if */ productType = myki_br_cd_GetProductType( pDirectory->ProductId ); if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_ACTIVATED ) { /* a. If the product is activated and the Start date time is greater than the End date time. (Snapshot Reason Code: BR_LLSC_0_1_Check1a) */ if ( pMYKI_TAProduct->StartDateTime > pMYKI_TAProduct->EndDateTime ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : StartDateTime(%d) > EndDateTime(%d)", dirIndex, pMYKI_TAProduct->StartDateTime, pMYKI_TAProduct->EndDateTime ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 1 ); return RULE_RESULT_BYPASSED; } /* b. If the product is activated and is of type daily or n-hour or Single Trip and the difference between the start date and expiry time is greater than 24 hours. (Snapshot Reason Code: BR_LLSC_0_1_Check1b) */ if ( ( productType == PRODUCT_TYPE_DAILY || productType == PRODUCT_TYPE_SINGLE ) && ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + HOURS_TO_SECONDS( 24 ) ) ) ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : %s and EndDateTime(%d) > StartDateTime(%d) + 24 hours", dirIndex, myki_br_GetProductTypeName( productType ), pMYKI_TAProduct->EndDateTime, pMYKI_TAProduct->StartDateTime ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 2 ); return RULE_RESULT_BYPASSED; } /* c. If the product is activated and is of type weekly and the difference between the start date and expiry time is greater than 8 days. (Snapshot Reason Code: BR_LLSC_0_1_Check1c) */ if ( ( productType == PRODUCT_TYPE_WEEKLY ) && ( pMYKI_TAProduct->EndDateTime > ( pMYKI_TAProduct->StartDateTime + DAYS_TO_SECONDS( 8 ) ) ) ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : Weekly and EndDateTime(%d) > StartDateTime(%d) + 8 days", dirIndex, pMYKI_TAProduct->EndDateTime, pMYKI_TAProduct->StartDateTime ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 3 ); return RULE_RESULT_BYPASSED; } /* d. If the product is of subtype Epass (not fixed epass) and status is activated and the instance count is not zero, RoundUP to Days (Product[n].EndDateTime minus Product[n].StartDateTime) should be equal to the Instance Count (Snapsot Reason Code: BR_LLSC_0_1_Check1d). */ if ( ( productType == PRODUCT_TYPE_EPASS ) && ( myki_br_cd_IsFixedePass( pDirectory->ProductId ) == FALSE ) && ( pMYKI_TAProduct->InstanceCount != 0 ) ) { Time_t EPassDuration = ( pMYKI_TAProduct->EndDateTime - pMYKI_TAProduct->StartDateTime + DAYS_TO_SECONDS( 1 ) - 1 ) / DAYS_TO_SECONDS( 1 ); if ( EPassDuration != pMYKI_TAProduct->InstanceCount ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : ePass and InstanceCount(%d) / StartDateTime(%d) / EndDateTime(%d) invalid", dirIndex, pMYKI_TAProduct->InstanceCount, pMYKI_TAProduct->StartDateTime, pMYKI_TAProduct->EndDateTime ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 4 ); return RULE_RESULT_BYPASSED; } } } /* e. If the product is “Issued” status and is product subtype is not (e-pass or fixed e-pass). (Snapshot Reason Code: BR_LLSC_0_1_Check2a) */ if ( pDirectory->Status == TAPP_CONTROL_DIRECTORY_STATUS_ISSUED ) { if ( productType != PRODUCT_TYPE_EPASS ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : Invalid ISSUED %s(%d) product", dirIndex, myki_br_GetProductTypeName( productType ), productType ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 5 ); return RULE_RESULT_BYPASSED; } } if ( ( pMYKI_TAProduct->ControlBitmap & TAPP_TPRODUCT_CONTROL_PROVISIONAL_BITMAP ) != 0 ) { /* f. If the product is not an n-hour and Product.ControlBitmap provisional bit is set. (Snapshot Reason Code: BR_LLSC_0_1_Check3) */ if ( productType != PRODUCT_TYPE_NHOUR ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : PROVISIONAL set on %s(%d) product", dirIndex, myki_br_GetProductTypeName( productType ), productType ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 6 ); return RULE_RESULT_BYPASSED; } /* g. If the Product.ControlBitmap provisional bit is set and it is not the product in use. (Snapshot Reason Code: BR_LLSC_0_1_Check3) */ if ( dirIndex != pMYKI_TAControl->ProductInUse ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Product %d : PROVISIONAL product but not in use(%d)", dirIndex, pMYKI_TAControl->ProductInUse ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 1, 7 ); return RULE_RESULT_BYPASSED; } } /* 2. If the TApp.Daily.CappingExpiry is more than 1 day in the future. (Snapshot Reason Code: BR_LLSC_0_1_Check4And5) */ if ( pMYKI_TACapping->Daily.Expiry > ( pData->DynamicData.currentBusinessDate + 1 ) ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Daily capping counter expiry(%d) > current(%d) + 1", pMYKI_TACapping->Daily.Expiry, pData->DynamicData.currentBusinessDate ); pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 2, 0 ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; return RULE_RESULT_BYPASSED; } /* 3. If the TApp.Weekly.CappingExpiry is more than 8 day into the future. (Snapshot Reason Code: BR_LLSC_0_1_Check4And5) */ if ( pMYKI_TACapping->Weekly.Expiry > ( pData->DynamicData.currentBusinessDate + 8 ) ) { CsErrx( "BR_LLSC_99_1 : Bypassed - Weekly capping counter expiry(%d) > current(%d) + 8", pMYKI_TACapping->Weekly.Expiry, pData->DynamicData.currentBusinessDate ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 3, 0 ); return RULE_RESULT_BYPASSED; } /* 4. If the TApp.TPurse.Balance is less than two (2) times the negative (Tariff.MaximumTPurseBalance) OR if TApp.TPurse.Balance is greater than two (2) times the Tariff.MaximumTPurseBalance. (Snapshot Reason Code: TPurseBalanceExcess) */ minTPurseBalance = - ( pData->Tariff.TPurseMaximumBalance * 2 ); if ( pMYKI_TAPurseBalance->Balance < minTPurseBalance ) { CsErrx( "BR_LLSC_99_1 : Bypassed - TAPurseBalance(%d) < Minimum (%d)", pMYKI_TAPurseBalance->Balance, minTPurseBalance ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 4, 1 ); return RULE_RESULT_BYPASSED; } maxTPurseBalance = ( pData->Tariff.TPurseMaximumBalance * 2 ); if ( pMYKI_TAPurseBalance->Balance > maxTPurseBalance ) { CsErrx( "BR_LLSC_99_1 : Bypassed - TAPurseBalance(%d) > Maximum (%d)", pMYKI_TAPurseBalance->Balance, maxTPurseBalance ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 4, 2 ); return RULE_RESULT_BYPASSED; } /* 5. If the TApp.TPurse.Balance is NOT equal to the TApp.TPurseControl.LastChangeNewBalance. (Snapshot Reason Code: TPurseBalance) */ if ( pMYKI_TAPurseBalance->Balance != pMYKI_TAPurseControl->LastChangeNewBalance ) { CsErrx( "BR_LLSC_99_1 : Bypassed - TAPurseBalance(%d) != TAPurseControl.LastChangeNewBalance(%d)", pMYKI_TAPurseBalance->Balance, pMYKI_TAPurseControl->LastChangeNewBalance ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 5, 0 ); return RULE_RESULT_BYPASSED; } /* 6. If TApp.TPurseControl.NextTxSeqNo is NOT equal to TApp.TPurseControl.LastChangeTxSeqNo +1. (Snapshot Reason Code: TPurseTxSeqNo) */ if ( pMYKI_TAPurseControl->NextTxSeqNo != (U16_t)( pMYKI_TAPurseControl->LastChangeTxSeqNo + 1 ) ) { CsErrx( "BR_LLSC_99_1 : Bypassed - TAPurseControl.NextTxSeqNo(%d) != TAPurseControl.LastChangeTxSeqNo(%d) + 1", pMYKI_TAPurseControl->NextTxSeqNo, (U16_t)( pMYKI_TAPurseControl->LastChangeTxSeqNo + 1 ) ); pData->ReturnedData.rejectReason = MYKI_BR_REJECT_REASON_PRECOMMIT_CHECK_FAILED; pData->ReturnedData.bypassCode = BYPASS_CODE( 99, 1, 6, 0 ); return RULE_RESULT_BYPASSED; } } /* end-of-for */ } /* PROCESSING */ { /* DONOTHING! */ } CsDbg( BRLL_RULE, "BR_LLSC_99_1 : Executed" ); return RULE_RESULT_EXECUTED; } /* BR_LLSC_99_1( ) */