Monday, November 17, 2025

Invoice proposal workflow auto submitted

 Contract 

======== 

/// <summary> 

/// Data contract class for the <c>  AutoSubmitInvoiceProposalWFService</c> auto submit invoice proposal service. 

/// </summary> 

[DataContract] 

public class   AutoSubmitInvoiceProposalWFContract extends SysOperationDataContractBase 

    str packedQuery; 

  

    [DataMember, AifQueryType('_packedQuery', queryStr(  ProjProposalJour))] 

    public str parmPackedQuery(str _packedQuery = packedQuery) 

    { 

        packedQuery = _packedQuery; 

        return packedQuery; 

    } 

  

    public Query getQuery() 

    { 

        return new Query(SysOperationHelper::base64Decode(packedQuery)); 

    } 

  

    public void setQuery(Query _query) 

    { 

        packedQuery = SysOperationHelper::base64Encode(_query.pack()); 

    } 

  

 

Controler 

======== 

 

 

/// <summary> 

///     Controller class for the <c>  AutoSubmitInvoiceProposalWFService</c> class. 

/// </summary> 

public class   AutoSubmitInvoiceProposalWFController extends SysOperationServiceController 

    public static void main(Args _args) 

    { 

          AutoSubmitInvoiceProposalWFController controller; 

  

        // Create and start controller 

        controller =   AutoSubmitInvoiceProposalWFController::construct(); 

        controller.startOperation(); 

    } 

  

    public static   AutoSubmitInvoiceProposalWFController construct() 

    { 

        return new   AutoSubmitInvoiceProposalWFController(); 

    } 

  

    protected void new() 

    { 

        super(); 

  

        this.parmClassName(classStr(  AutoSubmitInvoiceProposalWFService)); 

        this.parmMethodName(methodStr(  AutoSubmitInvoiceProposalWFService, submitToWorkflow)); 

        this.parmDialogCaption("@SYS301355"); 

    } 

  

    public ClassDescription caption() 

    { 

        return this.defaultCaption(); 

    } 

  

    protected ClassDescription defaultCaption() 

    { 

        return "@SYS301355"; 

    } 

  

 

 

Service class 

=========== 

/// <summary> 

///     Service class for submitting invoice proposals to workflow. 

/// </summary> 

public class   AutoSubmitInvoiceProposalWFService extends SysOperationServiceBase 

    public static   AutoSubmitInvoiceProposalWFService construct() 

    { 

        return new   AutoSubmitInvoiceProposalWFService(); 

    } 

  

    /// <summary> 

    ///     Submits open transactions to workflow. 

    /// </summary> 

    public void submitToWorkflow(  AutoSubmitInvoiceProposalWFContract _contract) 

    { 

        ProjProposalJour projProposalJour; 

  

        Query       query; 

        QueryRun    queryRun; 

  

        int64 messageId; 

        boolean hasMessage = false; 

  

        // Create and run query 

        query = _contract.getQuery(); 

        queryRun = new QueryRun(query); 

  

        // Enumerate not submitted open proposals 

        while (queryRun.next()) 

        { 

            // Get current proposal 

            projProposalJour = queryRun.get(tableNum(ProjProposalJour)); 

  

            // Submit to workflow  

            messageId = this.submitSingleToWorkflow(projProposalJour); 

  

            if (messageId != 0) 

            { 

                hasMessage = true; 

            } 

        } 

  

        if (!hasMessage) 

        { 

            // Operation completed (only shown if no other messages were raised) 

            Message::Add(MessageSeverity::Informational, "@SYS9265"); 

        } 

    } 

  

    /// <summary> 

    ///     Submits a single project invoice proposal to workflow. 

    /// </summary> 

    /// <param name = "_projProposalJour"></param> 

    /// <returns></returns> 

    public int64 submitSingleToWorkflow(ProjProposalJour _projProposalJour) 

    { 

        int64 messageId; 

  

        // Check if all transactions are related to projects with auto submit enabled 

        if (  AutoSubmitInvoiceProposalHelper::allProjectsEnabledForAutoSubmit(_projProposalJour)) 

        { 

            try 

            { 

                // Start workflow 

                  AutoSubmitInvoiceProposalHelper::startWorkflow([_projProposalJour]); 

  

                // Submitted invoice proposal %1 to workflow 

                messageId = Message::Add(MessageSeverity::Informational, strFmt("@  :  SubmitInvoiceComplete", _projProposalJour.ProposalId)); 

            } 

            catch 

            { 

                // Could not submit invoice proposal %1 to workflow 

                messageId = Message::Add(MessageSeverity::Error, strFmt("@  :  SubmitInvoiceError", _projProposalJour.ProposalId)); 

            } 

        } 

        else 

        { 

            // Invoice proposal %1 was not submitted to workflow as all included projects are not enabled for automatic submit 

            messageId = Message::Add(MessageSeverity::Warning, strFmt("@  :  SubmitInvoiceFail", _projProposalJour.ProposalId)); 

        } 

  

        return messageId; 

    } 

  

 

Helper class 

========== 

/// <summary> 

///     Helper class for the Automatic submission of invoice proposal process. 

/// </summary> 

public class   AutoApproveInvoiceProposalHelper 

  

    public static   AutoApproveInvoiceProposalHelper construct() 

    { 

        return new   AutoApproveInvoiceProposalHelper(); 

    } 

  

    protected void new() 

    { 

    } 

  

    /// <summary> 

    ///     Starts a workflow asynchronous. 

    /// </summary> 

    /// <param name = "_parameters"></param> 

    public static void startWorkflowAsync(container _parameters) 

    { 

        try 

        { 

            Global::runAsync(classNum(  AutoApproveInvoiceProposalHelper), 

                staticMethodStr(  AutoApproveInvoiceProposalHelper, startWorkflow), 

                _parameters); 

        } 

        catch 

        { 

            Global::exceptionTextFallThrough(); 

        } 

    } 

  

    /// <summary> 

    ///     Starts a workflow from parameters. Based on the PSAProjInvoiceProposalWorkflow::submit method. 

    /// </summary> 

    /// <param name = "_parameters"></param> 

    public static void startWorkflow(container _parameters) 

    { 

        Common common; 

        ProjProposalJour            projProposalJour; 

        WorkflowTypeName workflowTemplateName = workFlowTypeStr(PSAProjInvoiceProposal); 

        WorkflowComment wfcomment = "@  :  AutomaticalSubmission"; 

        UserId                      userId; 

  

        // Ensure first parameter is a record buffer 

        if (typeOf(conPeek(_parameters, 1)) == Types::Record) 

        { 

            common = conPeek(_parameters, 1); 

  

            switch (common.TableId) 

            { 

                case tableNum(ProjProposalJour): 

                    projProposalJour = ProjProposalJour::findRecid(common.RecId,true); 

                    break; 

  

                default: 

                    throw Error(Error::wrongUseOfFunction(funcName())); 

            } 

        } 

        else 

        { 

            throw Error(Error::wrongUseOfFunction(funcName())); 

        } 

  

        // Start the workflow using the template API 

        try 

        { 

            ttsbegin; 

  

            // Reread record 

            projProposalJour.reread(); 

  

            if (projProposalJour.createdBy) 

            { 

                userId = projProposalJour.createdBy; 

            } 

            else 

            { 

                userId = curUserId(); 

            } 

  

            // Create a new workflow from the workflow template used on the workflow configuration associated to the journal's journal name. 

            Workflow::activateFromWorkflowType(workflowTemplateName, projProposalJour.RecId, wfcomment, NoYes::No, userId); 

  

            // Set the status to Submitted 

           // PSAProjInvoiceProposalStateChangeManager::documentSubmit(projProposalJour); 

              AutoApproveInvoiceProposalHelper::documentSubmit(projProposalJour); 

             

  

            ttscommit; 

        } 

        catch(Exception::Error) 

        { 

            throw (error("@PSA3324")); 

        } 

    } 

  

    /// <summary> 

    ///     Checks if all projects on invoice proposal have been enabled for auto submit to workflow. 

    /// </summary> 

    /// <param name = "_projPoposalJour"></param> 

    /// <returns></returns> 

    public static boolean allProjectsEnabledForAutoSubmit(ProjProposalJour _projPoposalJour) 

    { 

        ProjProposalTransUnion  projProposalTransUnion; 

        ProjTable               projTable; 

  

        // Select first project included in proposal which is not enabled for auto submit 

        select firstonly RecId from projTable 

            where projTable.  AutoSubmit == NoYes::No 

            exists join projProposalTransUnion 

                where projProposalTransUnion.ProjId == projTable.ProjId 

                    && projProposalTransUnion.ProposalId == _projPoposalJour.ProposalId; 

  

        // If no such project was found all projects are enabled for auto submit 

        return projTable.RecId == 0; 

    } 

  

    public static void documentSubmit(ProjProposalJour _tProjProposalJour) 

    { 

        // Check the document is in a status that allows transition to the submitted status 

        if (_tProjProposalJour.RecId != 0 && _tProjProposalJour.LineProperty == ProjLinePropertyCode::Open) 

        { 

            _tProjProposalJour.LineProperty = ProjLinePropertyCode::Approved; 

            _tProjProposalJour.PSAWorkerSubmittedBy = HcmWorker::userId2Worker(curuserId()); 

            _tProjProposalJour.doUpdate(); 

        } 

        else 

        { 

            error("@PSA3322"); 

        } 

    } 

  

 


No comments:

Post a Comment