spread Workflow Action Buttons

PHOTO EMBED

Tue Dec 31 2024 10:00:45 GMT+0000 (Coordinated Universal Time)

Saved by @MinaTimo

//called by     NW_PayrollRequestsHelper::spreadWorkflowActionButtons(element);


using Microsoft.Dynamics.@Client.ServerForm.Contexts;
/// <summary>
/// this class is used for requests that should be used in the workspace, listpages
/// and created from NCA portals
/// </summary>
class NW_PayrollRequestsHelper
{
    public static boolean isPayrollAdmin()
    {
        SecurityRole role;
        SecurityUserRole userRole;
         
        select userRole where userRole.User == curUserId()
             join role where  userRole.SecurityRole == role.RecID &&
            (role.Name == "Payroll administrator" || role.Name == "HR Manager");
         
        if(userRole)
            return true;

        return false;
    }

    public static boolean userHasSecurityRole(SecurityRoleName _securityRoleName, UserId _userId = curUserId())
    {
        SecurityRole role;
        SecurityUserRole userRole;
         
        select userRole where userRole.User == curUserId()
             join role where  userRole.SecurityRole == role.RecID &&
            (role.Name == _securityRoleName);
         
        if(userRole)
            return true;

        return false;
    }

    public static str pendingWorkItemUsers(RefRecId _refRecId, RefTableId _refTableId)
    {
        WorkflowWorkItemTable workflowWorkItemTable;
        WorkflowTrackingStatus trackingStatus;
        WorkflowCorrelationId correlationId;
        str currentStepName, nextStepName;
        container users;
        ;

        // Find the next pending work item for the current user
        while select workflowWorkItemTable
                where  workflowWorkItemTable.RefRecId == _refRecId
                && workflowWorkItemTable.RefTableId == _refTableId
                && workflowWorkItemTable.Status == WorkflowWorkItemStatus::Pending
        {
            users += workflowWorkItemTable.userName();
        }
        return con2Str(users, ", ");
    }

    private static boolean canSeeAllrequestRecords()
    {
        SecurityRole role;
        SecurityUserRole userRole;

        if(isSystemAdministrator())
            return true;

        while select userRole where userRole.User == curUserId()
        join role where userRole.SecurityRole == role.RecId

            && (role.Name == "Netways Payroll admin"
            || role.Name == "Human resources assistant")
        {
            return true;
        }
        return false;
    }

    public static void applyNCAPolicy(FormDataSource _Ds, FieldName _workerFieldName = '',
                boolean _filterCreatedBy = true, boolean _filterAssignedBy = true)
    {
        // stopped now till tested
        //  return;

        QueryBuildDataSource qbdsWorkItem;
        FormRun fr = _Ds.formRun();
        container rangeExpressions;
        MenuFunction callerMenuItem=  new MenuFunction(fr.args().menuItemName(), fr.args().menuItemType());
     
        if(NW_PayrollRequestsHelper::canSeeAllrequestRecords())
            return;
    
        /// if the request is opened from a url with an encrypted query
        if(NW_PayrollRequestsHelper::formHasRecordContext())
            return;
         
        QueryBuildRange qbr = _ds.queryBuildDataSource()
                        .addRange(fieldNum(AbsenceRequestHeader, RecId));

        Name qbdsName = _Ds.queryBuildDataSource().name();
        DictTable dictTable = new DictTable(_Ds.table());
        FieldId recIdField = dictTable.fieldName2Id("RecId");
        FieldId tableIdField = dictTable.fieldName2Id("TableId");
        FieldId createdByField = dictTable.fieldName2Id("CreatedBy");

        if(_workerFieldName)
        {
            rangeExpressions += strFmt('(%1.%2 == %3)',
                                qbdsName, _workerFieldName, HcmWorker::userId2Worker(curUserId()));
        }
        if(_filterCreatedBy)
        {
            if(createdByField)
                                rangeExpressions += strFmt('(%1.%2 == "%3")',qbdsName, "CreatedBy", curUserId());
        }
        if(_filterAssignedBy)
        {
            qbdsWorkItem = _Ds.queryBuildDataSource().
                                addDataSource(tableNum(WorkflowWorkItemTable));

            qbdsWorkItem.addRange(fieldnum(WorkflowWorkItemTable, Status)).value(queryValue(WorkflowWorkItemStatus::Pending));
            qbdsWorkItem.joinMode(JoinMode::OuterJoin);

            qbdsWorkItem.addLink(recIdField, fieldNum(WorkflowWorkItemTable, RefRecId));
            qbdsWorkItem.addLink(tableIdField, fieldNum(WorkflowWorkItemTable, RefTableId));

            rangeExpressions += strFmt('(%1.%2 == "%3")',
                                qbdsWorkItem.name(), fieldStr(WorkflowWorkItemTable, UserId), curUserId());
        }
        str rangeValue = strFmt('(%1)', con2Str(rangeExpressions, " || "));

        qbr.value(rangeValue);
        qbr.status(RangeStatus::Hidden);
    
        if(rangeExpressions == conNull())
                        qbr.AOTdelete();
        //info(qbr.value());
        //info(_Ds.query().toString());
    }

    public void workflowMenuBtnclicked(FormFunctionButtonControl _btn)
    {
        _btn.clicked();
        NW_PayrollRequestsHelper::requestDataSourceOnDeletion(_btn.formRun());

        //#Task
        //_btn.formRun().task(#TaskRefresh);
    }

    public static void hideNonSpecificGender(FormComboBoxControl _genderComboBoxCtrl)
    {
        _genderComboBoxCtrl.delete(enum2Str(HcmPersonGender::NonSpecific));
    }

    /// <summary>
    /// this method spreads the workflow approve and reject buttons beside the workflow menu button
    /// use this method on the datasource active method
    /// </summary>
    /// <param name = "_fr"> the form run object</param>
    public static void spreadWorkflowActionButtons(FormRun _fr)
    {
        #Workflow
        #JmgIcons
        #define.NCAWorkflowBtnGrp("NCAWorkflowBtnGrp")

        FormMenuButtonControl workflowMenu = _fr.control(_fr.controlId(#WorkflowActionBarButtonGroup));
        FormButtonGroupControl NCAWorkflowBtnGrp = _fr.control(_fr.controlId(#NCAWorkflowBtnGrp));

        if(NCAWorkflowBtnGrp)
            _fr.design().removeControl(_fr.controlId(#NCAWorkflowBtnGrp));
     
        FormFunctionButtonControl duplicateActionButton;
        
        
        if(workflowMenu)
        {
           
            FormButtonGroupControl workflowActionPaneButtonGroup = _fr.control(_fr.controlId("workflowActionPaneButtonGroup"));
            FormActionPaneControl actionPaneCtrl = workflowActionPaneButtonGroup.parentControl();
            NCAWorkflowBtnGrp = actionPaneCtrl.addControl(FormControlType::ButtonGroup, "NCAWorkflowBtnGrp", workflowActionPaneButtonGroup);
            NCAWorkflowBtnGrp.frameType(2);
            NCAWorkflowBtnGrp.visible(false);
            For(int i = 1; i <= workflowMenu.controlCount(); i++)
            {
                
                FormFunctionButtonControl   actionButton = workflowMenu.controlNum(i);
               // info(strFmt('%1',actionButton));

                if(actionButton &&
                    (strScan(actionButton.menuItemName(), "Approve", 1, 90)
                    || strScan(actionButton.menuItemName(), "Reject", 1, 90)
                    || strScan(actionButton.menuItemName(), "tChange", 1, 90)))
                {
                   
                    duplicateActionButton = NCAWorkflowBtnGrp.addControl(FormControlType::MenuFunctionButton, "Net_" + #WorkflowActionMenuFunctionPrefix+int2str(i));
                    duplicateActionButton.menuItemType(MenuItemType::Action);
                    duplicateActionButton.dataSource(_fr.workflowDataSource().name());
                    duplicateActionButton.menuItemName(actionButton.menuItemName());

                    NW_PayrollRequestsHelper helper = new NW_PayrollRequestsHelper();
                    duplicateActionButton.registerOverrideMethod(methodStr(FormFunctionButtonControl, clicked),
                                                methodStr(NW_PayrollRequestsHelper, workflowMenuBtnclicked), helper);
          
                    //helper = new NW_PayrollRequestsHelper();
                    //actionButton.registerOverrideMethod(methodStr(FormFunctionButtonControl, clicked),
                    //    methodStr(NW_PayrollRequestsHelper, workflowMenuBtnclicked), helper);

                    if(strScan(actionButton.menuItemName(), "Approve", 1, 90))
                        duplicateActionButton.normalImage("GreenCheck");

                    if(strScan(actionButton.menuItemName(), "Reject", 1, 90))
                        duplicateActionButton.normalImage("RedX");

                    if(strScan(actionButton.menuItemName(), "tChange", 1, 90))
                        duplicateActionButton.normalImage("Return");

                    //if(strScan(actionButton.menuItemName(), "Resubmit", 1, 90))
                    //    actionButton.visible(false);

                    //if(strScan(actionButton.menuItemName(), "Cancel", 1, 90))
                    //    actionButton.visible(false);


                    NCAWorkflowBtnGrp.visible(true);
                }
            }
        }
    }

    /// <summary>
    /// use this method on forms run() method
    ///
    /// </summary>
    /// <param name = "_fr"> FormRun object</param>
    public static void requestOnRun(FormRun _fr)
    {
        if(_fr.args().openMode() == OpenMode::New && !_fr.args().caller())
        {
            #Task
            _fr.task(#taskNew);
        }
        //  if(_fr.args().record() || !_fr.args().caller())
        if(_fr.args().openMode() == OpenMode::New || _fr.args().openMode() == OpenMode::Edit)
        {
            #SysSystemDefinedButtons
            formcontrol filterBtn = _fr.control(_fr.controlId(#SystemDefinedShowFiltersButton));
            if(filterBtn)
                filterBtn.visible(false);
      
            formcontrol listBtn = _fr.control(_fr.controlId(#SystemDefinedShowListButton));
            if(listBtn)
                listBtn.visible(false);
        }
    }

    public static void lockRanges(FormDataSource _ds)
    {
        //if(_ds.formRun().args().record())
        //{
        for(int i = 1; i <= _ds.queryRunQueryBuildDataSource().rangeCount(); i ++)
        {
            _ds.queryRunQueryBuildDataSource().range(i).status(RangeStatus::Locked);
            // _ds.queryBuildDataSource().range(i).status(RangeStatus::Hidden);
        }
        //}
    }

    /// <summary>
    /// use this method on forms close() method
    /// </summary>
    /// <param name = "_fr"> FormRun object</param>
    public static void requestOnClosed(FormRun _fr)
    {
        FormRun caller = _fr.args().caller();
        if(caller)
        {
            #Task
            caller.task(#TaskRefresh);
        }
    }

    /// <summary>
    /// use this method in form task method as a condition
    /// example: if(NW_PayrollRequestsHelper::cannotSwitchToGridView(element, _p1))
    ///             return ret;
    /// </summary>
    /// <param name = "_fr"></param>
    /// <param name = "_task"></param>
    /// <returns></returns>
    public static boolean cannotSwitchToGridView(FormRun _fr, int _task)
    {
        #Task
        return _task == #TaskSwitchToGridView &&
                        (_fr.args().openMode() == OpenMode::New || _fr.args().openMode() == OpenMode::Edit);  // is opened from ess
    }

    /// <summary>
    /// used to pop out of the form details to previous screen
    /// use this method on the form datasource delete() method
    /// you can use it also in save and submit button
    /// </summary>
    /// <param name = "_fr"> FormRun object</param>
    public static void requestDataSourceOnDeletion(FormRun _fr)
    {
        #Task
    
        if(_fr.args().openMode() == OpenMode::New)
        {
            _fr.closeCancel();
        }
        else if (_fr.args().openMode() == OpenMode::Edit)
        {
            _fr.task(#taskEsc);
        }
        else
        {
            _fr.task(#taskSwitchToGridView);
        }
    }

    /// <summary>
    /// don't use, not ready
    /// </summary>
    /// <param name = "_ds"></param>
    /// <param name = "_allowEdit"></param>
    public static void dataSourceFieldsAllowEdit(FormDataSource _ds, boolean _allowEdit)
    {
        DictTable dictTable = DictTable::construct(tableId2Name(_ds.table()));

        FieldId fieldId = dictTable.fieldNext(0);
    
        while(fieldId)
        {
            _ds.object(fieldId).allowEdit(_allowEdit);
            fieldId = dictTable.fieldNext(fieldId);
        }
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormEventHandler(formStr(DocumentUpload), FormEventType::Closing)]
    public static void DocumentUpload_OnClosing(xFormRun sender, FormEventArgs e)
    {
        FormControl ctrl = sender.args().caller();
        if(ctrl)
        {
            FormRun callerFr = ctrl.formRun();
            if(callerFr)
            {
                #Task
                callerFr.task(#TaskRefresh);
            }
        }
    }

    public static void refreshCallerForm(FormRun _formRun)
    {
        FormRun callerFr = _formRun.args().caller();
        if(callerFr)
        {
            #Task
            callerFr.task(#TaskRefresh);
        }
    }

    public static boolean formHasRecordContext()
    {
        SessionContext sessionContext = SessionContext::Get_Current();
        if(!sessionContext)
            return false;
        /// if the request is opened from a url with an encrypted query
        URLUtility urlUtil = new URLUtility();
        str q = urlUtil.getQueryParamValue('q');
        if(q)
            return true;

        return false;
    }

    public static void SubmitToWorkflow(container _parms)
    {
        workflowTypeName  workflowTemplateName;
        recId             recId;
        WorkflowComment   initialNote;
        NoYes             activatingFromWeb;
        WorkflowUser      submittingUser;

        [workflowTemplateName, recId, initialNote, activatingFromWeb, submittingUser] = _parms;

        Workflow::activateFromWorkflowType(workflowTemplateName,
                                           RecId,
                                           initialNote,
                                           NoYes::No,
                                           submittingUser);
    }

    static SysEmailItemId SendMailByDistributerBatch(
        SysEmailId _emailTemplate,
        Email _recipientMail,
        Map _placeHolderMap = null,
        str _origin = '')
    {
        SysOutgoingEmailTable outgoingEmailTable;
        SysEmailItemId nextEmailItemId;

        SysEmailTable        sysEmailTable        = SysEmailTable::find(_emailTemplate);
        SysEmailMessageTable sysEmailMessageTable = SysEmailMessageTable::find(sysEmailTable.EmailId, sysEmailTable.DefaultLanguage);
        str messageBody = sysEmailMessageTable.Mail;
        str subject = sysEmailMessageTable.Subject;

        //Map placeholderMap = new Map(Types::String, Types::String);
        //placeholderMap.insert("Startdate", date2Str(_SDate,123, DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Slash,DateYear::Digits4));
        //placeholderMap.insert("Enddate", date2Str(_EDate,123, DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Slash,DateYear::Digits4));
        //placeholderMap.insert("Task", _Tasks);
        Map placeHolderMap = _placeHolderMap;

        messageBody = SysEmailMessage::stringExpand(messageBody, placeholderMap);
        subject     = SysEmailMessage::stringExpand(subject, placeholderMap);
         
         
        nextEmailItemId = EventInbox::nextEventId();
        outgoingEmailTable.EmailItemId = nextEmailItemId;
        outgoingEmailTable.IsSystemEmail = NoYes::No;
        outgoingEmailTable.Origin = _origin;
        outgoingEmailTable.Sender = sysEmailTable.SenderAddr;
        outgoingEmailTable.SenderName = sysEmailTable.SenderName;
        outgoingEmailTable.Recipient = _recipientMail;
        outgoingEmailTable.Subject = subject;
        outgoingEmailTable.Priority = eMailPriority::Normal ;
        outgoingEmailTable.WithRetries = true;
        outgoingEmailTable.RetryNum = 10;
        outgoingEmailTable.UserId = curUserId();
        outgoingEmailTable.Status = SysEmailStatus::Unsent;
        outgoingEmailTable.Message = messageBody;
        outgoingEmailTable.LatestStatusChangeDateTime = DateTimeUtil::getSystemDateTime();
        outgoingEmailTable.insert();

        return outgoingEmailTable.EmailItemId ;
    }

}
content_copyCOPY