Commit c3400012 by Nilu

Finish Feature-0.0.4.2

Conflicts:
	cmsWebApp/src/performa/form/SaveJobFP.java
parents 62428d7c 1fecfb55
......@@ -21,7 +21,13 @@
<column name="has_client_support" type="Boolean" nullable="true"/>
<column name="stripe_reference" type="String" nullable="true" length="100"/>
<column name="stripe_subscription" type="String" nullable="true" length="100"/>
<column name="name_on_card" type="String" nullable="true" length="100"/>
<column name="card_post_code" type="String" nullable="true" length="10"/>
<column name="card_id" type="String" nullable="true" length="100"/>
<column name="plan_renewed_on" type="Date" nullable="true"/>
<column name="used_credits" type="Long" nullable="true"/>
<column name="added_by_user_id" type="Long" length="11" nullable="false"/>
<column name="payment_plan_id" type="Long" length="11" nullable="true"/>
</NODE>
</NODE></OBJECTS>
\ No newline at end of file
......@@ -24,6 +24,8 @@
<column name="state" type="String" nullable="true" length="200"/>
<column name="country" type="String" nullable="true" length="200"/>
<column name="manually_closed" type="Boolean" nullable="true"/>
<column name="last_edited" type="Date" nullable="true"/>
<column name="is_ppj" 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"/>
......
<?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.DefineTableOperation">
<tableName factory="String">tl_payment_plan</tableName>
<column name="object_id" type="Long" nullable="false" length="11"/>
<column name="object_last_updated_date" type="Date" nullable="false" length="22"/>
<column name="object_created_date" type="Date" nullable="false" length="22"/>
<column name="stripe_reference" type="String" nullable="false" length="100"/>
<column name="plan_name" type="CLOB" nullable="true"/>
<column name="description" type="CLOB" nullable="true"/>
<column name="currency_type" type="String" nullable="false" length="200"/>
<column name="amount" type="Double" nullable="false"/>
<column name="interval" type="String" nullable="false" length="200"/>
<column name="interval_count" type="Long" nullable="false"/>
<column name="trial_period_days" type="Long" nullable="true"/>
<column name="active_job_count" type="Long" nullable="true"/>
</NODE>
</NODE></OBJECTS>
\ No newline at end of file
......@@ -21,7 +21,13 @@ CREATE TABLE tl_company (
has_client_support char(1) NULL,
stripe_reference varchar(100) NULL,
stripe_subscription varchar(100) NULL,
added_by_user_id numeric(12) NOT NULL
name_on_card varchar(100) NULL,
card_post_code varchar(10) NULL,
card_id varchar(100) NULL,
plan_renewed_on datetime NULL,
used_credits numeric(12) NULL,
added_by_user_id numeric(12) NOT NULL,
payment_plan_id numeric(12) NULL
);
......
......@@ -24,6 +24,8 @@ CREATE TABLE tl_job (
state varchar(200) NULL,
country varchar(200) NULL,
manually_closed char(1) NULL,
last_edited datetime NULL,
is_ppj char(1) NULL,
level_id numeric(12) NULL,
client_id numeric(12) NULL,
company_user_id numeric(12) NULL,
......
-- DROP TABLE tl_payment_plan;
CREATE TABLE tl_payment_plan (
object_id int NOT NULL ,
object_last_updated_date datetime DEFAULT getdate() NOT NULL ,
object_created_date datetime DEFAULT getdate() NOT NULL
,
stripe_reference varchar(100) NOT NULL,
plan_name text NULL,
description text NULL,
currency_type varchar(200) NOT NULL,
amount numeric(20,5) NOT NULL,
interval varchar(200) NOT NULL,
interval_count numeric(12) NOT NULL,
trial_period_days numeric(12) NULL,
active_job_count numeric(12) NULL
);
ALTER TABLE tl_payment_plan ADD
CONSTRAINT PK_tl_payment_plan PRIMARY KEY
(
object_id
) ;
\ No newline at end of file
......@@ -22,7 +22,13 @@ CREATE TABLE tl_company (
has_client_support char(1) NULL,
stripe_reference varchar2(100) NULL,
stripe_subscription varchar2(100) NULL,
added_by_user_id number(12) NOT NULL
name_on_card varchar2(100) NULL,
card_post_code varchar2(10) NULL,
card_id varchar2(100) NULL,
plan_renewed_on date NULL,
used_credits number(12) NULL,
added_by_user_id number(12) NOT NULL,
payment_plan_id number(12) NULL
);
......
......@@ -25,6 +25,8 @@ CREATE TABLE tl_job (
state varchar2(200) NULL,
country varchar2(200) NULL,
manually_closed char(1) NULL,
last_edited date NULL,
is_ppj char(1) NULL,
level_id number(12) NULL,
client_id number(12) NULL,
company_user_id number(12) NULL,
......
-- DROP TABLE tl_payment_plan;
CREATE TABLE tl_payment_plan (
object_id number(12) NOT NULL ,
object_last_updated_date date DEFAULT SYSDATE NOT NULL ,
object_created_date date DEFAULT SYSDATE NOT NULL
,
stripe_reference varchar2(100) NOT NULL,
plan_name clob NULL,
description clob NULL,
currency_type varchar2(200) NOT NULL,
amount number(20,5) NOT NULL,
interval varchar2(200) NOT NULL,
interval_count number(12) NOT NULL,
trial_period_days number(12) NULL,
active_job_count number(12) NULL
);
ALTER TABLE tl_payment_plan ADD
CONSTRAINT PK_tl_payment_plan PRIMARY KEY
(
object_id
) ;
\ No newline at end of file
......@@ -22,7 +22,13 @@ CREATE TABLE tl_company (
has_client_support char(1) NULL,
stripe_reference varchar(100) NULL,
stripe_subscription varchar(100) NULL,
added_by_user_id numeric(12) NOT NULL
name_on_card varchar(100) NULL,
card_post_code varchar(10) NULL,
card_id varchar(100) NULL,
plan_renewed_on timestamp NULL,
used_credits numeric(12) NULL,
added_by_user_id numeric(12) NOT NULL,
payment_plan_id numeric(12) NULL
);
......
......@@ -25,6 +25,8 @@ CREATE TABLE tl_job (
state varchar(200) NULL,
country varchar(200) NULL,
manually_closed char(1) NULL,
last_edited timestamp NULL,
is_ppj char(1) NULL,
level_id numeric(12) NULL,
client_id numeric(12) NULL,
company_user_id numeric(12) NULL,
......
-- @AutoRun
-- drop table tl_payment_plan;
CREATE TABLE tl_payment_plan (
object_id numeric(12) NOT NULL ,
object_last_updated_date timestamp DEFAULT NOW() NOT NULL ,
object_created_date timestamp DEFAULT NOW() NOT NULL
,
stripe_reference varchar(100) NOT NULL,
plan_name text NULL,
description text NULL,
currency_type varchar(200) NOT NULL,
amount numeric(20,5) NOT NULL,
interval varchar(200) NOT NULL,
interval_count numeric(12) NOT NULL,
trial_period_days numeric(12) NULL,
active_job_count numeric(12) NULL
);
ALTER TABLE tl_payment_plan ADD
CONSTRAINT pk_tl_payment_plan PRIMARY KEY
(
object_id
) ;
\ No newline at end of file
......@@ -21,7 +21,7 @@ public class CloseJobBatch extends ORMBatch
@Override
public void run(ObjectTransaction ot) throws StorageException, FieldException
{
LogMgr.log (CLOSE_JOB_BATCH, LogLevel.DEBUG2, "RUNNING Close Job Batch");
LogMgr.log (CLOSE_JOB_BATCH, LogLevel.PROCESSING1, "RUNNING Close Job Batch");
Job[] expiringJobs = Job.SearchByAll()
.andApplyBy(new LessThanFilter<>(DateDiff.getToday()))
......@@ -32,7 +32,7 @@ public class CloseJobBatch extends ORMBatch
job.setJobStatus(JobStatus.COMPLETE);
job.setIsManuallyClosed(Boolean.FALSE);
LogMgr.log(CLOSE_JOB_BATCH, LogLevel.DEBUG2, "Setting Job Status to Closed in job : ", job);
LogMgr.log(CLOSE_JOB_BATCH, LogLevel.PROCESSING1, "Setting Job Status to Closed in job : ", job);
}
// Update closed job details to intercom
......
package performa.batch;
import com.stripe.Stripe;
import com.stripe.exception.APIConnectionException;
import com.stripe.exception.APIException;
import com.stripe.exception.AuthenticationException;
import com.stripe.exception.CardException;
import com.stripe.exception.InvalidRequestException;
import com.stripe.model.Plan;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import oneit.appservices.batch.ORMBatch;
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.utils.parsers.FieldException;
import performa.orm.PaymentPlan;
import performa.orm.types.CurrencyType;
import performa.orm.types.Interval;
import performa.utils.StripeUtils;
public class PullStripeDataBatch extends ORMBatch
{
public static LoggingArea PULL_STRIPE_DATA_BATCH = LoggingArea.createLoggingArea("PullStripeDataBatch");
@Override
public void run(ObjectTransaction ot) throws StorageException, FieldException
{
try
{
LogMgr.log (PULL_STRIPE_DATA_BATCH, LogLevel.PROCESSING1, "RUNNING Pull Stripe Data Batch");
Stripe.apiKey = StripeUtils.STRIPE_KEY;
Map<String, Object> planParams = new HashMap<>();
List<Plan> plansList = Plan.list(planParams).getData();
for (Plan plan : plansList)
{
PaymentPlan[] paymentPlans = PaymentPlan.SearchByAll().andStripeReference(new EqualsFilter<>(plan.getId())).search(ot);
PaymentPlan paymentPlan;
if(paymentPlans != null && paymentPlans.length > 0)
{
paymentPlan = paymentPlans[0];
LogMgr.log (PULL_STRIPE_DATA_BATCH, LogLevel.PROCESSING1, "Updating exiting payment plan: " , paymentPlan, " to match stripe plan: ", plan);
}
else
{
paymentPlan = PaymentPlan.createPaymentPlan(ot);
LogMgr.log (PULL_STRIPE_DATA_BATCH, LogLevel.PROCESSING1, "Creating a new payment plan for stripe plan: ", plan);
}
Map<String, String> metadata = plan.getMetadata();
String activeJobs = metadata.get("ActiveJobs");
paymentPlan.setStripeReference(plan.getId());
paymentPlan.setPlanName(plan.getName());
paymentPlan.setDescription(plan.getStatementDescriptor());
paymentPlan.setCurrencyType(CurrencyType.forName(plan.getCurrency().toUpperCase()));
paymentPlan.setAmount(plan.getAmount().doubleValue() / 100);
paymentPlan.setInterval(Interval.forName(plan.getInterval().toUpperCase()));
paymentPlan.setIntervalCount(plan.getIntervalCount());
paymentPlan.setTrialPeriodDays(plan.getTrialPeriodDays());
if(activeJobs != null)
{
paymentPlan.setActiveJobCount(Integer.valueOf(activeJobs));
}
LogMgr.log (PULL_STRIPE_DATA_BATCH, LogLevel.PROCESSING1, "Saving payment plan: " , paymentPlan, " mapped from stripe plan: ", plan);
}
}
catch (AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException | StorageException | FieldException | NumberFormatException ex)
{
LogMgr.log(PULL_STRIPE_DATA_BATCH, LogLevel.PROCESSING1, ex, "Error while pulling plan details from stripe");
}
}
}
\ No newline at end of file
......@@ -18,7 +18,7 @@ public class URLShortnerBatch extends ORMBatch
@Override
public void run(ObjectTransaction ot) throws StorageException, FieldException
{
LogMgr.log (URL_SHORTNER_BATCH, LogLevel.DEBUG2, "RUNNING URL Shortner Batch");
LogMgr.log (URL_SHORTNER_BATCH, LogLevel.PROCESSING1, "RUNNING URL Shortner Batch");
Job[] jobs = Job.SearchByAll()
.andShortenedURL(new IsNullFilter<>())
......@@ -30,7 +30,7 @@ public class URLShortnerBatch extends ORMBatch
{
job.createShortenedURL();
LogMgr.log(URL_SHORTNER_BATCH, LogLevel.DEBUG2, "Setting Shortened URL to job : ", job);
LogMgr.log(URL_SHORTNER_BATCH, LogLevel.PROCESSING1, "Setting Shortened URL to job : ", job);
}
catch(StorageException | FieldException e)
{
......
......@@ -29,6 +29,8 @@ public class CompleteApplicationFP extends SaveFP
jobApplication = (JobApplication) jobApplication.getInTransaction (objTran);
}
LogMgr.log(JobApplication.LOG, LogLevel.PROCESSING2, "CompleteApplicationFP Job Application :", jobApplication);
jobApplication.setApplicationStatus(ApplicationStatus.SUBMITTED);
jobApplication.setSubmittedDate(new Date());
......
......@@ -35,7 +35,7 @@ public class LoadCultureFromTemplateFP extends ORMProcessFormProcessor
Job job = (Job) request.getAttribute("Job");
CultureCriteriaTemplate template = job.getCultureTemplate();
LogMgr.log(Job.LOG, LogLevel.PROCESSING1, "Inside LoadCultureFromTemplateFP for ", job.getObjectID(), " load from template:", template);
LogMgr.log(Job.LOG, LogLevel.PROCESSING1, "Inside LoadCultureFromTemplateFP for ", job , " load from template:", template);
if(template != null)
{
......@@ -55,7 +55,8 @@ public class LoadCultureFromTemplateFP extends ORMProcessFormProcessor
job.addToCultureCriterias(criteriaCopy);
}
}
LogMgr.log(Job.LOG, LogLevel.PROCESSING1, "LoadCultureFromTemplateFP completed for ", job.getObjectID());
LogMgr.log(Job.LOG, LogLevel.PROCESSING1, "LoadCultureFromTemplateFP completed for ", job);
return RedisplayResult.getInstance();
}
......
package performa.form;
import java.util.HashMap;
import java.util.Map;
import oneit.appservices.config.ConfigMgr;
import oneit.servlets.forms.SubmissionDetails;
import oneit.servlets.process.SaveFP;
import oneit.utils.BusinessException;
import oneit.utils.math.NullArith;
import javax.servlet.http.HttpServletRequest;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
import oneit.servlets.forms.SuccessfulResult;
import oneit.servlets.process.ORMProcessState;
import com.stripe.exception.StripeException;
import com.stripe.model.Card;
import com.stripe.model.Charge;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import oneit.logging.LoggingArea;
import oneit.security.SecUser;
import oneit.utils.DateDiff;
import performa.intercom.utils.IntercomUtils;
import performa.orm.Company;
import performa.orm.CompanyUser;
import performa.orm.Job;
import performa.orm.types.AssessmentType;
import performa.orm.types.JobStatus;
import performa.utils.StripeUtils;
public class MakePaymentFP extends SaveFP
{
public static final String STRIPE_KEY = ConfigMgr.getKeyfileString("stripe.key","");
public static final String STRIPE_PUB_KEY = ConfigMgr.getKeyfileString("stripe.pubkey","");
private static final LoggingArea LOG = LoggingArea.createLoggingArea("MakePaymentFP");
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map p) throws BusinessException, StorageException
{
HttpServletRequest request = submission.getRequest();
Boolean ppj = request.getAttribute("PPJ") != null ? (Boolean) request.getAttribute("PPJ") : Boolean.FALSE;
Boolean editCard = request.getAttribute("EditCard") != null ? (Boolean) request.getAttribute("EditCard") : Boolean.FALSE;
Boolean replaceCard = request.getAttribute("ReplaceCard") != null ? (Boolean) request.getAttribute("ReplaceCard") : Boolean.FALSE;
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Job job = (Job) process.getAttribute("Job");
LogMgr.log(LOG, LogLevel.PROCESSING1,"In MakePaymentFP from customer to open job: " + company.getStripeReference());
if(editCard)
{
UpdateCardFP.updateCardDetails(process, submission);
}
if(replaceCard)
{
ReplaceCardFP.replaceCardDetails(process, submission);
}
if(company.getCardID() != null && ppj)
{
try
{
Map<String, Object> chargeParams = new HashMap<>();
chargeParams.put("amount", NullArith.intVal(NullArith.multiply(job.getAssessmentType() == AssessmentType.COMPREHENSIVE ? 499.0 : 399.0, 100, 0d)));
chargeParams.put("currency", "aud");
chargeParams.put("description", "Charges of creating job");
chargeParams.put("customer", company.getStripeReference());
Charge.create(chargeParams);
}
catch (StripeException e)
{
LogMgr.log(LOG, LogLevel.PROCESSING1, e, "Error while making a payment of company stripe " + company.getStripeReference());
throw new BusinessException("Stripe payment was failed, Please contact adminstrator for more info.");
}
}
if(company.getCardID() == null)
{
Card card = StripeUtils.retrieveCard(company);
company.setNameOnCard(card.getName());
company.setCardPostCode(card.getAddressZip());
company.setCardID(card.getId());
}
job.setApplyBy(DateDiff.add(DateDiff.getToday(), Calendar.DATE, 30));
job.setOpenDate(new Date());
job.setJobStatus(JobStatus.OPEN);
job.setLastEdited(new Date());
job.setIsPPJ(ppj);
if(job.getShortenedURL() == null)
{
job.createShortenedURL();
}
if(!ppj && company.getPaymentPlan() != null)
{
// cannot subscribe to a plan without card details
// company.setPlanRenewedOn(DateDiff.getToday());
// company.setUsedCredits(1);
StripeUtils.updatePlan(company);
}
// restarting process as custom attributes needs to be updated to intercom
Set<String> attribsToRestore = new HashSet<>();
attribsToRestore.add("Job");
attribsToRestore.add("Company");
completeProcessRestartAndRestoreAttribs(process, attribsToRestore);
secUser = SecUser.getTXUser(process.getTransaction());
companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
{
IntercomUtils.updateCompany(companyUser.getCompany());
}
return super.processForm(process, submission, p);
}
}
\ No newline at end of file
package performa.form;
import com.stripe.Stripe;
import com.stripe.model.Plan;
import com.stripe.model.PlanCollection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import oneit.appservices.config.ConfigMgr;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
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.orm.Job;
public class ManagePlansFP extends SaveFP
{
public static final String STRIPE_KEY = ConfigMgr.getKeyfileString("stripe.key","");
public static final String STRIPE_PUB_KEY = ConfigMgr.getKeyfileString("stripe.pubkey","");
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map p) throws BusinessException, StorageException
{
HttpServletRequest request = submission.getRequest();
LogMgr.log(Job.LOG, LogLevel.PROCESSING1,"In ManagePlansFP : " );
Stripe.apiKey = STRIPE_KEY;
try {
Map<String, Object> planParams = new HashMap<>();
PlanCollection list = Plan.list(planParams);
List<Plan> lists = list.getData();
for (Plan plan : lists)
{
// Map<String, String> metadata = plan.getMetadata();
// PaymentPlan paymentPlan = PaymentPlan.createPaymentPlan(process.getTransaction());
//
// paymentPlan.setStripeReference(plan.getId());
// paymentPlan.setPlanName(plan.getName());
// paymentPlan.setDescription(plan.getStatementDescriptor());
// paymentPlan.setCurrencyType(CurrencyType.forName(plan.getCurrency().toUpperCase()));
// paymentPlan.setAmount(plan.getAmount().doubleValue());
// paymentPlan.setInterval(Interval.forName(plan.getInterval().toUpperCase()));
// paymentPlan.setIntervalCount(plan.getIntervalCount());
// paymentPlan.setTrialPeriodDays(plan.getTrialPeriodDays());
// paymentPlan.setActiveJobCount(Integer.valueOf(metadata.get("ActiveJobs")));
}
} catch (Exception ex)
{
Logger.getLogger(ManagePlansFP.class.getName()).log(Level.SEVERE, null, ex);
}
return super.processForm(process, submission, p);
}
}
package performa.form;
import com.stripe.Stripe;
import com.stripe.model.Card;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import oneit.appservices.config.ConfigMgr;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.logging.LoggingArea;
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 oneit.utils.StringUtils;
import oneit.utils.parsers.FieldException;
import performa.orm.Company;
import performa.orm.CompanyUser;
import performa.utils.StripeUtils;
public class ReplaceCardFP extends SaveFP
{
public static final String STRIPE_KEY = ConfigMgr.getKeyfileString("stripe.key","");
public static final String STRIPE_PUB_KEY = ConfigMgr.getKeyfileString("stripe.pubkey","");
private static final LoggingArea LOG = LoggingArea.createLoggingArea("ReplaceCardFP");
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map p) throws BusinessException, StorageException
{
LogMgr.log(LOG, LogLevel.PROCESSING1,"In ReplaceCardFP to replace card details");
replaceCardDetails(process, submission);
return super.processForm(process, submission, p);
}
public static void replaceCardDetails(ORMProcessState process, SubmissionDetails submission) throws BusinessException
{
HttpServletRequest request = submission.getRequest();
Stripe.apiKey = STRIPE_KEY;
String token = request.getParameter("stripe-token-id");
if(StringUtils.subBlanks(token) == null)
{
throw new BusinessException("Updating card details failed, Please contact adminstrator for more info.");
}
try
{
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Card card = StripeUtils.updateCardDetails(companyUser.getCompany(), token);
Company company = companyUser.getCompany();
LogMgr.log(LOG, LogLevel.PROCESSING1,"In ReplaceCardFP replacing card details of company: " + company );
company.setNameOnCard(card.getName());
company.setCardPostCode(card.getAddressZip());
company.setCardID(card.getId());
// cannot subscribe to a plan without card details
if(company.getPaymentPlan() != null)
{
StripeUtils.updatePlan(company);
}
}
catch(StorageException | FieldException e)
{
LogMgr.log(LOG, LogLevel.PROCESSING1, e, "Error while replacing stripe card details");
}
}
}
\ No newline at end of file
......@@ -5,14 +5,17 @@ import javax.servlet.http.HttpServletRequest;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.StorageException;
import oneit.objstore.parser.BusinessObjectParser;
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.CollectionUtils;
import oneit.utils.MultiException;
import performa.intercom.utils.IntercomUtils;
import performa.orm.Company;
import performa.utils.StripeUtils;
public class SaveCompanyFP extends SaveFP
......@@ -22,6 +25,7 @@ public class SaveCompanyFP extends SaveFP
{
HttpServletRequest request = submission.getRequest();
Company company = process.getAttribute("Company") != null ? (Company) process.getAttribute("Company") : (Company) request.getAttribute("Company");
Boolean isPayment = (Boolean) request.getAttribute("IsPayment");
LogMgr.log(Company.LOG, LogLevel.PROCESSING1,"In SaveCompanyFP saving company : ", company );
......@@ -32,9 +36,41 @@ public class SaveCompanyFP extends SaveFP
LogMgr.log(Company.LOG, LogLevel.PROCESSING1,"In SaveCompanyFP setting comany logo to null of company : ", company );
}
if(CollectionUtils.equals(isPayment, Boolean.TRUE) && company.getPaymentJobCount()!=null)
{
company.setPaymentPlan(company.getSelectedPaymentPlan());
LogMgr.log(Company.LOG, LogLevel.PROCESSING1,"Company payment plan updated.", company, company.getPaymentPlan());
if(company.getCardID() != null )
{
// cannot subscribe a user to a plan without card details
StripeUtils.updatePlan(company);
LogMgr.log(Company.LOG, LogLevel.PROCESSING1,"Strpe subscription updated.", company, company.getStripeSubscription());
}
}
// Update company in intercom
IntercomUtils.updateCompany(company);
return super.processForm(process, submission, params);
}
@Override
public void validate(ORMProcessState process, SubmissionDetails submission, MultiException exceptions, Map params) throws StorageException
{
HttpServletRequest request = submission.getRequest();
Company company = process.getAttribute("Company") != null ? (Company) process.getAttribute("Company") : (Company) request.getAttribute("Company");
Boolean isPayment = (Boolean) request.getAttribute("IsPayment");
//to select payment plan when job open
if(CollectionUtils.equals(isPayment, Boolean.TRUE) && company.getPaymentJobCount()!=null)
{
BusinessObjectParser.assertFieldCondition(company.getSelectedPaymentPlan()!= null, company , Company.SINGLEREFERENCE_PaymentPlan, "mandatory", exceptions, true, request);
}
super.validate(process, submission, exceptions, params);
}
}
\ No newline at end of file
......@@ -16,6 +16,7 @@ import oneit.servlets.process.SaveFP;
import oneit.utils.BusinessException;
import oneit.utils.DateDiff;
import oneit.utils.MultiException;
import oneit.utils.math.NullArith;
import performa.intercom.utils.IntercomUtils;
import performa.orm.*;
import performa.orm.types.JobStatus;
......@@ -29,6 +30,9 @@ public class SaveJobFP extends SaveFP
HttpServletRequest request = submission.getRequest();
Job job = request.getAttribute("Job") != null ? (Job) request.getAttribute("Job") : (Job) process.getAttribute("Job");
JobStatus status = (JobStatus) request.getAttribute("JobStatus");
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
LogMgr.log(Job.LOG, LogLevel.PROCESSING1,"In SaveJobFP saving job : ", job );
......@@ -46,8 +50,17 @@ public class SaveJobFP extends SaveFP
job.setApplyBy(DateDiff.add(DateDiff.getToday(), Calendar.DATE, 30));
job.setOpenDate(new Date());
company.setUsedCredits(NullArith.add(company.getUsedCredits(), 1).intValue());
if(status == JobStatus.OPEN)
{
if(company.getSelectedPaymentPlan() != null)
{
company.setPaymentPlan(company.getSelectedPaymentPlan());
LogMgr.log(Company.LOG, LogLevel.PROCESSING1,"Company payment plan updated.", job, company, company.getPaymentPlan());
}
job.setJobStatus(status);
LogMgr.log(Job.LOG, LogLevel.PROCESSING1,"Job status changed as Open. ", job );
......@@ -64,11 +77,13 @@ public class SaveJobFP extends SaveFP
job.setIsManuallyClosed(Boolean.TRUE);
}
job.setLastEdited(new Date());
// 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);
secUser = SecUser.getTXUser(process.getTransaction());
companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Update company in intercom
if(companyUser.getCompany() != null)
......@@ -85,6 +100,10 @@ public class SaveJobFP extends SaveFP
HttpServletRequest request = submission.getRequest();
Job job = process.getAttribute("Job") != null ? (Job) process.getAttribute("Job") : (Job) request.getAttribute("Job");
Boolean openJob = (Boolean) request.getAttribute("openJob");
JobStatus status = (JobStatus) request.getAttribute("JobStatus");
SecUser loggedInUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
if(job.getJobStatus() != JobStatus.DRAFT || openJob == Boolean.TRUE)
{
......@@ -96,6 +115,24 @@ public class SaveJobFP extends SaveFP
}
}
//to select payment plan when job open
if(status != null && status == JobStatus.OPEN)
{
BusinessObjectParser.assertFieldCondition(company.getSelectedPaymentPlan() != null || company.getPaymentPlan() != null, company, Company.SINGLEREFERENCE_PaymentPlan, "mandatory", exceptions, true, request);
if(company.getSelectedPaymentPlan() != null)
{
BusinessObjectParser.assertFieldCondition(company.getSelectedPaymentPlan().getActiveJobCount() > company.getUsedCredits() , job, Job.FIELD_JobStatus, "insufficientCredit", exceptions, true, request);
}
}
if(job.getJobStatus() == JobStatus.OPEN)
{
BusinessObjectParser.assertFieldCondition(company.getCardID() != null , company, Company.FIELD_CardID, "mandatoryCardDetails", exceptions, true, request);
BusinessObjectParser.assertFieldCondition(company.canCreateJob() , job, Job.FIELD_JobStatus, "insufficientCredit", exceptions, true, request);
}
super.validate(process, submission, exceptions, params);
}
}
\ No newline at end of file
......@@ -120,8 +120,8 @@ public class SendCompanyUserInvitesFP extends SaveFP
StripeUtils.createCustomer(companyUser);
LogMgr.log(LOG, LogLevel.PROCESSING1,"Created customer in Stripe, customer reference ", company.getStripeReference());
StripeUtils.subscribeCustomer(company);
LogMgr.log(LOG, LogLevel.PROCESSING1,"Subscribed customer to default plan in Stripe, subscription reference ", company.getStripeSubscription());
// StripeUtils.subscribeCustomer(company);
// LogMgr.log(LOG, LogLevel.PROCESSING1,"Subscribed customer to default plan in Stripe, subscription reference ", company.getStripeSubscription());
//process user invitations
......
......@@ -130,6 +130,7 @@ public class SendVerificationMailFP extends SaveFP
secUser = SecUser.createSecUser(objTran);
secUser.setUserName(email);
secUser.setEmail(email);
secUser.setAttribute("md5:" + SecUser.FIELD_Password, CompanyUser.DEFAULT_PASSWORD);
secUser.addRole(Utils.getRole(Utils.ROLE_APPLICANT, objTran));
}
......
package performa.form;
import com.stripe.Stripe;
import com.stripe.exception.APIConnectionException;
import com.stripe.exception.APIException;
import com.stripe.exception.AuthenticationException;
import com.stripe.exception.CardException;
import com.stripe.exception.InvalidRequestException;
import com.stripe.model.Card;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.logging.LoggingArea;
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 oneit.utils.parsers.FieldException;
import performa.orm.Company;
import performa.orm.CompanyUser;
import performa.utils.StripeUtils;
public class UpdateCardFP extends SaveFP
{
private static final LoggingArea LOG = LoggingArea.createLoggingArea("UpdateCardFP");
@Override
public SuccessfulResult processForm(ORMProcessState process, SubmissionDetails submission, Map p) throws BusinessException, StorageException
{
Stripe.apiKey = StripeUtils.STRIPE_KEY;
updateCardDetails(process, submission);
return super.processForm(process, submission, p);
}
public static void updateCardDetails(ORMProcessState process, SubmissionDetails submission) throws FieldException
{
try
{
HttpServletRequest request = submission.getRequest();
SecUser secUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = secUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Card card = StripeUtils.retrieveCard(company);
LogMgr.log(LOG, LogLevel.PROCESSING1,"In UpdateCardFP updating card details of user : ", company, " card : " , card );
Map<String, Object> updateParams = new HashMap<>();
String expiryDate = request.getParameter("expiry-date");
String name = request.getParameter("holder-name");
String addressZip = request.getParameter("address-zip");
if(expiryDate != null && !expiryDate.isEmpty() && expiryDate.length() == 7)
{
updateParams.put("exp_month", expiryDate.substring(0, 2));
updateParams.put("exp_year", expiryDate.substring(5, 7));
}
if(name != null && !name.isEmpty())
{
updateParams.put("name", name);
company.setNameOnCard(name);
}
if(addressZip != null && !addressZip.isEmpty())
{
updateParams.put("address_zip", addressZip);
company.setCardPostCode(addressZip);
}
Card updatedCard = card.update(updateParams);
LogMgr.log(LOG, LogLevel.PROCESSING1,"Updated card details of user : ", company, " updated card : " , updatedCard );
}
catch (AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException e)
{
LogMgr.log(LOG, LogLevel.PROCESSING1, e, "Error while updating card details of user");
}
}
}
\ No newline at end of file
package performa.form;
import java.util.Map;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.objstore.ObjectTransaction;
import oneit.security.LoginProcessor;
import oneit.security.SecUser;
......@@ -23,6 +25,8 @@ public class UserLoginFP extends LoginProcessor
CompanyUser companyUser = userToCheck.getExtension(CompanyUser.REFERENCE_CompanyUser);
LogMgr.log(LOGIN, LogLevel.PROCESSING1,"In UserLoginFP checking user can log : ", companyUser );
if(!Utils.checkAdminPortalAccess(userToCheck) || companyUser == null || !companyUser.isTrue(companyUser.getIsAccountVerified()))
{
throw new FieldException("You're not an authorised user to access this portal.", SecUser.FIELD_UserName);
......
......@@ -9,7 +9,6 @@ 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;
......@@ -19,9 +18,15 @@ import oneit.utils.CollectionUtils;
import oneit.utils.ObjectTransform;
import oneit.utils.filter.CollectionFilter;
import oneit.utils.filter.Filter;
import performa.intercom.resources.AuthorizationException;
import performa.intercom.resources.ClientException;
import performa.intercom.resources.Company;
import performa.intercom.resources.CustomAttribute;
import performa.intercom.resources.Intercom;
import performa.intercom.resources.InvalidException;
import performa.intercom.resources.NotFoundException;
import performa.intercom.resources.RateLimitException;
import performa.intercom.resources.ServerException;
import performa.intercom.resources.User;
import performa.orm.Job;
import performa.orm.JobApplication;
......@@ -56,9 +61,13 @@ public class IntercomUtils
user.addCompany(company);
}
return User.create(user);
User.create(user);
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Created Intercom User: ", user);
return user;
}
catch (Exception e)
catch (AuthorizationException | ClientException | ServerException | InvalidException | RateLimitException e)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while creating a user in intercom");
......@@ -77,7 +86,7 @@ public class IntercomUtils
return User.find(map);
}
catch (Exception e)
catch (AuthorizationException | ClientException | ServerException | InvalidException | RateLimitException | NotFoundException e)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while fetching a user by id from intercom");
......@@ -100,9 +109,11 @@ public class IntercomUtils
User.update(user);
}
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Updated Intercom User: ", user);
return user;
}
catch (Exception e)
catch (InvalidException | AuthorizationException e)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while updating a user in intercom");
return null;
......@@ -118,9 +129,13 @@ public class IntercomUtils
setCompanyDetails(intercomCompany, company);
return Company.create(intercomCompany);
Company.create(intercomCompany);
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Created Intercom Company: ", intercomCompany);
return intercomCompany;
}
catch (Exception e)
catch (StorageException | InvalidException | AuthorizationException e)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while creating a company in intercom");
......@@ -188,7 +203,7 @@ public class IntercomUtils
return Company.find(map);
}
catch (Exception e)
catch (InvalidException | AuthorizationException | NotFoundException e)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, e, "Error while fetching a company by id from intercom");
......@@ -212,6 +227,8 @@ public class IntercomUtils
setCompanyDetails(intercomCompany, company);
Company.update(intercomCompany);
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Updated Intercom Company: ", intercomCompany);
}
}
catch (Exception e)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
package performa.orm;
import com.stripe.model.Card;
import oneit.logging.LoggingArea;
import oneit.objstore.ObjectStatus;
import oneit.objstore.ValidationContext;
import oneit.objstore.rdbms.filters.EqualsFilter;
import oneit.security.SecUser;
import oneit.utils.CollectionUtils;
import oneit.utils.StringUtils;
import oneit.utils.math.NullArith;
import oneit.utils.parsers.FieldException;
import performa.orm.types.JobStatus;
import performa.utils.StripeUtils;
import performa.utils.Utils;
public class Company extends BaseCompany
......@@ -73,4 +79,151 @@ public class Company extends BaseCompany
{
return StringUtils.subNulls(getCompanyName(), super.getToString());
}
public PaymentPlan getSelectedPaymentPlan()
{
if(getPaymentJobCount() != null)
{
PaymentPlan maxPlan = Utils.getMaximumPaymentPlan(getTransaction());
if(maxPlan!=null && getPaymentJobCount()>=maxPlan.getActiveJobCount())
{
return maxPlan;
}
PaymentPlan[] plans = PaymentPlan.SearchByAll()
.andActiveJobCount(new EqualsFilter<>(getPaymentJobCount()))
.search(getTransaction());
if(plans.length > 0)
{
return plans[0];
}
}
return null;
}
public Double getPaymentPlanAmount()
{
PaymentPlan selectedPaymentPlan = getSelectedPaymentPlan();
if(selectedPaymentPlan!=null)
{
return selectedPaymentPlan.getAmount();
}
return null;
}
public Double getPerJobPaymentPlanAmount()
{
PaymentPlan selectedPaymentPlan = getSelectedPaymentPlan();
if(selectedPaymentPlan!=null)
{
return NullArith.divide(selectedPaymentPlan.getAmount(), selectedPaymentPlan.getActiveJobCount());
}
return null;
}
public Double getPaymentPlanSaveAmount()
{
PaymentPlan selectedPaymentPlan = getSelectedPaymentPlan();
if(selectedPaymentPlan!=null)
{
return selectedPaymentPlan.getPerMonthSaveAmount();
}
return null;
}
public boolean canCreateJob()
{
return getPaymentPlan() != null && getPaymentPlan().getActiveJobCount() > getUsedCredits();
}
@Override
public Integer getUsedCredits()
{
return super.getUsedCredits() != null ? super.getUsedCredits() : 0;
}
public Job[] getOpenJobs()
{
return Job.SearchByCompany()
.andJobStatus(new EqualsFilter<>(JobStatus.OPEN))
.byCompany(this)
.search(getTransaction());
}
public Integer getOpenJobsCount()
{
return getOpenJobs().length;
}
public Card getCard() throws FieldException
{
return StripeUtils.retrieveCard(this);
}
public String getCardNumber() throws FieldException
{
if(getStripeLast4() == null)
{
Card card = StripeUtils.retrieveCard(this);
if(card != null)
{
setStripeLast4(card.getLast4());
setStripeBrand(card.getBrand());
return "xxxx-xxxx-xxxx-" + getStripeLast4();
}
else
{
return "";
}
}
return "xxxx-xxxx-xxxx-" + getStripeLast4();
}
public String getExpiry () throws FieldException
{
Card card = StripeUtils.retrieveCard(this);
return card != null ? String.format("%02d", card.getExpMonth()) + " / " + (card.getExpYear() % 100) : "";
}
public Boolean isSubscriptionChanged()
{
PaymentPlan selectedPaymentPlan = getSelectedPaymentPlan();
if(selectedPaymentPlan!=null)
{
Company earliestBackup = (Company) getEarliestBackup();
if(!CollectionUtils.equals(earliestBackup.getPaymentPlan(), selectedPaymentPlan))
{
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}
\ No newline at end of file
......@@ -17,6 +17,9 @@
<TRANSIENT name="RoleType" type="RoleType" defaultValue="RoleType.STANDARD" attribHelper="EnumeratedAttributeHelper"/>
<TRANSIENT name="IsLogoDeleted" type="Boolean" defaultValue="Boolean.FALSE"/>
<TRANSIENT name="CompletedProfile" type="Boolean" defaultValue="Boolean.FALSE"/>
<TRANSIENT name="PaymentJobCount" type="Integer"/>
<TRANSIENT name="StripeLast4" type="String" />
<TRANSIENT name="StripeBrand" type="String" />
<TABLE name="tl_company" tablePrefix="object">
......@@ -31,10 +34,16 @@
<ATTRIB name="PostCode" type="String" dbcol="post_code" mandatory="false" length="10"/>
<ATTRIB name="City" type="String" dbcol="city" mandatory="false" length="100"/>
<ATTRIB name="HasClientSupport" type="Boolean" dbcol="has_client_support" mandatory="false" defaultValue="Boolean.FALSE"/>
<ATTRIB name="StripeReference" type="String" dbcol="stripe_reference" length="100"/>
<ATTRIB name="StripeSubscription" type="String" dbcol="stripe_subscription" length="100"/>
<SINGLEREFERENCE name="AddedByUser" type="CompanyUser" dbcol="added_by_user_id" mandatory="true"/>
<ATTRIB name="StripeReference" type="String" dbcol="stripe_reference" length="100" />
<ATTRIB name="StripeSubscription" type="String" dbcol="stripe_subscription" length="100" />
<ATTRIB name="NameOnCard" type="String" dbcol="name_on_card" length="100" />
<ATTRIB name="CardPostCode" type="String" dbcol="card_post_code" length="10" />
<ATTRIB name="CardID" type="String" dbcol="card_id" length="100" />
<ATTRIB name="PlanRenewedOn" type="Date" dbcol="plan_renewed_on" mandatory="false" />
<ATTRIB name="UsedCredits" type="Integer" dbcol="used_credits" />
<SINGLEREFERENCE name="AddedByUser" type="CompanyUser" dbcol="added_by_user_id" mandatory="true" />
<SINGLEREFERENCE name="PaymentPlan" type="PaymentPlan" dbcol="payment_plan_id" mandatory="false" />
</TABLE>
......
......@@ -175,4 +175,9 @@ public class CompanyUser extends BaseCompanyUser
}
}
public boolean hasRole(RoleType role)
{
return getRoles() != null && getRoles().contains(role);
}
}
\ No newline at end of file
......@@ -47,6 +47,8 @@
<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"/>
<ATTRIB name="LastEdited" type="Date" dbcol="last_edited" />
<ATTRIB name="IsPPJ" type="Boolean" dbcol="is_ppj" defaultValue="Boolean.FALSE"/>
<SINGLEREFERENCE name="Level" type="Level" dbcol="level_id" mandatory="false"/>
<SINGLEREFERENCE name="Client" type="Client" dbcol="client_id" backreferenceName="Jobs"/>
......
package performa.orm;
import oneit.utils.math.NullArith;
public class PaymentPlan extends BasePaymentPlan
{
private static final long serialVersionUID = 0L;
public static final Double PER_PER_JOB_AMOUNT = 499D;
// This constructor should not be called
public PaymentPlan ()
{
// Do not add any code to this, always put it in initialiseNewObject
}
@Override
public String getToString()
{
if(getActiveJobCount()!=null)
{
return getActiveJobCount().toString();
}
return super.getToString();
}
public Double getPerMonthSaveAmount()
{
if(getActiveJobCount()!=null)
{
return NullArith.subtract(NullArith.multiply(getActiveJobCount(), PER_PER_JOB_AMOUNT, 0D), getAmount(), 0D);
}
return null;
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://www.oneit.com.au/schemas/5.2/BusinessObject.xsd'>
<BUSINESSCLASS name="PaymentPlan" package="performa.orm">
<IMPORT value="performa.orm.types.*"/>
<TABLE name="tl_payment_plan" tablePrefix="object" polymorphic="FALSE">
<ATTRIB name="StripeReference" type="String" dbcol="stripe_reference" length="100" mandatory="true"/>
<ATTRIB name="PlanName" type="String" dbcol="plan_name" />
<ATTRIB name="Description" type="String" dbcol="description" />
<ATTRIB name="CurrencyType" type="CurrencyType" dbcol="currency_type" mandatory="true" attribHelper="EnumeratedAttributeHelper" defaultValue="CurrencyType.AUD"/>
<ATTRIB name="Amount" type="Double" dbcol="amount" mandatory="true" SubType="Currency" Formatter="Currency" />
<ATTRIB name="Interval" type="Interval" dbcol="interval" mandatory="true" attribHelper="EnumeratedAttributeHelper" />
<ATTRIB name="IntervalCount" type="Integer" dbcol="interval_count" mandatory="true"/>
<ATTRIB name="TrialPeriodDays" type="Integer" dbcol="trial_period_days" />
<ATTRIB name="ActiveJobCount" type="Integer" dbcol="active_job_count" />
</TABLE>
<SEARCH type="All" paramFilter="tl_payment_plan.object_id is not null" orderBy="tl_payment_plan.object_id" />
<SEARCH type="Max" paramFilter="tl_payment_plan.object_id IS NOT NULL AND active_job_count IS NOT NULL" orderBy="tl_payment_plan.active_job_count DESC LIMIT 1" singleton="TRUE" />
</BUSINESSCLASS>
</ROOT>
\ No newline at end of file
package performa.orm.types;
import java.util.*;
import oneit.utils.*;
/**
* This class was generated using constGen.bat.
* DO NOT MODIFY THIS CODE.
* Edit the associated .xml file, and regenerate this file
* constGen (directory) (file minus extension)
* e.g. constGen C:\...\sql FieldType
*/
public class CurrencyType extends AbstractEnumerated
{
public static final EnumeratedFactory FACTORY_CurrencyType = new CurrencyTypeFactory();
public static final CurrencyType AUD = new CurrencyType ("AUD", "AUD", "AUD", false);
public static final CurrencyType NZD = new CurrencyType ("NZD", "NZD", "NZD", false);
public static final CurrencyType EUR = new CurrencyType ("EUR", "EUR", "EUR", false);
public static final CurrencyType GBP = new CurrencyType ("GBP", "GBP", "GBP", false);
public static final CurrencyType USD = new CurrencyType ("USD", "USD", "USD", false);
public static final CurrencyType SGD = new CurrencyType ("SGD", "SGD", "SGD", false);
private static final CurrencyType[] allCurrencyTypes =
new CurrencyType[] { AUD,NZD,EUR,GBP,USD,SGD};
private static CurrencyType[] getAllCurrencyTypes ()
{
return allCurrencyTypes;
}
private CurrencyType (String name, String value, String description, boolean disabled)
{
super (name, value, description, disabled);
}
public static final Comparator COMPARE_BY_POSITION = new CompareEnumByPosition (allCurrencyTypes);
static
{
defineAdditionalData ();
}
public boolean isEqual (CurrencyType other)
{
return this.name.equals (other.name);
}
public Enumeration getAllInstances ()
{
return CurrencyType.getAll ();
}
private Object readResolve() throws java.io.ObjectStreamException
{
return CurrencyType.forName (this.name);
}
public EnumeratedFactory getFactory ()
{
return FACTORY_CurrencyType;
}
public static CurrencyType forName (String name)
{
if (name == null) { return null; }
CurrencyType[] all = getAllCurrencyTypes();
int enumIndex = AbstractEnumerated.getIndexForName (all, name);
return all[enumIndex];
}
public static CurrencyType forValue (String value)
{
if (value == null) { return null; }
CurrencyType[] all = getAllCurrencyTypes();
int enumIndex = AbstractEnumerated.getIndexForValue (getAllCurrencyTypes (), value);
return all[enumIndex];
}
public static java.util.Enumeration getAll ()
{
return AbstractEnumerated.getAll (getAllCurrencyTypes());
}
public static CurrencyType[] getCurrencyTypeArray ()
{
return (CurrencyType[])getAllCurrencyTypes().clone ();
}
public static void defineAdditionalData ()
{
}
static class CurrencyTypeFactory implements EnumeratedFactory
{
public AbstractEnumerated getForName (String name)
{
return CurrencyType.forName (name);
}
public AbstractEnumerated getForValue (String name)
{
return CurrencyType.forValue (name);
}
public Enumeration getAll ()
{
return CurrencyType.getAll ();
}
}
public Map getAdditionalAttributes ()
{
Map attribs = new HashMap ();
return attribs;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<CONSTANT package="performa.orm.types" name="CurrencyType">
<VALUE name="AUD" description="AUD" />
<VALUE name="NZD" description="NZD" />
<VALUE name="EUR" description="EUR" />
<VALUE name="GBP" description="GBP" />
<VALUE name="USD" description="USD" />
<VALUE name="SGD" description="SGD" />
</CONSTANT>
</ROOT>
package performa.orm.types;
import java.util.*;
import oneit.utils.*;
/**
* This class was generated using constGen.bat.
* DO NOT MODIFY THIS CODE.
* Edit the associated .xml file, and regenerate this file
* constGen (directory) (file minus extension)
* e.g. constGen C:\...\sql FieldType
*/
public class Interval extends AbstractEnumerated
{
public static final EnumeratedFactory FACTORY_Interval = new IntervalFactory();
public static final Interval DAY = new Interval ("DAY", "DAY", "Day", false);
public static final Interval WEEK = new Interval ("WEEK", "WEEK", "Week", false);
public static final Interval MONTH = new Interval ("MONTH", "MONTH", "Month", false);
public static final Interval YEAR = new Interval ("YEAR", "YEAR", "Year", false);
private static final Interval[] allIntervals =
new Interval[] { DAY,WEEK,MONTH,YEAR};
private static Interval[] getAllIntervals ()
{
return allIntervals;
}
private Interval (String name, String value, String description, boolean disabled)
{
super (name, value, description, disabled);
}
public static final Comparator COMPARE_BY_POSITION = new CompareEnumByPosition (allIntervals);
static
{
defineAdditionalData ();
}
public boolean isEqual (Interval other)
{
return this.name.equals (other.name);
}
public Enumeration getAllInstances ()
{
return Interval.getAll ();
}
private Object readResolve() throws java.io.ObjectStreamException
{
return Interval.forName (this.name);
}
public EnumeratedFactory getFactory ()
{
return FACTORY_Interval;
}
public static Interval forName (String name)
{
if (name == null) { return null; }
Interval[] all = getAllIntervals();
int enumIndex = AbstractEnumerated.getIndexForName (all, name);
return all[enumIndex];
}
public static Interval forValue (String value)
{
if (value == null) { return null; }
Interval[] all = getAllIntervals();
int enumIndex = AbstractEnumerated.getIndexForValue (getAllIntervals (), value);
return all[enumIndex];
}
public static java.util.Enumeration getAll ()
{
return AbstractEnumerated.getAll (getAllIntervals());
}
public static Interval[] getIntervalArray ()
{
return (Interval[])getAllIntervals().clone ();
}
public static void defineAdditionalData ()
{
}
static class IntervalFactory implements EnumeratedFactory
{
public AbstractEnumerated getForName (String name)
{
return Interval.forName (name);
}
public AbstractEnumerated getForValue (String name)
{
return Interval.forValue (name);
}
public Enumeration getAll ()
{
return Interval.getAll ();
}
}
public Map getAdditionalAttributes ()
{
Map attribs = new HashMap ();
return attribs;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<CONSTANT package="performa.orm.types" name="Interval">
<VALUE name="DAY" description="Day" />
<VALUE name="WEEK" description="Week" />
<VALUE name="MONTH" description="Month" />
<VALUE name="YEAR" description="Year" />
</CONSTANT>
</ROOT>
\ No newline at end of file
......@@ -23,6 +23,7 @@ import oneit.servlets.utils.BaseHttpServletResponse;
import oneit.servlets.utils.decorator.ServletDecorator;
import oneit.servlets.utils.decorator.ServletDecoratorConfig;
import oneit.utils.*;
import oneit.utils.parsers.FieldException;
import performa.orm.Candidate;
import performa.orm.CompanyUser;
import performa.orm.Company;
......@@ -78,7 +79,7 @@ public class PerformaOAuthCallbackDecorator implements ServletDecorator, Initial
{
SecUser secUser = loginHandler.getOrCreateSecuser(request, transaction);
if(fullURL.contains(WebUtils.APPLICANT_PORTAL))
if(fullURL.contains(WebUtils.APPLICANT_PORTAL) && !secUser.hasPrivilege(Utils.PRIV_ACCESS_ADMIN_PORTAL))
{
secUser.addRole(Role.searchNAME(secUser.getTransaction(), Utils.ROLE_APPLICANT));
......@@ -86,7 +87,7 @@ public class PerformaOAuthCallbackDecorator implements ServletDecorator, Initial
candidate.setUser(secUser);
}
else if(fullURL.contains(WebUtils.ADMIN_PORTAL))
else if(fullURL.contains(WebUtils.ADMIN_PORTAL) && !secUser.hasPrivilege(Utils.PRIV_ACCESS_APPLICANT_PORTAL))
{
secUser.addRole(Role.searchNAME(secUser.getTransaction(), Utils.ROLE_CLIENT));
secUser.addRole(Role.searchNAME(secUser.getTransaction(), Utils.ROLE_COMPANY_ADMIN));
......
......@@ -6,23 +6,35 @@ import com.stripe.exception.APIException;
import com.stripe.exception.AuthenticationException;
import com.stripe.exception.CardException;
import com.stripe.exception.InvalidRequestException;
import com.stripe.model.Card;
import com.stripe.model.Customer;
import com.stripe.model.Event;
import com.stripe.model.Invoice;
import com.stripe.model.Plan;
import com.stripe.model.Subscription;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import oneit.appservices.config.ConfigMgr;
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.security.SecUser;
import oneit.utils.DateDiff;
import oneit.utils.parsers.FieldException;
import performa.orm.Company;
import performa.orm.CompanyUser;
import performa.orm.PaymentPlan;
import spark.utils.IOUtils;
public class StripeUtils
......@@ -53,6 +65,7 @@ public class StripeUtils
company.setStripeReference(customer.getId());
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Create customer in stripe : ", customer);
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
{
......@@ -61,6 +74,78 @@ public class StripeUtils
}
public static Card updateCardDetails(Company company, String token) throws FieldException
{
try
{
if(company.getStripeReference() == null)
{
createCustomer(company.getAddedByUser());
}
Customer customer = Customer.retrieve(company.getStripeReference());
Map<String, Object> updateParams = new HashMap<>();
updateParams.put("source", token);
customer = customer.update(updateParams);
Card card = (Card) customer.getSources().retrieve(customer.getDefaultSource());
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Update card details in stripe, customer : ", customer, " card : ", card);
return card;
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while updating a customer in stripe");
}
return null;
}
public static Card retrieveCard(Company company) throws FieldException
{
try
{
Customer customer = Customer.retrieve(company.getStripeReference());
return (Card) customer.getSources().retrieve(customer.getDefaultSource());
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while updating a customer in stripe");
}
return null;
}
public static List<Invoice> retrieveInvoices(Company company) throws FieldException
{
if(company.getStripeSubscription() != null)
{
try
{
Map<String, Object> invoiceParams = new HashMap<>();
invoiceParams.put("customer", company.getStripeReference());
return Invoice.list(invoiceParams).getData();
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while retriving invoices in stripe for subscription: " + company.getStripeSubscription());
}
}
return new ArrayList<>();
}
public static void subscribeCustomer(Company company) throws FieldException
{
try
......@@ -83,6 +168,8 @@ public class StripeUtils
Subscription subscription = Subscription.create(params);
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Subscribing customer in stripe : ", subscription);
company.setStripeSubscription(subscription.getId());
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
......@@ -90,4 +177,97 @@ public class StripeUtils
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while creating subscrition in stripe");
}
}
public static void updatePlan(Company company) throws FieldException
{
try
{
Subscription subscription = null;
PaymentPlan paymentPlan = company.getPaymentPlan();
Map<String, Object> item = new HashMap<>();
if(company.getStripeSubscription() != null)
{
subscription = Subscription.retrieve(company.getStripeSubscription());
item.put("id", subscription.getSubscriptionItems().getData().get(0).getId());
}
item.put("plan", paymentPlan.getStripeReference());
Map<String, Object> items = new HashMap<>();
items.put("0", item);
Map<String, Object> params = new HashMap<>();
params.put("items", items);
if(subscription != null)
{
subscription.update(params);
}
else
{
params.put("customer", company.getStripeReference());
subscription = Subscription.create(params);
}
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Subscribing customer in stripe : ", subscription);
company.setStripeSubscription(subscription.getId());
}
catch (StorageException | AuthenticationException | InvalidRequestException | APIConnectionException | CardException | APIException ex)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while creating subscrition in stripe");
}
}
public static void handleWebhook(HttpServletRequest request, ObjectTransaction objTran) throws FieldException
{
try
{
String rawJson = IOUtils.toString(request.getInputStream());
Event event = Event.GSON.fromJson(rawJson, Event.class);
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Event received from stripe : ", event);
if (event != null && event.getType().equals("invoice.payment_succeeded"))
{
Invoice invoice = (Invoice) event.getData().getObject();
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Payment Succeeded event received from stripe with invoice : ", invoice);
if(invoice.getBilling().equals("charge_automatically"))
{
Company[] companies = Company.SearchByAll().andStripeReference(new EqualsFilter<>(invoice.getCustomer())).search(objTran);
if(companies != null && companies.length > 0)
{
Company company = companies[0];
Date invoiceDate = new Date(invoice.getDate() * 1000L);
if(company.getPlanRenewedOn() == null || !DateDiff.startOfDay(invoiceDate).equals(DateDiff.startOfDay(company.getPlanRenewedOn())))
{
if(company.getPlanRenewedOn() != null)
{
company.setUsedCredits(0);
}
company.setPlanRenewedOn(invoiceDate);
}
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, "Setting company with reset plan details : ", company);
}
}
}
}
catch (IOException ex)
{
LogMgr.log(LoggingArea.ALL, LogLevel.PROCESSING1, ex, "Error while handling webhook");
}
}
}
......@@ -519,4 +519,18 @@ public class Utils
return SecUserToNameTransform.INSTANCE.transform(companyUser.getUser());
}
}
public static PaymentPlan[] getPaymentPlansForJobs(ObjectTransaction objTran)
{
return PaymentPlan.SearchByAll()
.andActiveJobCount(new IsNotNullFilter<>())
.search(objTran);
}
public static PaymentPlan getMaximumPaymentPlan(ObjectTransaction objTran)
{
return PaymentPlan.SearchByMax().search(objTran);
}
}
\ No newline at end of file
......@@ -25,6 +25,10 @@ public class WebUtils
public static final String JOB_REVIEW = "JobReview";
public static final String APPLY_JOB = "ApplyJob";
public static final String JOB_APPLICATION = "JobApplication";
public static final String JOB_PAYMENT = "JobPayment";
public static final String CARD_PAYMENT = "CardPayment";
public static final String REPLACE_CARD = "ReplaceCard";
public static final String EDIT_CARD = "EditCard";
public static final String CREATED_JOB = "CreatedJob";
public static final String EDIT_JOB = "EditJob";
public static final String JOBS = "Jobs";
......@@ -147,6 +151,10 @@ public class WebUtils
renderMode.equals(WORKPLACE_CULTURE) ||
renderMode.equals(JOB_MATCH) ||
renderMode.equals(JOB_REVIEW) ||
renderMode.equals(JOB_PAYMENT) ||
renderMode.equals(CARD_PAYMENT) ||
renderMode.equals(REPLACE_CARD) ||
renderMode.equals(EDIT_CARD) ||
renderMode.equals(CREATED_JOB);
}
......
......@@ -810,7 +810,7 @@ span.checkbox.checked + .slider:before {-webkit-transform: translateX(18px);-ms-
margin-bottom: 15px;
}
.form-page-area {
padding: 65px 13.5%;
padding: 65px 10.5%;
background: #fff;
float: left;
width: 100%;
......@@ -844,9 +844,10 @@ span.checkbox.checked + .slider:before {-webkit-transform: translateX(18px);-ms-
font-size: 15px;
text-align: center;
border-color: #03a0e7;
width: 400px;
width: 300px;
height: 60px;
margin-top: 10px;
margin-right: 20px;
font-weight: 500;
}
.btn.btn-primary.largeBtn.greyBtn, .btn.btn-primary.largeBtn.greyBtn:hover
......@@ -1158,6 +1159,7 @@ span.skill-label span{
font-size: 16px;
top: -2px;
position: relative;
padding-top: 12px;
}
.plan-link a {
text-decoration: underline;
......@@ -2716,7 +2718,7 @@ a.forgot-pass {
text-align: left;
font-size: 26px;
font-weight: 300;
margin-bottom: 24px;
margin-bottom: 15px;
}
.chief-officer span{
color: #ffffff;
......@@ -4613,7 +4615,7 @@ img.alert-icon {float: left;}
.applicant-sidebar {margin-bottom: 15px;width: 100%;}
.main-applicant-content {width: 100%;}
.off-name {font-size: 11px;}
.chief-officer{margin-bottom: 15px;}
.chief-officer{margin-bottom: 12px;}
.job-status-appli{font-size: 9px;}
.edit-btn-dropdown a {height: 34px;line-height: 34px;margin-left: 10px;padding: 0 15px;}
.edit-btn-dropdown img {margin-left: 5px;}
......@@ -5415,15 +5417,54 @@ label, label .label-title span {
font-weight: normal;
}
.company-content-area label
{
.company-content-area label{
font-family: "Usual-Regular";
}
.company-content-area .fileLink
{
.company-content-area .fileLink{
display: none;
}
.company-content-area .grey-area, .billing-content-area .grey-area{
background-color: #EFF0F2;
border-radius: 2px;
padding: 5% 10%;
margin-top: 10px;
}
.company-content-area .line-break, .billing-content-area .line-break{
border: solid 1px #EFF0F2;
display: inline-block;
width: 100%;
margin-top: 5px;
}
.company-content-area .footer-note{
margin-top: 150px;
}
.label-20{
font-size: 20px;
}
.label-14{
font-size: 14px;
}
.company-content-area .bold, .billing-content-area .bold{
font-family: "Usual-Medium";
}
.large-btn, .line-break .large-btn{
width: 50%;
height: 60px;
border-radius: 100px;
font-size: 15px;
font-family: "Usual-Medium";
margin-top: 20px;
}
.edit-card-link
{
text-decoration: underline;
font-size: 13px;
}
.deselected-link{
color: #03a0e7;
}
/*My Company Pages End*/
......@@ -5870,3 +5911,294 @@ input{
color: #9b9b9b;
font-family: "Usual-Light";
}
.ja-exp-fact-c {
color: #4E5258;
font-family: "Usual-Bold";
font-size: 12px;
font-weight: bold;
line-height: 14px;
}
.ja-exp-fact {
color: #4E5258;
font-family: "Usual-Light";
font-size: 12px;
line-height: 24px;
}
.ja-exp-f-c-b-b{
border-bottom: 1px solid #868686;
padding: 0 0 0 0;
}
.ja-exp-f-b-b{
border-bottom: 1px solid #E4E4E4;;
padding: 0 0 0 0;
}
.ja-exp-f-box{
padding: 0 12px;
line-height: 8px;
}
.ja-exp-b-p{
padding-bottom: 0;
}
.ja-exp-fact-score {
color: #667281;
font-family: "Usual-Light";
font-size: 18px;
float: right;
}
.select-payment-optio {
color: #1A2531;
font-family: "Usual-Light";
font-size: 28px;
font-weight: 300;
line-height: 34px;
}
.payment-optio-bg {
text-align: center;
}
.annual-plan {
height: 22px;
color: #4A4A4A;
font-family: "Usual-Bold";
font-size: 18px;
font-weight: 500;
line-height: 22px;
}
.payment-optio-text {
height: 17px;
color: #8D8D8D;
font-family: Usual;
font-size: 14px;
line-height: 17px;
text-align: center;
padding: 12px 0;
}
.payment-optio-sep {
border-top: 1px solid #E6E6E6;
padding: 42px 0;
}
.payment-amt {
color: #418DE0;
font-family: "Usual-Light";
font-size: 40px;
font-weight: 300;
display: inline-block;
text-align: center;
}
.payment-type-row{
padding-top: 30px;
padding-bottom: 70px;
}
.active-jobs-per-mont {
width: 66px;
color: #8D8D8D;
font-family: "Usual-Light";
font-size: 12px;
display: inline-block;
text-align: left;
vertical-align: middle;
margin-right: 6px;
}
.per-job {
width: 21px;
color: #969696;
font-family: "Usual-Light";
font-size: 12px;
font-style: italic;
text-align: center;
display: inline-block;
}
.pay-only-job-btn {
height: 48px;
width: 243px;
border: 1px solid #E2E2E2;
border-radius: 24px;
background-color: #FFFFFF;
}
.pay-only-job-amt{
width: 79px;
color: #6D6D6D;
font-family: "Usual-Light";
font-size: 18px;
line-height: 22px;
}
.pay-only-job-txt {
width: 118px;
color: #8D8D8D;
font-family: "Usual-Light";
font-size: 14px;
line-height: 17px;
}
.payment-cancel{
padding-top: 60px;
}
.payment-job-det {
width: 100%;
color: #777777;
font-family: "Usual-Light";
font-size: 12px;
font-style: italic;
padding-top: 20px;
}
.payment-paln-count{
width: 75px;
font-size: 24px;
text-align: center;
margin-top: 6px;
}
.payment-grey-area{
height: 370px;
}
.pay-subsc-row{
vertical-align: middle;
margin-right: -10px;
margin-left: -10px;
}
.pay-subsc-txt{
margin-top: 7px;
}
.pay-subsc-amt {
color: #03A0E7;
font-family: "Usual-Light";
font-size: 16px;
}
.pay-subsc-det {
color: #777777;
font-family: "Usual-Light";
font-size: 12px;
font-style: italic;
margin-top: 6px;
}
.pay-subsc-det-row{
padding-top: 50px;
margin-bottom: 70px;
}
.pay-subsc-btn-row{
padding-bottom: 40px;
}
.inv-hdr {
color: #4E5258;
font-family: "Usual-Regular";
font-size: 14px;
font-weight: 500;
line-height: 17px;
}
.inv-pdf{
width: 18px;
height: 24px;
}
.inv-amt{
color: #3F84CC;
font-family: "Usual-Regular";
font-size: 14px;
font-weight: 500;
line-height: 17px;
}
.inv-det {
color: #4E5258;
font-family: "Usual-Regular";
font-size: 11px;
font-weight: 500;
line-height: 13px;
}
.inv-des{
color: #4E5258;
font-family: "Usual-Regular";
font-size: 12px;
line-height: 16px;
}
.card-payment label{
font-family: "Usual-Regular";
}
.card-payment .cancel-and-go-back{
color: #8D8D8D;
font-family: "Usual-Regular";
font-size: 14px;
line-height: 17px;
text-align: center;
}
.card-payment .btn-footer{
margin-top: 40px;
}
.card-payment .large-btn{
width: 80%;
}
.card-payment .btn-right{
text-align: right;
}
.info-panel p{
line-height: 0.5;
color: #7d7f82;
font-size: 10px;
padding-top: 5px;
}
.info-toggle{
padding-left: 10px;
display: inline-block;
font-weight: bold;
font-size: 15px;
}
.info-panel{
padding: 0 31.5%;
display: none;
background-color: white;
overflow: hidden;
color: #7d7f82;
font-size: 10px;
}
.subscr-change.disabled button{
background-color: #939393 !important;
border-color: #939393 !important;
}
.footer-note a{
color: #03A0E7;
text-decoration: underline;
}
.select-plan.disabled button{
background-color: #939393 !important;
border-color: #939393 !important;
}
\ No newline at end of file
......@@ -53,6 +53,10 @@
<FORM name="*.saveClient" factory="Participant" class="performa.form.SaveClientFP"/>
<FORM name="*.saveCompany" factory="Participant" class="performa.form.SaveCompanyFP"/>
<FORM name="*.processCulture" factory="Participant" class="performa.form.ProcessCultureFP"/>
<FORM name="*.savePayment" factory="Participant" class="performa.form.MakePaymentFP"/>
<FORM name="*.managePlans" factory="Participant" class="performa.form.ManagePlansFP"/>
<FORM name="*.updateCard" factory="Participant" class="performa.form.UpdateCardFP"/>
<FORM name="*.replaceCard" factory="Participant" class="performa.form.ReplaceCardFP"/>
</NODE>
<NODE name="job_assessment_criteria_add_jsp" factory="Participant">
......@@ -126,6 +130,10 @@
<INHERITS factory="Named" nodename="CoreORMAdminNoPriv"/>
</NODE>
<NODE name="webhook_jsp" factory="Participant">
<INHERITS factory="Named" nodename="CoreORMAdminNoPriv"/>
</NODE>
<NODE name="ORMErrorConfig::ADMIN_PORTAL" factory="Participant" class="oneit.servlets.forms.ErrorReportConfig">
<format item="field.*.error.pageHeader_performa_errorPrefix">
<![CDATA[<div class="error-message message-common"><img src="${contextRoot}/images/error-alert.png" class="alert-icon" /><span class="message-txt" style="font-weight: bold">${translateLabel:Errors_Occurred:Errors occurred, please correct them and try again}</span><br/>]]>
......
......@@ -40,7 +40,11 @@
<RenderMode name="WorkplaceCulture" preIncludeJSP="extensions/adminportal/workplace_culture.jsp"/>
<RenderMode name="JobMatchAssessment" preIncludeJSP="extensions/adminportal/job_match_assessment.jsp"/>
<RenderMode name="JobReview" preIncludeJSP="extensions/adminportal/job_review_submit.jsp"/>
<RenderMode name="JobPayment" preIncludeJSP="extensions/adminportal/job_payment.jsp"/>
<RenderMode name="CardPayment" preIncludeJSP="extensions/adminportal/card_payment.jsp"/>
<RenderMode name="CreatedJob" preIncludeJSP="extensions/adminportal/created_job.jsp"/>
<RenderMode name="ReplaceCard" preIncludeJSP="extensions/adminportal/replace_card_payment.jsp"/>
<RenderMode name="EditCard" preIncludeJSP="extensions/adminportal/edit_card_payment.jsp"/>
</NODE>
</MAP>
......@@ -73,6 +77,11 @@
<INHERITS nodename="StandardJSP"/>
<RenderMode name="Page" preIncludeJSP="extensions/adminportal/my_company.jsp"/>
<RenderMode name="ManagePlan" preIncludeJSP="extensions/adminportal/manage_plan.jsp"/>
<RenderMode name="Billing" preIncludeJSP="extensions/adminportal/billing.jsp"/>
<RenderMode name="ReplaceCard" preIncludeJSP="extensions/adminportal/replace_card.jsp"/>
<RenderMode name="EditCard" preIncludeJSP="extensions/adminportal/edit_card.jsp"/>
<RenderMode name="Invoices" preIncludeJSP="extensions/adminportal/invoices.jsp"/>
</NODE>
</MAP>
......@@ -129,6 +138,18 @@
</TASK>
<TASK factory="Participant" class="oneit.appservices.batch.DefaultTask" lockName="performa">
<RUN class="performa.batch.PullStripeDataBatch" factory="Participant"/>
<WHEN factory="MetaComponent" component="BatchSchedule" selector="performa.runbatch">
<NODE name="schedule" class="oneit.appservices.batch.HourlySchedule">
<NODE name="minuteOfHour" factory="Integer" value="1"/>
</NODE>
</WHEN>
</TASK>
<TASK factory="Participant" class="oneit.appservices.batch.DefaultTask" lockName="performa">
<RUN class="performa.batch.URLShortnerBatch" factory="Participant"/>
<WHEN factory="MetaComponent" component="BatchSchedule" selector="performa.runbatch">
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Debug.assertion(company != null , "Invalid company in admin portal my company");
String nextPage = WebUtils.getSamePageInRenderMode(request, "Billing");
String replaceCardPage = WebUtils.getSamePageInRenderMode(request, "ReplaceCard");
%>
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<div class="container-fluid">
<div class="row content">
<div class="main-content-area">
<h1 class="page-title">My Hiring Team</h1>
<div class="my-company-area">
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<div style="padding-left: 15px; padding-right: 15px;">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
</div>
<oneit:dynInclude page="/extensions/adminportal/inc/my_company_tabs.jsp" TabNumber="3" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="company-content-area">
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="company-detail">
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Billing</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= false %>"/>
<%
}
else
{
%>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14 bold">Add a payment method</label><br/>
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
</div>
<div class="form-group">
<oneit:button value="Save Card" name="updateCard" cssClass="btn btn-primary btn-green large-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.toMap() %>" />
</div>
<%
}
%>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editCompany" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="stripe-token-id" />
</div>
</div>
</div>
<oneit:button value="Pay" name="replaceCard" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/performaStripe.js"/>
</oneit:script>
</div>
</div>
</div>
</div>
</oneit:dynIncluded>
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Job job = (Job) process.getAttribute("Job");
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&JobID=" + job.getObjectID() + "&fromJob=true";
Boolean ppj = (Boolean) process.getAttribute("PPJ");
String jobsPage = WebUtils.getSamePageInRenderMode(request, "Page");
%>
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<div class="main-created-job card-payment">
<h1 class="page-title select-payment-optio">
Enter Payment Details
</h1>
<div class="form-page-area billing-content-area">
<oneit:dynInclude page="/extensions/adminportal/inc/payment_plan.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" Job="<%= job %>"/>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Payment</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= false %>"/>
<%
}
else
{
%>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
</div>
<%
}
%>
<div class="form-group row" style="padding-top: 30px;">
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-footer">
<oneit:button value="Cancel and go back to Jobs" name="gotoPage" skin="link" cssClass="cancel-and-go-back"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobsPage)
.toMap() %>" />
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-right">
<oneit:button value="Pay and Open Job" name="savePayment" cssClass="btn btn-primary large-btn btn-green"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.mapEntry("PPJ", ppj)
.toMap() %>'/>
</div>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="stripe-token-id" />
</div>
</div>
</div>
<oneit:button value="Pay" name="savePayment" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.mapEntry("ReplaceCard", Boolean.TRUE)
.mapEntry("PPJ", ppj)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/performaStripe.js"/>
</oneit:script>
</oneit:dynIncluded>
\ No newline at end of file
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Debug.assertion(company != null , "Invalid company in admin portal my company");
String nextPage = WebUtils.getSamePageInRenderMode(request, "Billing");
%>
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<h1 class="page-title">My Hiring Team</h1>
<div class="my-company-area">
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<div style="padding-left: 15px; padding-right: 15px;">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
</div>
<oneit:dynInclude page="/extensions/adminportal/inc/my_company_tabs.jsp" TabNumber="3" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="company-content-area">
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="company-detail">
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Billing</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= true %>" IsReplace="<%= false %>"/>
<%
}
%>
</div>
<div>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14 bold">Edit Card</label><br/>
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= true %>" IsReplace="<%= false %>"/>
<div class="form-group">
<oneit:button value="Save Card" name="updateCard" cssClass="btn btn-primary btn-green large-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.toMap() %>" />
</div>
</div>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editCompany" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="expiry-date" />
</div>
<div class="form-group hide">
<input type="hidden" name="holder-name" />
</div>
<div class="form-group hide">
<input type="hidden" name="address-zip" />
</div>
</div>
</div>
<oneit:button value="Pay" name="updateCard" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v2/"></script>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/updateCardStripe.js"/>
</oneit:script>
</div>
</oneit:dynIncluded>
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&fromJob=true";
Job job = (Job) process.getAttribute("Job");
String jobsPage = WebUtils.getSamePageInRenderMode(request, "Page");
Boolean ppj = (Boolean) process.getAttribute("PPJ");
%>
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<div class="main-created-job card-payment">
<h1 class="page-title select-payment-optio">
Enter Payment Details
</h1>
<div class="form-page-area billing-content-area">
<oneit:dynInclude page="/extensions/adminportal/inc/payment_plan.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" Job="<%= job %>"/>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Payment</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= true %>" IsReplace="<%= false %>"/>
<%
}
%>
<div class="form-brack-line"></div>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14 bold">Edit Card</label><br/>
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= true %>" IsReplace="<%= false %>"/>
</div>
<div class="form-group row" style="padding-top: 30px;">
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-footer">
<oneit:button value="Cancel and go back to Jobs" name="gotoPage" skin="link" cssClass="cancel-and-go-back"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobsPage)
.toMap() %>" />
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-right">
<oneit:button value="Pay and Open Job" name="updateCard" cssClass="btn btn-primary large-btn btn-green"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.toMap() %>" />
</div>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="expiry-date" />
</div>
<div class="form-group hide">
<input type="hidden" name="holder-name" />
</div>
<div class="form-group hide">
<input type="hidden" name="address-zip" />
</div>
</div>
</div>
<oneit:button value="Pay" name="savePayment" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("EditCard", Boolean.TRUE)
.mapEntry("PPJ", ppj)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v2/"></script>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/updateCardStripe.js"/>
</oneit:script>
</oneit:dynIncluded>
\ No newline at end of file
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<%
Company company = (Company) getData(request, "Company");
boolean isReplace = (boolean) getData(request, "IsReplace");
boolean isEdit = (boolean) getData(request, "IsEdit");
String nextPage = WebUtils.getSamePageInRenderMode(request, "Billing");
%>
<oneit:dynIncluded>
<script>
$(document).ready(function() {
$('#cardExpiry').attr("maxlength", 7);
$("#cardExpiry" ).keydown(function(e) {
var val = $(this).val();
if(e.keyCode == 8) {
temp_val = val.substring(0,1);
$(this).val(temp_val);
}
if(!isNaN(val)) {
if(val.length === 3 || val.length === 2)
{
temp_val = val + " / ";
$(this).val(temp_val);
}
else
{
if(val > 1 && val < 10 && val.length === 1) {
temp_val = "0" + val + " / ";
$(this).val(temp_val);
}
else if (val >= 1 && val < 10 && val.length === 2 && e.keyCode != 7) {
temp_val = val + " / ";
$(this).val(temp_val);
}
else if(val > 9 && val.length === 2 && e.keyCode !== 7) {
temp_val = val + " / ";
$(this).val(temp_val);
}
}
}
});
});
</script>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label>Card Number</label>
<div style="float: right; margin-top:-15px;">
<img src="images/master-small.png" style="width:30px;"/>
<img src="images/visa.svg" style="width:40px;"/>
</div>
<%
if(isEdit)
{
%>
<input type="text" name="cardNumber" value="<%= company.getCardNumber() %>" class="form-control" readonly>
<%
}
else
{
%>
<div id="card-number" class="form-control" style="padding-top:15px;">
</div>
<%
}
%>
</div>
</div>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label>Name on Card</label>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="NameOnCard" cssClass="form-control" id="NameOnCard" data-stripe="name"/>
</div>
</div>
<div class="form-group row">
<div class="col-lg-4 col-md-4 col-sm-4">
<label>Expires</label>
<%
if(isEdit)
{
%>
<input type="text" id="cardExpiry" class="form-control" placeholder="MM / YY" value="<%= company.getExpiry() %>">
<%
}
else
{
%>
<div id="card-expiry" class="form-control" style="padding-top:15px;">
</div>
<%
}
%>
</div>
<div class="col-lg-4 col-md-4 col-sm-4">
<label>CCV</label>
<%
if(isEdit)
{
%>
<input type="text" name="ccv" value="" class="form-control" readonly>
<%
}
else
{
%>
<div id="card-cvc" class="form-control" style="padding-top:15px;">
</div>
<%
}
%>
</div>
<div class="col-md-4col-lg-4 col-md-4 col-sm-4">
<label>Postal Code</label>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="CardPostCode" cssClass="form-control" id="PostCode" />
</div>
</div>
</oneit:dynIncluded>
......@@ -51,13 +51,13 @@
if(company.getIsVerified()==Boolean.TRUE || !CollectionUtils.equals(company.getAddedByUser(), companyUser))
{
%>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="CompanyName" cssClass="form-control" readonly="true" required="true"/>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="CompanyName" cssClass="form-control" readonly="true" required="true" placeholder="Your company name"/>
<%
}
else
{
%>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="CompanyName" cssClass="form-control" required="true"/>
<oneit:ormInput obj="<%= company %>" type="text" attributeName="CompanyName" cssClass="form-control" required="true" placeholder="Your company name"/>
<%
}
%>
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<%
Company company = (Company) getData(request, "Company");
boolean isReplace = (boolean) getData(request, "IsReplace");
boolean isEdit = (boolean) getData(request, "IsEdit");
String replaceCardPage = WebUtils.getSamePageInRenderMode(request, "ReplaceCard");
String editCardPage = WebUtils.getSamePageInRenderMode(request, "EditCard");
String cardNumber = company.getCardNumber();
Job job = (Job) process.getAttribute("Job");
Boolean ppj = (Boolean) process.getAttribute("PPJ");
%>
<oneit:dynIncluded>
<div class="form-group row">
<div class="col-lg-3 col-md-3 col-sm-3">
<label>Card on file</label>
</div>
<div class="col-lg-5 col-md-5 col-sm-5" style="margin-top: -20px;">
<img src="<%= company.getStripeBrand().equals("MasterCard") ? "images/master.svg" : "images/visa.svg" %>" style="width:60px;"/>
<label><%= cardNumber %></label>
</div>
<div class="col-lg-2 col-md-2 col-sm-2">
<oneit:button value=" " name="gotoPage" skin="link" cssClass="<%= "edit-card-link " + (isEdit ? "" : "deselected-link")%>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", editCardPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job)
.mapEntry("PPJ", ppj).toMap())
.toMap() %>">
Edit Card
</oneit:button>
</div>
<div class="col-lg-2 col-md-2 col-sm-2">
<oneit:button value=" " name="gotoPage" skin="link" cssClass="<%= "edit-card-link " + (isReplace ? "" : "deselected-link")%>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", replaceCardPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job)
.mapEntry("PPJ", ppj).toMap())
.toMap() %>">
Replace Card
</oneit:button>
</div>
</div>
</oneit:dynIncluded>
......@@ -37,6 +37,12 @@
</oneit:button>
</div>
<div class="off-name">
<oneit:toString value="<%= job.getAssessmentType() %>" mode="EscapeHTML" nullValue=""/>:
<span class="ex-management">
<oneit:toString value="<%= job.getLevel() %>" mode="EscapeHTML" />
</span>
</div>
<div class="off-name">
<span class="austr-post">
<%
if(job.isClientAvailable())
......@@ -47,9 +53,6 @@
}
%>
</span> by <oneit:toString value="<%= job.getCompanyUser() %>" mode="EscapeHTML" nullValue=""/>
<span class="ex-management">&bull;&nbsp;
<oneit:toString value="<%= job.getLevel() %>" mode="EscapeHTML" />
</span>
</div>
</div>
<div class="applicant-right-status">
......
......@@ -7,6 +7,12 @@
<%
String tabNumber = (String) getData(request, "TabNumber");
String firstPage = WebUtils.getSamePageInRenderMode(request, "Page");
String secondPage = WebUtils.getSamePageInRenderMode(request, "ManagePlan");
String thirdPage = WebUtils.getSamePageInRenderMode(request, "Billing");
String forthPage = WebUtils.getSamePageInRenderMode(request, "Invoices");
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
%>
<oneit:dynIncluded>
......@@ -19,9 +25,34 @@
Hiring Team Details
</oneit:button>
</li>
<li class="">Manage Plan</li>
<li class="">Billing</li>
<li class="disabled">Invoices</li>
<%
if(companyUser.hasRole(RoleType.BILLING))
{
%>
<li class="<%= tabNumber == "2" ? "active" : ""%>">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", secondPage)
.toMap() %>">
Manage Plan
</oneit:button>
</li>
<li class="<%= tabNumber == "3" ? "active" : ""%>">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", thirdPage)
.toMap() %>">
Billing
</oneit:button>
</li>
<li class="<%= tabNumber == "4" ? "active" : ""%>">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", forthPage)
.toMap() %>">
Invoices
</oneit:button>
</li>
<%
}
%>
</ul>
</div>
</oneit:dynIncluded>
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<%
Company company = (Company) getData(request, "Company");
Job job = (Job) getData(request, "Job");
PaymentPlan[] plans = Utils.getPaymentPlansForJobs(transaction);
Integer maxCount = 0;
Integer minCount = 0;
if(company.getPaymentPlan() != null && company.getPaymentJobCount() == null)
{
company.setPaymentJobCount(company.getPaymentPlan().getActiveJobCount());
}
if(plans.length > 0)
{
Collection<Integer> jCounts = PaymentPlan.pipesPaymentPlan(plans).toActiveJobCount().vals();
maxCount = Collections.max(jCounts);
minCount = Collections.min(jCounts);
}
%>
<style>
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
opacity: 1;
}
</style>
<oneit:dynIncluded>
<div class="a-label-row pay-subsc-row">
<div class="col-md-6 col-sm-6 col-xs-6 text-left">
<label class="label-20 pay-subsc-txt"><%= company.getPaymentPlan() != null ? "Monthly Plan" : job.getAssessmentType().getDescription() %></label>
</div>
<%
if(company.getPaymentPlan() != null)
{
%>
<div class="col-md-6 col-sm-6 col-xs-6 text-right">
<oneit:ormInput type="number" obj="<%= company %>" attributeName="PaymentJobCount" required="true"
min="<%= minCount %>" max="<%= maxCount %>" step="1" cssClass="payment-paln-count"/>
<label class="label-20">&nbsp;Jobs / month </label>
</div>
<%
}
%>
</div>
<div class="form-group row">
<div class="pay-subsc-det-row a-label-row">
<oneit:recalcClass htmlTag="span" classScript="company.getPaymentPlanAmount()!=null ? 'show': 'hide'" company="<%= company %>">
<div class="col-md-6 col-sm-6 col-xs-6 text-left">
Total:
<span class="pay-subsc-amt">
<oneit:recalc mode="Currency" script="company.getPaymentPlanAmount()" company="<%= company %>" nullValue=""/>
/ mo
</span>
</div>
<div class="col-md-6 col-sm-6 col-xs-6 text-right pay-subsc-det">
<div class="text-right">
<oneit:recalc mode="Currency" script="company.getPerJobPaymentPlanAmount()" company="<%= company %>" nullValue=""/>
per job. Save
<oneit:recalc mode="Currency" script="company.getPaymentPlanSaveAmount()" company="<%= company %>" nullValue=""/>
per month.
</div>
</div>
</oneit:recalcClass>
</div>
</div>
</oneit:dynIncluded>
......@@ -318,6 +318,16 @@
<div class="tab-row" id="<%= factorScore.getObjectID() %>">
<div class="tab-view-label">
<oneit:toString value="<%= factorLevelLink.getFactor() %>" mode="EscapeHTML"/>
<%
if(job.isExpressJob())
{
%>
<div class="ja-exp-fact-score">
<oneit:toString value="<%= factorScore.getScore() %>" mode="EscapeHTML"/>
</div>
<%
}
%>
</div>
<div class="tab-view-side">
<div class="result-want">
......@@ -451,14 +461,35 @@
<span class="common-dot <%= dotClass %>"></span> &nbsp;
<oneit:toString value="<%= answer.getAssessmentCriteria().getCriteriaType() %>" mode="EscapeHTML"/>
</div>
<div class="detail-tab-row-text col-md-8 col-sm-8 col-xs-8" style="width: 65%">
<div class="detail-tab-row-text col-md-7 col-sm-7 col-xs-7" style="width: 55%">
<oneit:toString value="<%= answer.getAssessmentCriteria() %>" mode="EscapeHTML"/>
<span style="padding-left: 10px; float: right">
</div>
<div class="detail-tab-row-text col-md-1 col-sm-1 col-xs-1" style="width: 15%; line-height: 0.1;">
<oneit:toString value="<%= answer.getAnswer() ? "Yes" : "No" %>" mode="EscapeHTML"/>
<%
if(answer.getNotes()!=null)
{
%>
<span class="info-toggle">
&#9432;
</span>
<%
}
%>
</div>
</div>
<%
if(answer.getNotes()!=null)
{
%>
<div class="tab-row info-panel">
<oneit:toString value="<%= answer.getNotes() %>" mode="ParagraphHTML"/>
</div>
<%
}
%>
<%
}
%>
</div>
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Debug.assertion(company != null , "Invalid company in admin portal my company");
String nextPage = WebUtils.getSamePageInRenderMode(request, "Page");
List<Invoice> invoices = StripeUtils.retrieveInvoices(company);
%>
<div class="container-fluid">
<div class="row content">
<div class="main-content-area">
<h1 class="page-title">My Hiring Team</h1>
<div class="my-company-area">
<oneit:form name="editCompany" method="post" enctype="multipart/form-data">
<div style="padding-left: 15px; padding-right: 15px;">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
</div>
<oneit:dynInclude page="/extensions/adminportal/inc/my_company_tabs.jsp" TabNumber="4" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="company-content-area">
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="company-detail">
<div class="tabpage-title">
<label class="label-20">Invoices</label><br/>
</div>
</div>
<div class="">
<div class="a-label-row">
<div class="col-md-2 col-sm-2 col-xs-2 inv-hdr text-left">Date</div>
<div class="col-md-6 col-sm-6 col-xs-6 inv-hdr text-left">Item</div>
<div class="col-md-2 col-sm-2 col-xs-2 inv-hdr text-right">Charge</div>
<div class="col-md-2 col-sm-2 col-xs-2 inv-hdr text-right">Export</div>
</div>
<div class="line-break"></div>
<%
for(Invoice invoice : invoices)
{
%>
<div class="a-label-row">
<div class="col-md-2 col-sm-2 col-xs-2 text-left inv-det">
<oneit:toString value="<%= new Date(invoice.getDate() * 1000) %>" mode="MidDate"/>
</div>
<div class="col-md-6 col-sm-6 col-xs-6 text-left inv-des">
Subscription <%= StringUtils.subNulls(invoice.getDescription(), "") %>
<!--<div class="inv-det">#12536536</div>-->
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-right inv-amt">
<oneit:toString value="<%= invoice.getAmountDue() * 0.01 %>" mode="Currency"/>
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-right inv-det">
<a href="#">
<span class=""><img src="images/pdf.svg" class="inv-pdf"/><span>
&nbsp;
PDF
</a>
</div>
</div>
<div class="line-break"></div>
<%
}
%>
</div>
</div>
</div>
</oneit:form>
</div>
</div>
</div>
</div>
</oneit:dynIncluded>
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
Job job = (Job) process.getAttribute("Job");
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
PaymentPlan[] plans = Utils.getPaymentPlansForJobs(transaction);
Integer maxCount = 0;
Integer minCount = 0;
if(company.getPaymentPlan()!=null && company.getPaymentJobCount()==null)
{
company.setPaymentJobCount(company.getPaymentPlan().getActiveJobCount());
}
if(plans.length>0)
{
Collection<Integer> jCounts = PaymentPlan.pipesPaymentPlan(plans).toActiveJobCount().vals();
maxCount = Collections.max(jCounts);
minCount = Collections.min(jCounts);
}
Debug.assertion(company != null , "Invalid company in admin portal my company");
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&fromJob=true";
String jobsPage = WebUtils.getSamePageInRenderMode(request, "Page");
String fromPage = WebUtils.getSamePageInRenderMode(request, WebUtils.JOB_PAYMENT);
String paymentPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CARD_PAYMENT);
%>
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("form"), {'recalcOnError':true});
addPostRecalcHandler(function ($fieldThatChanged) {
if (! $fieldThatChanged) {
return;
}
var name = $fieldThatChanged.attr('name');
if (typeof name !== typeof undefined && name !== false) {
if ( name.indexOf('PaymentJobCount') >= 0 ) {
validate();
}
}
});
validate();
$('input').on('change keyup', function() { validate() });
});
function validate() {
if ($('.select-plan').hasClass('disabled')) {
$('.save-btn').attr('disabled', 'disabled');
} else {
$('.save-btn').removeAttr('disabled');
}
}
</script>
<style>
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
opacity: 1;
}
</style>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="main-created-job">
<h1 class="page-title select-payment-optio">
Select Payment Option
</h1>
<div class="form-page-area payment-optio-bg">
<div class="a-label-row annual-plan">
Annual Plan
</div>
<div class="a-label-row payment-optio-text">
<p>Hire for any role, save up to $995.00 / mo</p>
</div>
<div class="a-label-row payment-type-row">
<div class="col-md-6 col-sm-6 col-xs-6 text-right">
<div class="active-jobs-per-mont">
Active Jobs Per Month
</div>
<oneit:ormInput type="number" obj="<%= company %>" attributeName="PaymentJobCount"
min="<%= minCount %>" max="<%= maxCount %>" step="1" cssClass="payment-paln-count"/>
</div>
<div class="col-md-6 col-sm-6 col-xs-6 text-left">
<oneit:recalcClass htmlTag="span" classScript="company.getPerJobPaymentPlanAmount()!=null ? 'show': 'hide'" company="<%= company %>">
<div >
<span class="payment-amt text-right">
<oneit:recalc mode="Currency" script="company.getPerJobPaymentPlanAmount()" company="<%= company %>" nullValue=""/>
</span>
<span class="text-left">
<p class="per-job">
Per Job
</p>
</span>
</div>
</oneit:recalcClass>
</div>
</div>
<div class="a-label-row text-center">
<oneit:recalcClass htmlTag="span" classScript="company.getPaymentPlanAmount()!=null ? 'select-plan enabled': 'select-plan disabled'" company="<%= company %>">
<oneit:button value="Select Plan" name="saveJob" cssClass="btn btn-primary largeBtn btn-green save-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", paymentPage)
.mapEntry("PPJ", Boolean.FALSE)
.mapEntry ("fromPage", fromPage)
.mapEntry("JobStatus", JobStatus.OPEN)
.mapEntry ("restartProcess", Boolean.TRUE)
.mapEntry ("attribNamesToRestore", Collections.singleton("Job"))
.toMap() %>" />
</oneit:recalcClass>
</div>
<div class="a-label-row text-center">
<div class="col-md-12 col-sm-12 col-xs-12 text-center">
<div class="payment-job-det ">
<oneit:recalcClass htmlTag="span" classScript="company.getPaymentPlanAmount()!=null ? 'show': 'hide'" company="<%= company %>">
<oneit:recalc mode="Currency" script="company.getPaymentPlanAmount()" company="<%= company %>" nullValue=""/>
Monthly for up to
<oneit:recalc mode="EscapeHTML" script="company.getPaymentJobCount()" company="<%= company %>" nullValue=""/>
jobs / month
<div>
Save
<oneit:recalc mode="Currency" script="company.getPaymentPlanSaveAmount()" company="<%= company %>" nullValue=""/>
per month
</div>
</oneit:recalcClass>
</div>
</div>
</div>
</div>
<div class="form-page-area payment-optio-sep">
<div class="a-label-row">
<div class="col-md-3 col-sm-3 col-xs-3">
</div>
<div class="col-md-3 col-sm-3 col-xs-3">
<div class="annual-plan">Pay Per Job</div>
<div class="">
<span class="pay-only-job-amt">
<oneit:toString value="<%= job.getAssessmentType() == AssessmentType.COMPREHENSIVE ? 499.0 : 399.0%>" mode="Currency"/>
</span>
<span class="pay-only-job-txt">&ensp;&ensp;Open for 30 Days</span>
</div>
</div>
<div class="col-md-6 col-sm-6 col-xs-6">
<oneit:button value="Pay for this job only" name="gotoPage" cssClass="btn pay-only-job-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", paymentPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job)
.mapEntry("PPJ", Boolean.TRUE).toMap())
.toMap() %>" />
</div>
</div>
</div>
</div>
<div class="payment-optio-text text-center payment-cancel">
<oneit:button value="Cancel and go back to Jobs" name="gotoPage" cssClass="" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobsPage)
.mapEntry(UpdateMappedObjFP.FAIL_VALIDATION_ERRORS, Boolean.FALSE).toMap() %>"/>
</div>
</oneit:form>
</oneit:dynIncluded>
......@@ -6,7 +6,7 @@
<oneit:dynIncluded>
<%
Job job = (Job) process.getAttribute("Job");
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&fromJob=true";
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.JOB_PAYMENT);
String firstPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATE_JOB);
String secondPage = WebUtils.getSamePageInRenderMode(request, WebUtils.ASSESSMENT_CRITERIA);
String thirdPage = WebUtils.getSamePageInRenderMode(request, WebUtils.WORKPLACE_CULTURE);
......@@ -21,6 +21,9 @@
process.setAttribute("Job", job);
}
CompanyUser companyUser = job.getCompanyUser();
Company company = companyUser.getCompany();
Debug.assertion(job != null, "Job is null in admin portal create job");
%>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
......@@ -29,11 +32,27 @@
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<h1 class="page-title">Review Job</h1>
<!-- <div class="page-subtitle-">
<span class="pull-right plan-link"> Post multiple jobs per month? <a href="#">See our plans</a></span>
</div>-->
<h1 class="page-title">Review Job
<%
if(company.getPaymentPlan()!=null)
{
Integer activeCount = company.getOpenJobsCount();
Integer totCount = company.getPaymentPlan().getActiveJobCount();
Integer remCount = (totCount - activeCount) > 0 ? (totCount - activeCount) : 0;
%>
<div style="float:right;">
<span class="pull-right plan-link">
<oneit:toString value="<%= remCount %>" mode="EscapeHTML" />
/
<oneit:toString value="<%= totCount %>" mode="EscapeHTML" />
&nbsp;Jobs remaining this month
</span>
</div>
<%
}
%>
</h1>
<oneit:dynInclude page="/extensions/adminportal/inc/job_main_tabs.jsp" PageNumber="5" data="<%= CollectionUtils.EMPTY_MAP%>"/>
......@@ -73,10 +92,11 @@
</div>
</div>
<%
SecUser txUser = SecUser.getTXUser(process.getTransaction());
CompanyUser companyUser = txUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// SecUser txUser = SecUser.getTXUser(process.getTransaction());
// CompanyUser companyUser = txUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
// Company company = companyUser.getCompany();
if(companyUser.getCompany().showHasClientSupport())
if(company.showHasClientSupport())
{
%>
<div class="row main-review-label">
......@@ -212,14 +232,42 @@
.mapEntry ("restartProcess", Boolean.TRUE)
.mapEntry ("attribNamesToRestore", Collections.singleton("Job"))
.toMap() %>" />
<%
if(company.canCreateJob())
{
<oneit:button value="Open this job" name="saveJob" cssClass="btn btn-primary btn-green top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
if(company.getCardID() != null)
{
String createJobPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&fromJob=true";
%>
<oneit:button value="Confirm and Create Job" name="saveJob" cssClass="btn btn-primary btn-green top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", createJobPage)
.mapEntry ("fromPage", fifthPage)
.mapEntry("JobStatus", JobStatus.OPEN)
.mapEntry ("restartProcess", Boolean.TRUE)
.mapEntry ("attribNamesToRestore", Collections.singleton("Job"))
.toMap() %>" />
<%
}
else
{
String createJobPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CARD_PAYMENT);
%>
<oneit:button value="Confirm and Create Job" name="gotoPage" cssClass="btn btn-primary btn-green top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", createJobPage).toMap() %>" />
<%
}
}
else
{
%>
<oneit:button value="Confirm and make payment" name="gotoPage" cssClass="btn btn-primary btn-green top-margin-25 largeBtn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage).toMap() %>" />
<%
}
%>
</div>
</div>
</div>
......
......@@ -36,3 +36,4 @@ Company.RoleType = Role
Company.CompanyLogo = Logo
Company.HiringTeamType = Hiring Team
Company.CompanyName = Hiring Team Name
Company.PaymentPlan = Payment Plan
......@@ -5,3 +5,5 @@
#invitationSent = Your invitation has been successfully sent.
#invalidEmail = Invalid email address.
#emailChangeVefified = Your email address has been successfully changed and you can now use new email address when signing in.
#mandatoryCardDetails = Please enter card details to open the job.
#insufficientCredit = Insufficient credit to open the job.
\ No newline at end of file
......@@ -47,7 +47,7 @@
<div class="tab-content">
<div class="tab-pane active" id="company-detail">
<div class="tabpage-title">
<label class="label-16">Hiring Team Details</label>
<label class="label-20">Hiring Team Details</label>
</div>
<div class="form-group">
<label><oneit:ormlabel obj="<%= company %>" field="CompanyName" /></label>
......@@ -77,7 +77,7 @@
<div class="form-group row">
<div class="col-md-6">
<label><oneit:label GUIName="Industry" /></label>
<oneit:ormEnum obj="<%= company %>" attributeName="Industry" cssClass="form-control"/>
<oneit:ormEnum obj="<%= company %>" attributeName="Industry" cssClass="form-control" displayType="autocomplete"/>
</div>
</div>
<div class="form-group">
......
......@@ -48,6 +48,16 @@
.byCompany(secUser.getExtension(CompanyUser.REFERENCE_CompanyUser).getCompany())
.search(transaction);
Job[] allJobs = Job.SearchByCompany()
.byCompany(secUser.getExtension(CompanyUser.REFERENCE_CompanyUser).getCompany())
.search(transaction);
List<Job> recentJobs = ObjstoreUtils.sort(Arrays.asList(allJobs),
new ObjectTransform[]{ Job.pipesJob().toLastEdited() ,
Job.pipesJob().toObjectLastModified()},
new Comparator[]{ CollectionUtils.reverse(CollectionUtils.DEFAULT_COMPARATOR), CollectionUtils.reverse(CollectionUtils.DEFAULT_COMPARATOR), CollectionUtils.reverse(CollectionUtils.DEFAULT_COMPARATOR) });
Article jobsArticle = WebUtils.getArticleByShortCut(transaction, WebUtils.JOBS);
String nextPage = jobsArticle.getLink(request, CollectionUtils.mapEntry("cms.rm", WebUtils.VIEW_APPLICANTS).toMap());
String shortlistPage = jobsArticle.getLink(request, CollectionUtils.mapEntry("cms.rm", WebUtils.APPLICANTS_SHORTLIST).toMap());
......@@ -131,10 +141,23 @@
</div>
<div class="second-part">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="d-job-title">Open Jobs</div>
<div class="d-job-title">Recent Jobs</div>
<%
if(recentJobs.isEmpty())
{
%>
No jobs available.
<%
}
else
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/job_list.jsp" data="<%= CollectionUtils.EMPTY_MAP%>" ShortlistPage="<%= shortlistPage %>"
NextPage="<%= nextPage%>" HomePage="<%= homePage%>" Jobs="<%= jobs %>"/>
NextPage="<%= nextPage%>" HomePage="<%= homePage%>"
Jobs="<%= CollectionUtils.batch(recentJobs, 10).get(0).toArray(new Job[0]) %>"/>
<%
}
%>
</div>
</div>
</oneit:form>
......
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
Debug.assertion(company != null , "Invalid company in admin portal my company");
String nextPage = WebUtils.getSamePageInRenderMode(request, "Billing");
%>
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<h1 class="page-title">My Hiring Team</h1>
<div class="my-company-area">
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<div style="padding-left: 15px; padding-right: 15px;">
<oneit:dynInclude page="/extensions/applicantportal/inc/multifieldtext.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"/>
</div>
<oneit:dynInclude page="/extensions/adminportal/inc/my_company_tabs.jsp" TabNumber="3" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="company-content-area">
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="company-detail">
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Billing</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
<%
}
%>
</div>
<div>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14 bold">Replace Card</label><br/>
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
<div class="form-group">
<oneit:button value="Save Card" name="updateCard" cssClass="btn btn-primary btn-green large-btn"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.toMap() %>" />
</div>
</div>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editCompany" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="stripe-token-id" />
</div>
</div>
</div>
<oneit:button value="Pay" name="replaceCard" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/performaStripe.js"/>
</oneit:script>
</div>
</oneit:dynIncluded>
<%@ page extends="oneit.servlets.jsp.JSPInclude" %>
<%@ include file="/inc/stdimports50.jsp" %><%-- This is in cougar --%>
<%@ include file="/inc/stdcms.jsp" %><%-- This is in cougar --%>
<%@ include file="/extensions/performa/inc/stdimports.jsp" %>
<oneit:dynIncluded>
<%
SecUser loggedInUser = SecUser.getTXUser(transaction);
CompanyUser companyUser = loggedInUser.getExtension(CompanyUser.REFERENCE_CompanyUser);
Company company = companyUser.getCompany();
String nextPage = WebUtils.getSamePageInRenderMode(request, WebUtils.CREATED_JOB) + "&fromJob=true";
Job job = (Job) process.getAttribute("Job");
String jobsPage = WebUtils.getSamePageInRenderMode(request, "Page");
Boolean ppj = (Boolean) process.getAttribute("PPJ");
%>
<oneit:form name="makePayment" method="post" enctype="multipart/form-data">
<script type="text/javascript">
$(document).ready(function()
{
recalcFunction = setupRecalc ($("makePayment"), {'recalcOnError':true});
});
</script>
<div class="main-created-job card-payment">
<h1 class="page-title select-payment-optio">
Enter Payment Details
</h1>
<div class="form-page-area billing-content-area">
<oneit:dynInclude page="/extensions/adminportal/inc/payment_plan.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" Job="<%= job %>"/>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-20 pay-subsc-txt">Payment</label><br/>
<span id="card-errors" style="color: #eb1c26; font-size: 15px;"></span>
</div>
</div>
<%
if(company.getCardID() != null)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/existing_card.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
<%
}
%>
<div class="form-brack-line"></div>
<div class="form-group row">
<div class="col-md-12 col-sm-12 col-xs-12 text-left">
<label class="label-14 bold">Replace Card</label><br/>
<label class="label-14">Your card details will be saved for future billing</label>
</div>
</div>
<div class="grey-area">
<oneit:dynInclude page="/extensions/adminportal/inc/card_details.jsp" data="<%= CollectionUtils.EMPTY_MAP%>"
Company="<%= company %>" IsEdit="<%= false %>" IsReplace="<%= true %>"/>
</div>
<div class="form-group row" style="padding-top: 30px;">
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-footer">
<oneit:button value="Cancel and go back to Jobs" name="gotoPage" skin="link" cssClass="cancel-and-go-back"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", jobsPage)
.toMap() %>" />
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6 btn-right">
<oneit:button value="Pay and Open Job" name="savePayment" cssClass="btn btn-primary large-btn btn-green"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.toMap() %>" />
</div>
</div>
</div>
</div>
</oneit:form>
<oneit:form name="editJob" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="form-group hide">
<input type="hidden" name="stripe-token-id" />
</div>
</div>
</div>
<oneit:button value="Pay" name="savePayment" cssClass="hide" id="payNow"
requestAttribs='<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("Company", company)
.mapEntry("ReplaceCard", Boolean.TRUE)
.mapEntry("PPJ", ppj)
.toMap() %>'/>
</oneit:form>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripePubKey = '<%= MakePaymentFP.STRIPE_PUB_KEY %>';
</script>
<oneit:script>
<!-- MUST be included after initializing stripePubKey -->
<oneit:script src="/scripts/performaStripe.js"/>
</oneit:script>
</oneit:dynIncluded>
\ No newline at end of file
<?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_company</tableName>
<column name="payment_plan_id" type="Long" length="11" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
<?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="last_edited" type="Date" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
<?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_company</tableName>
<column name="plan_renewed_on" type="Date" nullable="true"/>
<column name="used_credits" type="Long" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
<?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="is_ppj" type="Boolean" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
......@@ -95,8 +95,7 @@
}
});
if (!$('input[name$=Password]').val() || $('input[name$=Password]').val() !== $('input[name$=Password2]').val())
{
if (<%= !socialLogin %> && (!$('input[name$=Password]').val() || $('input[name$=Password]').val() !== $('input[name$=Password2]').val())) {
empty = true;
}
......
......@@ -115,8 +115,6 @@
String appID = "app-id-" + jobApplication.getID().toString();
Integer overallRank = jobApplication.getOverallRank();
Boolean isTopRank = CollectionUtils.equals(overallRank, 1);
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-->
......@@ -143,14 +141,73 @@
<div class="jcc-box">
<div class="job-match jcc">
<img src="images/app-job-match-icon.svg"> Role fit
<%
if(!job.isExpressJob())
{
%>
<span><oneit:toString value="<%= jobApplication.getRoleFitPercentage() %>" mode="PercentageTwoDP" /></span>
<%
}
%>
</div>
<%
if(!job.isExpressJob())
if(job.isExpressJob())
{
Map<FactorClass, Map<FactorLevelLink, Map>> factorClassDtls = (Map<FactorClass, Map<FactorLevelLink, Map>>) jobApplication.getFactorScoreDetails();
for(FactorClass factorClass : factorClassDtls.keySet())
{
if(factorClass != null)
{
%>
<div class="detail-box ja-exp-b-p">
<div class="detail-row">
<div class="detail-label ja-exp-fact-c">
<oneit:toString value="<%= factorClass %>" mode="EscapeHTML"/>
</div>
</div>
</div>
<%
Map<FactorLevelLink, Map> factorDetails = factorClassDtls.get(factorClass);
for(FactorLevelLink factorLevelLink : factorDetails.keySet())
{
Map factorLinkDetails = factorDetails.get(factorLevelLink);
if(!factorLinkDetails.isEmpty())
{
FactorScore factorScore = (FactorScore) factorLinkDetails.get("factorScore");
%>
<div class="detail-box ja-exp-f-box">
<div class="detail-row">
<div class="detail-label">
<oneit:toString value="<%= factorLevelLink.getFactor() %>" mode="EscapeHTML"/>
</div>
<div class="detail-no">
<oneit:toString value="<%= factorScore.getScore() %>" mode="WholeNumber"/>
</div>
</div>
</div>
<div class="detail-box ja-exp-f-b-b">
</div>
<%
}
}
%>
<div class="detail-box ja-exp-f-c-b-b">
</div>
<%
}
}
}
else
{
%>
<div class="detail-box">
<%
Map<FactorClass, Tuple.T3<Double, ColorCode, Double>> roleScoreMap = (Map<FactorClass, Tuple.T3<Double, ColorCode, Double>>)jobApplication.getRoleFit();
for(FactorClass factorClass : jobApplication.getSortedFactorClasses())
{
if(factorClass != null && roleScoreMap.get(factorClass) != null)
......
......@@ -93,6 +93,11 @@
showPercent: true
});
$(".info-toggle").click(function(){
// alert('sdfdsf')
$(this).parent('div').parent('.tab-row').next('.info-panel').slideToggle();
});
});
</script>
......
<%@page import="performa.utils.StripeUtils"%>
<%@page import="oneit.objstore.ObjectTransaction"%>
<%@page import="oneit.servlets.process.ProcessDecorator"%>
<%@page import="oneit.servlets.process.ORMProcessState"%>
<%@ page extends="oneit.servlets.jsp.FormJSP" %>
<%! protected String getName (ServletConfig config) { return "webhook_jsp"; } %>
<%
ORMProcessState process = (ORMProcessState) ProcessDecorator.getDefaultProcess(request);
ObjectTransaction objTran = process.getTransaction ();
StripeUtils.handleWebhook(request, objTran);
process.complete();
%>
\ No newline at end of file
<%@ 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.* "%>
<%@ page import="performa.intercom.utils.*, performa.intercom.resources.User, com.stripe.model.*"%>
<%@ page import="oneit.objstore.rdbms.filters.*, oneit.security.jsp.SecUserToNameTransform, oneit.servlets.utils.*, oneit.utils.image.*, oneit.objstore.utils.ObjstoreUtils "%>
<?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.DefineTableOperation">
<tableName factory="String">tl_payment_plan</tableName>
<column name="object_id" type="Long" nullable="false" length="11"/>
<column name="object_last_updated_date" type="Date" nullable="false" length="22"/>
<column name="object_created_date" type="Date" nullable="false" length="22"/>
<column name="stripe_reference" type="String" nullable="false" length="100"/>
<column name="plan_name" type="CLOB" nullable="true"/>
<column name="description" type="CLOB" nullable="true"/>
<column name="currency_type" type="String" nullable="false" length="200"/>
<column name="amount" type="Double" nullable="false"/>
<column name="interval" type="String" nullable="false" length="200"/>
<column name="interval_count" type="Long" nullable="false"/>
<column name="trial_period_days" type="Long" nullable="true"/>
<column name="active_job_count" type="Long" nullable="true"/>
</NODE>
</NODE>
</OBJECTS>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
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