/** * Verify that an order is retrieved correctly */ public function test_order_retrieval() { $order = appthemes_new_order(); $this->assertNotEmpty($order); $retrieved_order = appthemes_get_order($order->get_id()); $this->assertEquals($order, $retrieved_order); }
/** * Returns an instance of APP_Order for the given Post ID connected to Order * @param int $post_id An post ID * @param array $args (optional) Additional params to pass to the WP_Query * @return APP_Order An order object representing the order last connected to the post */ function appthemes_get_order_connected_to($post_id, $args = array()) { $connected = _appthemes_orders_get_connected($post_id, $args); if (!$connected->posts) { return false; } return appthemes_get_order($connected->post->ID); }
/** * Returns an order object * @param $order_id (optional) If given, returns the specified order, otherwise returns * the order currently being queried * @return APP_Order */ function get_order($order_id = null) { if (empty($order_id)) { $post = get_queried_object(); $order_id = $post->ID; } return appthemes_get_order($order_id); }
protected function call_step($id, $type = 'display') { $id = apply_filters('appthemes_checkout_call_step', $id); $this->current_step = $id; if ($this->steps->is_empty()) { return false; } if (!$this->steps->contains($id)) { return false; } $callbacks = $this->steps->get($this->current_step); $callback = $callbacks['payload'][$type == 'display' ? 1 : 0]; $order_id = $this->get_data('order_id'); if (!$order_id) { $order = new APP_Draft_Order(); } else { $order = appthemes_get_order($order_id); } if (is_callable($callback)) { call_user_func($callback, $order, $this); } else { if (is_string($callback)) { locate_template($callback, true); } else { return false; } } if ($order instanceof APP_Draft_Order && $order->is_modified()) { $new_order = APP_Order_Factory::duplicate($order); if (!$new_order) { return false; } $this->add_data('order_id', $new_order->get_id()); // save checkout type & hash in order update_post_meta($new_order->get_id(), 'checkout_type', $this->checkout_type); update_post_meta($new_order->get_id(), 'checkout_hash', $this->hash); // save complete and cancel urls in order if ($complete_url = $this->get_data('complete_url')) { update_post_meta($new_order->get_id(), 'complete_url', $complete_url); } if ($cancel_url = $this->get_data('cancel_url')) { update_post_meta($new_order->get_id(), 'cancel_url', $cancel_url); } } if ($this->step_cancelled) { $this->redirect(appthemes_get_step_url($this->get_previous_step($id))); exit; } if ($this->step_finished) { $this->redirect(appthemes_get_step_url($this->get_next_step($id))); exit; } $this->current_step = false; return true; }
function save($post_id) { $order = appthemes_get_order($post_id); if (!$this->check_order($order)) { return; } remove_action('save_post', array($this, '_save_post'), 10, 2); if (isset($_POST['complete_order'])) { $order->complete(); } }
public function test_pending_order() { $this->markTestIncomplete(); $response = $this->getResponse(); $order = appthemes_get_order($response['item_number']); $response['txn_type'] = 'web_accept'; $response['payment_status'] = 'Pending'; remove_all_actions('appthemes_transaction_completed'); $errors = $this->bridge->handle_response($response); $this->assertEmpty($errors->get_error_codes()); $this->assertEquals(APPTHEMES_ORDER_PENDING, $order->get_status()); }
public function test_register() { $queue = new APP_Order_Processing(); $queue->schedule_process(); $this->assertNotEquals(0, wp_next_scheduled('app_order_processing')); $draft = new APP_Draft_Order(); $draft->complete(); $new_order = APP_Draft_Order::upgrade($draft); $child_order = APP_Order_Factory::duplicate($new_order); $child_order->set_gateway('mock-gateway'); wp_update_post(array('ID' => $child_order->get_id(), 'post_status' => APPTHEMES_ORDER_COMPLETED, 'post_parent' => $new_order->get_id())); $child_order->schedule_payment(date('Y-m-d H:i:s', strtotime('-1 day'))); $items_processed = $queue->process(); $this->assertEquals(1, $items_processed); $order = appthemes_get_order($child_order->get_id(), true); $this->assertEquals(APPTHEMES_ORDER_ACTIVATED, $order->get_status()); }
/** * Processes a Bank Transfer Order to display * instructions to the user * @param APP_Order $order Order to display information for * @param array $options User entered options * @return void */ public function process($order, $options) { $sent = get_post_meta($order->get_ID(), 'bt-sentemail', true); if (empty($sent)) { appthemes_bank_transfer_pending_email(get_post($order->get_ID())); update_post_meta($order->get_ID(), 'bt-sentemail', true); } $templates = appthemes_payments_get_args('templates'); $template_name = $templates['bank-transfer']; $located = appthemes_locate_template($template_name); if ($located) { // load theme template $order = appthemes_get_order($order->get_ID()); appthemes_load_template($template_name, array('order' => $order)); } else { // load bundled template require_once dirname(__FILE__) . '/template/' . $template_name; } }
public function process_item($item) { $order = appthemes_get_order($item->ID, true); if (!$order) { return; } if ($order->get_status() == APPTHEMES_ORDER_PENDING) { $gateway = $order->get_gateway(); if (empty($gateway)) { return; } $gateway_object = APP_Gateway_Registry::get_gateway($gateway); if (!$gateway_object || !$gateway_object->is_recurring()) { return; } appthemes_process_recurring_gateway($gateway, $order); } $order = appthemes_get_order($item->ID, true); if ($order->get_status() == APPTHEMES_ORDER_COMPLETED) { $order->log('Processing Queue: Order is completed. Activating'); $order->activate(); } }
/** * Update lead status of the specified payment * * @param string $payment */ public static function status_update(Pronamic_Pay_Payment $payment, $can_redirect = false) { if (self::SLUG === $payment->get_source()) { $id = $payment->get_source_id(); $order = appthemes_get_order($id); $data = new Pronamic_WP_Pay_Extensions_AppThemes_PaymentData($order); $url = $data->get_normal_return_url(); switch ($payment->status) { case Pronamic_WP_Pay_Statuses::CANCELLED: $order->failed(); $url = $data->get_cancel_url(); break; case Pronamic_WP_Pay_Statuses::EXPIRED: $order->failed(); $url = $data->get_error_url(); break; case Pronamic_WP_Pay_Statuses::FAILURE: $order->failed(); $url = $data->get_error_url(); break; case Pronamic_WP_Pay_Statuses::SUCCESS: $order->complete(); $url = $data->get_success_url(); break; case Pronamic_WP_Pay_Statuses::OPEN: $order->pending(); break; default: $order->pending(); break; } if ($can_redirect) { wp_redirect($url); exit; } } }
/** * Update orders to include urls, checkout type, and hash. * * @since 3.4 */ function cp_upgrade_340_orders() { $order_ids = get_option('cp_upgrade_340_orders'); if (!$order_ids || $order_ids == 'done') { return; } $i = 0; $left_orders = $order_ids; foreach ($order_ids as $key => $order_id) { $i++; // all orders updated, quit the loop if (empty($left_orders)) { break; } // save current progress, and continue on next page load (memory and execution time have limits) if ($i > 50) { echo scb_admin_notice(sprintf(__('Orders Update Progress: %d orders left.', APP_TD), count($left_orders))); update_option('cp_upgrade_340_orders', $left_orders); return; } unset($left_orders[$key]); // updated order check if ($checkout_hash = get_post_meta($order_id, 'checkout_hash', true)) { continue; } // retrieve order object $order = appthemes_get_order($order_id); if (!$order) { continue; } // determine checkout type and url if ($item = $order->get_item(CP_ITEM_LISTING)) { $listing_orders_args = array('connected_type' => APPTHEMES_ORDER_CONNECTION, 'connected_query' => array('post_status' => 'any'), 'connected_to' => $item['post_id'], 'post_status' => 'any', 'fields' => 'ids', 'nopaging' => true); $listing_orders = new WP_Query($listing_orders_args); if (empty($listing_orders->posts) || $order_id == min($listing_orders->posts)) { $checkout_type = 'create-listing'; $checkout_url = get_permalink(CP_Add_New::get_id()); } else { $checkout_type = 'renew-listing'; $checkout_url = add_query_arg('listing_renew', $item['post_id'], get_permalink(CP_Renew_Listing::get_id())); } } else { if ($item = $order->get_item(CP_ITEM_MEMBERSHIP)) { $checkout_type = 'membership-purchase'; $checkout_url = get_permalink(CP_Membership::get_id()); } else { // unknown/invalid order continue; } } // generate new checkout hash $hash = substr(sha1(time() . mt_rand(0, 1000)), 0, 20); // if url set, get the hash if ($complete_url = get_post_meta($order_id, 'complete_url', true)) { $parsed_url = parse_url($complete_url); parse_str($parsed_url['query'], $url_args); if (!empty($url_args['hash'])) { $hash = $url_args['hash']; } } $complete_url = add_query_arg(array('step' => 'order-summary', 'hash' => $hash), $checkout_url); $cancel_url = add_query_arg(array('step' => 'gateway-select', 'hash' => $hash), $checkout_url); update_post_meta($order_id, 'complete_url', $complete_url); update_post_meta($order_id, 'cancel_url', $cancel_url); update_post_meta($order_id, 'checkout_type', $checkout_type); update_post_meta($order_id, 'checkout_hash', $hash); } // mark this upgrage as completed update_option('cp_upgrade_340_orders', 'done'); }
private function find_next_processable_subscription_order($subscription_id) { $posts = new WP_Query(array('post_type' => APPTHEMES_ORDER_PTYPE, 'post_status' => array(APPTHEMES_ORDER_PENDING, APPTHEMES_ORDER_FAILED), 'meta_query' => array(array('key' => 'paypal_subscription_id', 'value' => $subscription_id)), 'order' => 'ASC', 'orderby' => 'date')); if (count($posts->posts) == 0) { return false; } return appthemes_get_order($posts->post->ID); }
/** * Restores existing membership meta on previously trashed orders. * * @since 3.5 */ function _cp_restore_order_membership_meta($post_id) { $post = get_post($post_id); if (APPTHEMES_ORDER_PTYPE != $post->post_type) { return; } $order = appthemes_get_order($post_id); // check if the order is for a membership purchase $pack = cp_get_order_plan_data($order, CP_PACKAGE_MEMBERSHIP_PTYPE); if (!$pack) { return; } $user_id = $post->post_author; $trashed_order_id = get_user_meta($user_id, '_trashed-membership_order_id', true); // check if this is an order with a previously active membership previously trashed if ($post_id == $trashed_order_id) { $active_pack_id = get_user_meta($user_id, 'active_membership_pack', true); // only restore if there's not a new membership already activated - otherwise skip and clear previous trash meta if (!$active_pack_id) { $pack_id = get_user_meta($user_id, '_trashed-active_membership_pack', true); $expire_date = get_user_meta($user_id, '_trashed-membership_expires', true); // restore membership meta if the order is trashed update_user_meta($user_id, 'active_membership_pack', $pack_id); update_user_meta($user_id, 'membership_expires', $expire_date); } // delete the temp trashed membership meta delete_user_meta($user_id, '_trashed-membership_order_id'); delete_user_meta($user_id, '_trashed-active_membership_pack'); delete_user_meta($user_id, '_trashed-membership_expires'); } }
protected function refresh_order() { $id = $this->order->get_id(); $this->order = appthemes_get_order($id, true); }
/** * Returns an order object. * * @param int $order_id (optional) If given, returns the specified order, otherwise returns the order currently being queried. * * @return object APP_Order */ function get_order($order_id = null) { if (!$order_id && ($order = get_query_var('app_order'))) { $order_id = $order->get_id(); } else { if (empty($order_id)) { $post = get_queried_object(); $order_id = $post->ID; } } return appthemes_get_order($order_id); }
protected function get_action_order() { if (!isset($_GET['post'])) { die('No post included'); } $post = get_post($_GET['post']); if (!$post || $post->post_type != APPTHEMES_ORDER_PTYPE) { die('Bad post included'); } return appthemes_get_order($post->ID); }
/** * Outputs column data for orders * @param string $column_index Name of the column being processed * @param int $post_id ID of order being dispalyed * @return void */ function appthemes_order_add_column_data($column_index, $post_id) { $order = appthemes_get_order($post_id); switch ($column_index) { case 'order': echo '<a href="' . get_edit_post_link($post_id) . '">' . $order->get_ID() . '</a>'; break; case 'order_author': $user = get_userdata($order->get_author()); echo $user->display_name; echo '<br>'; echo $order->get_ip_address(); break; case 'item': $count = count($order->get_items()); $string = _n('Purchased %s item', 'Purchased %s items', $count, APP_TD); printf($string, $count); break; case 'price': $currency = $order->get_currency(); if (!empty($currency)) { echo appthemes_get_price($order->get_total(), $order->get_currency()); } else { echo appthemes_get_price($order->get_total()); } break; case 'payment': $gateway_id = $order->get_gateway(); if (!empty($gateway_id)) { $gateway = APP_Gateway_Registry::get_gateway($gateway_id); if ($gateway) { echo $gateway->display_name('admin'); } else { _e('Unknown', APP_TD); } } else { _e('Undecided', APP_TD); } echo '</br>'; $status = $order->get_display_status(); if ($order->get_status() == APPTHEMES_ORDER_PENDING) { echo '<strong>' . ucfirst($status) . '</strong>'; } else { echo ucfirst($status); } break; case 'status': echo ucfirst($order->get_status()); break; case 'order_date': $order_post = get_post($order->get_ID()); if ('0000-00-00 00:00:00' == $order_post->post_date) { $t_time = $h_time = __('Unpublished', APP_TD); $time_diff = 0; } else { $t_time = get_the_time(_x('Y/m/d g:i:s A', 'Order Date Format', APP_TD)); $m_time = $order_post->post_date; $time = get_post_time('G', true, $order_post); $time_diff = time() - $time; if ($time_diff > 0 && $time_diff < 24 * 60 * 60) { $h_time = sprintf(__('%s ago', APP_TD), human_time_diff($time)); } else { $h_time = mysql2date(_x('Y/m/d', 'Order Date Format', APP_TD), $m_time); } } echo '<abbr title="' . $t_time . '">' . $h_time . '</abbr>'; break; } }
/** * Displays specific details for PayPal Adaptive escrow orders * * @param object $post WordPress Post object */ function display($post) { $order = appthemes_get_order($post->ID); $details = appthemes_get_escrow_details($order); ?> <style type="text/css"> #admin-escrow-order-details td.paypal-email { font-size: 11px; } </style> <?php if (!empty($details['paymentInfoList']['paymentInfo'])) { ?> <table id="admin-escrow-order-details"> <?php $retained = 0; ?> <tbody> <?php foreach ($details['paymentInfoList']['paymentInfo'] as $key => $payment_info) { ?> <?php if (0 == $key) { continue; } ?> <?php $retained += $payment_info['receiver']['amount']; ?> <tr> <th><?php _e('Funds', APP_TD); ?> : </th> <td><?php echo appthemes_display_price($order->get_total(), $order->get_currency()); ?> </td> </tr> <tr> <td> </td> </tr> <tr> <th><?php _e('Receiver', APP_TD); ?> : </th> <td class="paypal-email"><?php echo $payment_info['receiver']['email']; ?> </td> </tr> <tr> <th><?php _e('Amount', APP_TD); ?> : </th> <td><?php echo appthemes_display_price($payment_info['receiver']['amount'], $order->get_currency()); ?> </td> </tr> <?php } ?> <tr> <th><?php _e('Retained', APP_TD); ?> : </th> <td><?php echo appthemes_display_price($order->get_total() - $retained, $order->get_currency()); ?> <?php echo __('(when completed)', APP_TD); ?> </td> </tr> </tr> </tbody> </table> <?php } else { ?> <?php echo __('N/A', APP_TD); ?> <?php } ?> <div class="clear"></div> <?php }
/** * Convert transactions to format of new AppThemes Payments. * * @since 3.3 */ function cp_upgrade_transactions_330() { global $wpdb; if (!current_theme_supports('app-payments')) { return; } // legacy orders $legacy_orders = $wpdb->get_results("SELECT * FROM {$wpdb->cp_order_info} "); if (!$legacy_orders) { return; } foreach ($legacy_orders as $legacy_order) { // create new post for order $new_order_post = array('post_title' => __('Transaction', APP_TD), 'post_content' => __('Transaction Data', APP_TD), 'post_status' => $legacy_order->payment_status == 'Completed' ? APPTHEMES_ORDER_ACTIVATED : APPTHEMES_ORDER_PENDING, 'post_type' => APPTHEMES_ORDER_PTYPE, 'post_date' => date('Y-m-d H:i:s', strtotime($legacy_order->payment_date)), 'post_author' => $legacy_order->user_id ? $legacy_order->user_id : 1); $new_order_id = wp_insert_post($new_order_post); if (!$new_order_id) { continue; } // set correct slug wp_update_post(array('ID' => $new_order_id, 'post_name' => $new_order_id)); $price = empty($legacy_order->mc_gross) || !is_numeric($legacy_order->mc_gross) ? 0 : $legacy_order->mc_gross; // add meta fields for order $new_order_postmeta = array('currency' => $legacy_order->mc_currency, 'total_price' => $price, 'gateway' => $legacy_order->payment_type == 'banktransfer' ? 'bank-transfer' : 'paypal', 'transaction_id' => $legacy_order->txn_id, 'bt-sentemail' => '1', 'ip_address' => appthemes_get_ip(), 'first_name' => $legacy_order->first_name, 'last_name' => $legacy_order->last_name, 'street' => $legacy_order->street, 'city' => $legacy_order->city, 'state' => $legacy_order->state, 'postcode' => $legacy_order->zipcode, 'country' => $legacy_order->residence_country); foreach ($new_order_postmeta as $meta_key => $meta_value) { add_post_meta($new_order_id, $meta_key, $meta_value, true); } $order = appthemes_get_order($new_order_id); if (!$order) { continue; } if (!empty($legacy_order->ad_id) && $legacy_order->ad_id > 0) { $order->add_item(CP_ITEM_LISTING, $price, $legacy_order->ad_id); } else { $order->add_item(CP_ITEM_MEMBERSHIP, $price); } // remove legacy entry $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->cp_order_info} WHERE id = %d", $legacy_order->id)); } }
/** * Returns coupon code text. * * @return string */ function appthemes_coupon_text() { $post = get_queried_object(); if (!$post) { if (isset($_GET['post'])) { $post = get_post($_GET['post']); } elseif (isset($_POST['post_ID'])) { $post = get_post($_POST['post_ID']); } } if (!is_object($post) || is_wp_error($post)) { return __('Coupon Code', APP_TD); } $order = appthemes_get_order($post->ID); if (!$order) { return __('Coupon Code', APP_TD); } $coupons = $order->get_items(APPTHEMES_COUPON_PTYPE); $coupon = $coupons[0]; $coupon_code = get_post_meta($coupon['post_id'], 'code', true); return sprintf(__('Coupon Code: "%s"', 'appthemes-coupons'), $coupon_code); }
</th> </tr> </thead> <tbody> <?php if ($orders->have_posts()) { ?> <?php while ($orders->have_posts()) { $orders->the_post(); ?> <?php $order = appthemes_get_order($orders->post->ID); ?> <tr> <td class="order-history-id text-center">#<?php the_ID(); ?> </td> <td class="date text-center"><strong><?php the_time(__('j M', APP_TD)); ?> </strong><br/><span class="year"><?php the_time(__('Y', APP_TD)); ?> </span></td> <td class="order-history-summary left"> <span class="order-history-ad"><?php
/** * Returns funds held in escrow to the original sender. * Triggered only when changing an Order from 'Paid' to 'Failed'. * * @uses do_action() Calls 'appthemes_escrow_refunded' * @uses do_action() Calls 'appthemes_escrow_refund_failed' * * @param Post object $post The post being updated * * @return bool True on success, False on failure */ function appthemes_escrow_refund($post) { $order = appthemes_get_order($post->ID); if (!$order->is_escrow()) { return false; } $gateway_id = $order->get_gateway(); $gateway = APP_Gateway_Registry::get_gateway($gateway_id); if ($gateway && (APP_Gateway_Registry::is_gateway_enabled($gateway_id, 'escrow') || current_user_can('manage_options'))) { if (!$gateway instanceof APP_Escrow_Payment_Processor) { return false; } $options = APP_Gateway_Registry::get_gateway_options($gateway_id); $result = $gateway->fail_escrow($order, $options); if (!$result) { do_action('appthemes_escrow_refund_failed', $order); } else { do_action('appthemes_escrow_refunded', $order); } return $result; } else { return false; } }