project QadFinancials > class BPeriod > method MultiCompanyVerifications

Description

MultiCompanyVerifications:
This method should be called from the UI as the first action when save is pressed but only in case the MutliEntity field is filled.

When an error is returned the save-action shoudl be aborted.
When a warnign is returned the user shoudl have the option to either complete the save-process, either stop the save-process.

This method shouldl be called before the actual processing in the different entities is started (on BMultiCyProcessor)


Parameters


iiPeriodIDinputintegerID of the Period that is currently on the screen
icCompanyGroupCodeinputcharacterCompanyGroupCode: CompanyGroup that is specified on the UI
icActivityCodeinputcharacterActivityCode: this should be the current activity on this method
ocErrorWarningStringoutputcharacterErrorWarningString: This parameter will hold the error-message or the warnign-message is applicable.
To distinguish a warning from an error you can use the return-status
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFitnesse
method BPeriod.ApiMultiCompanyVerifications


program code (program1/bperiod.p)

define buffer bSharedSet for SharedSet.
    
    /* =================================================================================================================================== */
    /* MultiCompanyVerifications;                                                                                                          */
    /* This method should be called from the UI as the first action when save is pressed but only in case the MutliEntity field is filled. */
    /*   - When an error is returned the save-action should be aborted.                                                                    */
    /*   - When a warning is returned the user shoudl have the option to either complete the save-process, either stop the save-process.   */
    /* =================================================================================================================================== */
    /* Notes:                                                                                                                              */
    /*   - This method should be called before the actual processing in the different entities is started (by calling BMultiCyProcessor)   */ 
    /*   - As the processing in BMultiCyProcessor is done in different transactions, this method returns the warning- or error-msg as an   */
    /*     output parameter because it makes no sense to raise a warning after the trransaction has been commited                          */
    /* =================================================================================================================================== */
    
    
    /*================== */
    /* Start major block */
    /*================== */
    MAINVERIFICATIONEBLOCK: Do on error undo, throw : 
        
        /* ================================================================================================= */
        /* Raise an error in these cases:                                                                    */
        /*   - PeriodID is not filled or is not in the db or is not in the current company                   */
        /*   - CompanyGroupCode is not filled or invalid                                                     */
        /*   - The current-company does not belong to the CompanyGroup                                       */
        /* ================================================================================================= */
        if iiPeriodID = 0 or 
           iiPeriodID = ?
        then assign oiReturnStatus       = -1
                    ocErrorWarningString = trim(substitute(#T-95'Internal error: parameter &1 is mandatory for method &2 but was not provided.':255(797059068)T-95#,"iiPeriodID":U,"BPeriod.MultiCompanyVerifications":U)).
        if oiReturnStatus < 0 then Leave MAINVERIFICATIONEBLOCK.
        <Q-24 run PeriodByYearPeriod (all) (Read) (NoCache)
           (input ?, (CompanyId)
            input ?, (PeriodYear)
            input ?, (PeriodPeriod)
            input iiPeriodID, (PeriodId)
            output dataset tqPeriodByYearPeriod) in BPeriod>
        find tqPeriodByYearPeriod where 
             tqPeriodByYearPeriod.tiPeriod_ID = iiPeriodID
             no-lock no-error.
        if not available tqPeriodByYearPeriod
        then assign oiReturnStatus       = -1
                    ocErrorWarningString = trim(substitute(#T-17'Internal error: Unable to find the period based upon its ID (&1).':255(622600841)T-17#,string(iiPeriodID)))  + chr(10) + trim(substitute(#T-34'Method: &1':255(809651004)T-34#,"BPeriod.MultiCompanyVerifications":U)).
        if oiReturnStatus < 0 then Leave MAINVERIFICATIONEBLOCK.
        if tqPeriodByYearPeriod.tiCompany_ID <> viCompanyID
        then assign oiReturnStatus       = -1
                    ocErrorWarningString = trim(substitute(#T-49'Internal error: The entity of the period (&1) differs from the current-entity (&2).':255(975573360)T-49#,string(tqPeriodByYearPeriod.tiPeriodYear) + "/":U + string(tqPeriodByYearPeriod.tiPeriodPeriod),vcCompanyCode))  + chr(10) + trim(substitute(#T-23'Method: &1':255(809651004)T-23#,"BPeriod.MultiCompanyVerifications":U)).
        if oiReturnStatus < 0 then Leave MAINVERIFICATIONEBLOCK.
        if icCompanyGroupCode = "":U or 
           icCompanyGroupCode = ?
        then assign oiReturnStatus       = -1
                    ocErrorWarningString = trim(substitute(#T-81'Internal error: parameter &1 is mandatory for method &2 but was not provided.':255(797059068)T-81#,"icCompanyGroupCode":U,"BPeriod.MultiCompanyVerifications":U)).
        if oiReturnStatus < 0 then Leave MAINVERIFICATIONEBLOCK.
        <Q-13 run CyGroupCompanyByGrpCy (all) (Read) (NoCache)
           (input ?, (CompanyId)
            input ?, (GroupID)
            input icCompanyGroupCode, (GroupCode)
            output dataset tqCyGroupCompanyByGrpCy) in BCompanyGroup>
        if not can-find (tqCyGroupCompanyByGrpCy where 
                         tqCyGroupCompanyByGrpCy.tcCyGroupCode = icCompanyGroupCode and 
                         tqCyGroupCompanyByGrpCy.tiCompany_ID  = viCompanyID)
        then assign oiReturnStatus       = -1
                    ocErrorWarningString = trim(substitute(#T-73'The current entity (&1) should belong to the specified entity-group (&2).':255(490312612)T-73#,vcCompanyCode,icCompanyGroupCode)) + chr(10) + trim(substitute(#T-64'Method: &1':255(809651004)T-64#,"BPeriod.MultiCompanyVerifications":U)).
        if oiReturnStatus < 0 then Leave MAINVERIFICATIONEBLOCK.
        
        /* ================================================================================================= */
        /* Raise a warning in these cases:                                                                   */
        /*   - The main properties of the similar periods in the companies of the CompanyGroup differ        */
        /* ================================================================================================= */
        if oiReturnStatus >= 0 and 
           (ocErrorWarningString = "":U or 
            ocErrorWarningString = ?)
        then do :
            assign ocErrorWarningString = "":U
                   viWarningCounter     = 0.
            for each tqCyGroupCompanyByGrpCy where 
                     tqCyGroupCompanyByGrpCy.tcCyGroupCode  = icCompanyGroupCode and 
                     tqCyGroupCompanyByGrpCy.tiCompany_ID  <> viCompanyID
                     no-lock :
                <Q-31 run PeriodForStartEndDateYearPd (all) (Read) (NoCache)
                   (input tqCyGroupCompanyByGrpCy.tiCompany_ID, (CompanyId)
                    input tqPeriodByYearPeriod.tiPeriodYear, (PeriodYear)
                    input tqPeriodByYearPeriod.tiPeriodPeriod, (PeriodPeriod)
                    output dataset tqPeriodForStartEndDateYearPd) in BPeriod>
                Find first tqPeriodForStartEndDateYearPd where 
                           tqPeriodForStartEndDateYearPd.tiCompany_ID   = tqCyGroupCompanyByGrpCy.tiCompany_ID       and 
                           tqPeriodForStartEndDateYearPd.tiPeriodYear   = tqPeriodByYearPeriod.tiPeriodYear   and 
                           tqPeriodForStartEndDateYearPd.tiPeriodPeriod = tqPeriodByYearPeriod.tiPeriodPeriod and 
                           (tqPeriodForStartEndDateYearPd.ttPeriodStartDate <> tqPeriodByYearPeriod.ttPeriodStartDate or
                            tqPeriodForStartEndDateYearPd.ttPeriodEndDate   <> tqPeriodByYearPeriod.ttPeriodEndDate )
                           no-lock no-error.
                if available tqPeriodForStartEndDateYearPd 
                then do :
                    assign oiReturnStatus   = +1
                           viWarningCounter = viWarningCounter + 1.
                    if viWarningCounter < 4 /* This viWarningCounter is to limit the size of the warning in case there are many companies with this issue */
                    then ocErrorWarningString = ocErrorWarningString + chr(10) + trim(substitute(#T-74'The period in entity &1 is defined with start-date &2 and end-date &3.':255(434590287)T-74#,tqPeriodForStartEndDateYearPd.tcCompanyCode,tqPeriodForStartEndDateYearPd.ttPeriodStartDate,tqPeriodForStartEndDateYearPd.ttPeriodEndDate)).
                    else if viWarningCounter = 4 /* This viWarningCounter is to limit the size of the warning in case there are many companies with this issue */
                         then ocErrorWarningString = ocErrorWarningString + chr(10) + trim(substitute(#T-30'More entities having the same issue.':255(690016344)T-30#)).
                         else leave.
                end. /* if available tqPeriodForStartEndDateYearPd */
            end. /* for each tqCyGroupCompanyByGrpCy where */
            if ocErrorWarningString <> "":U 
            then assign ocErrorWarningString = trim(substitute(#T-89'The start and end dates of the period are different in some entities for the selected entity group.':255(226807066)T-89#)) + chr(10) + 
                                               trim(substitute(#T-75'Period &1 in the current entity is defined with start-date &2 and end-date &3.':255(500947615)T-75#,string(tqPeriodByYearPeriod.tiPeriodYear) + "/":U + string(tqPeriodByYearPeriod.tiPeriodPeriod),tqPeriodByYearPeriod.ttPeriodStartDate,tqPeriodByYearPeriod.ttPeriodEndDate)) + chr(10) + 
                                               ocErrorWarningString + chr(10) + chr(10) + 
                                               trim(substitute(#T-79'Do you want to continue?':255(598860433)T-79#)).
        end. /* if oiReturnStatus >= 0 */
        
        /* ================================================================================================= */
        /* Raise an error if the user is trying to assign Daybook mask to a entity/period, that has          */
        /* Dayook shared set then the Daybook mask                                                           */
        /* ================================================================================================= */
        if oiReturnStatus >= 0 and
           icActivityCode = "LockJournalPeriod":U
        then do:
            /* Get the closing mask shared set. It is the same as Daybook shared set */
            assign vhFcComponent = vhCacher.
            <M-55 run GetIntegerValueFromSession
               (input  viSessionID (iiSessionId), 
                input  'SharedSetForJournal':U (icDataItemName), 
                output viSharedSetJournalId (oiValue), 
                output viFcReturnSuper (oiReturnStatus)) in Cacher>
                
            /* Go through all entities of the entity group and check, if they have the same journal shared set as current entity */
            for each tqCyGroupCompanyByGrpCy where
                     tqCyGroupCompanyByGrpCy.tcCyGroupCode = icCompanyGroupCode on error undo, throw:
                
                for each bSharedSet fields (SharedSetTypeCode SharedSet_ID) no-lock where
                         bSharedSet.SharedSet_ID <> viSharedSetJournalId and
                         bSharedSet.SharedSetTypeCode = {&SHAREDSETTYPE-JOURNAL} on error undo, throw:
                    if can-find (first CompanySharedSet where
                                       CompanySharedSet.SharedSet_ID = bSharedSet.SharedSet_ID and
                                       CompanySharedSet.Company_ID = tqCyGroupCompanyByGrpCy.tiCompany_ID)
                    then do:
                        assign vcMessage            = #T-61'Entity group &1 contains entities with different daybook shared set. Closing of the daybook(s) in the entity group cannot be done.':255(533140834)T-61#
                               vcMessage            = substitute(vcMessage, icCompanyGroupCode)
                               ocErrorWarningString = substitute("&1&2&3", 
                                                                 ocErrorWarningString,
                                                                 if ocErrorWarningString = "":U then "":U else chr(10),
                                                                 vcMessage)
                               oiReturnStatus       = -1.
                        leave.
                    end. /* can-find */
                end. /* for each bSharedSet */ 
            end. /* for each tqCyGroupCompanyByGrpCy where */
        end. /* if oiReturnStatus >= 0 and */
    END. /* MAINVERIFICATIONEBLOCK */
    
    
    /* ================================================ */        
    /* Finally actions that should be done in ALL cases */
    /* ================================================ */         
    FINALLY:
        
    END FINALLY.