Commit 23aec6ce by Harsh Shah

Finish Release-20171030

parents 8f0fee74 897c1e95
......@@ -23,7 +23,8 @@
<column name="city" type="String" nullable="true" length="100"/>
<column name="state" type="String" nullable="true" length="200"/>
<column name="country" type="String" nullable="true" length="200"/>
<column name="level_id" type="Long" length="11" nullable="false"/>
<column name="manually_closed" type="Boolean" nullable="true"/>
<column name="level_id" type="Long" length="11" nullable="true"/>
<column name="client_id" type="Long" length="11" nullable="true"/>
<column name="company_user_id" type="Long" length="11" nullable="true"/>
<column name="shortened_url_id" type="Long" length="11" nullable="true"/>
......
......@@ -23,7 +23,8 @@ CREATE TABLE tl_job (
city varchar(100) NULL,
state varchar(200) NULL,
country varchar(200) NULL,
level_id numeric(12) NOT NULL,
manually_closed char(1) NULL,
level_id numeric(12) NULL,
client_id numeric(12) NULL,
company_user_id numeric(12) NULL,
shortened_url_id numeric(12) NULL
......
......@@ -24,7 +24,8 @@ CREATE TABLE tl_job (
city varchar2(100) NULL,
state varchar2(200) NULL,
country varchar2(200) NULL,
level_id number(12) NOT NULL,
manually_closed char(1) NULL,
level_id number(12) NULL,
client_id number(12) NULL,
company_user_id number(12) NULL,
shortened_url_id number(12) NULL
......
......@@ -24,7 +24,8 @@ CREATE TABLE tl_job (
city varchar(100) NULL,
state varchar(200) NULL,
country varchar(200) NULL,
level_id numeric(12) NOT NULL,
manually_closed char(1) NULL,
level_id numeric(12) NULL,
client_id numeric(12) NULL,
company_user_id numeric(12) NULL,
shortened_url_id numeric(12) NULL
......
package performa.batch;
import java.util.Set;
import oneit.appservices.batch.ORMBatch;
import oneit.logging.*;
import oneit.objstore.ObjectTransaction;
......@@ -7,7 +8,9 @@ import oneit.objstore.StorageException;
import oneit.objstore.rdbms.filters.LessThanFilter;
import oneit.utils.DateDiff;
import oneit.utils.parsers.FieldException;
import performa.intercom.utils.IntercomUtils;
import performa.orm.Job;
import performa.orm.Company;
import performa.orm.types.JobStatus;
......@@ -27,8 +30,17 @@ public class CloseJobBatch extends ORMBatch
for (Job job : expiringJobs)
{
job.setJobStatus(JobStatus.COMPLETE);
job.setIsManuallyClosed(Boolean.FALSE);
LogMgr.log(CLOSE_JOB_BATCH, LogLevel.DEBUG2, "Setting Job Status to Closed in job : ", job);
}
// Update closed job details to intercom
Set<Company> companies = Job.pipesJob(expiringJobs).toCompanyUser().toCompany().uniqueVals();
for (Company company : companies)
{
IntercomUtils.updateCompany(company);
}
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import oneit.objstore.StorageException;
import oneit.objstore.parser.BusinessObjectParser;
import oneit.objstore.rdbms.filters.EqualsFilter;
import oneit.objstore.utils.ObjstoreUtils;
import oneit.security.SecUser;
import oneit.servlets.forms.SubmissionDetails;
import oneit.servlets.forms.SuccessfulResult;
import oneit.servlets.process.ORMProcessState;
......@@ -17,6 +18,8 @@ import oneit.servlets.process.SaveFP;
import oneit.utils.BusinessException;
import oneit.utils.filter.CollectionFilter;
import oneit.utils.filter.Filter;
import performa.intercom.utils.IntercomUtils;
import performa.orm.CompanyUser;
import performa.orm.Job;
import performa.orm.JobApplication;
import performa.orm.types.AppProcessOption;
......@@ -61,7 +64,19 @@ public class BulkUpdateFP extends SaveFP
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1,"In BulkUpdateFP Job Application Status successfully changed : ", application );
}
// restarting process as custom attributes needs to be updated to intercom
completeProcessRestartAndRestoreAttribs(process, request);
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
{
IntercomUtils.updateCompany(companyUser.getCompany());
}
return super.processForm(process, submission, params);
}
}
......@@ -5,11 +5,14 @@ import javax.servlet.http.HttpServletRequest;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
import oneit.security.SecUser;
import oneit.servlets.forms.SubmissionDetails;
import oneit.servlets.forms.SuccessfulResult;
import oneit.servlets.process.ORMProcessState;
import oneit.servlets.process.SaveFP;
import oneit.utils.BusinessException;
import performa.intercom.utils.IntercomUtils;
import performa.orm.CompanyUser;
import performa.orm.JobApplication;
import performa.orm.types.AppProcessOption;
import performa.orm.types.ApplicationStatus;
......@@ -34,7 +37,19 @@ public class ChangeApplicationStatusFP extends SaveFP
}
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1,"In ChangeApplicationStatusFP Job Application Status successfully changed : ", jobApplication );
// restarting process as custom attributes needs to be updated to intercom
completeProcessRestartAndRestoreAttribs(process, request);
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
{
IntercomUtils.updateCompany(companyUser.getCompany());
}
return super.processForm(process, submission, params);
}
}
\ No newline at end of file
......@@ -6,9 +6,12 @@ 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 static oneit.servlets.process.SaveFP.completeProcessRestartAndRestoreAttribs;
import oneit.utils.*;
import performa.intercom.utils.IntercomUtils;
import performa.orm.*;
import performa.orm.types.ApplicationStatus;
import performa.utils.AnalysisEngine;
......@@ -19,14 +22,14 @@ public class CompleteApplicationFP extends SaveFP
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map params) throws BusinessException, StorageException
{
JobApplication jobApplication = (JobApplication) process.getAttribute("JobApplication");
HttpServletRequest request = submission.getRequest();
JobApplication jobApplication = (JobApplication) process.getAttribute("JobApplication");
jobApplication.setApplicationStatus(ApplicationStatus.SUBMITTED);
jobApplication.setSubmittedDate(new Date());
AnalysisEngine.analyseAnswers(jobApplication.getCandidate(), jobApplication.getJob().getLevel(), jobApplication.getCompletedAnswers());
//TODO: set application status as UNSUITABLE if not scored
if(false)
{
......@@ -35,6 +38,18 @@ public class CompleteApplicationFP extends SaveFP
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING2, "Job Application Completed", jobApplication);
// restarting process as custom attributes needs to be updated to intercom
completeProcessRestartAndRestoreAttribs(process, request);
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
{
IntercomUtils.updateCompany(companyUser.getCompany());
}
return super.processForm(process, submission, params);
}
......
......@@ -7,12 +7,17 @@ import java.util.Map;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
import oneit.objstore.parser.BusinessObjectParser;
import oneit.security.SecUser;
import oneit.servlets.forms.SubmissionDetails;
import oneit.servlets.forms.SuccessfulResult;
import oneit.servlets.process.ORMProcessState;
import oneit.servlets.process.SaveFP;
import oneit.utils.BusinessException;
import oneit.utils.DateDiff;
import oneit.utils.MultiException;
import performa.intercom.utils.IntercomUtils;
import performa.orm.CompanyUser;
import performa.orm.Job;
import performa.orm.types.JobStatus;
......@@ -30,19 +35,17 @@ public class SaveJobFP extends SaveFP
Job oldJob = (Job) job.getEarliestBackup();
if(oldJob != null && oldJob.getJobStatus() == JobStatus.DRAFT && job.getJobStatus() == JobStatus.OPEN)
if(openJob==Boolean.TRUE)
{
job.setApplyBy(DateDiff.add(DateDiff.getToday(), Calendar.DATE, 30));
job.setOpenDate(new Date());
job.setJobStatus(JobStatus.OPEN);
LogMgr.log(Job.LOG, LogLevel.PROCESSING1,"Job status changed as Open. ", job );
}
if(openJob==Boolean.TRUE)
if(oldJob != null && oldJob.getJobStatus() == JobStatus.DRAFT && job.getJobStatus() == JobStatus.OPEN)
{
job.setJobStatus(JobStatus.OPEN);
job.setApplyBy(DateDiff.add(DateDiff.getToday(), Calendar.DATE, 30));
job.setOpenDate(new Date());
LogMgr.log(Job.LOG, LogLevel.PROCESSING1,"Job status changed as Open. ", job );
}
if(job.getJobStatus() == JobStatus.OPEN && job.getShortenedURL() == null)
......@@ -50,6 +53,38 @@ public class SaveJobFP extends SaveFP
job.createShortenedURL();
}
if(job.getJobStatus() == JobStatus.COMPLETE)
{
job.setIsManuallyClosed(Boolean.TRUE);
}
// restarting process as custom attributes needs to be updated to intercom
completeProcessRestartAndRestoreAttribs(process, request);
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
{
IntercomUtils.updateCompany(companyUser.getCompany());
}
return super.processForm(process, submission, params);
}
@Override
public void validate(ORMProcessState process, SubmissionDetails submission, MultiException exceptions, Map params) throws StorageException
{
HttpServletRequest request = submission.getRequest();
Job job = process.getAttribute("Job") != null ? (Job) process.getAttribute("Job") : (Job) request.getAttribute("Job");
Boolean openJob = (Boolean) request.getAttribute("openJob");
if(job.getJobStatus() != JobStatus.DRAFT || openJob == Boolean.TRUE)
{
BusinessObjectParser.assertFieldCondition(job.getLevel() != null, job , Job.SINGLEREFERENCE_Level, "mandatory", exceptions, true, request);
}
super.validate(process, submission, exceptions, params);
}
}
\ No newline at end of file
......@@ -29,6 +29,7 @@ public class SendCompanyUserInvitesFP extends SaveFP
private static final LoggingArea LOG = LoggingArea.createLoggingArea("SendCompanyUserInvites");
protected ConfigurableArticleTemplateEmailer emailer;
protected ConfigurableArticleTemplateEmailer ownerAccountCreatedEmailer;
protected ConfigurableArticleTemplateEmailer invitationEmailer;
......@@ -80,7 +81,6 @@ public class SendCompanyUserInvitesFP extends SaveFP
LogMgr.log(LOG, LogLevel.PROCESSING1, "Verifing Company User", companyUser, secUser);
companyUser.setRole(RoleType.ADMIN);
companyUser.setIsAccountVerified(Boolean.TRUE);
company.setIsVerified(Boolean.TRUE);
......@@ -98,6 +98,8 @@ public class SendCompanyUserInvitesFP extends SaveFP
if(companyUser == company.getAddedByUser())
{
companyUser.setRole(RoleType.ADMIN);
//process user invitations
for(CompanyUser cUser : company.getUsersSet())
{
......@@ -147,8 +149,9 @@ public class SendCompanyUserInvitesFP extends SaveFP
{
super.init(context);
emailer = (ConfigurableArticleTemplateEmailer) (context.getSingleChild("AccountCreatedEmailer"));
invitationEmailer = (ConfigurableArticleTemplateEmailer) (context.getSingleChild("InvitationEmailer"));
emailer = (ConfigurableArticleTemplateEmailer) (context.getSingleChild("AccountCreatedEmailer"));
ownerAccountCreatedEmailer = (ConfigurableArticleTemplateEmailer) (context.getSingleChild("OwnerAccountCreatedEmailer"));
invitationEmailer = (ConfigurableArticleTemplateEmailer) (context.getSingleChild("InvitationEmailer"));
}
private void sendAccountCreatedMail(CompanyUser companyUser, HttpServletRequest request) throws BusinessException
......@@ -157,11 +160,28 @@ public class SendCompanyUserInvitesFP extends SaveFP
{
LogMgr.log(LOG, LogLevel.PROCESSING1, "Sending Account Created mail from SendCompanyUserInvitesFP to :: ", companyUser);
Map defaultParams = CollectionUtils.EMPTY_MAP;
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser);
Utils.sendMail(emailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
String link = LoopbackHTTP.getRemoteAccessURL(request) + "/extensions/adminportal/forgot_password.jsp";
if(companyUser == companyUser.getCompany().getAddedByUser())
{
Article article = WebUtils.getArticleByShortCut(companyUser.getTransaction(), WebUtils.JOBS);
String jobCreateLink = LoopbackHTTP.getRemoteAccessURL(request)
+ article.getLink(request, CollectionUtils.mapEntry("cms.rm", WebUtils.CREATE_JOB).toMap(), "/");
Map defaultParams = CollectionUtils.mapEntry("link", link)
.mapEntry("create_job_link", jobCreateLink)
.toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getUser(), companyUser.getCompany());
Utils.sendMail(ownerAccountCreatedEmailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
}
else
{
Map defaultParams = CollectionUtils.mapEntry("link", link).toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getCompany(), companyUser.getUser());
Utils.sendMail(emailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
}
LogMgr.log(LOG, LogLevel.PROCESSING1, "Sent Account Created mail successfully from " + SendCompanyUserInvitesFP.class + " to :: ", companyUser);
}
catch (ConfigurableEmailerException ex)
......@@ -192,7 +212,7 @@ public class SendCompanyUserInvitesFP extends SaveFP
+ "?id=" + companyUser.getID()
+ "&key=" + companyUser.getVerificationKey();
Map defaultParams = CollectionUtils.mapEntry("link", link).toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser);
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getCompany(), companyUser.getCompany().getAddedByUser().getUser());
Utils.sendMail(invitationEmailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
......
......@@ -60,7 +60,7 @@ public class SendUserInvitationFP extends SaveFP
{
LogMgr.log(LOG, LogLevel.PROCESSING1, "Started to re-sending invitaion email.", resendUser);
sendInvitationMail(resendUser, request);
sendInvitationMail(resendUser, request, objTran);
LogMgr.log(LOG, LogLevel.PROCESSING1, "End of re-sending invitation email.", resendUser);
}
......@@ -90,7 +90,7 @@ public class SendUserInvitationFP extends SaveFP
LogMgr.log(LOG, LogLevel.PROCESSING1, "New user created :: ", secUser);
sendInvitationMail(newComUser, request);
sendInvitationMail(newComUser, request, objTran);
LogMgr.log(LOG, LogLevel.PROCESSING1, "End of sending invitation email.", secUser);
}
......@@ -108,7 +108,7 @@ public class SendUserInvitationFP extends SaveFP
}
protected void sendInvitationMail(CompanyUser companyUser, HttpServletRequest request) throws BusinessException
protected void sendInvitationMail(CompanyUser companyUser, HttpServletRequest request, ObjectTransaction objTran) throws BusinessException
{
if(!companyUser.isTrue(companyUser.getIsAccountVerified()))
{
......@@ -133,7 +133,7 @@ public class SendUserInvitationFP extends SaveFP
+ "?id=" + companyUser.getID()
+ "&key=" + companyUser.getVerificationKey();
Map defaultParams = CollectionUtils.mapEntry("link", link).toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser);
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getCompany(), SecUser.getTXUser(objTran));
Utils.sendMail(invitationEmailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
......
......@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import oneit.utils.Storage;
class HttpClient {
......@@ -248,7 +249,7 @@ class HttpClient {
}
private String generateAuthString(String username, String password) {
return Base64.encodeBase64String((username + ":" + password).getBytes());
return Storage.bytesToBase64((username + ":" + password).getBytes());
}
private Map<String, String> createHeaders() {
......
package performa.intercom.utils;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.logging.LoggingArea;
import oneit.objstore.ObjectTransaction;
import oneit.objstore.StorageException;
import oneit.objstore.rdbms.filters.EqualsFilter;
import oneit.objstore.rdbms.filters.InFilter;
import oneit.objstore.utils.ObjstoreUtils;
import oneit.security.SecUser;
import oneit.utils.CollectionUtils;
import oneit.utils.ObjectTransform;
import oneit.utils.filter.CollectionFilter;
import oneit.utils.filter.Filter;
import performa.intercom.resources.Company;
import performa.intercom.resources.CustomAttribute;
import performa.intercom.resources.Intercom;
import performa.intercom.resources.User;
import performa.orm.Job;
import performa.orm.JobApplication;
import performa.orm.types.ApplicationStatus;
import performa.orm.types.JobStatus;
import performa.utils.Utils;
......@@ -99,8 +116,7 @@ public class IntercomUtils
{
Company intercomCompany = new Company();
intercomCompany.setName(company.getCompanyName());
intercomCompany.setCompanyID(company.getID().toString());
setCompanyDetails(intercomCompany, company);
return Company.create(intercomCompany);
}
......@@ -111,6 +127,55 @@ public class IntercomUtils
return null;
}
}
private static void setCompanyDetails(Company intercomCompany, performa.orm.Company company) throws StorageException
{
intercomCompany.setName(company.getCompanyName());
intercomCompany.setCompanyID(company.getID().toString());
// job related custom attributes
Job[] jobs = Job.searchCompany(company.getTransaction(), company);
Filter draftFilter = Job.SearchByAll().andJobStatus(new EqualsFilter<>(JobStatus.DRAFT));
Collection draftJobs = CollectionFilter.filter(Arrays.asList(jobs), draftFilter);
Filter filledFilter = Job.SearchByAll().andJobStatus(new EqualsFilter<>(JobStatus.FILLED));
Collection filledJobs = CollectionFilter.filter(Arrays.asList(jobs), filledFilter);
Filter openFilter = Job.SearchByAll().andJobStatus(new EqualsFilter<>(JobStatus.OPEN));
Collection openJobs = CollectionFilter.filter(Arrays.asList(jobs), openFilter);
Filter closedFilter = Job.SearchByAll().andJobStatus(new EqualsFilter<>(JobStatus.COMPLETE));
Collection closedJobs = CollectionFilter.filter(Arrays.asList(jobs), closedFilter);
Filter manuallyFilter = Job.SearchByAll().andIsManuallyClosed(new EqualsFilter<>(Boolean.TRUE));
Collection manuallyClosed = CollectionFilter.filter(closedJobs, manuallyFilter);
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("job-count", jobs != null ? jobs.length : 0));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("draft-job-count", draftJobs.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("filled_job_count", filledJobs.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("open_job_count", openJobs.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("manually_closed_job_count", manuallyClosed.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("expired_job_count", closedJobs.size() - manuallyClosed.size()));
// applicant related custom attributes
Filter allApplicantFilter = JobApplication.SearchByAll().andApplicationStatus(new InFilter<>(ApplicationStatus.SUBMITTED, ApplicationStatus.SHORTLISTED, ApplicationStatus.UNSUITABLE));
Collection applicants = Job.pipesJob(jobs).toJobApplications(allApplicantFilter).uniqueVals();
Filter shortlistedFilter = JobApplication.SearchByAll().andApplicationStatus(new EqualsFilter<>(ApplicationStatus.SHORTLISTED));
Collection shortlistedApplicants = CollectionFilter.filter(applicants, shortlistedFilter);
Filter unsuitableFilter = JobApplication.SearchByAll().andApplicationStatus(new EqualsFilter<>(ApplicationStatus.UNSUITABLE));
Collection unsuitableApplicants = CollectionFilter.filter(applicants, unsuitableFilter);
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("total_applicants", applicants.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("total_shortlisted", shortlistedApplicants.size()));
intercomCompany.addCustomAttribute(CustomAttribute.newIntegerAttribute("total_unsuitable", unsuitableApplicants.size()));
List<Job> sortedJobs = ObjstoreUtils.sort(Arrays.asList(jobs),
new ObjectTransform[]{Job.pipesJob().toObjectCreated()},
new Comparator[]{CollectionUtils.reverse(CollectionUtils.DEFAULT_COMPARATOR)});
if(sortedJobs.size() > 0)
{
intercomCompany.addCustomAttribute(CustomAttribute.newLongAttribute("recent_job_created_at", sortedJobs.get(0).getObjectCreated().getTime() / 1000));
}
}
public static Company findCompanyByID(performa.orm.Company company)
......@@ -144,7 +209,8 @@ public class IntercomUtils
}
else
{
intercomCompany.setName(company.getCompanyName());
setCompanyDetails(intercomCompany, company);
Company.update(intercomCompany);
}
}
......@@ -167,4 +233,28 @@ public class IntercomUtils
return intercomCompany;
}
// public static void createAccessedJobEvent(Job job, User user)
// {
// try
// {
// Map<String, CustomAttribute> customAttributes = user.getCustomAttributes();
// customAttributes.get("shortlisted-count");
// Event event = new Event();
//
// event.setEventName("accessed-job");
// event.putMetadata("applicant-count", job.getNoOfCandidatesApplied());
// event.putMetadata("shortlisted-count", job.getNoOfCandidatesShortlisted());
// event.setUserID(user.getUserId());
// event.setCreatedAt(currentTimeMillis()/1000L);
//
// Event.create(event);
// }
// catch (Exception e)
// {
// LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while creating accessed job event in intercom");
//
// }
// }
}
package performa.orm;
import oneit.utils.math.NullArith;
public class ClassNormalisation extends BaseClassNormalisation
{
......@@ -16,4 +18,9 @@ public class ClassNormalisation extends BaseClassNormalisation
{
return "ClassNormalisation";
}
public Double getRoleFitScore(Integer weightedScore)
{
return NullArith.round(((10 * ((weightedScore - getWghtMeanScore()) / getWghtStddevScore())) + 50), 1);
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import oneit.objstore.ObjectStatus;
import oneit.objstore.ValidationContext;
import oneit.security.SecUser;
import oneit.utils.CollectionUtils;
import oneit.utils.StringUtils;
import oneit.utils.parsers.FieldException;
......@@ -59,4 +60,17 @@ public class Company extends BaseCompany
super.validate(context);
}
public Boolean isEmailCorrect()
{
return StringUtils.isEmailAddress(getUserEmail());
}
@Override
public String getToString()
{
return StringUtils.subNulls(getCompanyName(), super.getToString());
}
}
\ No newline at end of file
......@@ -46,8 +46,9 @@
<ATTRIB name="City" type="String" dbcol="city" length="100"/>
<ATTRIB name="State" type="State" dbcol="state" defaultValue="State.WA" attribHelper="EnumeratedAttributeHelper"/>
<ATTRIB name="Country" type="Countries" dbcol="country" defaultValue="Countries.AU" attribHelper="EnumeratedAttributeHelper"/>
<ATTRIB name="IsManuallyClosed" type="Boolean" dbcol="manually_closed" defaultValue="Boolean.FALSE"/>
<SINGLEREFERENCE name="Level" type="Level" dbcol="level_id" mandatory="true"/>
<SINGLEREFERENCE name="Level" type="Level" dbcol="level_id" mandatory="false"/>
<SINGLEREFERENCE name="Client" type="Client" dbcol="client_id" backreferenceName="Jobs"/>
<SINGLEREFERENCE name="CompanyUser" type="CompanyUser" dbcol="company_user_id" />
<SINGLEREFERENCE name="ShortenedURL" type="ShortenedURL" dbcol="shortened_url_id" />
......
......@@ -313,8 +313,8 @@ public class JobApplication extends BaseJobApplication
{
try
{
Map<FactorClass, Map<FactorLevelLink, Map>> factorScoreDetails = new LinkedHashMap();
Map<FactorClass, Tuple.T2<Double, ColorCode>> roleScoreMap = (Map<FactorClass, Tuple.T2<Double, ColorCode>>) getRoleFit();
Map<FactorClass, Map<FactorLevelLink, Map>> factorScoreDetails = new LinkedHashMap();
Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> roleScoreMap = (Map<FactorClass, Tuple.T3<Double, ColorCode, Double>>) getRoleFit();
for(FactorClass factorClass : getSortedFactorClasses())
{
......@@ -335,7 +335,7 @@ public class JobApplication extends BaseJobApplication
public Double getRoleFitScore()
{
return getRoleFit() != null && getRoleFit().get(null) != null ? ((Tuple.T2<Double, ColorCode>)getRoleFit().get(null)).get0() : 0d;
return getRoleFit() != null && getRoleFit().get(null) != null ? ((Tuple.T3<Double, ColorCode, Double>)getRoleFit().get(null)).get0() : 0d;
}
public Long getCultureFitScore()
......@@ -375,26 +375,9 @@ public class JobApplication extends BaseJobApplication
return score >= 80 ? "green" : (score >= 60 ? "yellow" : "red-b");
}
//This will return relative percentage considering topper as 100%
public Double getRoleFitPercentage()
{
Double myScore = getRoleFitScore();
if(myScore > 0 && getCandidate() != null && getJob() != null && getJob().getLevel() != null)
{
TestAnalysis testAnalysis = getCandidate().getTestAnalysisFor(getJob().getLevel());
if(testAnalysis != null)
{
Double topScore = AnalysisEngine.getSuitabilityScore(testAnalysis, true).get0();
if(topScore > 0)
{
return NullArith.round(NullArith.divide(NullArith.multiply(myScore, 100), topScore), 2);
}
}
}
return 0d;
return getRoleFit() != null && getRoleFit().get(null) != null ? ((Tuple.T3<Double, ColorCode, Double>)getRoleFit().get(null)).get2() : 0d;
}
public List<AppProcessOption> getValidProcessOptions()
......
package performa.orm;
import oneit.utils.math.NullArith;
public class LevelNormalisation extends BaseLevelNormalisation
{
......@@ -16,4 +18,9 @@ public class LevelNormalisation extends BaseLevelNormalisation
{
return "LevelNormalisation";
}
public Double getRoleFitScore(Double weightedScore)
{
return NullArith.round(((10 * ((weightedScore - getWghtMeanScore()) / getWghtStddevScore())) + 50), 2);
}
}
\ No newline at end of file
......@@ -22,7 +22,7 @@ public class AssessmentType extends AbstractEnumerated
public static final AssessmentType COMPREHENSIVE = new AssessmentType ("COMPREHENSIVE", "COMPREHENSIVE", "Talentology Comprehensive", false);
public static final AssessmentType EXPRESS = new AssessmentType ("EXPRESS", "EXPRESS", "Talentology Express", true);
public static final AssessmentType EXPRESS = new AssessmentType ("EXPRESS", "EXPRESS", "Talentology Express", false);
private static final AssessmentType[] allAssessmentTypes =
new AssessmentType[] { COMPREHENSIVE,EXPRESS};
......@@ -138,7 +138,7 @@ public class AssessmentType extends AbstractEnumerated
COMPREHENSIVE.QuestionDetails = " (250 Questions - 20 Minutes)";
COMPREHENSIVE.TestDescr = "Comprehensive Assessment";
EXPRESS.HeaderDesc = "";
EXPRESS.AdditionalDesc = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut.";
EXPRESS.AdditionalDesc = "";
EXPRESS.QuestionDetails = " (30 Questions - 5 Minutes)";
EXPRESS.TestDescr = "Express Assessment";
......
......@@ -13,8 +13,8 @@
QuestionDetails='" (250 Questions - 20 Minutes)"'
TestDescr='"Comprehensive Assessment"'/>
<VALUE name="EXPRESS" description="Talentology Express" HeaderDesc='""'
AdditionalDesc='"Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut."'
QuestionDetails='" (30 Questions - 5 Minutes)"' disabled="true"
AdditionalDesc='""'
QuestionDetails='" (30 Questions - 5 Minutes)"'
TestDescr='"Express Assessment"'/>
</CONSTANT>
</ROOT>
\ No newline at end of file
......@@ -413,12 +413,12 @@ public class AnalysisEngine
return roleFitMap;
}
public static Map<FactorClass, Tuple.T2<Double, ColorCode>> getRoleFitSuitability(Candidate candidate, Level level)
public static Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> getRoleFitSuitability(Candidate candidate, Level level)
{
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1, "AnalysisEngine --> getRoleFitSuitability called for candidate ", candidate, " Level ", level);
TestAnalysis testAnalysis = candidate.getTestAnalysisFor(level);
Map<FactorClass, Tuple.T2<Double, ColorCode>> scoreMap = new HashMap();
TestAnalysis testAnalysis = candidate.getTestAnalysisFor(level);
Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> scoreMap = new HashMap();
if(testAnalysis != null && testAnalysis.getCandidateClassScoresCount() > 0)
{
......@@ -429,30 +429,36 @@ public class AnalysisEngine
CandidateClassScore candidateClassScore = testAnalysis.pipelineTestAnalysis().toCandidateClassScores(candidateClassScoreFilter).val();
ClassNormalisation classNormalisation = level.getClassNormalisationFor(factorClass);
Double score = 0d;
Double maxScore = 0d;
Double scorePercentage = 0d;
ColorCode colorCode = null;
if(candidateClassScore != null && classNormalisation != null && NullArith.greaterThan(classNormalisation.getWghtStddevScore(), 0d))
{
score = NullArith.round(((10 * ((candidateClassScore.getWghtdClassScore() - classNormalisation.getWghtMeanScore()) / classNormalisation.getWghtStddevScore())) + 50), 1);
colorCode = candidateClassScore.getColorCode();
score = classNormalisation.getRoleFitScore(candidateClassScore.getWghtdClassScore());
maxScore = classNormalisation.getRoleFitScore(candidateClassScore.getMaxWghtdClassScore());
colorCode = candidateClassScore.getColorCode();
scorePercentage = NullArith.round(NullArith.divide(NullArith.multiply(score, 100), maxScore), 2);
}
scoreMap.put(factorClass, new Tuple.T2(score, colorCode));
scoreMap.put(factorClass, new Tuple.T3(score, colorCode, scorePercentage));
}
scoreMap.put(null, getSuitabilityScore(testAnalysis, false));
scoreMap.put(null, getSuitabilityScore(testAnalysis));
}
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1, "AnalysisEngine --> getRoleFitSuitability completed for candidate ", candidate, " Level ", level);
return scoreMap;
}
public static Tuple.T2<Double, ColorCode> getSuitabilityScore(TestAnalysis testAnalysis, boolean maxScore)
public static Tuple.T3<Double, ColorCode, Double> getSuitabilityScore(TestAnalysis testAnalysis)
{
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1, "AnalysisEngine --> getSuitabilityScore called for testAnalysis ", testAnalysis);
Double totalScore = maxScore ? testAnalysis.getMaxWghtdLevelScore() : testAnalysis.getWghtdLevelScore();
Double rawScore = testAnalysis.getWghtdLevelScore();
Double wghtdMeanScore = 0d;
Double wghtdStdDevScore = 0d;
Double suitabilityScore = 0d;
Double maxScore = 0d;
Double suitabilityPercent = 0d;
ColorCode colorCode = null;
LevelNormalisation levelNormalisation = testAnalysis.getLevel().getLevelNormalisation();
......@@ -461,18 +467,20 @@ public class AnalysisEngine
{
wghtdMeanScore = levelNormalisation.getWghtMeanScore();
wghtdStdDevScore = levelNormalisation.getWghtStddevScore();
}
if(wghtdStdDevScore > 0d)
{
suitabilityScore = NullArith.round(((10 * ((totalScore - wghtdMeanScore) / wghtdStdDevScore)) + 50), 2);
if(wghtdStdDevScore > 0d)
{
suitabilityScore = levelNormalisation.getRoleFitScore(rawScore);
maxScore = levelNormalisation.getRoleFitScore(testAnalysis.getMaxWghtdLevelScore());
suitabilityPercent = NullArith.round(NullArith.divide(NullArith.multiply(suitabilityScore, 100), maxScore), 2);
}
}
if(totalScore >= wghtdMeanScore)
if(rawScore >= wghtdMeanScore)
{
colorCode = ColorCode.GREEN;
}
else if(totalScore < (wghtdMeanScore - wghtdStdDevScore))
else if(rawScore < (wghtdMeanScore - wghtdStdDevScore))
{
colorCode = ColorCode.RED;
}
......@@ -482,7 +490,7 @@ public class AnalysisEngine
}
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING1, "AnalysisEngine --> getSuitabilityScore completed for testAnalysis ", testAnalysis, " Score:", suitabilityScore, " Color:", colorCode);
return new Tuple.T2(suitabilityScore, colorCode);
return new Tuple.T3(suitabilityScore, colorCode, suitabilityPercent);
}
public static Map<FactorLevelLink, Map> getFactorScoreDetails(Candidate candidate, Level level, FactorClass factorClass)
......
......@@ -424,7 +424,7 @@ public class Utils
+ "?id=" + companyUser.getID()
+ "&key=" + companyUser.getVerificationKey();
Map defaultParams = CollectionUtils.mapEntry("link", link).toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser);
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getUser());
Utils.sendMail(emailer, transform, new String[]{companyUser.getEmailAddressFromUser()}, null, companyUser);
......@@ -463,7 +463,7 @@ public class Utils
+ "?id=" + companyUser.getID()
+ "&key=" + companyUser.getVerificationKey();
Map defaultParams = CollectionUtils.mapEntry("link", link).toMap();
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser);
ObjectTransform transform = Utils.createCompoundTransform(defaultParams, companyUser.getUser());
Utils.sendMail(emailer, transform, new String[]{companyUser.getUser().getEmail()}, null, companyUser);
......
......@@ -849,6 +849,13 @@ span.checkbox.checked + .slider:before {-webkit-transform: translateX(18px);-ms-
margin-top: 10px;
font-weight: 500;
}
.btn.btn-primary.largeBtn.greyBtn, .btn.btn-primary.largeBtn.greyBtn:hover
{
background-color: rgba(255, 255, 255, 0.5);
border: solid 1px #dfdfdf;
color: #9b9b9b;
width: 200px;
}
.btn.btn-primary.largeBtn.grey{
background-color: #667281;
border-color: #667281;
......@@ -3353,7 +3360,7 @@ input.add-note-btn:hover{
text-align: center;
font-family: "Usual-Medium";
}
.int-timeline li a:hover {
.int-timeline li.has-applicant.inactive a:hover {
color: #ffffff;
font-size: 11px;
background-color: #4e5964;
......@@ -3438,7 +3445,7 @@ input.add-note-btn:hover{
width: 96px;
font-family: "Usual-Medium";
}
.unsutable a:hover,.unsutable a:hover span{
.unsutable.has-applicant.inactive a:hover,.unsutable.has-applicant.inactive a:hover span{
color: #ffffff;
}
.unsutable.active a:hover{
......
......@@ -37,11 +37,11 @@
<FORM name="*.bulkupdate" factory="Participant" class="performa.form.BulkUpdateFP"/>
<FORM name="*.navigateBetweenStatus" factory="Participant" class="performa.form.NavigateBetweenStatusFP"/>
<FORM name="*.sendCompanyUserInvites" factory="Participant" class="performa.form.SendCompanyUserInvitesFP">
<OwnerAccountCreatedEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="OwnerAccountCreatedMail"/>
<AccountCreatedEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="AccountCreatedMail"/>
<InvitationEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="InvitationMail"/>
</FORM>
<FORM name="*.sendUserInvites" factory="Participant" class="performa.form.SendUserInvitationFP">
<AccountCreatedEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="AccountCreatedMail"/>
<InvitationEmailer factory="Participant" class="oneit.email.ConfigurableArticleTemplateEmailer" templateShortcut="InvitationMail"/>
</FORM>
<FORM name="*.saveUserDetails" factory="Participant" class="performa.form.SaveUserDetailsFP">
......
......@@ -8,6 +8,7 @@
Job job = (Job) process.getAttribute("Job");
String samePage = WebUtils.getSamePageInRenderMode(request, WebUtils.ASSESSMENT_CRITERIA);
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.JOB_REVIEW);
String jobPage = WebUtils.getSamePageInRenderMode(request, "Page");
Debug.assertion(job != null, "Job is null in admin portal create job");
......@@ -184,6 +185,10 @@
</oneit:recalcClass>
</div>
<div class="text-center">
<oneit:button value="Save as draft" name="saveJob" cssClass="btn btn-primary top-margin-25 largeBtn greyBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobPage)
.mapEntry(UpdateMappedObjFP.FAIL_VALIDATION_ERRORS, Boolean.FALSE)
.toMap() %>"/>
<oneit:button value="Review Details" name="gotoPage" cssClass="btn btn-primary top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
......
......@@ -10,8 +10,10 @@
String firstTab = WebUtils.getSamePageInRenderMode(request, WebUtils.VIEW_APPLICANTS);
String secondTab = WebUtils.getSamePageInRenderMode(request, WebUtils.APPLICANTS_SHORTLIST);
String thirdTab = WebUtils.getSamePageInRenderMode(request, WebUtils.UNSUITABLE_APPS);
int noOfShortlisted = job.getNoOfCandidatesShortlisted();
int noOfUnsuitable = job.getNoOfCandidatesUnsuitable();
int totalCandidates = job.getNoOfCandidatesApplied();
%>
<oneit:dynIncluded>
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
......@@ -22,21 +24,18 @@
<div class="int-timeline">
<ul>
<li class="<%= tabNumber == "1" ? "active" : "" %>">
<li class="<%= totalCandidates > 0 ? "has-applicant" : "" %> <%= tabNumber == "1" ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", firstTab)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= job.getNoOfCandidatesApplied() %>" mode="Integer" />
<oneit:toString value="<%= totalCandidates %>" mode="Integer" />
</span>
Applicants
</oneit:button>
</li>
<li class="<%= tabNumber == "2" ? "active" : "" %>">
<%
int noOfShortlisted = job.getNoOfCandidatesShortlisted();
%>
<li class="<%= noOfShortlisted > 0 ? "has-applicant" : "" %> <%= tabNumber == "2" ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfShortlisted > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", secondTab)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
......@@ -49,11 +48,8 @@
</li>
</ul>
</div>
<div class="unsutable <%= tabNumber == "3" ? "active" : "" %>">
<%
int noOfUnsuitable = job.getNoOfCandidatesUnsuitable();
%>
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfUnsuitable > 0 ? "false" : "true" %>"
<div class="unsutable <%= noOfUnsuitable > 0 ? "has-applicant" : "" %> <%= tabNumber == "3" ? "active" : "inactive" %>">
<oneit:button id="unsuitableBtn" value=" " name="gotoPage" skin="link" disabled="<%= noOfUnsuitable > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", thirdTab)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.toMap() %>">
......
......@@ -21,7 +21,7 @@
.mapEntry("procParams", CollectionUtils.mapEntry("Company", company).toMap())
.toMap() %>">
<span><%= CollectionUtils.equals(company.getCompletedProfile(), Boolean.TRUE) ? "<img src=\"images/right-mark.png\" />" : "1"%></span>
<div>Company Profile</div>
<div>Team Profile</div>
</oneit:button>
</li>
<li class="<%= tabNumber == "2" ? "active" : ""%>">
......
......@@ -41,16 +41,15 @@
<%
for(Job job: jobs)
{
int shortlisted = job.getNoOfCandidatesShortlisted();
int maxShortlist = job.getMaxShortlistApplicants();
nextPage = shortlisted > 0 ? shortlistPage : nextPage;
int shortlisted = job.getNoOfCandidatesShortlisted();
int maxShortlist = job.getMaxShortlistApplicants();
String goToPage = shortlisted > 0 ? shortlistPage : nextPage;
%>
<div class="job-list" id="<%= job.getID() %>">
<div class="job-row" >
<div class="job-post jl-c eq-second-height" style="height: 107px;">
<div class="job-post-name">
<a href="<%= nextPage+"&JobID="+job.getObjectID() %>">
<a href="<%= goToPage+"&JobID="+job.getObjectID() %>">
<oneit:toString value="<%= job.getJobTitle() %>" mode="EscapeHTML" />
</a>
</div>
......@@ -92,9 +91,9 @@
<div class="ja-icon"><img src="images/job-list-user.svg"></div>
<div class="ja-count">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", goToPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.toMap() %>">
.toMap() %>" disabled="<%= job.getJobStatus() == JobStatus.DRAFT ? "true" : "false" %>">
<oneit:toString value="<%= job.getNoOfCandidatesApplied() %>" mode="EscapeHTML" nullValue="0"/>
</oneit:button>
<span class="grey-span">Applicants</span>
......@@ -117,10 +116,10 @@
</div>
</div>
<div class="ja-count">
<oneit:button value=" " name="gotoPage" skin="link"
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", shortlistPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
.toMap() %>">
.toMap() %>" disabled="<%= job.getJobStatus() == JobStatus.DRAFT ? "true" : "false" %>">
<oneit:toString value="<%= shortlisted %>" mode="Integer" nullValue="0"/>
</oneit:button>
/
......
......@@ -8,14 +8,14 @@
<%
JobApplication jobApplication = (JobApplication) process.getAttribute("JobApplication");
List<JobApplication> applications = (List<JobApplication>) process.getAttribute("Applications");
Long prevAppID = (Long) getData(request, "prevAppID");
Long nextAppID = (Long) getData(request, "nextAppID");
JobApplication prevApp = (JobApplication) getData(request, "prevApp");
JobApplication nextApp = (JobApplication) getData(request, "nextApp");
Job job = jobApplication.getJob();
Candidate candidate = jobApplication.getCandidate();
String tabText = candidate.getToString();
String currentPage = WebUtils.getSamePageInRenderMode(request, WebUtils.VIEW_APPLICATION);
Map<FactorClass, Tuple.T2<Double, ColorCode>> roleScoreMap = (Map<FactorClass, Tuple.T2<Double, ColorCode>>)jobApplication.getRoleFit();
Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> roleScoreMap = (Map<FactorClass, Tuple.T3<Double, ColorCode, Double>>)jobApplication.getRoleFit();
%>
<script>
function tabToggle(tab, selectDiv) {
......@@ -78,9 +78,9 @@
</script>
<div class="main-applicant-content dashboard-content-area v-applicant-area ">
<div class="applicant-header">
<oneit:button name="gotoPage" value=" " cssClass="prev-btn" skin="link"
<oneit:button name="gotoPage" value=" " cssClass="prev-btn" skin="link" disabled="<%= prevApp == null ? "true" : "false"%>"
requestAttribs="<%= CollectionUtils.mapEntry("procParams", CollectionUtils.mapEntry("Applications", applications).toMap())
.mapEntry("nextPage", currentPage+"&JobApplicationID="+prevAppID ).toMap() %>" >
.mapEntry("nextPage", currentPage+"&JobApplicationID="+ (prevApp != null ? prevApp.getID().toString() : "") ).toMap() %>" >
<img src="images/arrow-left-prev.svg" />
</oneit:button>
<div class="main-appli-name">
......@@ -107,9 +107,9 @@
.mapEntry ("restartProcess", Boolean.TRUE).toMap() %>" />
</span>
</div>
<oneit:button name="gotoPage" value=" " cssClass="next-btn" skin="link"
<oneit:button name="gotoPage" value=" " cssClass="next-btn" skin="link" disabled="<%= nextApp == null ? "true" : "false"%>"
requestAttribs="<%= CollectionUtils.mapEntry("procParams", CollectionUtils.mapEntry("JobApplication", jobApplication).mapEntry("Applications", applications).toMap())
.mapEntry("nextPage", currentPage+"&JobApplicationID="+nextAppID ).toMap() %>" >
.mapEntry("nextPage", currentPage+"&JobApplicationID="+ (nextApp != null ? nextApp.getID().toString() : "") ).toMap() %>" >
<img src="images/arrow-right-next.svg" />
</oneit:button>
</div>
......@@ -117,16 +117,16 @@
<div class="applicant-sub-part">
<div class="applicant-left">
<%
Tuple.T2<Double, ColorCode> roleFitData = (jobApplication.getRoleFit()!=null && jobApplication.getRoleFit().get(null)!=null) ? (Tuple.T2<Double, ColorCode>) jobApplication.getRoleFit().get(null) : null;
String colorClass = "percent-" +(roleFitData!=null ? roleFitData.get1().getCSSClass() : "green");
List<FactorScore> factorScores = jobApplication.getRoleAreaOfConcerns();
List<Tuple.T2> cultureConcerns = jobApplication.getCultureAreaOfConcerns();
Tuple.T3<Double, ColorCode, Double> roleFitData = (jobApplication.getRoleFit()!=null && jobApplication.getRoleFit().get(null)!=null) ? (Tuple.T3<Double, ColorCode, Double>) jobApplication.getRoleFit().get(null) : null;
String colorClass = "percent-" +(roleFitData!=null ? roleFitData.get1().getCSSClass() : "green");
List<FactorScore> factorScores = jobApplication.getRoleAreaOfConcerns();
List<Tuple.T2> cultureConcerns = jobApplication.getCultureAreaOfConcerns();
%>
<div class="applicant-progress">
<div class="<%= job.getIncludeAssessmentCriteria()==Boolean.TRUE ? "col-sm-4" : "col-sm-6" %> col-xs-12 text-center thr-block role-fit" href="#1a" data-toggle="tab" id="progress1" onClick="tabToggle('#tab1', '.role-fit')">
<label class="progress-label">role fit</label>
<div class="<%= colorClass %> fixed-width">
<p style="display:none;"><oneit:toString value="<%= jobApplication.getRoleFitPercentage() %>" mode="TwoDPDouble" nullValue="0"/></p>
<p style="display:none;"><oneit:toString value="<%= roleFitData!=null ? roleFitData.get2() : 0d %>" mode="TwoDPDouble" nullValue="0"/></p>
</div>
<div class="row four-label">
<%
......@@ -280,14 +280,14 @@
for(FactorClass factorClass : factorClassDtls.keySet())
{
Map<FactorLevelLink, Map> factorDetails = factorClassDtls.get(factorClass);
Double rating = roleScoreMap.get(factorClass).get0();
Double rating = roleScoreMap.get(factorClass).get2();
ColorCode colorCode = roleScoreMap.get(factorClass).get1();
String cssClass = colorCode.getCSSClass();
%>
<div class="main-pro-bar">
<div class="pro-bar">
<span class="appli-label"><oneit:toString value="<%= factorClass %>" mode="EscapeHTML"/></span>
<span class="appli-percen gray"><oneit:toString value="<%= rating %>" mode="WholeNumber"/></span>
<span class="appli-percen gray"><oneit:toString value="<%= rating %>" mode="PercentageWholeNumber"/></span>
<span class="appli-progress-bar">
<div class="progress">
<div class="progress-bar <%= cssClass %>" role="progressbar" aria-valuenow="<%= rating %>" aria-valuemin="0" aria-valuemax="100" style="width:<%= rating %>%"></div>
......
......@@ -8,7 +8,7 @@
<oneit:dynIncluded>
<%
String nextPage = WebUtils.getArticleByShortCut(process.getTransaction(), WebUtils.ADMIN_HOME).getLink(request) + "?showModal=true";
String nextPage = WebUtils.getArticleByShortCut(process.getTransaction(), WebUtils.ADMIN_HOME).getLink(request);
Company company = (Company) process.getAttribute("Company");
Boolean socialLogin = CollectionUtils.equals(process.getAttribute("socialLogin"), Boolean.TRUE);
......
......@@ -8,6 +8,7 @@
<%
boolean toRedirect = GenericObjDF.getOrCreateObject (request, "Job", Job.REFERENCE_Job);
Job job = (Job) process.getAttribute("Job");
String jobPage = WebUtils.getSamePageInRenderMode(request, "Page");
Debug.assertion(job != null, "Job is null in admin portal create job");
......@@ -101,6 +102,10 @@
</div>
</div>
<div class="text-center">
<oneit:button value="Save as draft" name="saveJob" cssClass="btn btn-primary largeBtn greyBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobPage)
.mapEntry(UpdateMappedObjFP.FAIL_VALIDATION_ERRORS, Boolean.FALSE)
.toMap() %>"/>
<oneit:button value="Proceed to Role" name="gotoPage" cssClass="btn btn-primary largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
......
......@@ -7,7 +7,8 @@
<%
Job job = (Job) process.getAttribute("Job");
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.WORKPLACE_CULTURE);
String jobPage = WebUtils.getSamePageInRenderMode(request, "Page");
Debug.assertion(job != null, "Job is null in admin portal create job");
%>
<script>
......@@ -53,11 +54,6 @@
for(AssessmentType assessmentType : AssessmentType.getAssessmentTypeArray())
{
if(assessmentType.getDisabled() == Boolean.TRUE)
{
continue;
}
String assessmentTypeId = assessmentType.getName();
String selectedStr = CollectionUtils.equals(assessmentTypeValue, assessmentTypeId) ? "checked" : "";
%>
......@@ -108,6 +104,10 @@
}
%>
<div class="text-center">
<oneit:button value="Save as draft" name="saveJob" cssClass="btn btn-primary top-margin-37 largeBtn greyBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobPage)
.mapEntry(UpdateMappedObjFP.FAIL_VALIDATION_ERRORS, Boolean.FALSE)
.toMap() %>"/>
<oneit:button value="Proceed to Culture" name="gotoPage" cssClass="btn btn-primary top-margin-37 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).toMap())
......
......@@ -29,11 +29,11 @@
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<h1 class="page-title review-title">Review Job</h1>
<h1 class="page-title">Review Job</h1>
<div class="page-subtitle-">
<!-- <div class="page-subtitle-">
<span class="pull-right plan-link"> Post multiple jobs per month? <a href="#">See our plans</a></span>
</div>
</div>-->
<oneit:dynInclude page="/extensions/adminportal/inc/job_main_tabs.jsp" PageNumber="5" data="<%= CollectionUtils.EMPTY_MAP%>"/>
......@@ -206,7 +206,7 @@
<% } %>
<div class="text-center">
<oneit:button value="Save as Draft and go to your jobs" name="save" cssClass="btn btn-primary btn-gray largeBtn"
<oneit:button value="Save as Draft and go to your jobs" name="saveJob" cssClass="btn btn-primary btn-gray largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobsPage)
.mapEntry ("restartProcess", Boolean.TRUE)
.mapEntry ("attribNamesToRestore", Collections.singleton("Job"))
......
......@@ -10,9 +10,14 @@
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.VIEW_APPLICANTS);
String shortlistPage = WebUtils.getSamePageInRenderMode(request, WebUtils.APPLICANTS_SHORTLIST);
String homePage = WebUtils.getSamePageInRenderMode(request, "Page");
JobStatus jobStatus = (JobStatus) session.getAttribute("JobStatus");
JobStatus jobStatus = process.getAttribute("JobStatus") != null ? (JobStatus) process.getAttribute("JobStatus") : (JobStatus) session.getAttribute("JobStatus");
JobSortOption jobSortOpt = (JobSortOption) process.getAttribute("JobSortOption");
if(process.getAttribute("JobStatus") != null)
{
session.setAttribute("JobStatus", jobStatus);
}
if( request.getParameter("JobSortOption") != null)
{
jobSortOpt = JobSortOption.forName((String) request.getParameter("JobSortOption"));
......@@ -75,22 +80,29 @@
%>
</ul>
</div>
<div class="shorting-dropdown">
<span class="order-label">order by</span>
<select class="form-control" onChange="location=this.value">
<%
for (JobSortOption sortOption : JobSortOption.getJobSortOptionArray())
{
String optionLink = homePage + "&JobSortOption=" + sortOption.getName() ;
%>
<option <%= (jobSortOpt != null && jobSortOpt == sortOption ? "selected" : "" )%> value="<%= optionLink %>">
<oneit:toString value="<%= sortOption.getDescription() %>" mode="EscapeHTML"/>
</option>
<%
}
%>
</select>
</div>
<%
if(jobs.length > 1)
{
%>
<div class="shorting-dropdown">
<span class="order-label">order by</span>
<select class="form-control" onChange="location=this.value">
<%
for (JobSortOption sortOption : JobSortOption.getJobSortOptionArray())
{
String optionLink = homePage + "&JobSortOption=" + sortOption.getName() ;
%>
<option <%= (jobSortOpt != null && jobSortOpt == sortOption ? "selected" : "" )%> value="<%= optionLink %>">
<oneit:toString value="<%= sortOption.getDescription() %>" mode="EscapeHTML"/>
</option>
<%
}
%>
</select>
</div>
<%
}
%>
</div>
<oneit:dynInclude page="/extensions/adminportal/inc/job_list.jsp" data="<%= CollectionUtils.EMPTY_MAP%>" ShortlistPage="<%= shortlistPage %>"
......
......@@ -208,7 +208,7 @@
<label><oneit:label GUIName="Role" /></label>
<oneit:ormEnum obj="<%= company %>" attributeName="RoleType" cssClass="form-control"/>
</div>
<oneit:recalcClass htmlTag="div" classScript="company.getUserEmail()== null? 'invite-btn disabled': 'invite-btn enabled'" company="<%= company %>">
<oneit:recalcClass htmlTag="div" classScript="company.isEmailCorrect() ? 'invite-btn enabled': 'invite-btn disabled'" company="<%= company %>">
<oneit:button value="Invite" name="sendUserInvites" cssClass="btn btn-invite"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", currentPage)
.mapEntry ("restartProcess", Boolean.TRUE)
......
......@@ -8,6 +8,7 @@ Job.AssessmentTemplateName = Template Name
Job.CultureTemplateName = Template Name
Job.JobType = Job Type
Job.ReferenceNumber = Reference Number
Job.State = State or Province
CultureCriteria.Importance = Rate Importance
CultureCriteria.CultureElementRating = Rating
......
......@@ -53,25 +53,14 @@
String shortlistPage = jobsArticle.getLink(request, CollectionUtils.mapEntry("cms.rm", WebUtils.APPLICANTS_SHORTLIST).toMap());
String homePage = WebUtils.getSamePageInRenderMode(request, "Page");
String jobsPage = jobsArticle.getLink(request, CollectionUtils.mapEntry("cms.rm", "Page").toMap());
boolean showModal = request.getParameter("showModal") != null ? Boolean.parseBoolean(request.getParameter("showModal")) : false;
if(showModal)
{
%>
<script>
$(document).ready(function(){
$('#welcomepopup').modal('show');
});
</script>
<%
}
boolean firstTime = request.getParameter("firstTime") != null ? Boolean.parseBoolean(request.getParameter("firstTime")) : false;
%>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
<div class="dashboard-content-area">
<div class="dashboard-first-part">
<div class="welcome-box">
<div class="dashboard-welcome">
<div class="welcome-text"> Welcome <br/> back <oneit:toString value="<%= secUser.getFirstName()!=null ? secUser.getFirstName() : secUser.getUserName()%>" mode="EscapeHTML"/>!</div>
<div class="welcome-text"> Welcome <br/> <%= firstTime ? "" : "back"%> <oneit:toString value="<%= secUser.getFirstName()!=null ? secUser.getFirstName() : secUser.getUserName()%>" mode="EscapeHTML"/>!</div>
<a class="d-create-job-btn" href="<%= jobsArticle.getLink(request, CollectionUtils.mapEntry("cms.rm", WebUtils.CREATE_JOB).toMap()) %>">Create a Job</a>
</div>
<div class="col-sm-3 col-xs-12 d-three-box green-light">
......@@ -149,7 +138,8 @@
</div>
</div>
</oneit:form>
<!-- not using -->
<div class="modal fade" id="welcomepopup" role="dialog">
<div class="modal-dialog welcome-pop-top">
<div class="modal-body main-welcome-popup">
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Owner Account Created Mail">
<createSpecificIdentifier factory='String' value='GKHZ94OVGDV0PK8GFPTFKCDUAPBRU3'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="GKHZ94OVGDV0PK8GFPTFKCDUAPBRU3"/>
</articleIdentifiers>
<createdLabel factory="String" value="GKHZ94OVGDV0PK8GFPTFKCDUAPBRU3"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="On Left Menu" factory="Boolean" value="false"/>
<NODE name="On Top Menu" factory="Boolean" value="false"/>
<NODE name="On Footer Left" factory="Boolean" value="false"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="Welcome to Talentology, ${Company:CompanyName}!"/>
<NODE name="Shortcuts" factory="String" value="OwnerAccountCreatedMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
<NODE name="On Footer Menu" factory="Boolean" value="false"/>
<NODE name="On Footer Right" factory="Boolean" value="false"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Owner Account Created Mail"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>Hi&nbsp;${SecUser:FirstName},</p>
<p>Welcome to Talentology!</p>
<p>Your account&rsquo;s been set up and you&rsquo;re all ready to go. Whenever you sign in to Talentology, be sure to use <strong>${SecUser:UserName}</strong>&nbsp;along with the password that you just created.</p>
<p>And don&rsquo;t worry: If you ever forget your password, you can <a href="${link}">reset it</a> anytime.</p>
<p>Now, let&rsquo;s get going and <a href="${create_job_link}">set up a job</a>!</p>
<p>Thanks,</p>
<p>The Talentology Team</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>Hi&nbsp;${SecUser:FirstName},</p><p>Welcome to Talentology!</p><p>Your account&rsquo;s been set up and you&rsquo;re all ready to go. Whenever you sign in to Talentology, be sure to use <strong>${SecUser:UserName}</strong>&nbsp;along with the password that you just created.</p><p>And don&rsquo;t worry: If you ever forget your password, you can <a href="${link}">reset it</a> anytime.</p><p>Now, let&rsquo;s get going and <a href="${create_job_link}">set up a job</a>!</p><p>Thanks,</p><p>The Talentology Team</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Account Created Mail">
<createSpecificIdentifier factory='String' value='JMZDIPT76HCPJ5FDHSTH0G95R5BZX4'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="JMZDIPT76HCPJ5FDHSTH0G95R5BZX4"/>
</articleIdentifiers>
<createdLabel factory="String" value="JMZDIPT76HCPJ5FDHSTH0G95R5BZX4"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="On Left Menu" factory="Boolean" value="false"/>
<NODE name="On Top Menu" factory="Boolean" value="false"/>
<NODE name="On Footer Left" factory="Boolean" value="false"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="You've joined ${Company:CompanyName} on Talentology!"/>
<NODE name="Shortcuts" factory="String" value="AccountCreatedMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
<NODE name="On Footer Menu" factory="Boolean" value="false"/>
<NODE name="On Footer Right" factory="Boolean" value="false"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Account Created Mail"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>Hi ${SecUser:FirstName},</p>
<p>Welcome! You&rsquo;re now a full member of the ${Company:CompanyName} team on Talentology!</p>
<p>Your account&rsquo;s been set up and you&rsquo;re all ready to go. Whenever you sign in to Talentology, be sure to use ${SecUser:UserName}&nbsp;along with the password that you just created.</p>
<p>And don&rsquo;t worry: If you ever forget your password, you can <a href="${link}">reset it</a> anytime.</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>Hi ${SecUser:FirstName},</p><p>Welcome! You&rsquo;re now a full member of the ${Company:CompanyName} team on Talentology!</p><p>Your account&rsquo;s been set up and you&rsquo;re all ready to go. Whenever you sign in to Talentology, be sure to use ${SecUser:UserName}&nbsp;along with the password that you just created.</p><p>And don&rsquo;t worry: If you ever forget your password, you can <a href="${link}">reset it</a> anytime.</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Invitation Mail">
<createSpecificIdentifier factory='String' value='UDQKBSOIBW9O2ET72SI93FJJ6SUWF3'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="UDQKBSOIBW9O2ET72SI93FJJ6SUWF3"/>
</articleIdentifiers>
<createdLabel factory="String" value="UDQKBSOIBW9O2ET72SI93FJJ6SUWF3"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="You?ve been invited to join ${Company:CompanyName} on Talentology"/>
<NODE name="Shortcuts" factory="String" value="InvitationMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Invitation Mail"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>${SecUser:FirstName}&nbsp;${SecUser:LastName}&nbsp;has invited you to join the ${Company:CompanyName} team on Talentology.</p>
<p>
<a href="${link}">Click here</a>&nbsp;to accept ${SecUser:FirstName}&rsquo;s invitation.</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>${SecUser:FirstName}&nbsp;${SecUser:LastName}&nbsp;has invited you to join the ${Company:CompanyName} team on Talentology.</p><p>
<a href="${link}">Click here</a>&nbsp;to accept ${SecUser:FirstName}&rsquo;s invitation.</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Reset Code Email">
<createSpecificIdentifier factory='String' value='WFDXIOQKNEMOGB6ZGPF8XV08WZZAHO'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="WFDXIOQKNEMOGB6ZGPF8XV08WZZAHO"/>
</articleIdentifiers>
<createdLabel factory="String" value="WFDXIOQKNEMOGB6ZGPF8XV08WZZAHO"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="Reset your password"/>
<NODE name="Shortcuts" factory="String" value="ResetCodeEmail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Reset Code Email"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>Hi ${SecUser:FirstName},</p>
<p>We&rsquo;ve received a request to reset your password.</p>
<p>If you didn&rsquo;t make the request, just ignore this message. Otherwise, you can reset your password using this link:</p>
<p>
<a href="${url}">Reset your password</a>
</p>
<p>Thanks,</p>
<p>The Talentology Team</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>Hi ${SecUser:FirstName},</p><p>We&rsquo;ve received a request to reset your password.</p><p>If you didn&rsquo;t make the request, just ignore this message. Otherwise, you can reset your password using this link:</p><p>
<a href="${url}">Reset your password</a>
</p><p>Thanks,</p><p>The Talentology Team</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Company Account Verification Mail">
<createSpecificIdentifier factory='String' value='P1U6WNGWG39B7X9W9Q7MX0Q8YAZGOB'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="P1U6WNGWG39B7X9W9Q7MX0Q8YAZGOB"/>
</articleIdentifiers>
<createdLabel factory="String" value="P1U6WNGWG39B7X9W9Q7MX0Q8YAZGOB"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="Please verify your email address"/>
<NODE name="Shortcuts" factory="String" value="CompanyAccountVerificationMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Company Account Verification Mail"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>Hi ${SecUser:FirstName},</p>
<p>Thank you for choosing Talentology! &nbsp;</p>
<p>You entered <strong>${SecUser:UserName}</strong> as your email address for your Talentology account. Please verify this email address by clicking this link:</p>
<p>
<a href="${link}">Verify now</a>
</p>
<p>Thanks,</p>
<p>The Talentology Team</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>Hi ${SecUser:FirstName},</p><p>Thank you for choosing Talentology! &nbsp;</p><p>You entered <strong>${SecUser:UserName}</strong> as your email address for your Talentology account. Please verify this email address by clicking this link:</p><p>
<a href="${link}">Verify now</a>
</p><p>Thanks,</p><p>The Talentology Team</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Email Changed Mail">
<createSpecificIdentifier factory='String' value='180CNU1NHZCIJRIAM7PWFGKDEHD5QQ'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="180CNU1NHZCIJRIAM7PWFGKDEHD5QQ"/>
</articleIdentifiers>
<createdLabel factory="String" value="180CNU1NHZCIJRIAM7PWFGKDEHD5QQ"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="Please verify your email address (change)"/>
<NODE name="Shortcuts" factory="String" value="EmailChangedMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Email Changed Mail"/>
<NODE name="ShortTitle" factory="String" value="Email Changed Mail"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>Hi&nbsp;${SecUser:FirstName},</p>
<p>You entered <strong>${SecUser:Email}</strong> as your new email address for your Talentology account.</p>
<p>If you didn&rsquo;t make the request, just ignore this message. Otherwise, you can verify this new email address using this link:</p>
<p>
<a href="${link}">Verify now</a>
</p>
<p>Thanks,</p>
<p>The Talentology Team</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>Hi&nbsp;${SecUser:FirstName},</p><p>You entered <strong>${SecUser:Email}</strong> as your new email address for your Talentology account.</p><p>If you didn&rsquo;t make the request, just ignore this message. Otherwise, you can verify this new email address using this link:</p><p>
<a href="${link}">Verify now</a>
</p><p>Thanks,</p><p>The Talentology Team</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS xmlns:oneit="http://www.1iT.com.au" name="">
<NODE factory="Vector" name="Script">
<NODE class="oneit.appservices.upgrade.cms.CMSArticleUpdateOperation" factory="Participant" name="Invitation Mail">
<createSpecificIdentifier factory='String' value='UDQKBSOIBW9O2ET72SI93FJJ6SUWF3'/>
<articleIdentifiers factory="Array" class="java.lang.String">
<NODE factory="String" value="UDQKBSOIBW9O2ET72SI93FJJ6SUWF3"/>
</articleIdentifiers>
<createdLabel factory="String" value="UDQKBSOIBW9O2ET72SI93FJJ6SUWF3"/>
<newParentCategory factory="String" value="RESOURCE_LIBRARY"/>
<articleAttributeChanges factory="Map">
<NODE name="EmailTo" factory="Null"/>
<NODE name="EmailFrom" factory="String" value="help@talentology.com"/>
<NODE name="EmailSubject" factory="String" value="You've been invited to join ${Company:CompanyName} on Talentology"/>
<NODE name="Shortcuts" factory="String" value="InvitationMail"/>
<NODE name="EmailCC" factory="Null"/>
<NODE name="EmailBCC" factory="Null"/>
</articleAttributeChanges>
<ormAttributeChanges factory="Map">
<NODE name="PublishDate" factory="Date" value="2016-02-05 00:00:00"/>
<NODE name="WithdrawDate" factory="Date" value="2066-02-05 16:00:00"/>
<NODE name="Title" factory="String" value="Invitation Mail"/>
<NODE name="ShortTitle" factory="String" value="Reset Code Email"/>
<NODE name="SortOrder" factory="Integer" value="-200926"/>
<NODE name="Type" factory="Enumerated" class="oneit.business.content.ArticleType" value="ARTICLE"/>
<NODE name="Template" factory="Enumerated" class="oneit.business.content.ArticleTemplate" value="EMAIL_TEMPLATE"/>
</ormAttributeChanges>
<content factory="Map">
<NODE name="EmailBody" 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>${SecUser:FirstName}&nbsp;${SecUser:LastName}&nbsp;has invited you to join the ${Company:CompanyName} team on Talentology.</p>
<p>
<a href="${link}">Click here</a>&nbsp;to accept ${SecUser:FirstName}&rsquo;s invitation.</p>
</body>
</html>
]]></NODE>
<NODE name="TransformedContent" factory="String"><![CDATA[<p>${SecUser:FirstName}&nbsp;${SecUser:LastName}&nbsp;has invited you to join the ${Company:CompanyName} team on Talentology.</p><p>
<a href="${link}">Click here</a>&nbsp;to accept ${SecUser:FirstName}&rsquo;s invitation.</p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" factory="Map">
<NODE name="Content" factory="String"><![CDATA[
<p></p>
]]></NODE>
<NODE name="IncludeContent" factory="Boolean" value="true"/>
</NODE>
<NODE name="" 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
......@@ -8,7 +8,7 @@
<oneit:dynIncluded>
<%
String nextPage = WebUtils.getSamePageInRenderMode(request, "CompanyProfile");
String homePage = WebUtils.getArticleByShortCut(process.getTransaction(), WebUtils.ADMIN_HOME).getLink(request);
String homePage = WebUtils.getArticleByShortCut(process.getTransaction(), WebUtils.ADMIN_HOME).getLink(request) + "?firstTime=true"; ;
CompanyUser companyUser = (CompanyUser) process.getAttribute("CompanyUser");
SecUser secUser = null;
Boolean socialLogin = Boolean.FALSE;
......
......@@ -69,7 +69,7 @@
tabNumber="1"
sortOption="<%= appSortOpt %>"
currentPage="<%= currentPage %>"
showOrderBy="<%= sortedApplications.size() > 0 %>"
showOrderBy="<%= sortedApplications.size() > 1 %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<oneit:dynInclude page="/extensions/adminportal/inc/application_list_data.jsp"
......
......@@ -64,7 +64,7 @@
currentPage="<%= currentPage %>"
tabNumber="1"
isShortList="<%= Boolean.TRUE %>"
showOrderBy="<%= sortedApplications.size() > 0 %>"
showOrderBy="<%= sortedApplications.size() > 1 %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<oneit:dynInclude page="/extensions/adminportal/inc/application_list_data.jsp"
......
......@@ -101,7 +101,7 @@
currentPage="<%= currentPage %>"
tabNumber="2"
isShortList="<%= Boolean.TRUE %>"
showOrderBy="<%= sortedApplications.size() > 0 %>"
showOrderBy="<%= sortedApplications.size() > 1 %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
......@@ -116,7 +116,7 @@
Integer overallRank = jobApplication.getOverallRank();
Boolean isTopRank = CollectionUtils.equals(overallRank, 1);
Map<FactorClass, Tuple.T2<Double, ColorCode>> roleScoreMap = (Map<FactorClass, Tuple.T2<Double, ColorCode>>)jobApplication.getRoleFit();
Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> roleScoreMap = (Map<FactorClass, Tuple.T3<Double, ColorCode, Double>>)jobApplication.getRoleFit();
%>
<div class="<%= "appl-c-box " + (i == 0 ? " cb-one" : "")%> ">
<!--TODO: need to work on the logic. just added to demonstrate that there are 3 different colors for this-->
......@@ -157,7 +157,7 @@
<oneit:toString value="<%= factorClass %>" mode="EscapeHTML"/>
</div>
<div class="detail-no green">
<oneit:toString value="<%= roleScoreMap.get(factorClass).get0() %>" mode="PercentageWholeNumber"/>
<oneit:toString value="<%= roleScoreMap.get(factorClass).get2() %>" mode="PercentageWholeNumber"/>
</div>
</div>
<%
......
......@@ -66,7 +66,7 @@
<oneit:dynInclude page="/extensions/adminportal/inc/application_sorting_bar.jsp"
sortOption="<%= appSortOpt %>"
currentPage="<%= currentPage %>"
showOrderBy="<%= sortedApplications.size() > 0 %>"
showOrderBy="<%= sortedApplications.size() > 1 %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<oneit:dynInclude page="/extensions/adminportal/inc/application_list_data.jsp"
......
......@@ -103,7 +103,7 @@
sortOption="<%= appSortOpt %>"
currentPage="<%= currentPage %>"
tabNumber="2"
showOrderBy="<%= sortedApplications.size() > 0 %>"
showOrderBy="<%= sortedApplications.size() > 1 %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
......
......@@ -34,8 +34,8 @@
int appPosition = applications.indexOf(jobApplication);
int prevNo = appPosition - 1;
int nextNo = appPosition + 1;
JobApplication prevApp = prevNo<0 ? applications.get(applications.size()-1) : applications.get(prevNo);
JobApplication nextApp = nextNo>=applications.size() ? applications.get(0) : applications.get(nextNo);
JobApplication prevApp = prevNo<0 ? null : applications.get(prevNo);
JobApplication nextApp = nextNo>=applications.size() ? null : applications.get(nextNo);
%>
<script type="text/javascript">
......@@ -104,8 +104,8 @@
</div>
<div class="second-part v-applicant-area">
<oneit:dynInclude page="/extensions/adminportal/inc/view_application_tab_applicant.jsp"
data="<%= CollectionUtils.mapEntry("prevAppID", prevApp.getObjectID())
.mapEntry("nextAppID", nextApp.getObjectID()).toMap() %>"/>
data="<%= CollectionUtils.mapEntry("prevApp", prevApp)
.mapEntry("nextApp", nextApp).toMap() %>"/>
</div>
</div>
</oneit:form>
......
......@@ -7,6 +7,7 @@
<%
Job job = (Job) process.getAttribute("Job");
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.ASSESSMENT_CRITERIA);
String jobPage = WebUtils.getSamePageInRenderMode(request, "Page");
Debug.assertion(job != null, "Job is null in admin portal create job");
......@@ -241,6 +242,10 @@
</div>
</oneit:recalcClass>
<div class="text-center">
<oneit:button value="Save as draft" name="saveJob" cssClass="btn btn-primary top-margin-25 largeBtn greyBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobPage)
.mapEntry(UpdateMappedObjFP.FAIL_VALIDATION_ERRORS, Boolean.FALSE)
.toMap() %>"/>
<oneit:button value="Proceed to Requirements" name="processCulture" cssClass="btn btn-primary top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Job", job)
......
......@@ -45,7 +45,7 @@
.mapEntry("procParams", CollectionUtils.mapEntry("JobApplication", jobApplication).toMap())
.toMap() %>">
<span><%= isCultureComplete ? "<img src=\"images/right-mark.png\" />" : (includeAssessment ? "2" : "1")%></span>
<div class="mobile-hide">Workplace Preference</div>
<div class="mobile-hide">Workplace Preferences</div>
</oneit:button>
</li>
<li class="<%= pageNumber == "3" ? "active" : isAssesmentComplete ? "complate" : ""%>">
......
......@@ -83,13 +83,13 @@
<div class="clearfix no-height"></div>
</div>
<div class="show-mobile-title">
<div class="mobile-title-page">Workplace Preference</div>
<div class="mobile-title-page">Workplace Preferences</div>
<div class="mobile-estimated">Estimated time to complete:
<span class="estimated-time-20">&nbsp;5 mins</span>
</div>
</div>
<div class="section-c-title m-hide">
Workplace Preference
Workplace Preferences
<span class="estimated-time">Estimated time to complete:
<span class="estimated-time-20">&nbsp;5 mins</span>
</span>
......
<%@ page import="performa.orm.*, performa.orm.types.*, performa.form.*, performa.utils.*"%>
<%@ page import="performa.intercom.utils.*, performa.intercom.resources.User"%>
<%@ page import="oneit.objstore.rdbms.filters.*, oneit.security.jsp.SecUserToNameTransform, oneit.servlets.utils.*, oneit.utils.image.* "%>
-- @AutoRun
ALTER TABLE tl_job ALTER COLUMN level_id DROP NOT NULL;
<?xml version="1.0" encoding="UTF-8"?>
<!-- @AutoRun -->
<OBJECTS name="" xmlns:oneit="http://www.1iT.com.au">
<NODE name="Script" factory="Vector">
<NODE name="DDL" factory="Participant" class="oneit.sql.transfer.RedefineTableOperation">
<tableName factory="String">tl_job</tableName>
<column name="manually_closed" type="Boolean" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
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