예제 #1
0
 /**
  * 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);
}
예제 #4
0
 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;
 }
예제 #5
0
파일: bt-admin.php 프로젝트: kalushta/darom
 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();
     }
 }
예제 #6
0
 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());
 }
예제 #7
0
 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());
 }
예제 #8
0
 /**
  * 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();
     }
 }
예제 #10
0
 /**
  * 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;
         }
     }
 }
예제 #11
0
파일: updates.php 프로젝트: kalushta/darom
/**
 * 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');
}
예제 #12
0
 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);
 }
예제 #13
0
파일: packages.php 프로젝트: kalushta/darom
/**
 * 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');
    }
}
예제 #14
0
 protected function refresh_order()
 {
     $id = $this->order->get_id();
     $this->order = appthemes_get_order($id, true);
 }
예제 #15
0
/**
 * 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);
}
예제 #16
0
 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);
 }
예제 #17
0
/**
 * 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;
    }
}
예제 #18
0
    /**
     * 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>&nbsp;</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 
    }
예제 #19
0
/**
 * 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));
    }
}
예제 #20
0
파일: coupons.php 프로젝트: kalushta/darom
/**
 * 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);
}
예제 #21
0
</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 
예제 #22
0
/**
 * 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;
    }
}