Commit 5967759c by chenith Committed by Harsh Shah

Email authentication updated, proceed verification request.

parent 11bb67ca
package performa.form;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
import oneit.objstore.parser.BusinessObjectParser;
import oneit.security.*;
import oneit.servlets.forms.*;
import oneit.servlets.process.*;
import oneit.servlets.security.SessionSecUserDecorator;
import oneit.utils.*;
import performa.orm.Candidate;
import performa.orm.Job;
import performa.orm.JobApplication;
public class ResetPasswordFP extends ORMProcessFormProcessor
{
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map params) throws BusinessException, StorageException
{
HttpServletRequest request = submission.getRequest();
Job job = (Job) request.getAttribute("Job");
Candidate candidate = (Candidate) request.getAttribute("NewCandidate");
String nextPage = (String) request.getAttribute("nextPage");
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1, "Inside ResetPasswordFP for ", job, candidate);
SecUser secUser = candidate.getUser();
if(CollectionUtils.equals(job.getPassword(), job.getConfirmPassword()))
{
secUser.setAttribute("md5:" + SecUser.FIELD_Password, job.getPassword());
candidate.setIsAccountVerified(Boolean.TRUE);
}
request.getSession().setAttribute (SecUser.SEC_USER_ID, secUser);
request.getSession().setAttribute (SessionSecUserDecorator.REFRESH_SECURITY, Boolean.TRUE);
process.completeAndRestart();
process.setAttributeIgnoreTX("Job", job);
return new ProcessRedirectResult(nextPage, new String[0]);
}
@Override
public void validate(ORMProcessState process, SubmissionDetails submission, MultiException exceptions, Map params) throws StorageException
{
HttpServletRequest request = submission.getRequest();
Job job = (Job) request.getAttribute("Job");
Candidate candidate = (Candidate) request.getAttribute("NewCandidate");
if(candidate!=null)
{
BusinessObjectParser.assertFieldCondition(job.getPassword()!= null, job, Job.FIELD_Password, "mandatory", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(job.getConfirmPassword()!= null, job, Job.FIELD_ConfirmPassword, "mandatory", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(CollectionUtils.equals(job.getPassword(), job.getConfirmPassword()), job, Job.FIELD_ConfirmPassword, "passwordNotMatch", exceptions, true, request);
}
super.validate(process, submission, exceptions, params);
}
}
......@@ -95,7 +95,7 @@ public class SendVerificationMailFP extends SaveFP
{
LogMgr.log(LOG, LogLevel.PROCESSING1, "Sending verification mail from SendVerificationMailFP to :: ", candidate);
Article verificationArticle = WebUtils.getArticleByShortCut(candidate.getTransaction(), WebUtils.APPLY_JOB);
Article verificationArticle = WebUtils.getArticleByShortCut(candidate.getTransaction(), WebUtils.APPLICANT_ACCOUNT_VERIFICATION);
RandomStringGen random = new RandomStringGen();
//set verification key and send mail time
......@@ -104,8 +104,7 @@ public class SendVerificationMailFP extends SaveFP
String link = LoopbackHTTP.getRemoteAccessURL(request)
+ verificationArticle.getLink(request, CollectionUtils.EMPTY_MAP, "/")
+ "?cms%2Erm=SignIn"
+ "&id=" + job.getID()
+ "?id=" + job.getID()
+ "&key=" + job.getRandomKey()
+ "&aid=" + candidate.getID()
+ "&pin=" + candidate.getVerificationKey();
......
......@@ -3,22 +3,26 @@ package performa.form;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import oneit.logging.*;
import oneit.objstore.StorageException;
import oneit.objstore.parser.BusinessObjectParser;
import oneit.security.SecUser;
import oneit.servlets.forms.*;
import oneit.servlets.process.*;
import oneit.servlets.security.SessionSecUserDecorator;
import oneit.utils.*;
import performa.orm.*;
public class VerifyIdentityFP extends SaveFP
public class VerifyIdentityFP extends ORMProcessFormProcessor
{
private static LoggingArea LOG = LoggingArea.createLoggingArea("VerifyIdentity");
@Override
protected Map validate(SubmissionDetails submission, MultiException exceptions)
{
HttpServletRequest request = submission.getRequest();
Boolean isVerify = CollectionUtils.equals(request.getAttribute("isVerify"), Boolean.TRUE);
Job job = (Job) request.getAttribute("Job");
Candidate candidate = (Candidate) request.getAttribute("Candidate");
SecUser secUser = candidate.getUser();
......@@ -31,6 +35,48 @@ public class VerifyIdentityFP extends SaveFP
BusinessObjectParser.assertFieldCondition(secUser.getFirstName() != null, secUser, SecUser.FIELD_FirstName, "mandatory", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(secUser.getLastName() != null, secUser, SecUser.FIELD_LastName, "mandatory", exceptions, true, request);
if(isVerify)
{
BusinessObjectParser.assertFieldCondition(job.getPassword()!= null, job, Job.FIELD_Password, "mandatory", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(job.getConfirmPassword()!= null, job, Job.FIELD_ConfirmPassword, "mandatory", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(CollectionUtils.equals(job.getPassword(), job.getConfirmPassword()), job, Job.FIELD_ConfirmPassword, "passwordNotMatch", exceptions, true, request);
}
return super.validate(submission, exceptions);
}
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map params) throws BusinessException, StorageException
{
HttpServletRequest request = submission.getRequest();
Boolean isVerify = CollectionUtils.equals(request.getAttribute("isVerify"), Boolean.TRUE);
Job job = (Job) request.getAttribute("Job");
String nextPage = (String) request.getAttribute("nextPage");
if(isVerify)
{
Candidate candidate = (Candidate) request.getAttribute("Candidate");
SecUser secUser = candidate.getUser();
LogMgr.log(LOG, LogLevel.PROCESSING1, "Verifing User", job, secUser);
if(CollectionUtils.equals(job.getPassword(), job.getConfirmPassword()))
{
secUser.setAttribute("md5:" + SecUser.FIELD_Password, job.getPassword());
candidate.setIsAccountVerified(Boolean.TRUE);
request.getSession().setAttribute (SecUser.SEC_USER_ID, secUser);
request.getSession().setAttribute (SessionSecUserDecorator.REFRESH_SECURITY, Boolean.TRUE);
// request.setAttribute("nextPage", nextPage + "&JobID=" + job.getObjectID());
LogMgr.log(LOG, LogLevel.PROCESSING1, "Password resetted", job, secUser);
}
}
process.completeAndRestart();
return new ProcessRedirectResult(nextPage + "&JobID=" + job.getObjectID(), new String[0]);
}
}
\ No newline at end of file
......@@ -404,7 +404,7 @@ public class Job extends BaseJob
{
if(getEmail()!=null)
{
SecUser user = SecUser.searchNAME(getTransaction(), getEmail());
SecUser user = SecUser.searchNAME(getTransaction(), getEmail().toLowerCase());
if(user!=null && user.getExtension(Candidate.REFERENCE_Candidate)!=null)
{
......
......@@ -38,6 +38,7 @@ public class WebUtils
public static final String APPLICANTS_GRID = "ApplicantsGrid";
public static final String VIEW_APPLICATION = "ViewApplication";
public static final String UNSUITABLE_APPS = "UnsuitableApps";
public static final String APPLICANT_ACCOUNT_VERIFICATION = "ApplicantAccountVerification";
public static String getArticleLink(HttpServletRequest request, ObjectTransaction objTran, String articleShortcut, String renderMode)
......
......@@ -4389,7 +4389,7 @@ img.alert-icon {float: left;}
.main-export {text-align: center;}
.appli-name,.appli-applied{text-align: center;}
.appli-applied {margin-bottom: 15px;}
.main-verify-identity {width: 100%;padding: 0 30px;}
.main-verify-identity {width: 100%;padding: 0 30px; margin-bottom: 80px;}
.pl-confirm {font-size: 12px;margin: 29px 0 25px;}
.main-box-layout.main-verify-step-2 {padding: 28px 30px 29px;}
.main-box-layout.login-box{padding: 28px 30px 29px;}
......
......@@ -11,7 +11,6 @@
<FORM name="*.sendVerificationMail" factory="Participant" class="performa.form.SendVerificationMailFP">
<AccountVerificationEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="AccountVerificationMail"/>
</FORM>
<FORM name="*.resetPassword" factory="Participant" class="performa.form.ResetPasswordFP"/>
</NODE>
......
......@@ -29,14 +29,25 @@
</MAP>
<MAP value="JOB_APLICATION" description="Job Application" TemplatePage="dynamic_content_form_applicant.jsp">
<MAP value="APPLICANT_ACCOUNT_VERIFICATION" description="Applicant Account Verification" TemplatePage="dynamic_content_form.jsp">
<NODE name="Config" factory="Participant" class="oneit.business.content.ArticleConfiguration">
<INHERITS nodename="StandardJSP"/>
<RenderMode name="Page" preIncludeJSP="extensions/applicantportal/verify_identity.jsp"/>
<RenderMode name="ApplicationOutline" preIncludeJSP="extensions/applicantportal/application_outline.jsp"/>
<RenderMode name="AuthError" preIncludeJSP="extensions/applicantportal/auth_error.jsp"/>
</NODE>
</MAP>
<MAP value="JOB_APLICATION" description="Job Application" TemplatePage="dynamic_content_form_applicant.jsp">
<NODE name="Config" factory="Participant" class="oneit.business.content.ArticleConfiguration">
<INHERITS nodename="StandardJSP"/>
<RenderMode name="Page" preIncludeJSP="extensions/applicantportal/application_outline.jsp"/>
<RenderMode name="SelectionCriteria" preIncludeJSP="extensions/applicantportal/selection_criteria.jsp"/>
<RenderMode name="WorkplaceCulture" preIncludeJSP="extensions/applicantportal/workplace_culture.jsp"/>
<RenderMode name="JobMatchAssessment" preIncludeJSP="extensions/applicantportal/job_match_assessment.jsp"/>
......
......@@ -9,8 +9,17 @@
<%
ObjectTransaction objTran = process.getTransaction ();
String nextPage = WebUtils.getSamePageInRenderMode(request, "SelectionCriteria");
boolean toRedirect = GenericObjDF.getOrCreateObject (request, "Job", Job.REFERENCE_Job);
Job job = (Job) process.getAttribute("Job");
Candidate candidate = Utils.getCandidateUser(transaction);
Debug.assertion(job != null && !toRedirect, "Invalid job in applicant portal");
SecUser secUser = SecUser.getTXUser(transaction);
Candidate candidate = secUser.getExtension(Candidate.REFERENCE_Candidate);
Debug.assertion(candidate != null, "Invalid candidate in applicant portal");
JobApplication jobApplication = JobApplication.searchCandidateJob(objTran, candidate, job);
if(jobApplication == null)
......@@ -27,9 +36,7 @@
Boolean isCultureComplete = jobApplication.cultureCompleted();
Boolean isAssesmentComplete = jobApplication.assessmentCompleted();
process.setAttribute("JobApplication", jobApplication);
%>
<div class="welcome-aust-logo"><img src="images/australia-post.png" /></div>
<div class="welcome-title">Welcome <oneit:toString value="<%= candidate.getFirstName() %>"/>, here's your application outline</div>
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<oneit:dynIncluded>
<div style="width: 50%; margin: 0px auto 0px auto; text-align: center">
<h3>Authentication Error</h3>
<p><span>Access expired.</span></p>
</div>
</oneit:dynIncluded>
......@@ -16,31 +16,6 @@
job = Job.getJobByID(transaction, Long.parseLong((String) request.getParameter("JobID")));
}
//to process candidate verification
String id = request.getParameter("id");
String key = request.getParameter("key");
String candidateId = request.getParameter("aid");
String pin = request.getParameter("pin");
if(id != null && key != null)
{
job = Job.searchJobKey(transaction, Long.parseLong(id), key);
}
if(candidateId!=null && pin!=null)
{
candidate = Candidate.searchIdPin(transaction, Long.parseLong(candidateId), pin);
if(candidate!=null && candidate.getIsAccountVerified()==Boolean.TRUE)
{
response.setStatus(404);
return;
}
}
process.setAttribute("Job", job);
process.setAttribute("NewCandidate", candidate);
Debug.assertion(job != null, "Job is null in applicant portal");
%>
<script type="text/javascript">
......@@ -57,23 +32,6 @@
$('.sign-in-btn').attr('disabled', 'disabled');
}
});
$('.reset-pw-btn').attr('disabled', 'disabled');
$('.reset-pw').keyup(function() {
var empty = false;
$('input.reset-pw').each(function() {
if ($( this ).val() == '') {
empty = true;
}
});
if(empty) {
$('.reset-pw-btn').attr('disabled', 'disabled');
} else {
$('.reset-pw-btn').removeAttr('disabled');
}
});
});
</script>
<style>
......@@ -93,7 +51,7 @@
position: absolute;
top: 50%;
right: -14px;
background-color: green;
background-color: #67b413;
padding-top: 5px;
}
......@@ -116,11 +74,6 @@
<oneit:toString value="<%= job.getPageTitle() %>" mode="EscapeHTML"/>
</div>
<div class="main-box-layout verify-i-setpone">
<%
if(candidate==null)
{
%>
<!-- <div class="box-label">Sign in using your social network of choice</div>
<ul class="social-login">
<li><a href="#"><img src="images/login-linkedin-icon.svg"></a></li>
......@@ -132,7 +85,7 @@
<div class="box-label">Sign in via email</div>
<div class="form-group text-left" id="email-div">
<label>Email Address</label>
<oneit:ormInput obj="<%= job %>" type="text" attributeName="Email" cssClass="form-control second-style" />
<oneit:ormInput obj="<%= job %>" type="text" attributeName="Email" cssClass="form-control second-style" style="text-transform: lowercase"/>
<oneit:recalcClass htmlTag="div" classScript="job.isEmailFound() ? 'show': 'hide'" job="<%= job %>" class="right-mark">
<span id="right-mark"><img src="images/right-mark.svg"/></span>
</oneit:recalcClass>
......@@ -157,7 +110,6 @@
<oneit:button value="Send link" name="sendVerificationMail" cssClass="box-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", currentPage)
.mapEntry("Job",job)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.mapEntry("restartProcess", Boolean.TRUE)
.mapEntry("attribNamesToRestore", "Job")
.mapEntry("attribNamesToRestore", Collections.singleton("Job"))
......@@ -165,37 +117,6 @@
.toMap() %>"/>
</div>
</oneit:recalcClass>
<%
}
else
{
SecUser secUser = candidate.getUser();
job.setEmail(secUser.getUserName());
%>
<div class="form-group text-left">
<label>Email Address</label>
<oneit:ormInput obj="<%= job %>" type="text" attributeName="Email" cssClass="form-control second-style" disabled="true" readonly="true"/>
</div>
<div class="form-group text-left">
<label>Password</label>
<oneit:ormInput obj="<%= job %>" type="password" attributeName="Password" cssClass="form-control second-style reset-pw"/>
</div>
<div class="form-group text-left">
<label>Confirm password</label>
<oneit:ormInput obj="<%= job %>" type="password" attributeName="ConfirmPassword" cssClass="form-control second-style reset-pw"/>
</div>
<div class="form-group">
<oneit:button value="Sign In" name="resetPassword" cssClass="box-btn reset-pw-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Job",job)
.mapEntry("NewCandidate",candidate)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.toMap() %>"/>
</div>
<%
}
%>
</div>
</div>
</oneit:form>
......
<?xml version="1.0" encoding="UTF-8"?>
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script"><NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Applicant Account Verification">
<createSpecificIdentifier factory='String' value='N44QD8IGZX6RGR87R9C0ELX4XHQ1XF'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="N44QD8IGZX6RGR87R9C0ELX4XHQ1XF"/>
</articleIdentifiers>
<createdLabel factory="String" value="N44QD8IGZX6RGR87R9C0ELX4XHQ1XF"/>
<newParentCategory factory="String" value="created:N6SFUFOG4A2H5U7ER9T8YDQI56H2TG"/>
<articleAttributeChanges factory="Map">
<NODE name="Additional CSS Class" factory="Null"/>
<NODE name="Exclude From Sitemap" factory="Boolean" value="false"/>
<NODE name="Exclude from SEO Indexing" factory="Boolean" value="false"/>
<NODE name="Add Brackline Separator" factory="Boolean" value="false"/>
<NODE name="On Top Menu" factory="Boolean" value="false"/>
<NODE name="On Footer Left" factory="Boolean" value="false"/>
<NODE name="Menu Title" factory="Null"/>
<NODE name="On Footer Menu" factory="Boolean" value="false"/>
<NODE name="Exclude From Search" factory="Boolean" value="false"/>
<NODE name="Menu Icon CSS" factory="Null"/>
<NODE name="On Left Menu" factory="Boolean" value="false"/>
<NODE name="Shortcuts" factory="String" value="ApplicantAccountVerification"/>
<NODE name="Exclude From Navigation" factory="Boolean" value="false"/>
<NODE name="On Footer Right" factory="Boolean" value="false"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2017-06-20 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2067-06-20 13:00:00"/>
<NODE name="Title" factory="String" value="Applicant Account Verification"/>
<NODE name="ShortTitle" factory="String" value="Account Verification"/>
<NODE name="SortOrder" factory="Integer" value="-36831674"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="APPLICANT_ACCOUNT_VERIFICATION"/>
</ormAttributeChanges>
<content factory="Map"> <NODE name="Body" factory="Map">
<NODE name="Content" factory="String"><![CDATA[<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="HTML Tidy, see www.w3.org" name="generator">
<title></title>
</head>
<body>
<p>&nbsp;</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>&nbsp;</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="Synopsis" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
</content>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
......@@ -5,21 +5,97 @@
<oneit:dynIncluded>
<%
boolean toRedirect = GenericObjDF.getOrCreateObject (request, "Job", Job.REFERENCE_Job);
String nextPage = WebUtils.getArticleLink(request, process.getTransaction (), WebUtils.JOB_APPLICATION, "Page");
Candidate candidate = (Candidate) process.getAttribute("NewCandidate");
Job job = (Job) process.getAttribute("Job");
SecUser secUser = null;
boolean toRedirect = false;
Debug.assertion(job != null && !toRedirect, "Invalid job in applicant portal");
//to process candidate verification
String id = request.getParameter("id");
String key = request.getParameter("key");
String candidateId = request.getParameter("aid");
String pin = request.getParameter("pin");
Boolean isVerify = Boolean.FALSE;
if(id!=null || key!=null || candidateId!=null || pin!=null)
{
isVerify = Boolean.TRUE;
if(candidateId!=null && pin!=null)
{
candidate = Candidate.searchIdPin(transaction, Long.parseLong(candidateId), pin);
if(candidate!=null && candidate.getIsAccountVerified()!=Boolean.TRUE)
{
secUser = candidate.getUser();
process.setAttribute("NewCandidate", candidate);
}
}
if(id != null && key != null)
{
job = Job.searchJobKey(transaction, Long.parseLong(id), key);
process.setAttribute("Job", job);
}
}
else
{
toRedirect = GenericObjDF.getOrCreateObject (request, "Job", Job.REFERENCE_Job);
}
SecUser secUser = SecUser.getTXUser(transaction);
Candidate candidate = secUser.getExtension(Candidate.REFERENCE_Candidate);
//INVALID REQUEST FOR VERIFY CANDIDATE
if(isVerify && (job==null || secUser==null))
{
response.sendRedirect(WebUtils.getSamePageInRenderMode(request, "AuthError"));
}
if(secUser==null)
{
secUser = SecUser.getTXUser(transaction);
candidate = secUser.getExtension(Candidate.REFERENCE_Candidate);
}
Debug.assertion(job != null && !toRedirect, "Invalid job in applicant portal");
Debug.assertion(candidate != null, "Invalid candidate in applicant portal");
String nextPage = WebUtils.getSamePageInRenderMode(request, "ApplicationOutline");
%>
<script>
<script type="text/javascript">
$(document.body).addClass('bg-color');
$(document).ready(function() {
$('.reset-pw-btn').attr('disabled', 'disabled');
validate();
$('.reset-pw').keyup(function() {
validate();
});
});
function validate() {
var empty = false;
$('input.reset-pw').each(function() {
if ($( this ).val() == '') {
empty = true;
}
});
if(empty) {
$('.reset-pw-btn').attr('disabled', 'disabled');
} else {
$('.reset-pw-btn').removeAttr('disabled');
}
}
</script>
<style>
button[disabled] {
opacity: 0.6;
background-color: #0582ba;
}
</style>
<oneit:form name="signIn" method="post" enctype="multipart/form-data">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
......@@ -30,7 +106,7 @@
<div class="main-box-layout main-verify-step-2">
<div class="form-group text-left">
<label>Email Address</label>
<oneit:ormInput obj="<%= secUser %>" type="text" attributeName="UserName" cssClass="form-control second-style" />
<oneit:ormInput obj="<%= secUser %>" type="text" attributeName="UserName" cssClass="form-control second-style" disabled="true" readonly="true"/>
</div>
<div class="row">
<div class="form-group text-left col-sm-6 col-xs-12">
......@@ -46,13 +122,28 @@
<label><oneit:ormlabel obj="<%= candidate %>" field="Phone" /></label>
<oneit:ormInput obj="<%= candidate %>" type="text" attributeName="Phone" cssClass="form-control second-style" />
</div>
<%
if(isVerify)
{
%>
<div class="form-group text-left">
<label>Password</label>
<oneit:ormInput obj="<%= job %>" type="password" attributeName="Password" cssClass="form-control second-style reset-pw"/>
</div>
<div class="form-group text-left">
<label>Confirm password</label>
<oneit:ormInput obj="<%= job %>" type="password" attributeName="ConfirmPassword" cssClass="form-control second-style reset-pw"/>
</div>
<%
}
%>
<div class="text-center">
<oneit:button value="Verify and proceed" name="verifyIdentity" cssClass="box-btn margin-top-18"
<oneit:button value="<%= isVerify ? "Sign In" : "Verify and proceed"%>" name="verifyIdentity" cssClass="box-btn reset-pw-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Job", job)
.mapEntry("Candidate", candidate)
.mapEntry("attribNamesToRestore", CollectionUtils.createSet("Job"))
.mapEntry("restartProcess", Boolean.TRUE)
.mapEntry("Job",job)
.mapEntry("Candidate",candidate)
.mapEntry("isVerify",isVerify)
.toMap() %>"/>
</div>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment