&ANALYZE-SUSPEND _VERSION-NUMBER UIB_v8r12
/* Procedure Description
"Data Logic Procedure Template

Use this template to create  a Data Logic Procedure."
*/
&ANALYZE-RESUME
{adecomm/appserv.i}
DEFINE VARIABLE h_Astra                    AS HANDLE          NO-UNDO.
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _XFTR "Check Version Notes Wizard" DataLogicProcedure _INLINE
/* Actions: af/cod/aftemwizcw.w ? ? ? ? */
/* MIP Update Version Notes Wizard
Check object version notes.
af/cod/aftemwizpw.w
*/
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _XFTR "Update-Object-Version" DataLogicProcedure _INLINE
/* Actions: ? ? ? ? af/sup/afverxftrp.p */
/* This has to go above the definitions sections, as that is what it modifies.
   If its not, then the definitions section will have been saved before the
   XFTR code kicks in and changes it */
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _XFTR "Definition Comments Wizard" DataLogicProcedure _INLINE
/* Actions: ? af/cod/aftemwizcw.w ? ? ? */
/* Program Definition Comment Block Wizard
Welcome to the Program Definition Comment Block Wizard. Press Next to proceed.
af/cod/aftemwizpw.w
*/
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS DataLogicProcedure 
/*********************************************************************
* Copyright (C) 2000 by Progress Software Corporation ("PSC"),       *
* 14 Oak Park, Bedford, MA 01730, and other contributors as listed   *
* below.  All Rights Reserved.                                       *
*                                                                    *
* The Initial Developer of the Original Code is PSC.  The Original   *
* Code is Progress IDE code released to open source December 1, 2000.*
*                                                                    *
* The contents of this file are subject to the Possenet Public       *
* License Version 1.0 (the "License"); you may not use this file     *
* except in compliance with the License.  A copy of the License is   *
* available as of the date of this notice at                         *
* http://www.possenet.org/license.html                               *
*                                                                    *
* Software distributed under the License is distributed on an "AS IS"*
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. You*
* should refer to the License for the specific language governing    *
* rights and limitations under the License.                          *
*                                                                    *
* Contributors:                                                      *
*                                                                    *
*********************************************************************/
/*---------------------------------------------------------------------------------
  File: gsmusplipp.p

  Description:  User Maintenance Procedure Library

  Purpose:      A procedure library (PLIP) to support maintenance of Users (gsm_user table)
                A procedure library (PLIP) to support the maintenance of the data-logic table
                The following internal procedures may be added or modified
                to act as validation to creation, modification, or deletion of
                records in the database table
                
                Client-side:
                rowObjectValidate***
                
                Server-side upon create:
                createPreTransValidate***
                createBeginTransValidate
                createEndTransValidate
                createPostTransValidate
                
                Server-side upon write (create and modify):
                writePreTransValidate***
                writeBeginTransValidate
                writeEndTransValidate
                writePostTransValidate
                
                Server-side upon delete:
                deletePreTransValidate
                deleteBeginTransValidate
                deleteEndTransValidate
                deletePostTransValidate
                
                *** The rowObjectValidate, createPreTransValidate and writePreTransValidate
                internal procedures are automatically generated by the SDO generator

  Parameters:

  History:
  --------
  (v:010000)    Task:    90000010   UserRef:    POSSE
                Date:   04/04/2001  Author:     Phil Magnay

  Update Notes: Created from Template rytemplipp.p

  (v:010001)    Task:           0   UserRef:    
                Date:   03/14/2002  Author:     Mark Davies (MIP)

  Update Notes: Fix for issue #3841 - Based on Profile fails

--------------------------------------------------------------------------------*/
/*                   This .W file was created with the Progress UIB.             */
/*-------------------------------------------------------------------------------*/

/* ***************************  Definitions  ************************** */
/* MIP-GET-OBJECT-VERSION pre-processors
   The following pre-processors are maintained automatically when the object is
   saved. They pull the object and version from Roundtable if possible so that it
   can be displayed in the about window of the container */

&scop object-name       gsmusplipp.p
DEFINE VARIABLE lv_this_object_name AS CHARACTER INITIAL "{&object-name}":U NO-UNDO.
&scop object-version    000000

/* object identifying preprocessor */
&glob   AstraPlip    yes

DEFINE VARIABLE cObjectName         AS CHARACTER NO-UNDO.

ASSIGN cObjectName = "{&object-name}":U.

&scop   mip-notify-user-on-plip-close   NO


/* Data Preprocessor Definitions */

/* Error handling definitions */
{af/sup2/afcheckerr.i &define-only = YES}

&GLOBAL-DEFINE DATA-LOGIC-TABLE gsm_user
&GLOBAL-DEFINE DATA-FIELD-DEFS "af/obj2/gsmusfullo.i"

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME


&ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 

/* ********************  Preprocessor Definitions  ******************** */

&Scoped-define PROCEDURE-TYPE DataLogicProcedure
&Scoped-define DB-AWARE yes


/* Db-Required definitions. */
&IF DEFINED(DB-REQUIRED) = 0 &THEN
    &GLOBAL-DEFINE DB-REQUIRED TRUE
&ENDIF
&GLOBAL-DEFINE DB-REQUIRED-START   &IF {&DB-REQUIRED} &THEN
&GLOBAL-DEFINE DB-REQUIRED-END     &ENDIF





/* _UIB-PREPROCESSOR-BLOCK-END */
&ANALYZE-RESUME


/* ************************  Function Prototypes ********************** */

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD addProfileTypes DataLogicProcedure  _DB-REQUIRED
FUNCTION addProfileTypes RETURNS HANDLE
  ( INPUT phTT              AS HANDLE,
    INPUT pdUserObj         AS DECIMAL )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD addSecurityTypes DataLogicProcedure  _DB-REQUIRED
FUNCTION addSecurityTypes RETURNS HANDLE
  ( INPUT phTT      AS HANDLE )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculateconfirm_password DataLogicProcedure  _DB-REQUIRED
FUNCTION calculateconfirm_password RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatec_profile_user DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatec_profile_user RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatefmt_password_create_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_create_time RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatefmt_password_expire_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_expire_time RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatefmt_password_fail_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_fail_time RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatefmt_user_create_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_user_create_time RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculatefmt_user_login_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_user_login_time RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD calculateoldPasswordExpiryDate DataLogicProcedure  _DB-REQUIRED
FUNCTION calculateoldPasswordExpiryDate RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD createTypesTT DataLogicProcedure  _DB-REQUIRED
FUNCTION createTypesTT RETURNS HANDLE
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD getProfileUser DataLogicProcedure  _DB-REQUIRED
FUNCTION getProfileUser RETURNS CHARACTER
  ( /* parameter-definitions */ )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD isFieldBlank DataLogicProcedure 
FUNCTION isFieldBlank RETURNS LOGICAL
  ( INPUT pcFieldValue AS CHARACTER )  FORWARD.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME


/* *********************** Procedure Settings ************************ */

&ANALYZE-SUSPEND _PROCEDURE-SETTINGS
/* Settings for THIS-PROCEDURE
   Type: DataLogicProcedure
   Allow: 
   Frames: 0
   Add Fields to: Neither
   Other Settings: CODE-ONLY COMPILE APPSERVER DB-AWARE
 */
&ANALYZE-RESUME _END-PROCEDURE-SETTINGS

/* *************************  Create Window  ************************** */

&ANALYZE-SUSPEND _CREATE-WINDOW
/* DESIGN Window definition (used by the UIB) 
  CREATE WINDOW DataLogicProcedure ASSIGN
         HEIGHT             = 24.57
         WIDTH              = 56.6.
/* END WINDOW DEFINITION */
                                                                        */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _INCLUDED-LIB DataLogicProcedure 
/* ************************* Included-Libraries *********************** */

{src/adm2/logic.i}

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME


 


&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK DataLogicProcedure 


/* ***************************  Main Block  ******************************* */

{ry/app/ryplipmain.i}

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME


/* **********************  Internal Procedures  *********************** */

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE cascadeTypesData DataLogicProcedure  _DB-REQUIRED
PROCEDURE cascadeTypesData :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE INPUT  PARAMETER pdUserObj            AS DECIMAL      NO-UNDO.
   DEFINE INPUT  PARAMETER pdCompanyObj         AS DECIMAL      NO-UNDO.

   DEFINE INPUT PARAMETER TABLE-HANDLE phTT.
   DEFINE OUTPUT PARAMETER ocErrorText          AS CHARACTER    NO-UNDO.

   DEFINE BUFFER b_gsm_user                     FOR gsm_user.

   DEFINE VARIABLE hTTQuery                     AS HANDLE       NO-UNDO.
   DEFINE VARIABLE cTTQuery                     AS CHARACTER    NO-UNDO.
   DEFINE VARIABLE hTTBuffer                    AS HANDLE       NO-UNDO.
   DEFINE VARIABLE hQuery                       AS HANDLE       NO-UNDO.
   DEFINE VARIABLE cQuery                       AS CHARACTER    NO-UNDO.
   DEFINE VARIABLE hBuffer                      AS HANDLE       NO-UNDO.
   DEFINE VARIABLE hUserObjField                AS HANDLE       NO-UNDO.
   DEFINE VARIABLE hSelectedField               AS HANDLE       NO-UNDO.
   DEFINE VARIABLE cErrorText                   AS CHARACTER    NO-UNDO.

   CREATE QUERY hQuery.
   hQuery:SET-BUFFERS(BUFFER b_gsm_user:HANDLE).
   ASSIGN cQuery = "FOR EACH b_gsm_user NO-LOCK
                       WHERE b_gsm_user.created_from_profile_user_obj EQ DECIMAL('" + STRING(pdUserObj) + "')":U.
   hQuery:QUERY-PREPARE(cQuery).

   hTTBuffer = phTT:DEFAULT-BUFFER-HANDLE.

   CREATE QUERY hTTQuery.
   hTTQuery:ADD-BUFFER(hTTBuffer).
   ASSIGN cTTQuery = "FOR EACH ":U + hTTBuffer:NAME + " NO-LOCK":U.
   hTTQuery:QUERY-PREPARE(cTTQuery).
   hQuery:QUERY-OPEN() NO-ERROR.
   hQuery:GET-FIRST().
   hBuffer = BUFFER b_gsm_user:HANDLE.
   DO WHILE hBuffer:AVAILABLE:

       hUserObjField = hBuffer:BUFFER-FIELD("user_obj":U).

       hTTQuery:QUERY-OPEN() NO-ERROR.
       hTTQuery:GET-FIRST().
       DO WHILE hTTBuffer:AVAILABLE:
           hSelectedField = hTTBuffer:BUFFER-FIELD("Selected":U).
           IF hSelectedField:BUFFER-VALUE THEN
           DO:
               RUN cascadeUser IN THIS-PROCEDURE
                   (INPUT  pdUserObj,
                    INPUT  hUserObjField:BUFFER-VALUE,
                    INPUT  hTTBuffer,
                    OUTPUT cErrorText).
               ASSIGN
                   ocErrorText  = ocErrorText + (IF NUM-ENTRIES(ocErrorText,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                                  cErrorText.
           END.
           hTTQuery:GET-NEXT().
       END.
       hQuery:GET-NEXT().
   END.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE cascadeUser DataLogicProcedure  _DB-REQUIRED
PROCEDURE cascadeUser :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

  DEFINE INPUT  PARAMETER pdSourceUserObj     AS DECIMAL     NO-UNDO.
  DEFINE INPUT  PARAMETER pdUserObj           AS DECIMAL     NO-UNDO.
  DEFINE INPUT  PARAMETER phBuffer            AS HANDLE      NO-UNDO.

  DEFINE OUTPUT PARAMETER ocErrorText         AS CHARACTER   NO-UNDO.

  DEFINE BUFFER b_gsm_profile_data            FOR gsm_profile_data.
  DEFINE BUFFER b_gsm_user_allocation         FOR gsm_user_allocation.

  DEFINE VARIABLE hField                      AS HANDLE      NO-UNDO.
  DEFINE VARIABLE cClass                      AS CHARACTER   NO-UNDO.
  DEFINE VARIABLE cProfileType                AS CHARACTER   NO-UNDO.
  DEFINE VARIABLE cSecurityType               AS CHARACTER   NO-UNDO.
  DEFINE VARIABLE cEntityMnemonic             AS CHARACTER   NO-UNDO.
  DEFINE VARIABLE cErrorText                  AS CHARACTER   NO-UNDO.

  hField = phBuffer:BUFFER-FIELD("Class":U).
  cClass = hField:BUFFER-VALUE.

  IF cClass EQ "Profile Data":U THEN
  DO:
      hField = phBuffer:BUFFER-FIELD("Type":U).
      cProfileType = hField:BUFFER-VALUE.

      OPEN QUERY qProfileData
          FOR EACH gsc_profile_type
             WHERE gsc_profile_type.profile_type_code = cProfileType,
              EACH gsc_profile_code NO-LOCK
             WHERE gsc_profile_code.profile_type_obj = gsc_profile_type.profile_type_obj,
              EACH gsm_profile_data NO-LOCK
             WHERE gsm_profile_data.USER_obj         = pdSourceUserObj
               AND gsm_profile_data.profile_type_obj = gsc_profile_type.profile_type_obj
               AND gsm_profile_data.profile_code_obj = gsc_profile_code.profile_code_obj
               AND gsm_profile_data.CONTEXT_id       = "":U.
      GET FIRST qProfileData NO-LOCK.
      profile-data-block:
      DO FOR b_gsm_profile_data TRANSACTION ON ERROR UNDO profile-data-block, LEAVE profile-data-block 
          WHILE AVAILABLE gsm_profile_data:

          FIND FIRST b_gsm_profile_data EXCLUSIVE-LOCK
               WHERE b_gsm_profile_data.USER_obj         = pdUserObj
                 AND b_gsm_profile_data.profile_type_obj = gsc_profile_type.profile_type_obj
                 AND b_gsm_profile_data.profile_code_obj = gsc_profile_code.profile_code_obj
                 AND b_gsm_profile_data.profile_data_key = gsm_profile_data.profile_data_key
                 AND b_gsm_profile_data.CONTEXT_id       = "":U
              NO-ERROR.
          IF NOT AVAILABLE b_gsm_profile_data THEN
             CREATE b_gsm_profile_data     NO-ERROR.

          BUFFER-COPY gsm_profile_data  
              EXCEPT profile_data_obj
              TO b_gsm_profile_data
              ASSIGN b_gsm_profile_data.USER_obj = pdUserObj.          
          VALIDATE b_gsm_profile_data NO-ERROR.
          {af/sup2/afcheckerr.i &no-return = YES}    
          ocErrorText = cMessageList.
          IF ocErrorText <> "":U THEN UNDO profile-data-block, LEAVE profile-data-block.
          GET NEXT qProfileData NO-LOCK.
      END.

  END.
  ELSE
  IF cClass EQ "Security":U THEN
  DO:

      hField = phBuffer:BUFFER-FIELD("type":U).
      cSecurityType = hField:BUFFER-VALUE.
      hField = phBuffer:BUFFER-FIELD("entity_mnemonic":U).
      cEntityMnemonic = hField:BUFFER-VALUE.

      CASE cSecurityType:
          WHEN "Menu Structures":U THEN
          DO:
              OPEN QUERY qMenuStructures
                  FOR EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.USER_obj               = pdSourceUserObj
                       AND gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic.
              GET FIRST qMenuStructures NO-LOCK.
              menu-structures-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO menu-structures-block, LEAVE menu-structures-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation 
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO menu-structures-block, LEAVE menu-structures-block.                
                  GET NEXT qMenuStructures NO-LOCK.
              END.
          END.
          WHEN "Menu Items":U THEN
          DO:
              OPEN QUERY qMenuItems
                  FOR EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.USER_obj               = pdSourceUserObj
                       AND gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic.
              GET FIRST qMenuItems NO-LOCK.
              menu-items-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO menu-items-block, LEAVE menu-items-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO menu-items-block, LEAVE menu-items-block.                
                  GET NEXT qMenuItems NO-LOCK.
              END.
          END.
          WHEN "Access Tokens":U THEN
          DO:
              OPEN QUERY qAccessTokens
                  FOR EACH gsm_security_structure NO-LOCK
                     WHERE gsm_security_structure.owning_entity_mnemonic = "GSMTO":U,
                      EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic
                       AND gsm_user_allocation.owning_obj             = gsm_security_structure.security_structure_obj
                       AND gsm_user_allocation.USER_obj               = pdSourceUserObj.
              GET FIRST qAccessTokens NO-LOCK.
              access-tokens-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO access-tokens-block, LEAVE access-tokens-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO access-tokens-block, LEAVE access-tokens-block.                
                  GET NEXT qAccessTokens NO-LOCK.
              END.
          END.
          WHEN "Fields":U THEN
          DO:
              OPEN QUERY qFields
                  FOR EACH gsm_security_structure NO-LOCK
                     WHERE gsm_security_structure.owning_entity_mnemonic = "GSMFF":U,
                      EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic
                       AND gsm_user_allocation.owning_obj             = gsm_security_structure.security_structure_obj
                       AND gsm_user_allocation.USER_obj               = pdSourceUserObj.
              GET FIRST qFields NO-LOCK.
              fields-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO fields-block, LEAVE fields-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO fields-block, LEAVE fields-block.                
                  GET NEXT qFields NO-LOCK.
              END.
          END.
          WHEN "Data Ranges":U THEN
          DO:
              OPEN QUERY qDataRanges
                  FOR EACH gsm_security_structure NO-LOCK
                     WHERE gsm_security_structure.owning_entity_mnemonic = "GSMRA":U,
                      EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic
                       AND gsm_user_allocation.owning_obj             = gsm_security_structure.security_structure_obj
                       AND gsm_user_allocation.USER_obj               = pdSourceUserObj.
              GET FIRST qDataRanges NO-LOCK.
              data-ranges-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO data-ranges-block, LEAVE data-ranges-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO data-ranges-block, LEAVE data-ranges-block.                
                  GET NEXT qDataRanges NO-LOCK.
              END.
          END.
          WHEN "Data Records":U THEN
          DO:
              OPEN QUERY qDataRecords
                  FOR EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.owning_obj             = gsm_security_structure.security_structure_obj
                       AND gsm_user_allocation.USER_obj               = pdSourceUserObj
                       AND NOT CAN-DO("GSMMS,GSMMI,GSMSS,GSMLG":U,gsm_user_allocation.owning_entity_mnemonic).
              GET FIRST qDataRecords NO-LOCK.
              data-records-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO data-records-block, LEAVE data-records-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO data-records-block, LEAVE data-records-block.                
                  GET NEXT qDataRecords NO-LOCK.
              END.
          END.
          WHEN "Login Companies":U THEN
          DO:
              OPEN QUERY qLoginCompanies
                  FOR EACH gsm_user_allocation NO-LOCK
                     WHERE gsm_user_allocation.USER_obj               = pdSourceUserObj
                       AND gsm_user_allocation.owning_entity_mnemonic = cEntityMnemonic.
              GET FIRST qLoginCompanies NO-LOCK.
              login-companies-block:
              DO FOR b_gsm_user_allocation TRANSACTION ON ERROR UNDO login-companies-block, LEAVE login-companies-block 
                  WHILE AVAILABLE gsm_user_allocation:

                  FIND FIRST b_gsm_user_allocation EXCLUSIVE-LOCK
                       WHERE b_gsm_user_allocation.USER_obj               = pdUserObj
                         AND b_gsm_user_allocation.login_organisation_obj = gsm_user_allocation.login_organisation_obj
                         AND b_gsm_user_allocation.owning_entity_mnemonic = gsm_user_allocation.owning_entity_mnemonic
                         AND b_gsm_user_allocation.owning_obj             = gsm_user_allocation.owning_obj
                      NO-ERROR.
                  IF NOT AVAILABLE b_gsm_user_allocation THEN
                     CREATE b_gsm_user_allocation     NO-ERROR.

                  BUFFER-COPY gsm_user_allocation  
                       EXCEPT gsm_user_allocation.user_allocation_obj
                           TO b_gsm_user_allocation
                       ASSIGN b_gsm_user_allocation.USER_obj = pdUserObj.
                  VALIDATE b_gsm_user_allocation NO-ERROR.
                  {af/sup2/afcheckerr.i &no-return = YES}    
                  ocErrorText = cMessageList.
                  IF ocErrorText <> "":U THEN UNDO login-companies-block, LEAVE login-companies-block.                
                  GET NEXT qLoginCompanies NO-LOCK.
              END.
          END.
      END CASE.

  END.

  OPEN QUERY qUser
      FOR EACH gsm_user NO-LOCK
         WHERE gsm_user.created_from_profile_user_obj = pdUserObj.
  GET FIRST qUser NO-LOCK.
  DO WHILE AVAILABLE gsm_user:
      RUN cascadeUser IN THIS-PROCEDURE
          (INPUT  pdSourceUserObj,
           INPUT  gsm_user.USER_obj,
           INPUT  phBuffer,
           OUTPUT cErrorText).
      ASSIGN
          ocErrorText  = ocErrorText + (IF NUM-ENTRIES(ocErrorText,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                         cErrorText.
      GET NEXT qUser.
  END.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE createDefaultGroupLink DataLogicProcedure  _DB-REQUIRED
PROCEDURE createDefaultGroupLink :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

    DEFINE INPUT PARAMETER pdUserObj           AS DECIMAL    NO-UNDO.
    DEFINE INPUT PARAMETER pdGroupObj          AS DECIMAL    NO-UNDO.
    DEFINE INPUT PARAMETER pdOrganisationObj   AS DECIMAL    NO-UNDO.    

    DEFINE VARIABLE cMessageList        AS CHARACTER  NO-UNDO.
    DEFINE BUFFER gsm_group_allocation FOR gsm_group_allocation.

    CREATE gsm_group_allocation NO-ERROR.
    IF RETURN-VALUE <> "":U THEN RETURN RETURN-VALUE.
      
    ASSIGN gsm_group_allocation.user_obj          = pdUserObj
           gsm_group_allocation.group_user_obj    = pdGroupObj
           gsm_group_allocation.login_company_obj = pdOrganisationObj
           NO-ERROR.

    VALIDATE gsm_group_allocation NO-ERROR.
    IF RETURN-VALUE <> "":U THEN
        ASSIGN cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) +
                              RETURN-VALUE.
                              
    RETURN cMessageList.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE createEndTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE createEndTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE createPostTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE createPostTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

    DEFINE VARIABLE cMessageList              AS CHARACTER    NO-UNDO.
    DEFINE VARIABLE cValueList                AS CHARACTER    NO-UNDO.

    DEFINE BUFFER sec_gsm_user                FOR gsm_user.
    DEFINE BUFFER gsm_user_allocation         FOR gsm_user_allocation.

    /* Link the User to all the Default Groups available*/
    FOR EACH sec_gsm_user NO-LOCK
       WHERE sec_gsm_user.security_group         = TRUE
         AND sec_gsm_user.default_security_group = TRUE
         AND sec_gsm_user.DISABLED               = FALSE:

      /* if group  is allocated to all organisations, create one link to the group for all organisations */
      IF NOT(CAN-FIND(FIRST gsm_user_allocation NO-LOCK
                      WHERE gsm_user_allocation.user_obj               = sec_gsm_user.user_obj
                        AND gsm_user_allocation.owning_entity_mnemonic = "GSMLG":U)) 
      THEN DO:
          /*create a group link with organisation_obj = 0, signifying all companies*/
          RUN createDefaultGroupLink (INPUT b_gsm_user.user_obj, INPUT sec_gsm_user.user_obj, INPUT 0) NO-ERROR.
          IF RETURN-VALUE <> "":U THEN
              ASSIGN cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                                    RETURN-VALUE.
      END.
      ELSE
          /* create a seperate group link for each organisation that the group is linked to*/
          FOR EACH gsm_user_allocation NO-LOCK
             WHERE gsm_user_allocation.user_obj                = sec_gsm_user.user_obj
               AND gsm_user_allocation.owning_entity_mnemonic  = "GSMLG":U:
      
              RUN createDefaultGroupLink (INPUT b_gsm_user.user_obj, INPUT sec_gsm_user.user_obj, INPUT gsm_user_allocation.owning_obj) NO-ERROR.
              IF RETURN-VALUE <> "":U THEN
                  ASSIGN cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                                        RETURN-VALUE.
          END.
    END.

    RETURN cMessageList.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE createPreTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE createPreTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

    DEFINE VARIABLE cMessageList              AS CHARACTER    NO-UNDO.
    DEFINE VARIABLE cValueList                AS CHARACTER    NO-UNDO.

    IF CAN-FIND(FIRST gsm_user
                WHERE gsm_user.user_login_name = b_gsm_user.user_login_name) THEN
    DO:
        ASSIGN
           cValueList    = STRING(b_gsm_user.user_login_name)
           cMessageList  = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                           {af/sup2/aferrortxt.i 'AF' '8' 'gsm_user' '' "'user_login_name, '" cValueList }
                           .
    END.

    ASSIGN
        b_gsm_user.user_creation_date = TODAY
        b_gsm_user.user_creation_time = TIME
        .

    RETURN cMessageList.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE deleteBeginTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE deleteBeginTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE deleteEndTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE deleteEndTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE deletePostTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE deletePostTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE deletePreTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE deletePreTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE development_userValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE development_userValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE INPUT PARAMETER plDevelopmentUser     AS LOGICAL   NO-UNDO.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE getTypesResultSet DataLogicProcedure  _DB-REQUIRED
PROCEDURE getTypesResultSet :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE INPUT  PARAMETER pdUserObj            AS DECIMAL      NO-UNDO.
   DEFINE INPUT  PARAMETER pdCompanyObj         AS DECIMAL      NO-UNDO.

   DEFINE OUTPUT PARAMETER TABLE-HANDLE ohTT.
   DEFINE OUTPUT PARAMETER ocErrorText          AS CHARACTER    NO-UNDO.

   DEFINE VARIABLE hTT                          AS HANDLE       NO-UNDO.

   /* Create dynamic temp table */
   hTT = createTypesTT().

   /* Add security type records to the temp table */
   hTT = addSecurityTypes(hTT).

   /* Add profile type records to the temp table */
   hTT = addProfileTypes(hTT,pdUserObj).

   ohTT = hTT.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE killPlip DataLogicProcedure 
PROCEDURE killPlip :
/*------------------------------------------------------------------------------
  Purpose:     entry point to instantly kill the plip if it should get lost in memory
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

  {ry/app/ryplipkill.i}

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE objectDescription DataLogicProcedure 
PROCEDURE objectDescription :
/*------------------------------------------------------------------------------
  Purpose:     Pass out a description of the PLIP, used in Plip temp-table
  Parameters:  <none>
  Notes:       This should be changed manually for each plip
------------------------------------------------------------------------------*/

  DEFINE OUTPUT PARAMETER cDescription AS CHARACTER NO-UNDO.

  ASSIGN cDescription = "Dynamics User Control PLIP".

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE plipSetup DataLogicProcedure 
PROCEDURE plipSetup :
/*------------------------------------------------------------------------------
  Purpose:    Run by main-block of PLIP at startup of PLIP
  Parameters: <none>
  Notes:       
------------------------------------------------------------------------------*/

  {ry/app/ryplipsetu.i}  

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE plipShutdown DataLogicProcedure 
PROCEDURE plipShutdown :
/*------------------------------------------------------------------------------
  Purpose:     This procedure will be run just before the calling program 
               terminates
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

  {ry/app/ryplipshut.i}

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE rowObjectValidate DataLogicProcedure 
PROCEDURE rowObjectValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

  DEFINE VARIABLE cMessageList    AS CHARACTER    NO-UNDO.
  DEFINE VARIABLE cValueList      AS CHARACTER    NO-UNDO.

  IF LENGTH(b_gsm_user.user_login_name) = 0 OR LENGTH(b_gsm_user.user_login_name) = ? THEN
    ASSIGN
      cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                    {af/sup2/aferrortxt.i 'AF' '1' 'b_gsm_user' 'user_login_name' "'User Login Name'"}.

  IF LENGTH(b_gsm_user.user_full_name) = 0 OR LENGTH(b_gsm_user.user_full_name) = ? THEN
    ASSIGN
      cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                    {af/sup2/aferrortxt.i 'AF' '1' 'b_gsm_user' 'user_full_name' "'User Full Name'"}.

  IF b_gsm_user.password_minimum_length GT 0 AND LENGTH(b_gsm_user.user_password) LT b_gsm_user.password_minimum_length THEN
      ASSIGN
        cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                      {af/sup2/aferrortxt.i 'AF' '33' 'b_gsm_user' 'user_password' "'User password'" "'the password minimum length'" "'b_gsm_user.user_password'"}.

  IF b_gsm_user.user_password NE "":U AND b_gsm_user.user_password NE b_gsm_user.confirm_password THEN
      ASSIGN
        cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                      {af/sup2/aferrortxt.i 'AF' '144'}.

  /* To check if the password expiry date has changed, we need the "before image" */

  IF  b_gsm_user.password_expiry_date <> ?
  AND ((b_gsm_user.rowMod = "A":U OR b_gsm_user.rowMod = "C":U)
    OR (b_gsm_user.rowMod = "U":U AND b_gsm_user.password_expiry_date <> b_gsm_user.oldPasswordExpiryDate))
  AND b_gsm_user.password_expiry_date LT TODAY THEN
      ASSIGN
        cMessageList = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                      {af/sup2/aferrortxt.i 'AF' '9' 'b_gsm_user' 'password_expiry_date' "'password expiry'" "'greater than or equal to today'"}.

  ERROR-STATUS:ERROR = NO.
  RETURN cMessageList.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE updatePasswordHistory DataLogicProcedure  _DB-REQUIRED
PROCEDURE updatePasswordHistory :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE INPUT PARAMETER pdUserObj     AS DECIMAL      NO-UNDO.
   DEFINE INPUT PARAMETER pcOldPassword AS CHARACTER    NO-UNDO.

   DEFINE BUFFER b_gst_password_history FOR gst_password_history.

   DEFINE VARIABLE dCurrentUserObj      AS DECIMAL      NO-UNDO.
   DEFINE VARIABLE cErrorText           AS CHARACTER    NO-UNDO.

   dCurrentUserObj = DYNAMIC-FUNCTION("getPropertyList":U IN gshSessionManager,
                                      INPUT "CurrentUserObj":U, 
                                      INPUT TRUE).
   password-block:
   DO FOR b_gst_password_history ON ERROR UNDO password-block, LEAVE password-block:
       CREATE b_gst_password_history NO-ERROR.
       ASSIGN
           b_gst_password_history.USER_obj             = pdUserObj
           b_gst_password_history.OLD_password         = pcOldPassword
           b_gst_password_history.password_change_date = TODAY
           b_gst_password_history.password_change_time = TIME
           b_gst_password_history.changed_by_user_obj  = dCurrentUserObj
           .
       VALIDATE b_gst_password_history NO-ERROR.
       {af/sup2/afcheckerr.i &no-return = YES}    
       cErrorText = cMessageList.
       IF cErrorText <> "":U THEN UNDO password-block, LEAVE password-block.
   END.

   RETURN cErrorText.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE writeBeginTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE writeBeginTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE writeEndTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE writeEndTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE VARIABLE cMessageList              AS CHARACTER    NO-UNDO.

   /* Check if the password has been modified */
   IF isCreate() OR b_gsm_user.user_password NE old_gsm_user.user_password THEN
   DO:

      /* If Update password history flag is set and the password has been changed,
         create a history record in gst_password_history */
       IF b_gsm_user.update_password_history THEN
       DO:
          RUN updatePasswordHistory IN THIS-PROCEDURE
              (INPUT b_gsm_user.user_obj,
               INPUT (IF isCreate() THEN "":U ELSE old_gsm_user.user_password)).
          IF RETURN-VALUE NE "":U THEN
              cMessageList = RETURN-VALUE.
       END.
   END.

   RETURN cMessageLIst.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE writePostTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE writePostTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE writePreTransValidate DataLogicProcedure  _DB-REQUIRED
PROCEDURE writePreTransValidate :
/*------------------------------------------------------------------------------
  Purpose:     
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/

   DEFINE VARIABLE cMessageList              AS CHARACTER    NO-UNDO.
   DEFINE VARIABLE cValueList                AS CHARACTER    NO-UNDO.

   /* Check user_login_name uniqueness constraint */
   IF NOT isCreate() AND 
      CAN-FIND(FIRST gsm_user
               WHERE gsm_user.user_login_name EQ b_gsm_user.user_login_name
                 AND ROWID(gsm_user)          NE TO-ROWID(ENTRY(1,b_gsm_user.RowIdent))) THEN
   DO:
      ASSIGN
          cValueList    = STRING(b_gsm_user.user_login_name)
          cMessageList  = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                         {af/sup2/aferrortxt.i 'AF' '8' 'gsm_user' '' "'user_login_name, '" cValueList }
                         .
   END.

   /* If profile_user is toggled off, then raise error if other users exist
      which have been created from this profile user */
   /* Referential integrity check for Based on Profile user foreign key value */
   IF NOT isCreate() AND NOT b_gsm_user.profile_user AND old_gsm_user.profile_user
       AND CAN-FIND(FIRST gsm_user 
                    WHERE gsm_user.created_from_profile_user_obj EQ b_gsm_user.user_obj) THEN
   DO:
       ASSIGN
         cMessageList  = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                         {af/sup2/aferrortxt.i 'AF' '145'}.
   END.

   /* Disallow the Based on Profile user foreign key value to be equal to the current user record */

   IF NOT isCreate()
   AND b_gsm_user.created_from_profile_user EQ b_gsm_user.user_obj AND 
       b_gsm_user.created_from_profile_user <> 0 THEN
   DO:
       ASSIGN
         cMessageList  = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                         {af/sup2/aferrortxt.i 'AF' '146'}.
   END.

   /* Referential integrity check for Based on Profile user foreign key value */
   IF isCreate() OR b_gsm_user.created_from_profile_user_obj NE old_gsm_user.created_from_profile_user_obj  THEN
   DO:   
     IF NOT(CAN-FIND(FIRST gsm_user 
                      WHERE gsm_user.user_obj = b_gsm_user.created_from_profile_user_obj)) THEN 
      DO:
         ASSIGN b_gsm_user.created_from_profile_user_obj = 0 .
      END.
   END.

   /* Referential integrity check for default login company foreign key value */
   IF isCreate() OR b_gsm_user.default_login_company_obj NE old_gsm_user.default_login_company_obj  THEN
   DO:
      IF NOT(CAN-FIND(FIRST gsm_login_company 
                      WHERE gsm_login_company.login_company_obj = b_gsm_user.default_login_company_obj)) THEN 
      DO:
         ASSIGN b_gsm_user.default_login_company_obj = 0 .
      END.
   END.

   /* Referential integrity check for language foreign key value */
   IF isCreate() OR b_gsm_user.language_obj NE old_gsm_user.language_obj  THEN
   DO:
      IF NOT(CAN-FIND(FIRST gsc_language 
                      WHERE gsc_language.language_obj = b_gsm_user.language_obj)) THEN 
      DO:
         ASSIGN b_gsm_user.language_obj = 0 .
      END.
   END.

   /* Referential integrity check for user category foreign key value */
   IF isCreate() OR b_gsm_user.user_category_obj NE old_gsm_user.user_category_obj  THEN
   DO:
       IF NOT(CAN-FIND(FIRST gsm_user_category 
                       WHERE gsm_user_category.user_category_obj = b_gsm_user.user_category_obj)) THEN 
       DO:
           ASSIGN
              cValueList    = STRING(b_gsm_user.user_login_name)
              cMessageList  = cMessageList + (IF NUM-ENTRIES(cMessageList,CHR(3)) > 0 THEN CHR(3) ELSE '':U) + 
                              {af/sup2/aferrortxt.i 'AF' '5' 'gsm_user' '' "'user_category_obj, '" "'User Category'" }.
       END.
   END.

   IF isCreate() OR b_gsm_user.user_password NE old_gsm_user.user_password THEN
   DO:

       IF b_gsm_user.user_password NE "":U THEN
          ASSIGN b_gsm_user.user_password    = ENCODE(b_gsm_user.user_password)
                 b_gsm_user.confirm_password = ENCODE(b_gsm_user.confirm_password).

       ASSIGN
           b_gsm_user.password_creation_date = TODAY
           b_gsm_user.password_creation_time = TIME.
           .

   END.

   RETURN cMessageList.

END PROCEDURE.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

/* ************************  Function Implementations ***************** */

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION addProfileTypes DataLogicProcedure  _DB-REQUIRED
FUNCTION addProfileTypes RETURNS HANDLE
  ( INPUT phTT              AS HANDLE,
    INPUT pdUserObj         AS DECIMAL ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  
  DEFINE VARIABLE hTTBuffer         AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTTField          AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hQuery            AS HANDLE     NO-UNDO.
  DEFINE VARIABLE cQuery            AS CHARACTER  NO-UNDO.

  /* Create query */
  CREATE QUERY hQuery NO-ERROR.
  hQuery:ADD-BUFFER(BUFFER gsc_profile_type:HANDLE).
  hQuery:ADD-BUFFER(BUFFER gsm_profile_data:HANDLE).
  ASSIGN 
      cQuery = "FOR EACH gsc_profile_type NO-LOCK,":U
             + "   FIRST gsm_profile_data NO-LOCK":U
             + "   WHERE gsm_profile_data.profile_type_obj EQ gsc_profile_type.profile_type_obj":U
             + "     AND gsm_profile_data.user_obj EQ DECIMAL('" + STRING(pdUserObj) + "')":U
             + "     AND gsm_profile_data.context_id EQ ''"
      .

  hQuery:QUERY-PREPARE(cQuery).
  hQuery:QUERY-OPEN().

/* Get the handle to the buffer for the temp-table */
  hTTBuffer = phTT:DEFAULT-BUFFER-HANDLE.

  hQuery:GET-FIRST() NO-ERROR.
  DO WHILE NOT hQuery:QUERY-OFF-END:

      /* Create a temp-table record */
      hTTBuffer:BUFFER-CREATE().

      hTTField = hTTBuffer:BUFFER-FIELD('rowIdent':U).
      hTTField:BUFFER-VALUE = STRING(ROWID(gsc_profile_type)).

      hTTField = hTTBuffer:BUFFER-FIELD('type':U).
      hTTField:BUFFER-VALUE = gsc_profile_type.profile_type_code.

      hTTField = hTTBuffer:BUFFER-FIELD('description':U).
      hTTField:BUFFER-VALUE = gsc_profile_type.profile_type_description.

      hTTField = hTTBuffer:BUFFER-FIELD('class':U).
      hTTField:BUFFER-VALUE = 'Profile Data':U.

      hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
      hTTField:BUFFER-VALUE = 'GSCPT':U.

      hQuery:GET-NEXT() NO-ERROR.
  END.

  RETURN phTT.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION addSecurityTypes DataLogicProcedure  _DB-REQUIRED
FUNCTION addSecurityTypes RETURNS HANDLE
  ( INPUT phTT      AS HANDLE ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/

  DEFINE VARIABLE hTTBuffer         AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTTField          AS HANDLE     NO-UNDO.

  /* Get the handle to the buffer for the temp-table */
  hTTBuffer = phTT:DEFAULT-BUFFER-HANDLE.

  /* MENU STRUCTURES */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Menu Structures".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon Menu Stuctures".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMMS':U.

  /* MENU ITEMS */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Menu Items".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon Menu Items".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMMI':U.

  /* ACCESS TOKENS */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Access Tokens".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon tokens such as buttons, tab pages, etc".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMMI':U.

  /* FIELDS */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Fields".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon user interface input fields".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMSS':U.

  /* DATA RANGES */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Data Ranges".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon ranges of data".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMSS':U.

  /* DATA RECORDS */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Data Records".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon records in database tables".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = '':U.

  /* LOGIN COMPANIES */
  /* Create a temp-table record */
  hTTBuffer:BUFFER-CREATE().
  hTTField = hTTBuffer:BUFFER-FIELD('type':U).
  hTTField:BUFFER-VALUE = "Login Companies".
  hTTField = hTTBuffer:BUFFER-FIELD('description':U).
  hTTField:BUFFER-VALUE = "Security restrictions upon login companies".
  hTTField = hTTBuffer:BUFFER-FIELD('class':U).
  hTTField:BUFFER-VALUE = 'Security':U.
  hTTField = hTTBuffer:BUFFER-FIELD('entity_mnemonic':U).
  hTTField:BUFFER-VALUE = 'GSMLG':U.

  RETURN phTT.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculateconfirm_password DataLogicProcedure  _DB-REQUIRED
FUNCTION calculateconfirm_password RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hPassword   AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hPassword  = hRowObject:BUFFER-FIELD("user_password":U).

  RETURN STRING(hPassword:BUFFER-VALUE).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatec_profile_user DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatec_profile_user RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE cProfileUser AS CHARACTER  NO-UNDO.

  cProfileUser = DYNAMIC-FUNCTION("getProfileUser":U IN TARGET-PROCEDURE).
  RETURN cProfileUser.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatefmt_password_create_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_create_time RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTime       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hTime      = hRowObject:BUFFER-FIELD("password_creation_time":U).

  RETURN STRING(hTime:BUFFER-VALUE,"HH:MM:SS":U).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatefmt_password_expire_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_expire_time RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTime       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hTime      = hRowObject:BUFFER-FIELD("password_expiry_time":U).

  RETURN STRING(hTime:BUFFER-VALUE,"HH:MM:SS":U).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatefmt_password_fail_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_password_fail_time RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTime       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hTime      = hRowObject:BUFFER-FIELD("password_fail_time":U).

  RETURN STRING(hTime:BUFFER-VALUE,"HH:MM:SS":U).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatefmt_user_create_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_user_create_time RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTime       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hTime      = hRowObject:BUFFER-FIELD("user_creation_time":U).

  RETURN STRING(hTime:BUFFER-VALUE,"HH:MM:SS":U).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculatefmt_user_login_time DataLogicProcedure  _DB-REQUIRED
FUNCTION calculatefmt_user_login_time RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hTime       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hTime      = hRowObject:BUFFER-FIELD("last_login_time":U).

  RETURN STRING(hTime:BUFFER-VALUE,"HH:MM:SS":U).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION calculateoldPasswordExpiryDate DataLogicProcedure  _DB-REQUIRED
FUNCTION calculateoldPasswordExpiryDate RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hDate       AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hDate      = hRowObject:BUFFER-FIELD("password_expiry_date":U).

  RETURN STRING(hDate:BUFFER-VALUE).

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION createTypesTT DataLogicProcedure  _DB-REQUIRED
FUNCTION createTypesTT RETURNS HANDLE
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  Creates a dynamic temp table and returns a handle to it
    Notes:  The structure of the dynamic temp table includes a rowNum and a rowIdent field
            fields from the field handle list parameter, and hard-coded fields
            dictated by security type
------------------------------------------------------------------------------*/

  DEFINE VARIABLE hTT       AS HANDLE       NO-UNDO.
  DEFINE VARIABLE iLoop     AS INTEGER      NO-UNDO.
  DEFINE VARIABLE hField    AS HANDLE       NO-UNDO.

  /* Create the dynamic temp-table */
  CREATE TEMP-TABLE hTT.

  /* Add fields */
  hTT:ADD-NEW-FIELD("RowIdent":U,"CHARACTER":U).  /* string of Rowid of correspding record, comma delimited for multiple tables */
  hTT:ADD-NEW-FIELD("type":U,"CHARACTER":U,0,"x(25)":U,"":U,"Type","Type").
  hTT:ADD-NEW-FIELD("description":U,"CHARACTER":U,0,"x(65)":U,"":U,"Description","Description").
  hTT:ADD-NEW-FIELD("class":U,"CHARACTER":U,0,"x(15)":U,"":U,"Class","Class").
  hTT:ADD-NEW-FIELD("entity_mnemonic":U,"CHARACTER":U,0,"x(15)":U,"":U,"Entity Mnemonic","Entity Mnemonic").
  hTT:ADD-NEW-FIELD("Selected":U,"LOGICAL":U,0,"yes/no","no","Selected","Selected").

  /* Add indexes to the temp-table */
  hTT:ADD-NEW-INDEX("idxType":U,FALSE,TRUE).
  hTT:ADD-INDEX-FIELD("idxType":U,"type":U,"asc":U).
  hTT:ADD-NEW-INDEX("idxRowIdent":U,FALSE,FALSE).
  hTT:ADD-INDEX-FIELD("idxRowIdent":U,"RowIdent":U,"asc":U).
  hTT:ADD-NEW-INDEX("idxSelected":U,FALSE,FALSE).
  hTT:ADD-INDEX-FIELD("idxSelected":U,"Selected":U,"asc":U).

  /* Prepare the temp-table with the name the user chose */
  hTT:TEMP-TABLE-PREPARE("RowObject":U).

  RETURN hTT.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

{&DB-REQUIRED-START}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION getProfileUser DataLogicProcedure  _DB-REQUIRED
FUNCTION getProfileUser RETURNS CHARACTER
  ( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
  Purpose:  
    Notes:  
------------------------------------------------------------------------------*/
  DEFINE VARIABLE hRowObject  AS HANDLE     NO-UNDO.
  DEFINE VARIABLE hUserObj    AS HANDLE     NO-UNDO.

  hRowObject = DYNAMIC-FUNCTION("getRowObject":U IN TARGET-PROCEDURE).
  hUserObj   = hRowObject:BUFFER-FIELD("created_from_profile_user_obj":U).

  DEFINE BUFFER bgsm_user FOR gsm_user.

  IF hRowObject:AVAILABLE THEN
  DO:
      FIND FIRST bgsm_user NO-LOCK
          WHERE bgsm_user.user_obj = DECIMAL(hRowObject:BUFFER-VALUE)
          NO-ERROR.
      IF AVAILABLE bgsm_user THEN
      DO:
          RETURN bgsm_user.USER_login_name.
      END.
      ELSE
          RETURN "":U.
  END.
  ELSE       
     RETURN "":U.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

{&DB-REQUIRED-END}

&ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION isFieldBlank DataLogicProcedure 
FUNCTION isFieldBlank RETURNS LOGICAL
  ( INPUT pcFieldValue AS CHARACTER ) :
/*------------------------------------------------------------------------------
  Purpose:  Checks whether a character field is blank
    Notes:  
------------------------------------------------------------------------------*/

  IF LENGTH(TRIM(pcFieldValue)) = 0 OR LENGTH(TRIM(pcFieldValue)) = ? THEN
    RETURN TRUE.
  ELSE
    RETURN FALSE.   /* Function return value. */

END FUNCTION.

/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME

