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