public function checkout($data)
{
return $this->app->checkout_manager->checkout($data);
$exec_return = false;
$sid = mw()->user_manager->session_id();
$sess_order_id = mw()->user_manager->session_get('order_id');
$cart = array();
$cart_table = $this->tables['cart'];
$table_orders = $this->tables['cart_orders'];
$cart['session_id'] = $sid;
$cart['order_completed'] = 0;
$cart['limit'] = 1;
$mw_process_payment = true;
$mw_process_payment_success = false;
$mw_process_payment_failed = false;
if (isset($_REQUEST['mw_payment_success'])) {
$mw_process_payment = false;
$mw_process_payment_success = true;
$exec_return = true;
} elseif (isset($_REQUEST['mw_payment_failure'])) {
$mw_process_payment_failed = true;
$exec_return = true;
}
$cart_table_real = $this->app->database_manager->real_table_name($cart_table);
$order_table_real = $this->app->database_manager->real_table_name($table_orders);
if ($exec_return == true) {
if (isset($_REQUEST['return_to'])) {
$return_to = urldecode($_REQUEST['return_to']);
$append = '?';
if (strstr($return_to, '?')) {
$append = '&';
}
if ($mw_process_payment_success == true) {
$return_to = $return_to . $append . 'mw_payment_success=1';
} elseif ($mw_process_payment_failed == true) {
$return_to = $return_to . $append . 'mw_payment_failure=1';
}
return $this->app->url_manager->redirect($return_to);
}
}
$additional_fields = false;
if (isset($data['for']) and isset($data['for_id'])) {
$additional_fields = $this->app->fields_manager->get($data['for'], $data['for_id'], 1);
}
$seach_address_keys = array('country', 'city', 'address', 'state', 'zip');
$addr_found_from_search_in_post = false;
if (isset($data) and is_array($data)) {
foreach ($data as $k => $v) {
if (is_array($v)) {
foreach ($seach_address_keys as $item) {
$case1 = ucfirst($item);
if (!isset($data[$item]) and (isset($v[$item]) or isset($v[$case1]))) {
$data[$item] = $v[$item];
if ($addr_found_from_search_in_post == false) {
unset($data[$k]);
}
$addr_found_from_search_in_post = 1;
}
}
}
}
}
$save_custom_fields_for_order = array();
if (is_array($additional_fields) and !empty($additional_fields)) {
foreach ($additional_fields as $cf) {
if (isset($data) and is_array($data)) {
foreach ($data as $k => $item) {
$key1 = str_replace('_', ' ', $cf['name']);
$key2 = str_replace('_', ' ', $k);
if ($key1 == $key2) {
$save_custom_fields_for_order[$key1] = $this->app->format->clean_html($item);
}
}
}
}
}
$checkout_errors = array();
$check_cart = $this->get_cart($cart);
if (!is_array($check_cart)) {
$checkout_errors['cart_empty'] = 'Your cart is empty';
} else {
if (!isset($data['payment_gw']) and $mw_process_payment == true) {
$data['payment_gw'] = 'none';
} else {
if ($mw_process_payment == true) {
$gw_check = $this->payment_options('payment_gw_' . $data['payment_gw']);
if (is_array($gw_check[0])) {
$gateway = $gw_check[0];
} else {
$checkout_errors['payment_gw'] = 'No such payment gateway is activated';
}
}
}
$shipping_country = false;
$shipping_cost_max = false;
$shipping_cost = false;
$shipping_cost_above = false;
if (mw()->user_manager->session_get('shipping_country')) {
$shipping_country = mw()->user_manager->session_get('shipping_country');
}
if (mw()->user_manager->session_get('shipping_cost_max')) {
$shipping_cost_max = mw()->user_manager->session_get('shipping_cost_max');
}
if (mw()->user_manager->session_get('shipping_cost')) {
$shipping_cost = mw()->user_manager->session_get('shipping_cost');
}
if (mw()->user_manager->session_get('shipping_cost_above')) {
$shipping_cost_above = mw()->user_manager->session_get('shipping_cost_above');
}
//post any of those on the form
$flds_from_data = array('first_name', 'last_name', 'email', 'country', 'city', 'state', 'zip', 'address', 'address2', 'payment_email', 'payment_name', 'payment_country', 'payment_address', 'payment_city', 'payment_state', 'payment_zip', 'phone', 'promo_code', 'payment_gw');
if (!isset($data['email']) or $data['email'] == '') {
$checkout_errors['email'] = 'Email is required';
}
if (!isset($data['first_name']) or $data['first_name'] == '') {
$checkout_errors['first_name'] = 'First name is required';
}
if (!isset($data['last_name']) or $data['last_name'] == '') {
$checkout_errors['last_name'] = 'Last name is required';
}
if (isset($data['payment_gw']) and $data['payment_gw'] != '') {
$data['payment_gw'] = str_replace('..', '', $data['payment_gw']);
}
$custom_order_id = $this->app->option_manager->get('custom_order_id', 'shop');
$posted_fields = array();
$place_order = array();
$place_order['id'] = false;
$return_url_after = '';
if ($this->app->url_manager->is_ajax()) {
$place_order['url'] = $this->app->url_manager->current(true);
$return_url_after = '&return_to=' . urlencode($_SERVER['HTTP_REFERER']);
} elseif (isset($_SERVER['HTTP_REFERER'])) {
$place_order['url'] = $_SERVER['HTTP_REFERER'];
$return_url_after = '&return_to=' . urlencode($_SERVER['HTTP_REFERER']);
} else {
$place_order['url'] = $this->app->url_manager->current();
}
$place_order['session_id'] = $sid;
$place_order['order_completed'] = 0;
$items_count = 0;
foreach ($flds_from_data as $value) {
if (isset($data[$value]) and $data[$value] != false) {
$place_order[$value] = $data[$value];
$posted_fields[$value] = $data[$value];
}
}
$amount = $this->cart_total();
$tax = $this->app->cart_manager->get_tax();
if (!empty($checkout_errors)) {
return array('error' => $checkout_errors);
}
$place_order['amount'] = $amount;
$place_order['allow_html'] = true;
$place_order['currency'] = $this->app->option_manager->get('currency', 'payments');
if (isset($data['shipping_gw'])) {
$place_order['shipping_service'] = $data['shipping_gw'];
}
$place_order['shipping'] = $shipping_cost;
if ($tax != 0) {
$place_order['taxes_amount'] = $tax;
}
$items_count = $this->cart_sum(false);
$place_order['items_count'] = $items_count;
$cart_checksum = md5($sid . serialize($check_cart) . uniqid());
$place_order['payment_verify_token'] = $cart_checksum;
define('FORCE_SAVE', $table_orders);
if (isset($save_custom_fields_for_order) and !empty($save_custom_fields_for_order)) {
$place_order['custom_fields_data'] = $this->app->format->array_to_base64($save_custom_fields_for_order);
}
if (!isset($place_order['shipping']) or $place_order['shipping'] == false) {
$place_order['shipping'] = 0;
}
$temp_order = $this->app->database_manager->save($table_orders, $place_order);
if ($temp_order != false) {
$place_order['id'] = $temp_order;
} else {
$place_order['id'] = 0;
}
if ($custom_order_id != false) {
foreach ($place_order as $key => $value) {
$custom_order_id = str_ireplace('{' . $key . '}', $value, $custom_order_id);
}
$custom_order_id = str_ireplace('{YYYYMMDD}', date('Ymd'), $custom_order_id);
$custom_order_id = str_ireplace('{date}', date('Y-m-d'), $custom_order_id);
}
if ($custom_order_id != false) {
$place_order['item_name'] = 'Order id:' . ' ' . $custom_order_id;
$place_order['order_id'] = $custom_order_id;
} else {
$place_order['item_name'] = 'Order id:' . ' ' . $place_order['id'];
}
if ($mw_process_payment == true) {
$shop_dir = module_dir('shop');
$shop_dir = $shop_dir . DS . 'payments' . DS . 'gateways' . DS;
if ($data['payment_gw'] != 'none') {
$gw_process = modules_path() . $data['payment_gw'] . '_process.php';
if (!is_file($gw_process)) {
$gw_process = normalize_path(modules_path() . $data['payment_gw'] . DS . 'process.php', false);
}
$mw_return_url = $this->app->url_manager->api_link('checkout') . '?mw_payment_success=1&order_id=' . $place_order['id'] . '&payment_gw=' . $data['payment_gw'] . '&payment_verify_token=' . $place_order['payment_verify_token'] . '&order_id=' . $place_order['id'] . $return_url_after;
$mw_cancel_url = $this->app->url_manager->api_link('checkout') . '?mw_payment_failure=1&order_id=' . $place_order['id'] . '&payment_gw=' . $data['payment_gw'] . '&payment_verify_token=' . $place_order['payment_verify_token'] . '&order_id=' . $place_order['id'] . $return_url_after;
$mw_ipn_url = $this->app->url_manager->api_link('checkout_ipn') . '?payment_gw=' . $data['payment_gw'] . '&order_id=' . $place_order['id'] . '&payment_verify_token=' . $place_order['payment_verify_token'] . $return_url_after;
// $place_order['success_url'] = $mw_return_url;
// $place_order['cancel_url'] = $mw_cancel_url;
// $place_order['notify_url'] = $mw_ipn_url;
if (is_file($gw_process)) {
require_once $gw_process;
} else {
$checkout_errors['payment_gw'] = 'Payment gateway\'s process file not found.';
}
} else {
$place_order['order_completed'] = 1;
$place_order['is_paid'] = 0;
$place_order['success'] = 'Your order has been placed successfully!';
}
$place_order['order_status'] = 'pending';
if (!empty($checkout_errors)) {
return array('error' => $checkout_errors);
}
$ord = $this->place_order($place_order);
$place_order['id'] = $ord;
}
if (isset($place_order) and !empty($place_order)) {
if (!isset($place_order['success'])) {
$place_order['success'] = 'Your order has been placed successfully!';
}
$return = $place_order;
if (isset($place_order['redirect'])) {
$return['redirect'] = $place_order['redirect'];
}
return $return;
}
}
if (!empty($checkout_errors)) {
return array('error' => $checkout_errors);
}
}