示例#1
0
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;
}
示例#2
0
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( ) */
示例#3
0
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( ) */
示例#4
0
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( ) */
示例#5
0
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( ) */
示例#6
0
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);
}
示例#7
0
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( ) */
示例#8
0
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( ) */