/** * Save the order and return the order id * * If the order is new, then save all the order items and manage the inventory. * If the order already exists, only the order data is updated. The order items and inventory * remain unchanged. * * @return int The order id (primary key form database) */ public function save() { // If the order is already in the database, only save the order data, not the ordered items or anything else if ($this->id > 0) { $this->_db->update($this->_tableName, $this->_data, array('id' => $this->id)); } else { // This is a new order so save the order items and deduct from inventory if necessary $this->_orderInfo['ouid'] = md5($this->_orderInfo['trans_id'] . $this->_orderInfo['bill_address']); $this->_db->insert($this->_tableName, $this->_orderInfo); $this->id = $this->_db->insert_id; $key = $this->_orderInfo['trans_id'] . '-' . $this->id . '-'; foreach ($this->_items as $item) { // Deduct from inventory Cart66Product::decrementInventory($item->getProductId(), $item->getOptionInfo(), $item->getQuantity()); $data = array('order_id' => $this->id, 'product_id' => $item->getProductId(), 'product_price' => $item->getProductPrice(), 'item_number' => $item->getItemNumber(), 'description' => $item->getFullDisplayName(), 'quantity' => $item->getQuantity(), 'duid' => md5($key . $item->getProductId())); $formEntryIds = ''; $fIds = $item->getFormEntryIds(); if (is_array($fIds) && count($fIds)) { foreach ($fIds as $entryId) { if (class_exists('RGFormsModel')) { if ($lead = RGFormsModel::get_lead($entryId)) { $lead['status'] = 'active'; RGFormsModel::update_lead($lead); } } } $formEntryIds = implode(',', $fIds); } $data['form_entry_ids'] = $formEntryIds; if ($item->getCustomFieldInfo()) { $data['description'] .= "\n" . $item->getCustomFieldDesc() . ":\n" . $item->getCustomFieldInfo(); } $orderItems = Cart66Common::getTableName('order_items'); $this->_db->insert($orderItems, $data); $orderItemId = $this->_db->insert_id; Cart66Common::log("Saved order item ({$orderItemId}): " . $data['description'] . "\nSQL: " . $this->_db->last_query); } } return $this->id; }
public static function admin_update_payment($form, $lead_id) { check_admin_referer('gforms_save_entry', 'gforms_save_entry'); //update payment information in admin, need to use this function so the lead data is updated before displayed in the sidebar info section //check meta to see if this entry is paypal $payment_gateway = gform_get_meta($lead_id, "payment_gateway"); $form_action = strtolower(rgpost("save")); if ($payment_gateway != "paypal" || $form_action != "update") { return; } //get lead $lead = RGFormsModel::get_lead($lead_id); //get payment fields to update $payment_status = rgpost("payment_status"); //when updating, payment status may not be editable, if no value in post, set to lead payment status if (empty($payment_status)) { $payment_status = $lead["payment_status"]; } $payment_amount = rgpost("payment_amount"); $payment_transaction = rgpost("paypal_transaction_id"); $payment_date = rgpost("payment_date"); if (empty($payment_date)) { $payment_date = gmdate("y-m-d H:i:s"); } else { //format date entered by user $payment_date = date("Y-m-d H:i:s", strtotime($payment_date)); } global $current_user; $user_id = 0; $user_name = "System"; if ($current_user && ($user_data = get_userdata($current_user->ID))) { $user_id = $current_user->ID; $user_name = $user_data->display_name; } $lead["payment_status"] = $payment_status; $lead["payment_amount"] = $payment_amount; $lead["payment_date"] = $payment_date; $lead["transaction_id"] = $payment_transaction; // if payment status does not equal approved or the lead has already been fulfilled, do not continue with fulfillment if ($payment_status == 'Approved' && !$lead["is_fulfilled"]) { //call fulfill order, mark lead as fulfilled self::fulfill_order($lead, $payment_transaction, $payment_amount); $lead["is_fulfilled"] = true; } //update lead, add a note RGFormsModel::update_lead($lead); RGFormsModel::add_note($lead["id"], $user_id, $user_name, sprintf(__("Payment information was manually updated. Status: %s. Amount: %s. Transaction Id: %s. Date: %s", "gravityforms"), $lead["payment_status"], GFCommon::to_money($lead["payment_amount"], $lead["currency"]), $payment_transaction, $lead["payment_date"])); }
private static function start_subscription($entry, $subscriber_id, $amount, $user_id, $user_name) { $entry["payment_status"] = "Active"; $entry["payment_amount"] = $amount; $entry["payment_date"] = gmdate("y-m-d H:i:s"); $entry["transaction_id"] = $subscriber_id; $entry["transaction_type"] = 2; //subscription if (!$entry["is_fulfilled"]) { self::fulfill_order($entry, $subscriber_id, $amount); $entry["is_fulfilled"] = true; } RGFormsModel::update_lead($entry); RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription has been created. Subscriber Id: %s", "gravityforms"), $subscriber_id)); }
public function gravityFormToCart($entry) { if (CART66_PRO) { $formId = Cart66GravityReader::getGravityFormIdForEntry($entry['id']); if ($formId) { $productId = Cart66Product::getProductIdByGravityFormId($formId); if ($productId > 0) { $product = new Cart66Product($productId); $qty = $product->gravityCheckForEntryQuantity($entry); $options = $product->gravityGetVariationPrices($entry); $productUrl = Cart66Common::getCurrentPageUrl(); $cart = Cart66Session::get('Cart66Cart'); $item = $cart->addItem($productId, $qty, $options, $entry['id'], $productUrl, false, true); Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Cart Item Value: " . print_r($item, true)); Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Should we use the gravity forms price? " . $product->gravity_form_pricing . ' :: Session value: ' . Cart66Session::get('userPrice_' . $product->id)); if ($product->gravity_form_pricing == 1) { $price = Cart66GravityReader::getPrice($entry['id']) / $qty; $entry_id = $item->getFirstFormEntryId(); $user_price_name = 'userPrice_' . $productId . '_' . $entry_id; Cart66Session::set($user_price_name, $price, true); // Setting the price of a Gravity Forms pricing product Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Using gravity forms pricing for product: Price: {$price} :: Name: " . $product->name . " :: Session variable name: {$user_price_name}"); } $cartPage = get_page_by_path('store/cart'); $cartPageLink = get_permalink($cartPage->ID); Cart66Session::set('Cart66LastPage', $_SERVER['HTTP_REFERER']); Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Cart66 Session Dump: " . Cart66Session::dump()); if (!Cart66Setting::getValue('display_form_entries_before_sale')) { $entry["status"] = 'unpaid'; } RGFormsModel::update_lead($entry); $cart->applyAutoPromotions(); do_action('cart66_after_add_to_cart', $product, $qty); wp_redirect($cartPageLink); exit; } } } }
private static function cancel_subscription($lead) { $lead["payment_status"] = "Canceled"; RGFormsModel::update_lead($lead); //loading data class $feed_id = gform_get_meta($lead["id"], "authorize.net_feed_id"); require_once self::get_base_path() . "/data.php"; $config = GFAuthorizeNetData::get_feed($feed_id); if (!$config) { return; } //1- delete post or mark it as a draft based on configuration if (rgars($config, "meta/update_post_action") == "draft" && !rgempty("post_id", $lead)) { $post = get_post($lead["post_id"]); $post->post_status = 'draft'; wp_update_post($post); } else { if (rgars($config, "meta/update_post_action") == "delete" && !rgempty("post_id", $lead)) { wp_delete_post($lead["post_id"]); } } //2- call subscription canceled hook do_action("gform_subscription_canceled", $lead, $config, $lead["transaction_id"], "authorize.net"); }
protected function process_subscription_canceled($entry, $feed) { //Updating entry payment status $entry["payment_status"] = "Canceled"; RGFormsModel::update_lead($entry); //Delete post or mark it as a draft based on feed configuration if (rgars($feed, "meta/update_post_action") == "draft" && !rgempty("post_id", $entry)) { $post = get_post($entry["post_id"]); $post->post_status = 'draft'; wp_update_post($post); } else { if (rgars($feed, "meta/update_post_action") == "delete" && !rgempty("post_id", $entry)) { wp_delete_post($entry["post_id"]); } } }
/** * Save a PayPal IPN order from a Website Payments Pro cart sale. * * @param array $pp Urldecoded array of IPN key value pairs */ public function saveOrder($pp) { global $wpdb; // NEW Parse custom value $referrer = false; $ouid = $pp['custom']; if (strpos($ouid, '|') !== false) { list($ouid, $referrer, $gfData) = explode('|', $ouid); } $order = new Cart66Order(); $order->loadByOuid($ouid); if ($order->id > 0 && $order->status == 'checkout_pending') { $hasDigital = false; // Calculate subtotal $subtotal = 0; $numCartItems = $pp['num_cart_items'] > 0 ? $pp['num_cart_items'] : 1; for ($i = 1; $i <= $numCartItems; $i++) { // PayPal in not consistent in the way it passes back the item amounts $amt = 0; if (isset($pp['mc_gross' . $i])) { $amt = $pp['mc_gross' . $i]; } elseif (isset($pp['mc_gross_' . $i])) { $amt = $pp['mc_gross_' . $i]; } $subtotal += $amt; } $statusOptions = Cart66Common::getOrderStatusOptions(); $status = $statusOptions[0]; // Parse Gravity Forms ids $gfIds = array(); if (!empty($gfData)) { $forms = explode(',', $gfData); foreach ($forms as $f) { list($itemId, $formEntryId) = explode(':', $f); $gfIds[$itemId] = $formEntryId; } } // Look for discount amount $discount = 0; if (isset($pp['discount'])) { $discount = $pp['discount']; } $data = array('bill_first_name' => $pp['first_name'], 'bill_last_name' => $pp['last_name'], 'bill_address' => $pp['address_street'], 'bill_city' => $pp['address_city'], 'bill_state' => $pp['address_state'], 'bill_zip' => $pp['address_zip'], 'bill_country' => $pp['address_country'], 'ship_first_name' => $pp['address_name'], 'ship_address' => $pp['address_street'], 'ship_city' => $pp['address_city'], 'ship_state' => $pp['address_state'], 'ship_zip' => $pp['address_zip'], 'ship_country' => $pp['address_country'], 'email' => $pp['payer_email'], 'phone' => $pp['contact_phone'], 'shipping' => $pp['mc_handling'], 'tax' => $pp['tax'], 'subtotal' => $subtotal, 'total' => $pp['mc_gross'], 'discount_amount' => $discount, 'trans_id' => $pp['txn_id'], 'ordered_on' => date('Y-m-d H:i:s', Cart66Common::localTs()), 'status' => $status); foreach ($data as $key => $value) { $data[$key] = is_null($value) ? '' : $value; } // Verify the first items in the IPN are for products managed by Cart66. It could be an IPN from some other type of transaction. $productsTable = Cart66Common::getTableName('products'); $orderItemsTable = Cart66Common::getTableName('order_items'); $sql = "SELECT id from {$productsTable} where item_number = '" . $pp['item_number1'] . "'"; $productId = $wpdb->get_var($sql); if (!$productId) { Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] about to throw an exception, this is not an IPN that should be managed by cart66 because the item number does not match up"); throw new Exception("This is not an IPN that should be managed by Cart66"); } // Look for the 100% coupons shipping item and move it back to a shipping costs rather than a product if ($data['shipping'] == 0) { for ($i = 1; $i <= $numCartItems; $i++) { $itemNumber = strtoupper($pp['item_number' . $i]); if ($itemNumber == 'SHIPPING') { $data['shipping'] = isset($pp['mc_gross_' . $i]) ? $pp['mc_gross_' . $i] : $pp['mc_gross' . $i]; } } } $order->setData($data); $order->save(); $orderId = $order->id; // Handle email receipts if (CART66_PRO && CART66_EMAILS && Cart66Setting::getValue('enable_advanced_notifications') == 1) { $notify = new Cart66AdvancedNotifications($orderId); $notify->sendAdvancedEmailReceipts(); } elseif (CART66_EMAILS) { $notify = new Cart66Notifications($orderId); $notify->sendEmailReceipts(); } // Process affiliate reward if necessary if ($referrer && CART66_PRO) { Cart66Common::awardCommission($order->id, $referrer); // End processing affiliate information if (isset($_COOKIE['ap_id']) && $_COOKIE['ap_id']) { setcookie('ap_id', $referrer, time() - 3600, "/"); unset($_COOKIE['ap_id']); } Cart66Session::drop('app_id'); } if (CART66_PRO) { // Begin iDevAffiliate Tracking if (CART66_PRO && ($url = Cart66Setting::getValue('idevaff_url'))) { require_once CART66_PATH . "/pro/idevaffiliate-award.php"; } // End iDevAffiliate Tracking } } else { $orderTable = Cart66Common::getTableName('orders'); // Make sure the transaction id is not already in the database $sql = "SELECT count(*) as c from {$orderTable} where trans_id=%s"; $sql = $wpdb->prepare($sql, $pp['txn_id']); $count = $wpdb->get_var($sql); if ($count < 1) { $hasDigital = false; // Calculate subtotal $subtotal = 0; $numCartItems = $pp['num_cart_items'] > 0 ? $pp['num_cart_items'] : 1; for ($i = 1; $i <= $numCartItems; $i++) { // PayPal in not consistent in the way it passes back the item amounts $amt = 0; if (isset($pp['mc_gross' . $i])) { $amt = $pp['mc_gross' . $i]; } elseif (isset($pp['mc_gross_' . $i])) { $amt = $pp['mc_gross_' . $i]; } $subtotal += $amt; } $statusOptions = Cart66Common::getOrderStatusOptions(); $status = $statusOptions[0]; $ouid = md5($pp['txn_id'] . $pp['address_street']); // Parse custom value $referrer = false; $deliveryMethod = $pp['custom']; if (strpos($deliveryMethod, '|') !== false) { list($deliveryMethod, $referrer, $gfData, $coupon) = explode('|', $deliveryMethod); } // Parse Gravity Forms ids $gfIds = array(); if (!empty($gfData)) { $forms = explode(',', $gfData); foreach ($forms as $f) { list($itemId, $formEntryId) = explode(':', $f); $gfIds[$itemId] = $formEntryId; } } // Look for discount amount $discount = 0; if (isset($pp['discount'])) { $discount = $pp['discount']; } // Look for coupon code $coupon_code = "none"; if (isset($coupon) && $coupon != "") { $coupon_code = $coupon; } $data = array('bill_first_name' => $pp['first_name'], 'bill_last_name' => $pp['last_name'], 'bill_address' => $pp['address_street'], 'bill_city' => $pp['address_city'], 'bill_state' => $pp['address_state'], 'bill_zip' => $pp['address_zip'], 'bill_country' => $pp['address_country'], 'ship_first_name' => $pp['address_name'], 'ship_address' => $pp['address_street'], 'ship_city' => $pp['address_city'], 'ship_state' => $pp['address_state'], 'ship_zip' => $pp['address_zip'], 'ship_country' => $pp['address_country'], 'shipping_method' => $deliveryMethod, 'email' => $pp['payer_email'], 'phone' => $pp['contact_phone'], 'shipping' => $pp['mc_handling'], 'tax' => $pp['tax'], 'subtotal' => $subtotal, 'total' => $pp['mc_gross'], 'coupon' => $coupon_code, 'discount_amount' => $discount, 'trans_id' => $pp['txn_id'], 'ordered_on' => date('Y-m-d H:i:s', Cart66Common::localTs()), 'status' => $status, 'ouid' => $ouid); $data = Cart66Common::deNullArrayValues($data); // Verify the first items in the IPN are for products managed by Cart66. It could be an IPN from some other type of transaction. $productsTable = Cart66Common::getTableName('products'); $orderItemsTable = Cart66Common::getTableName('order_items'); $sql = "SELECT id from {$productsTable} where item_number = '" . $pp['item_number1'] . "'"; $productId = $wpdb->get_var($sql); if (!$productId) { throw new Exception("This is not an IPN that should be managed by Cart66"); } // Look for the 100% coupons shipping item and move it back to a shipping costs rather than a product if ($data['shipping'] == 0) { for ($i = 1; $i <= $numCartItems; $i++) { $itemNumber = strtoupper($pp['item_number' . $i]); if ($itemNumber == 'SHIPPING') { $data['shipping'] = isset($pp['mc_gross_' . $i]) ? $pp['mc_gross_' . $i] : $pp['mc_gross' . $i]; } } } $wpdb->insert($orderTable, $data); $orderId = $wpdb->insert_id; $product = new Cart66Product(); for ($i = 1; $i <= $numCartItems; $i++) { $sql = "SELECT id from {$productsTable} where item_number = '" . $pp['item_number' . $i] . "'"; $productId = $wpdb->get_var($sql); if ($productId > 0) { $product->load($productId); // Decrement inventory $info = $pp['item_name' . $i]; if (strpos($info, '(') > 0) { $info = strrchr($info, '('); $start = strpos($info, '('); $end = strpos($info, ')'); $length = $end - $start; $variation = substr($info, $start + 1, $length - 1); Cart66Common::log("PayPal Variation Information: {$variation}\n{$info}"); } $qty = $pp['quantity' . $i]; Cart66Product::decrementInventory($productId, $variation, $qty); if ($hasDigital == false) { $hasDigital = $product->isDigital(); } // PayPal is not consistent in the way it passes back the item amounts $amt = 0; if (isset($pp['mc_gross' . $i])) { $amt = $pp['mc_gross' . $i]; } elseif (isset($pp['mc_gross_' . $i])) { $amt = $pp['mc_gross_' . $i] / $pp['quantity' . $i]; } // Look for Gravity Form Entry ID $formEntryId = ''; if (is_array($gfIds) && !empty($gfIds) && isset($gfIds[$i])) { $formEntryId = $gfIds[$i]; if (class_exists('RGFormsModel')) { if ($lead = RGFormsModel::get_lead($formEntryId)) { $lead['status'] = 'active'; RGFormsModel::update_lead($lead); } } } $duid = md5($pp['txn_id'] . '-' . $orderId . '-' . $productId); $data = array('order_id' => $orderId, 'product_id' => $productId, 'item_number' => $pp['item_number' . $i], 'product_price' => $amt, 'description' => $pp['item_name' . $i], 'quantity' => $pp['quantity' . $i], 'duid' => $duid, 'form_entry_ids' => $formEntryId); $wpdb->insert($orderItemsTable, $data); } } // Handle email receipts if (CART66_PRO && CART66_EMAILS && Cart66Setting::getValue('enable_advanced_notifications') == 1) { $notify = new Cart66AdvancedNotifications($orderId); $notify->sendAdvancedEmailReceipts(); } elseif (CART66_EMAILS) { $notify = new Cart66Notifications($orderId); $notify->sendEmailReceipts(); } $promotion = new Cart66Promotion(); $promotion->loadByCode($coupon_code); if ($promotion) { $promotion->updateRedemptions(); } // Process affiliate reward if necessary if ($referrer) { Cart66Common::awardCommission($orderId, $referrer); } } // end transaction id check } }
/** * Save payment information to DB * * @since 1.7.9.1 * * @uses rgar() * @uses GFCommon::get_currency() * @uses rgpost() * @uses RGFormsModel::get_lead_details_table_name() * @uses wpdb->prepare() * @uses wpdb->get_results() * @uses RGFormsModel::get_lead_detail_id() * @uses wpdb->update() * @uses wpdb->insert() * @uses RGFormsModel::update_lead() * @uses apply_filters() * @uses GFP_Stripe::get_feed() * @uses gform_update_meta() * @uses GFP_Stripe_Data::insert_transaction() * * @param $entry * @param $form * * @return void */ public function gform_entry_created($entry, $form) { global $wpdb; $entry_id = rgar($entry, 'id'); if (!empty(self::$transaction_response)) { //Current Currency $currency = GFCommon::get_currency(); $transaction_id = self::$transaction_response['transaction_id']; $transaction_type = self::$transaction_response['transaction_type']; $amount = array_key_exists('amount', self::$transaction_response) ? self::$transaction_response['amount'] : null; $payment_date = gmdate('Y-m-d H:i:s'); $entry['currency'] = $currency; if ('1' == $transaction_type) { $entry['payment_status'] = 'Approved'; } else { $entry['payment_status'] = 'Active'; } $entry['payment_amount'] = $amount; $entry['payment_date'] = $payment_date; $entry['transaction_id'] = $transaction_id; $entry['transaction_type'] = $transaction_type; $entry['is_fulfilled'] = true; //save card type since it gets stripped $form_id = $entry['form_id']; foreach ($form['fields'] as $field) { if ('creditcard' == $field['type']) { $creditcard_field_id = $field['id']; } } $card_type_name = "input_" . $creditcard_field_id . "_4"; $card_type_id = $creditcard_field_id . ".4"; $card_type_value = rgpost($card_type_name); $card_type_value = substr($card_type_value, 0, GFORMS_MAX_FIELD_LENGTH); $lead_detail_table = RGFormsModel::get_lead_details_table_name(); $current_fields = $wpdb->get_results($wpdb->prepare("SELECT id, field_number FROM {$lead_detail_table} WHERE lead_id=%d", $entry_id)); $lead_detail_id = RGFormsModel::get_lead_detail_id($current_fields, $card_type_id); if ($lead_detail_id > 0) { $wpdb->update($lead_detail_table, array('value' => $card_type_value), array('id' => $lead_detail_id), array("%s"), array("%d")); } else { $wpdb->insert($lead_detail_table, array('lead_id' => $entry_id, 'form_id' => $form['id'], 'field_number' => $card_type_id, 'value' => $card_type_value), array("%d", "%d", "%f", "%s")); } $entry = apply_filters('gfp_stripe_entry_created_update_lead', $entry, self::$transaction_response); RGFormsModel::update_lead($entry); //saving feed id $feed = self::$_this->get_feed($form); gform_update_meta($entry_id, 'Stripe_feed_id', $feed['id']); //updating form meta with current payment gateway gform_update_meta($entry_id, 'payment_gateway', 'stripe'); $subscriber_id = apply_filters('gfp_stripe_entry_created_subscriber_id', '', self::$transaction_response, $entry); GFP_Stripe_Data::insert_transaction($entry['id'], apply_filters('gfp_stripe_entry_created_insert_transaction_type', 'payment', $transaction_type), $subscriber_id, $transaction_id, $amount); } }
public function saveMijirehOrder($order_number) { global $wpdb; // Make sure the order is not already in the database $orders_table = Cart66Common::getTableName('orders'); $sql = "select id from {$orders_table} where trans_id = %s"; $sql = $wpdb->prepare($sql, $order_number); $order_id = $wpdb->get_var($sql); if (!$order_id) { // Save the order $order = new Cart66Order(); $cloud_order = $this->pullOrder($order_number); $order_data = $this->buildOrderDataArray($cloud_order); Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Order data: " . print_r($order_data, true)); $order_data = Cart66Common::deNullArrayValues($order_data); $order_id = $order->rawSave($order_data); // Save the order items $order_items_table = Cart66Common::getTableName('order_items'); foreach ($cloud_order['items'] as $key => $item) { $product = new Cart66Product(); $product->loadByItemNumber($item['sku']); $data = array('order_id' => $order_id, 'product_id' => $product->id, 'product_price' => $item['price'], 'item_number' => $item['sku'], 'description' => $item['name'], 'quantity' => $item['quantity'], 'duid' => md5($order_id . $item['sku'])); // Look for gravity forms data if (isset($cloud_order['meta_data'][$key]['gforms_' . $item['sku']])) { $data['form_entry_ids'] = $cloud_order['meta_data'][$key]['gforms_' . $item['sku']]; } $fIds = array(); if (isset($data['form_entry_ids'])) { $fIds = explode(',', $data['form_entry_ids']); if (is_array($fIds) && count($fIds)) { foreach ($fIds as $entryId) { if (class_exists('RGFormsModel')) { if ($lead = RGFormsModel::get_lead($entryId)) { $lead['status'] = 'active'; RGFormsModel::update_lead($lead); } } } } } $data = Cart66Common::deNullArrayValues($data); Cart66Common::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Trying to save this order item:" . print_r($data, true)); $wpdb->insert($order_items_table, $data); $order_item_id = $wpdb->insert_id; // Decrement inventory after sale if (Cart66Setting::getValue('track_inventory') == 1) { $option_info = ''; if (isset($cloud_order['meta_data']['options_' . $item['sku']])) { $option_info = $cloud_order['meta_data']['options_' . $item['sku']]; } Cart66Product::decrementInventory($data['product_id'], $option_info, $data['quantity']); } // Look for membership product upgrades/extensions if (isset($cloud_order['meta_data']['account_id']) && is_numeric($cloud_order['meta_data']['account_id'])) { $order->load($order_id); $account_id = $cloud_order['meta_data']['account_id']; if ($mp = $order->getMembershipProduct()) { $account = new Cart66Account(); $account->load($account_id); $account->attachMembershipProduct($mp, $account->firstName, $account->lastName); $order->account_id = $account->id; $order->save(); } } } //update the number of redemptions for the promotion code. if (Cart66Session::get('Cart66Promotion')) { Cart66Session::get('Cart66Promotion')->updateRedemptions(); } // Send email receipts if (CART66_PRO && CART66_EMAILS && Cart66Setting::getValue('enable_advanced_notifications') == 1) { $notify = new Cart66AdvancedNotifications($order_id); $notify->sendAdvancedEmailReceipts(); } elseif (CART66_EMAILS) { $notify = new Cart66Notifications($order_id); $notify->sendEmailReceipts(); } //Cart66Common::sendEmailReceipts($order_id); } // Redirect to receipt page $this->goToReceipt($order_id); }
public static function set_payment_status($config, $entry, $status, $transaction_type, $transaction_id, $subscriber_id, $amount, $profile_status, $period_type, $initial_payment_status, $initial_payment_amount, $initial_payment_transaction_id, $parent_transaction_id, $reason_code) { global $current_user; $user_id = 0; $user_name = "System"; if ($current_user && ($user_data = get_userdata($current_user->ID))) { $user_id = $current_user->ID; $user_name = $user_data->display_name; } switch (strtolower($transaction_type)) { case "recurring_payment_profile_created": if ($profile_status == "Active" && $entry["payment_status"] == "Pending") { //Adding note RGFormsModel::add_note($entry["id"], $user_id, $user_name, __("Pending profile has been approved by PayPal and this subscription has been marked as Active.", "gravityformspaypalpro")); //Marking entry as Active $entry["payment_status"] = "Active"; RGFormsModel::update_lead($entry); //Update transaction with transaction_id and payment amount $transactions = GFPayPalProData::get_transactions("signup", $subscriber_id); if (count($transactions) > 0) { $transaction = $transactions[0]; $transaction["transaction_id"] = rgpost("initial_payment_txn_id"); $transaction["amount"] = rgpost("initial_payment_amount"); GFPayPalProData::update_transaction($transaction); } else { //this shoulndn't happen, but create a new transaction if one isn't there $feed_id = gform_get_meta($entry["id"], "paypalpro_feed_id"); GFPayPalProData::insert_transaction($entry["id"], $feed_id, "signup", $subscriber_id, $transaction_id, $parent_transaction_id, $initial_payment_amount); } //fulfilling order self::fulfill_order($entry, $subscriber_id, $initial_payment_amount, $amount); } break; case "recurring_payment": if ($amount != 0) { $do_fulfillment = false; if ($profile_status == "Active") { if ($period_type == "Trial") { RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Trial payment has been made. Amount: %s. Transaction Id: %s", "gravityforms"), GFCommon::to_money($amount, $entry["currency"]), $transaction_id)); } else { RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription payment has been made. Amount: %s. Transaction Id: %s", "gravityforms"), GFCommon::to_money($amount, $entry["currency"]), $transaction_id)); } //Setting entry to Active if ($entry["payment_status"] == "Pending") { RGFormsModel::add_note($entry["id"], $user_id, $user_name, __("Pending profile has been approved by PayPal and this subscription has been marked as Active.", "gravityformspaypalpro")); $entry["payment_status"] = "Active"; $do_fulfillment = true; } } else { if ($profile_status == "Expired") { $entry["payment_status"] = "Expired"; RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription has successfully completed its billing schedule. Subscriber Id: %s", "gravityformspaypalpro"), $subscriber_id)); } } RGFormsModel::update_lead($entry); GFPayPalProData::insert_transaction($entry["id"], $config["id"], "payment", $subscriber_id, $transaction_id, $parent_transaction_id, $amount); //fulfilling order if ($do_fulfillment) { self::fulfill_order($entry, $subscriber_id, $initial_payment_amount, $amount); } } break; case "recurring_payment_failed": if ($profile_status == "Active") { $entry["payment_status"] = "Failed"; RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription payment failed due to a transaction decline, rejection, or error. The gateway will retry to collect payment in the next billing cycle. Subscriber Id: %s", "gravityforms"), $subscriber_id)); } else { if ($profile_status == "Suspended") { $entry["payment_status"] = "Failed"; RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription payment failed due to a transaction decline, rejection, or error. Subscriber Id: %s", "gravityformspaypalpro"), $subscriber_id)); } } RGFormsModel::update_lead($entry); break; case "recurring_payment_profile_cancel": $entry["payment_status"] = "Cancelled"; RGFormsModel::update_lead($entry); RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription has been cancelled. Subscriber Id: %s", "gravityformspaypalpro"), $subscriber_id)); break; case "recurring_payment_suspended_due_to_max_failed_payment": $entry["payment_status"] = "Failed"; RGFormsModel::update_lead($entry); RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Subscription is currently suspended as it exceeded maximum number of failed payments allowed. Subscriber Id: %s", "gravityformspaypalpro"), $subscriber_id)); break; default: //handles products and donation switch (strtolower($status)) { case "reversed": //self::$log->LogDebug("Processing reversal."); if ($entry["payment_status"] != "Reversed") { if ($entry["transaction_type"] == 1) { $entry["payment_status"] = "Reversed"; ////self::$log->LogDebug("Setting entry as Reversed"); RGFormsModel::update_lead($entry); } RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Payment has been reversed. Transaction Id: %s. Reason: %s", "gravityformspaypalpro"), $transaction_id, self::get_reason($reason_code))); } GFPayPalProData::insert_transaction($entry["id"], $config["id"], "reversal", $subscriber_id, $transaction_id, $parent_transaction_id, $amount); break; case "canceled_reversal": //self::$log->LogDebug("Processing a reversal cancellation"); if ($entry["payment_status"] != "Approved") { if ($entry["transaction_type"] == 1) { $entry["payment_status"] = "Approved"; //self::$log->LogDebug("Setting entry as approved"); RGFormsModel::update_lead($entry); } RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Payment reversal has been canceled and the funds have been transferred to your account. Transaction Id: %s", "gravityformspaypalpro"), $entry["transaction_id"])); } GFPayPalProData::insert_transaction($entry["id"], $config["id"], "reinstated", $subscriber_id, $transaction_id, $parent_transaction_id, $amount); break; case "refunded": //self::$log->LogDebug("Processing a Refund request."); if ($entry["payment_status"] != "Refunded") { if ($entry["transaction_type"] == 1) { $entry["payment_status"] = "Refunded"; //self::$log->LogDebug("Setting entry as Refunded."); RGFormsModel::update_lead($entry); } RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Payment has been refunded. Refunded amount: %s. Transaction Id: %s", "gravityformspaypalpro"), $amount, $transaction_id)); } GFPayPalProData::insert_transaction($entry["id"], $config["id"], "refund", $subscriber_id, $transaction_id, $parent_transaction_id, $amount); break; case "voided": //self::$log->LogDebug("Processing a Voided request."); if ($entry["payment_status"] != "Voided") { if ($entry["transaction_type"] == 1) { $entry["payment_status"] = "Voided"; //self::$log->LogDebug("Setting entry as Voided."); RGFormsModel::update_lead($entry); } RGFormsModel::add_note($entry["id"], $user_id, $user_name, sprintf(__("Authorization has been voided. Transaction Id: %s", "gravityformspaypalpro"), $transaction_id)); } GFPayPalProData::insert_transaction($entry["id"], $config["id"], "void", $subscriber_id, $transaction_id, $parent_transaction_id, $amount); break; } break; } }