SCA_SetRoleEmployeeDepentFavotite - Song Nghia - Microsoft Dynamics 365 Vietnam

Song Nghia - Microsoft Dynamics 365 Vietnam

Microsoft Dynamics AX/365 Outsourcing Service

Breaking

Thursday, January 2, 2020

SCA_SetRoleEmployeeDepentFavotite

Set Role Employee Depent Favotite
Song Nghia - Technical Consultant 

class SCA_SetRoleEmployeeDepentFavotite extends RunBaseBatch

{



    FilePath            filePath;

    Filename            filename;

    CommaTextIo         fileIO;

    Set                 fileSet;

    CommaIo             commaIo;

    str                 currentFile;

    container           lineCon;

    DialogField         fieldUserId;

    UserId              userId;

    UserInfo            userInfo;

    SCA_PrivilegesOfUser    privilegsOfUser;

    FromTime    startTime;

    str   elapsed;

    #AviFiles

    SysOperationProgress    progressor;

    int                     timeOfDayTmp;

    #OCCRetryCount



    #File

    #AviFiles

    #define.CurrentVersion(1)

    #localmacro.CurrentList

        userId

    #endmacro



    Public static void main(Args _args)

    {

        SCA_SetRoleEmployeeDepentFavotite    readFileData = SCA_SetRoleEmployeeDepentFavotite::construct();



        ;



        if (readFileData.prompt())

        {

            readFileData.run();

        }

    }



    public static SCA_SetRoleEmployeeDepentFavotite construct()

    {

        return new SCA_SetRoleEmployeeDepentFavotite();

    }



    public void run()

    {

        Name rolesName;

        startTime = timeNow();

        // Set Dialog field value to find CustTable

        if (userId)

        {

            this.getFavoriteItemOfEmployee(userId);

            rolesName = this.createRoleForUser(userId);

            if(rolesName)

                this.addRoleToUser(userId, rolesName);



            Info(strFmt("User Id: %1, Roles name: %2 completed", userId, rolesName));

        }

        else

        {

            error( 'Customer Account not found!');

        }

        elapsed = timeConsumed(startTime, timeNow());

        info(strFmt("Time run: %1", elapsed));

    }



    public boolean getFromDialog()

    {

        // Retrieve values from Dialog

        userId = fieldUserId.value();



        return super();

    }



    public Object dialog()

    {

        Dialog dialog;

        ;



        dialog = super();



        // Set a title for dialog

        dialog.caption( 'Create role for user');



        // Add a new field to Dialog

        fieldUserId = dialog.addField( extendedTypeStr(UserId), 'UserId' );



        return dialog;

    }



    public container pack()

    {

        return [#CurrentVersion, #CurrentList];

    }



    public boolean unpack(container _packedClass)

    {

        Version    version = RunBase::getVersion(_packedClass);

        switch (version)

        {

            case #CurrentVersion:

                [version,#CurrentList] = _packedClass;

                break;

            default:

                return false;

        }

        return true;

    }



    private void getAllMenuItemLoop(str _userId, str _menuItemName)

    {

        Name    privilegeName, grantType, grantAllow;



        [privilegeName, grantType,  grantAllow] =  this.findPrivileges(_menuItemName);



        if(privilegeName && grantType && grantAllow)

        {

            try

            {

                ttsbegin;

                if(!SCA_PrivilegesOfUser::find(_userId, privilegeName))

                {

                    privilegsOfUser.clear();

                    privilegsOfUser.UserId      =   _userId;

                    privilegsOfUser.Privilege   =   privilegeName;

                    privilegsOfUser.PrivilegeDescription    = strFmt("Privilege of user: %1", _userId);

                    privilegsOfUser.GrantType   =   grantType;

                    privilegsOfUser.GrantAllow  =   grantAllow;

                    privilegsOfUser.insert();

                }

                ttscommit;

                if(privilegeName && grantType && grantType)

                {

                        Info(strFmt("%1 %2 %3 ", privilegeName, grantType, grantAllow));

                }

            }

            catch

            {

                throw Error(strFmt("Cannot insert privilegs of user: %1", _userId ));

            }

        }

    }



    public  void getDisplayInForm(str displayName)

    {

        Form                myForm;

        FormBuildDesign     design;

        FormBuildControl    control;

        int                 cnt = 0;

        Set                 buttonsSet = new Set(Types::Class);

        Args                args;

        Object              _Object;

        FormControl         _FormControl;

        FormMenuButtonControl _buttonControl;

        FormBuildFunctionButtonControl  _menuButton;

        Name    privilegeName, grantType, grantAllow;



        void findButtons(FormBuildControl _buildControl)

        {

            FormBuildControl    buildControl;

            int                 i;

            ;



            if (_buildControl.controlCount() > 0)

            {

                for (i = 1; i <= _buildControl.controlCount(); i++)

                {

                    try

                    {

                        _menuButton = _buildControl.controlNum(i);

                        if(_menuButton.menuItemType() == MenuItemType::Display)

                        {

                            //info(_menuButton.menuItemName());

                            [privilegeName, grantType,  grantAllow] =  this.findPrivileges(_menuButton.menuItemName());

                            if(privilegeName && grantType && grantAllow)

                            {

                                try

                                {

                                    ttsbegin;

                                    if(!SCA_PrivilegesOfUser::find(userId, privilegeName))

                                    {

                                        privilegsOfUser.clear();

                                        privilegsOfUser.UserId      =   userId;

                                        privilegsOfUser.Privilege   =   privilegeName;

                                        privilegsOfUser.PrivilegeDescription    = strFmt("Privilege of user: %1", userId);

                                        privilegsOfUser.GrantType   =   grantType;

                                        privilegsOfUser.GrantAllow  =   grantAllow;

                                        privilegsOfUser.insert();

                                    }

                                    ttscommit;

                                    if(privilegeName && grantType && grantType)

                                    {

                                        progressor.setText(strFmt("%1 %2 %3 ", privilegeName, grantType, grantAllow));

                                        progressor.incCount();

                                        progressor.update(false);

                                        //Info(strFmt("%1 %2 %3 ", privilegeName, grantType, grantAllow));

                                    }

                                }

                                catch

                                {

                                    throw Error(strFmt("Cannot insert privilegs of user: %1", userId ));

                                }

                            }

                        }

                    }

                    catch

                    {



                    }

                    buildControl = _buildControl.controlNum(i);



                    findButtons(buildControl);

                }

            }

            else

            {

                if (classidget(_buildControl) == classnum(FormBuildButtonControl) ||

                    classidget(_buildControl) == classnum(FormBuildCommandButtonControl) ||

                    classidget(_buildControl) == classnum(FormBuildDropDialogButtonControl) ||

                    classidget(_buildControl) == classnum(FormBuildMenuButtonControl) ||

                    classidget(_buildControl) == classnum(FormBuildFunctionButtonControl))

                {

                    buttonsSet.add(_buildControl);

                }

            }

        }

        ;



        myForm = new Form(displayName);

        design = myForm.design();



        for (cnt = 1; cnt <= design.controlCount(); cnt++)

        {

            try

            {

                _menuButton =  design.controlNum(cnt).controlNum(cnt);

                if(_menuButton.menuItemType() == MenuItemType::Display)

                {

                    info(_menuButton.menuItemName());

                    [privilegeName, grantType,  grantAllow] =  this.findPrivileges(_menuButton.menuItemName());

                    if(privilegeName && grantType && grantAllow)

                    {

                        try

                        {

                            ttsbegin;

                            if(!SCA_PrivilegesOfUser::find(userId, privilegeName))

                            {

                                privilegsOfUser.clear();

                                privilegsOfUser.UserId      =   userId;

                                privilegsOfUser.Privilege   =   privilegeName;

                                privilegsOfUser.PrivilegeDescription    = strFmt("Privilege of user: %1", userId);

                                privilegsOfUser.GrantType   =   grantType;

                                privilegsOfUser.GrantAllow  =   grantAllow;

                                privilegsOfUser.insert();

                            }

                            ttscommit;

                            if(privilegeName && grantType && grantType)

                        Info(strFmt("%1 %2 %3 ", privilegeName, grantType, grantAllow));

                        }

                        catch

                        {

                            throw Error(strFmt("Cannot insert privilegs of user: %1", userId ));

                        }

                    }

                }

            }

            catch

            {



            }



            control = design.controlNum(cnt);

            findButtons(control);

        }

    }



    //Cho nay lay dc form name = > buoc thiep theo lay dc cai menuitem name

    public void  findMenuItem(str _menuItemName)

    {

        #AOT

        TreeNode root = TreeNode::findNode(#MenuItemsDisplayPath);

        TreeNode current;

        TreeNodeTraverser trav = new TreeNodeTraverser(root,false);



        current = trav.next();

        while (current)

        {

            if ((current.AOTgetProperty('ObjectType') == "Form") && (current.AOTgetProperty('Name') == _menuItemName))

            {

                info(strFmt("Menu Item inside display form %1",current.AOTgetProperty('Object')));

                this.getDisplayInForm(current.AOTgetProperty('Object'));

            }

            current = trav.next();

        }

    }



    private void getFavoriteItemOfEmployee(UserId _userId)

    {

        SysMenuNavigationFavoriteItemsTable favoriteTable;

        Name    privilegeName, grantType, grantAllow;

        // Define XML Document and its nodes

        XmlDocument     doc;

        Name            privilegesName;

        XmlElement      elementScript,

                        elementName;

        XMLParseError   xmlError;

        int             i;



        while select favoriteTable

            where favoriteTable.UserId == _userId

        {

            progressor = SysOperationProgress::newGeneral(#AviFileMove, "Processing...", 2500);

            progressor.setCaption("@SYS8577");

            progressor.setCaption(strFmt("Processing .. %1", favoriteTable.MenuItemName));

       

            [privilegeName, grantType,  grantAllow] =  this.findPrivileges(favoriteTable.MenuItemName);

            if(privilegeName && grantType && grantAllow)

            {

                try

                {

                    ttsbegin;

                    if(!SCA_PrivilegesOfUser::find(_userId, privilegeName))

                    {

                        privilegsOfUser.clear();

                        privilegsOfUser.UserId      =   _userId;

                        privilegsOfUser.Privilege   =   privilegeName;

                        privilegsOfUser.PrivilegeDescription    = strFmt("Privilege of user: %1", _userId);

                        privilegsOfUser.GrantType   =   grantType;

                        privilegsOfUser.GrantAllow  =   grantAllow;

                        privilegsOfUser.insert();

                    }

                    ttscommit;

                    if(privilegeName && grantType && grantType)

                    {

                        progressor.setText(strFmt("%1 %2 %3 ", privilegeName, grantType, grantAllow));

                        progressor.incCount();

                        progressor.update(false);

                    }

                }

                catch

                {

                    throw Error(strFmt("Cannot insert privilegs of user: %1", _userId ));

                }

            }



            this.findMenuItem(favoriteTable.MenuItemName);

        }



    }



    private container findPrivileges(Name _objectName)

    {

        System.IO.StreamReader reader;

        System.String stringLine;

        InteropPermission interopPermission;



        str file;

        int row = 1;

        int currentFileCount;

        str stringFile;



        container   conResult;

        Name        privilegesName, grantName, grantAllow;



        System.String[] filePaths = System.IO.Directory::GetFiles(@"C:\AOSService\PackagesLocalDirectory\", "*.xml*",System.IO.SearchOption::AllDirectories);



        int fileCount = filepaths.get_Length();



        for(currentFileCount = 0; currentFileCount < fileCount ; ++currentFileCount)

        {

            file = filepaths.GetValue(currentFileCount).ToString();

            if(strScan(file, "AxSecurityPrivilege", 0, strLen(file)) || strScan(file, "axsecurityprivilege", 0, strLen(file)) )

            {

                reader = new System.IO.StreamReader(file);

                stringLine = reader.ReadLine();

                stringFile = "";

                while (!System.String::IsNullOrEmpty(stringLine))

                {

                    stringFile += stringLine;

                    stringLine = reader.ReadLine();

                }

                //Get privilegs of meuitem display

                conResult = this.getXML(stringFile, _objectName);

           

                //get all source in fom dc goi toi



                if(conPeek(conResult, 1))

                {

                    return conResult;

                }

                reader.Close();

                reader.Dispose();

                CodeAccessPermission::revertAssert();

            }

        }



        return conResult;

    }



    /// <br />
<br />
<br />
<summary>

    /// Find privilege from object Type and object name

    /// </summary>

    /// <param name="strXML" />

    /// <returns></returns>

    private container getXML(str strXML, str objectName)

    {

        // Define XML Document and its nodes

        XmlDocument     doc;

        XmlNodeList     vtvNodeList;

        XmlNode         vtvNode;

        Name            privilegesName;

        str             grantAllow;

        //Nguyen doan script

        XmlElement      elementScript,

                        elementName,

                        elementEntryPoints,

                        elementEntryPointsRef,

                        elementRefGrant, elementGrantDetail;

        XmlElement      elementTemp;

        XMLParseError   xmlError;

        int             i ;



        try

        {

            doc = new XmlDocument();

            doc.loadXml(strXML);

            elementScript           = doc.getNamedElement("AxSecurityPrivilege");

            elementName             = elementScript.getNamedElement("Name");

            elementEntryPoints      = elementScript.getNamedElement("EntryPoints");

            vtvNodeList             = elementEntryPoints.childNodes();



            for(i = 0; i &lt; vtvNodeList.length() ; i++ )

            {

                //Doan nay phia loop data ben trong, moi get het duoc

                //elementEntryPointsRef   = elementEntryPoints.getNamedElement//("AxSecurityEntryPointReference");

                elementEntryPointsRef      = vtvNodeList.item(i);

                elementRefGrant       = elementEntryPointsRef.getNamedElement("Grant");

   

                //Get quyen cao nhat cua privileges

                if(elementRefGrant.getNamedElement("Delete") &amp;&amp; elementRefGrant.getNamedElement("Delete").text() == "Allow")

                {

                    if(elementEntryPointsRef.getNamedElement("ObjectName").text() == objectName)

                    {

                        return [elementName.text() ,

                            elementRefGrant.getNamedElement("Delete").name(),

                            elementRefGrant.getNamedElement("Delete").text()];

                    }

                }

                //else get read

                else

                {

                    if(elementRefGrant.getNamedElement("Read") &amp;&amp; elementRefGrant.getNamedElement("Read").text() == "Allow")

                    {

                        if(elementEntryPointsRef.getNamedElement("ObjectName").text() == objectName)

                        {

                            return [elementName.text() ,

                            elementRefGrant.getNamedElement("Read").name(),

                            elementRefGrant.getNamedElement("Read").text()];

                        }

                    }

                }

            }

       

        }

        catch

        {

            return conNull();

        }



        return conNull();

    }



    private Name createRoleForUser(UserId _userId)

    {

        FileIoPermission    permission;

        XMLDocument         xmlDoc = XMLDocument::newBlank();

        XMLNode             rootNode;

        XMLNode             NodeEmpl,

                            NodeName,

                            NodeDescript,

                            NodeLabel,

                            NodeDirectAccess,

                            NodeDuty,

                            NodePrivileges,

                            NodeNamePri;

        XMLElement          xmlElement;

        XMLText             xmlText;

        HCMWorker           HCMWorker;



        Name                fileRoleName;

        FilePath            linkFile;

        SCA_PrivilegesOfUser    privilegesOfUser;

        ;



        fileRoleName = strFmt("SCA_%1_%2_Maintain", _userId, System.DateTime::get_UtcNow().ToString('yyyyMdHHmmss'));



        linkFile = @'C:\AOSService\PackagesLocalDirectory\Scancom\Scancom\AxSecurityRole\' + fileRoleName + ".xml";



        try

        {

            permission= new FileIoPermission(linkFile,'w');

            permission.assert();

            xmlDoc = XMLDocument::newBlank();

            // Create first line containing version info

            rootNode = xmlDoc.documentElement();

            xmlElement = xmlDoc.createElement('AxSecurityRole');

            rootNode = xmlDoc.appendChild(xmlElement);



            // Create a node for the name

            xmlElement  = xmlDoc.createElement('Name');

            NodeName    = rootNode.appendChild(xmlElement);

            xmlText     = xmlDoc.createTextNode(fileRoleName);

            NodeName.appendChild(xmlText);



            xmlElement  = xmlDoc.createElement('Description');

            NodeDescript    = rootNode.appendChild(xmlElement);

            xmlText     = xmlDoc.createTextNode(strFmt("Basic role for user: %1", _userId));

            NodeDescript.appendChild(xmlText);



            xmlElement  = xmlDoc.createElement("Label");

            NodeLabel    = rootNode.appendChild(xmlElement);

            xmlText     = xmlDoc.createTextNode(strFmt("Basic role for user: %1 %2", _userId, fileRoleName));

            NodeLabel.appendChild(xmlText);



            xmlElement  = xmlDoc.createElement('Privileges');

            NodeName    = rootNode.appendChild(xmlElement);



            while select privilegesOfUser

                where privilegesOfUser.UserId == _userId

            {

                // Create a node for the address

                xmlElement  = xmlDoc.createElement('AxSecurityPrivilegeReference');

                NodePrivileges    = NodeName.appendChild(xmlElement);



                xmlElement  = xmlDoc.createElement('Name');

                xmlText     = xmlDoc.createTextNode(privilegesOfUser.Privilege);

                NodeNamePri   = NodePrivileges.appendChild(xmlElement);

                NodeNamePri.appendChild(xmlText);



            }

            // Save the file

            xmldoc.save(linkFile);

            return fileRoleName;

        }

        catch

        {

            throw Error("Create role error");

        }



    }



    private void addRoleToUser(UserId _userId, Name _roleName)

    {

        SecurityRole        role;

        SecurityUserRole    userRole;



        //Synchonice table sercurity role before insert data

        appl.dbSynchronize(tableNum("SecurityRole"));



        select role where role.AotName == _roleName;



        select * from userRole

            where userRole.SecurityRole == role.RecId &amp;&amp;

            userRole.User == _userId;



        userRole.User = _userId;

        userRole.SecurityRole = role.RecId;

        userRole.AssignmentMode = RoleAssignmentMode::Manual;

        userRole.AssignmentStatus = RoleAssignmentStatus::Enabled;



        SecuritySegregationOfDuties::assignUserToRole(userRole, null);



        //Synchonice table sercurity

        appl.dbSynchronize(tableNum("SecurityUserRole"));

    }



    private void getFiles()

    {

        System.String[]                 files;

        System.Collections.IEnumerator  enumerator;

        str file;



        try

        {

            fileSet = new Set(Types::Container);

            files = System.IO.Directory::GetFiles(filePath, '*.xml');

            enumerator = files.GetEnumerator();

            while(enumerator.MoveNext())

            {

                file = enumerator.get_Current();

                fileSet.add([file]);

            }

        }

        catch(Exception::Internal)

        {

            this.processCLRErrorException();

        }

        catch(Exception::CLRError)

        {

            this.processCLRErrorException();

        }

    }



    private void openFile()

    {

        FileIOPermission fileIOPermission;

        fileIOPermission = new FileIOPermission(filename, #io_read);

        fileIOPermission.assert();



        commaIo = new CommaIo(filename, #io_read);



        if(commaIo &amp;&amp; commaIo.status() == IO_Status::Ok)

        {

            commaIo.inRecordDelimiter(#delimiterCRLF);

        }

        else

        {

            throw error(strFmt("Error when opening file %1", filename));

        }

    }



    private boolean readLine()

    {

        boolean readLine;

        if(commaIo &amp;&amp; commaIo.status() == IO_Status::Ok)

        {

            lineCon = commaIo.read();

            readLine = lineCon != conNull();

        }

        else

        {

            lineCon = conNull();

            readLine = false;

        }

        return readLine;

    }



    private void processCLRErrorException( boolean _throw = true )

    {

        str strError;

        CLRObject exc;
        CLRObject innerExc;
        CLRObject clrExcMessage;
        exc = CLRInterop::getLastException();
        if(exc)
        {
            clrExcMessage = exc.get_Message();
            innerExc = exc.get_InnerException();
            while(innerExc != null)
            {
                clrExcMessage = innerExc.get_Message();

                innerExc = innerExc.get_InnerException();
            }
            strError = CLRInterop::getAnyTypeForObject(clrExcMessage);
            error(strError);
            if (_throw)
            {

                throw error("Update has been cancelled");

            }

        }

    }
}