page = 'awpcp-buy-credits';
$this->title = __( 'Buy Credits', 'another-wordpress-classifieds-plugin' );
}
public function get_transaction( $create = true ) {
if ( ! isset( $this->transaction ) ) {
$id = $this->request->param( 'transaction_id' );
// TODO: inject PaymentTransaction dependency
if ( $create === true ) {
$this->transaction = AWPCP_Payment_Transaction::find_or_create( $id );
} else {
$this->transaction = AWPCP_Payment_Transaction::find_by_id( $id );
}
}
if ( ! is_null( $this->transaction ) && $this->transaction->is_new() ) {
$this->transaction->user_id = wp_get_current_user()->ID;
$this->transaction->set( 'context', 'add-credit' );
$this->transaction->set( 'redirect', $this->url() );
$this->transaction->set( 'redirect-data', array( 'action' => 'payment-completed' ) );
}
return $this->transaction;
}
public function get_or_create_transaction() {
return $this->get_transaction( true );
}
public function dispatch() {
if ( $this->is_user_allowed_to_buy_credits() ) {
$this->do_page();
} else {
$this->render_user_not_allowed_error();
}
return $this->output;
}
private function is_user_allowed_to_buy_credits() {
return awpcp_current_user_is_admin() ? false : true;
}
protected function do_page_steps() {
$this->validate_payment_transaction();
parent::do_page_steps();
}
private function validate_payment_transaction() {
$this->verify_payment_transaction_has_a_valid_context();
$this->verify_payment_was_succesfull();
$this->force_payment_completed_step_if_necessary();
$this->force_final_step_if_necessary();
}
private function verify_payment_transaction_has_a_valid_context() {
$transaction = $this->get_transaction();
if ( ! is_null( $transaction ) && $transaction->get( 'context' ) != 'add-credit' ) {
$page_name = $this->title;
$page_url = $this->url( array( 'page' => $this->page ) );
$message = __( 'You are trying to buy credits using a transaction created for a different purpose. Please go back to the %s page.
If you think this is an error please contact the administrator and provide the following transaction ID: %s', 'another-wordpress-classifieds-plugin' );
$message = sprintf( $message, $page_url, $page_name, $transaction->id );
throw new AWPCP_Exception( $message );
}
}
private function verify_payment_was_succesfull() {
$transaction = $this->get_transaction();
if ( ! is_null( $transaction ) && $transaction->is_payment_completed() ) {
if ( ! ( $transaction->was_payment_successful() || $transaction->payment_is_not_verified() ) ) {
$this->errors = array_merge( $this->errors, awpcp_flatten_array( $transaction->errors ) );
$message = __('The payment associated with this transaction failed (see reasons below).', 'another-wordpress-classifieds-plugin');
throw new AWPCP_Exception( $message );
}
}
}
private function force_payment_completed_step_if_necessary() {
$transaction = $this->get_transaction();
$step_name = $this->get_current_step_name();
$step_not_allowed = in_array( $step_name, array( 'select-credit-plan', 'checkout' ) );
if ( ! is_null( $transaction ) && $transaction->is_payment_completed() ) {
if ( $transaction->payment_is_not_verified() ) {
$this->set_current_step( 'payment-completed' );
} else if ( $transaction->was_payment_successful() && $step_not_allowed ) {
$this->set_current_step( 'payment-completed' );
}
}
}
private function force_final_step_if_necessary() {
$transaction = $this->get_transaction();
if ( ! is_null($transaction) && $transaction->is_completed() ) {
$this->set_current_step( 'final' );
}
}
protected function render_user_not_allowed_error() {
$this->errors[] = __( 'You are not allowed to buy credits.', 'another-wordpress-classifieds-plugin' );
$this->render_page_error();
}
}
function awpcp_buy_credits_page() {
$request = new AWPCP_Request();
$steps = awpcp_buy_credit_page_steps( awpcp_payments_api() );
return new AWPCP_BuyCreditsPage( $steps, $request );
}
function awpcp_buy_credit_page_steps( $payments ) {
return array(
'select-credit-plan' =>
new AWPCP_SetTransactionStatusToOpenStepDecorator(
new AWPCP_SetCreditPlanStepDecorator(
new AWPCP_VerifyCreditPlanWasSetStepDecorator(
new AWPCP_PrepareTransactionForPaymentStepDecorator(
new AWPCP_BuyCreditsPageSelectCreditPlanStep( $payments ),
$payments,
'payment-completed',
'checkout'
),
$payments
),
$payments
),
$payments
),
'checkout' =>
new AWPCP_VerifyTransactionExistsStepDecorator(
new AWPCP_SetTransactionStatusToCheckoutStepDecorator(
new AWPCP_VerifyPaymentCanBeProcessedStepDecorator(
new AWPCP_SetPaymentMethodStepDecorator(
new AWPCP_BuyCreditsPageCheckoutStep( $payments ),
$payments
)
),
$payments
)
),
'payment-completed' => new AWPCP_BuyCreditsPagePaymentCompletedStep( $payments ),
'final' =>
new AWPCP_SetTransactionStatusToCompletedStepDecorator(
new AWPCP_BuyCreditsPageFinalStep( $payments ),
$payments
),
);
}