/** * Get the Export Data * * @access public * @since 1.5 * @global object $wpdb Used to query the database using the WordPress * Database API * @return array $data The data for the CSV file */ public function get_data() { if ($this->step == 1) { $this->delete_data('give_temp_recount_income'); } $total = get_option('give_temp_recount_income', false); if (false === $total) { $total = (double) 0; $this->store_data('give_temp_recount_income', $total); } $accepted_statuses = apply_filters('give_recount_accepted_statuses', array('publish')); $args = apply_filters('give_recount_income_args', array('number' => $this->per_step, 'page' => $this->step, 'status' => $accepted_statuses, 'fields' => 'ids')); $payments = give_get_payments($args); if (!empty($payments)) { foreach ($payments as $payment) { $total += give_get_payment_amount($payment); } if ($total < 0) { $totals = 0; } $total = round($total, give_currency_decimal_filter()); $this->store_data('give_temp_recount_income', $total); return true; } update_option('give_income_total', $total); set_transient('give_income_total', $total, 86400); return false; }
/** * Load Admin Scripts * * Enqueues the required admin scripts. * * @since 1.0 * @global $post * * @param string $hook Page hook * * @return void */ function give_load_admin_scripts($hook) { global $wp_version, $post, $post_type; //Directories of assets $js_dir = GIVE_PLUGIN_URL . 'assets/js/admin/'; $js_plugins = GIVE_PLUGIN_URL . 'assets/js/plugins/'; $css_dir = GIVE_PLUGIN_URL . 'assets/css/'; // Use minified libraries if SCRIPT_DEBUG is turned off $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; //Global Admin: wp_register_style('give-admin-bar-notification', $css_dir . 'adminbar-style.css'); wp_enqueue_style('give-admin-bar-notification'); //Give Admin Only: if (!apply_filters('give_load_admin_scripts', give_is_admin_page(), $hook)) { return; } //CSS wp_register_style('jquery-ui-css', $css_dir . 'jquery-ui-fresh' . $suffix . '.css'); wp_enqueue_style('jquery-ui-css'); wp_register_style('give-admin', $css_dir . 'give-admin' . $suffix . '.css', GIVE_VERSION); wp_enqueue_style('give-admin'); wp_register_style('jquery-chosen', $css_dir . 'chosen' . $suffix . '.css', array(), GIVE_VERSION); wp_enqueue_style('jquery-chosen'); wp_enqueue_style('thickbox'); //JS wp_register_script('jquery-chosen', $js_plugins . 'chosen.jquery' . $suffix . '.js', array('jquery'), GIVE_VERSION); wp_enqueue_script('jquery-chosen'); wp_register_script('give-admin-scripts', $js_dir . 'admin-scripts' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-admin-scripts'); wp_register_script('jquery-flot', $js_plugins . 'jquery.flot' . $suffix . '.js'); wp_enqueue_script('jquery-flot'); wp_register_script('give-qtip', $js_plugins . 'jquery.qtip' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-qtip'); wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_script('thickbox'); //Forms CPT Script if ($post_type === 'give_forms') { wp_register_script('give-admin-forms-scripts', $js_dir . 'admin-forms' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-admin-forms-scripts'); } //Localize strings & variables for JS wp_localize_script('give-admin-scripts', 'give_vars', array('post_id' => isset($post->ID) ? $post->ID : null, 'give_version' => GIVE_VERSION, 'quick_edit_warning' => __('Sorry, not available for variable priced forms.', 'give'), 'delete_payment' => __('Are you sure you wish to delete this payment?', 'give'), 'delete_payment_note' => __('Are you sure you wish to delete this note?', 'give'), 'delete_tax_rate' => __('Are you sure you wish to delete this tax rate?', 'give'), 'revoke_api_key' => __('Are you sure you wish to revoke this API key?', 'give'), 'regenerate_api_key' => __('Are you sure you wish to regenerate this API key?', 'give'), 'resend_receipt' => __('Are you sure you wish to resend the donation receipt?', 'give'), 'copy_download_link_text' => __('Copy these links to your clipboard and give them to your donor', 'give'), 'delete_payment_download' => sprintf(__('Are you sure you wish to delete this %s?', 'give'), give_get_forms_label_singular()), 'one_price_min' => __('You must have at least one price', 'give'), 'one_file_min' => __('You must have at least one file', 'give'), 'one_field_min' => __('You must have at least one field', 'give'), 'one_option' => sprintf(__('Choose a %s', 'give'), give_get_forms_label_singular()), 'one_or_more_option' => sprintf(__('Choose one or more %s', 'give'), give_get_forms_label_plural()), 'numeric_item_price' => __('Item price must be numeric', 'give'), 'numeric_quantity' => __('Quantity must be numeric', 'give'), 'currency_sign' => give_currency_filter(''), 'currency_pos' => isset($give_options['currency_position']) ? $give_options['currency_position'] : 'before', 'currency_decimals' => give_currency_decimal_filter(), 'new_media_ui' => apply_filters('give_use_35_media_ui', 1), 'remove_text' => __('Remove', 'give'), 'type_to_search' => sprintf(__('Type to search %s', 'give'), give_get_forms_label_plural()))); if (function_exists('wp_enqueue_media') && version_compare($wp_version, '3.5', '>=')) { //call for new media manager wp_enqueue_media(); } }
/** * Retrieve earning stats * * @access public * @since 1.0 * * @param $form_id INT The download product to retrieve stats for. If false, gets stats for all forms * @param $start_date string|bool The starting date for which we'd like to filter our sale stats. If false, we'll use the default start date of `this_month` * @param $end_date string|bool The end date for which we'd like to filter our sale stats. If false, we'll use the default end date of `this_month` * * @return float|int */ public function get_earnings($form_id = 0, $start_date = false, $end_date = false) { global $wpdb; $this->setup_dates($start_date, $end_date); // Make sure start date is valid if (is_wp_error($this->start_date)) { return $this->start_date; } // Make sure end date is valid if (is_wp_error($this->end_date)) { return $this->end_date; } $earnings = 0; add_filter('posts_where', array($this, 'payments_where')); if (empty($form_id)) { // Global earning stats $args = array('post_type' => 'give_payment', 'nopaging' => true, 'post_status' => array('publish', 'revoked'), 'fields' => 'ids', 'update_post_term_cache' => false, 'suppress_filters' => false, 'start_date' => $this->start_date, 'end_date' => $this->end_date, 'give_transient_type' => 'give_earnings'); $args = apply_filters('give_stats_earnings_args', $args); $key = md5(serialize($args)); $earnings = get_transient($key); $earnings = false; //TEMPORARY if (false === $earnings) { $sales = get_posts($args); $earnings = 0; if ($sales) { $sales = implode(',', $sales); $earnings += $wpdb->get_var("SELECT SUM(meta_value) FROM {$wpdb->postmeta} WHERE meta_key = '_give_payment_total' AND post_id IN({$sales})"); } // Cache the results for one hour set_transient($key, $earnings, 60 * 60); } } else { // Download specific earning stats global $give_logs, $wpdb; $args = array('post_parent' => $form_id, 'nopaging' => true, 'log_type' => 'sale', 'fields' => 'ids', 'suppress_filters' => false, 'start_date' => $this->start_date, 'end_date' => $this->end_date, 'give_transient_type' => 'give_earnings'); $args = apply_filters('give_stats_earnings_args', $args); $key = md5(serialize($args)); $earnings = get_transient($key); if (false === $earnings) { $log_ids = $give_logs->get_connected_logs($args, 'sale'); $earnings = 0; if ($log_ids) { $log_ids = implode(',', $log_ids); $payment_ids = $wpdb->get_col("SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key='_give_log_payment_id' AND post_id IN ({$log_ids});"); } // Cache the results for one hour set_transient($key, $earnings, 60 * 60); } } remove_filter('posts_where', array($this, 'payments_where')); return round($earnings, give_currency_decimal_filter()); }
/** * Retrieve earning stats * * @since 1.0 * @access public * * @param $form_id int The donation form to retrieve stats for. If false, gets stats for all forms * @param $start_date string|bool The starting date for which we'd like to filter our donation earnings stats. If false, we'll use the default start date of `this_month` * @param $end_date string|bool The end date for which we'd like to filter our sale stats. If false, we'll use the default end date of `this_month` * @param $gateway_id string|bool The gateway to get earnings for such as 'paypal' or 'stripe' * * @return float|int Total amount of donations based on the passed arguments. */ public function get_earnings($form_id = 0, $start_date = false, $end_date = false, $gateway_id = false) { global $wpdb; $this->setup_dates($start_date, $end_date); // Make sure start date is valid if (is_wp_error($this->start_date)) { return $this->start_date; } // Make sure end date is valid if (is_wp_error($this->end_date)) { return $this->end_date; } add_filter('posts_where', array($this, 'payments_where')); if (empty($form_id)) { // Global earning stats $args = array('post_type' => 'give_payment', 'nopaging' => true, 'post_status' => array('publish'), 'fields' => 'ids', 'update_post_term_cache' => false, 'suppress_filters' => false, 'start_date' => $this->start_date, 'end_date' => $this->end_date, 'give_transient_type' => 'give_earnings'); //Filter by Gateway ID meta_key if ($gateway_id !== false) { $args['meta_key'] = '_give_payment_gateway'; $args['meta_value'] = $gateway_id; } $args = apply_filters('give_stats_earnings_args', $args); $key = 'give_stats_' . substr(md5(serialize($args)), 0, 15); $earnings = get_transient($key); if (false === $earnings) { $sales = get_posts($args); $earnings = 0; if ($sales) { $sales = implode(',', array_map('intval', $sales)); $earnings += $wpdb->get_var("SELECT SUM(meta_value) FROM {$wpdb->postmeta} WHERE meta_key = '_give_payment_total' AND post_id IN({$sales})"); } // Cache the results for one hour set_transient($key, $earnings, HOUR_IN_SECONDS); } } else { // Donation form specific earning stats global $give_logs, $wpdb; $args = array('post_parent' => $form_id, 'nopaging' => true, 'log_type' => 'sale', 'fields' => 'ids', 'suppress_filters' => false, 'start_date' => $this->start_date, 'end_date' => $this->end_date, 'give_transient_type' => 'give_earnings'); $args = apply_filters('give_stats_earnings_args', $args); $key = 'give_stats_' . substr(md5(serialize($args)), 0, 15); //Set transient for faster stats $earnings = get_transient($key); if (false === $earnings) { $this->timestamp = false; $log_ids = $give_logs->get_connected_logs($args, 'sale'); $earnings = 0; if ($log_ids) { $log_ids = implode(',', array_map('intval', $log_ids)); $payment_ids = $wpdb->get_col("SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key='_give_log_payment_id' AND post_id IN ({$log_ids});"); foreach ($payment_ids as $payment_id) { $earnings += give_get_payment_amount($payment_id); } } // Cache the results for one hour set_transient($key, $earnings, 60 * 60); } } //remove our filter remove_filter('posts_where', array($this, 'payments_where')); //return earnings return round($earnings, give_currency_decimal_filter()); }
/** * Load Admin Scripts * * Enqueues the required admin scripts. * * @since 1.0 * * @global $post * @global $give_options * * @param string $hook Page hook * * @return void */ function give_load_admin_scripts($hook) { global $wp_version, $post, $post_type, $give_options; //Directories of assets $js_dir = GIVE_PLUGIN_URL . 'assets/js/admin/'; $js_plugins = GIVE_PLUGIN_URL . 'assets/js/plugins/'; $css_dir = GIVE_PLUGIN_URL . 'assets/css/'; // Use minified libraries if SCRIPT_DEBUG is turned off $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; //Global Admin: wp_register_style('give-admin-bar-notification', $css_dir . 'adminbar-style.css'); wp_enqueue_style('give-admin-bar-notification'); //Give Admin Only: if (!apply_filters('give_load_admin_scripts', give_is_admin_page(), $hook)) { return; } //CSS wp_register_style('jquery-ui-css', $css_dir . 'jquery-ui-fresh' . $suffix . '.css'); wp_enqueue_style('jquery-ui-css'); wp_register_style('give-admin', $css_dir . 'give-admin' . $suffix . '.css', GIVE_VERSION); wp_enqueue_style('give-admin'); wp_register_style('jquery-chosen', $css_dir . 'chosen' . $suffix . '.css', array(), GIVE_VERSION); wp_enqueue_style('jquery-chosen'); wp_enqueue_style('thickbox'); //JS wp_register_script('jquery-chosen', $js_plugins . 'chosen.jquery' . $suffix . '.js', array('jquery'), GIVE_VERSION); wp_enqueue_script('jquery-chosen'); wp_register_script('give-accounting', $js_plugins . 'accounting' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-accounting'); wp_register_script('give-admin-scripts', $js_dir . 'admin-scripts' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-admin-scripts'); wp_register_script('jquery-flot', $js_plugins . 'jquery.flot' . $suffix . '.js'); wp_enqueue_script('jquery-flot'); wp_register_script('give-qtip', $js_plugins . 'jquery.qtip' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-qtip'); wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_script('thickbox'); // Forms CPT Script. if ($post_type === 'give_forms') { wp_register_script('give-admin-forms-scripts', $js_dir . 'admin-forms' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-admin-forms-scripts'); } //Settings Scripts if (isset($_GET['page']) && $_GET['page'] == 'give-settings') { wp_register_script('give-admin-settings-scripts', $js_dir . 'admin-settings' . $suffix . '.js', array('jquery'), GIVE_VERSION, false); wp_enqueue_script('give-admin-settings-scripts'); } // Price Separators. $thousand_separator = give_get_price_thousand_separator(); $decimal_separator = give_get_price_decimal_separator(); //Localize strings & variables for JS wp_localize_script('give-admin-scripts', 'give_vars', array('post_id' => isset($post->ID) ? $post->ID : null, 'give_version' => GIVE_VERSION, 'thousands_separator' => $thousand_separator, 'decimal_separator' => $decimal_separator, 'quick_edit_warning' => esc_html__('Sorry, not available for variable priced forms.', 'give'), 'delete_payment' => esc_html__('Are you sure you wish to delete this payment?', 'give'), 'delete_payment_note' => esc_html__('Are you sure you wish to delete this note?', 'give'), 'revoke_api_key' => esc_html__('Are you sure you wish to revoke this API key?', 'give'), 'regenerate_api_key' => esc_html__('Are you sure you wish to regenerate this API key?', 'give'), 'resend_receipt' => esc_html__('Are you sure you wish to resend the donation receipt?', 'give'), 'copy_download_link_text' => esc_html__('Copy these links to your clipboard and give them to your donor.', 'give'), 'delete_payment_download' => sprintf(esc_html__('Are you sure you wish to delete this %s?', 'give'), give_get_forms_label_singular()), 'one_price_min' => esc_html__('You must have at least one price.', 'give'), 'one_file_min' => esc_html__('You must have at least one file.', 'give'), 'one_field_min' => esc_html__('You must have at least one field.', 'give'), 'one_option' => sprintf(esc_html__('Choose a %s', 'give'), give_get_forms_label_singular()), 'one_or_more_option' => sprintf(esc_html__('Choose one or more %s', 'give'), give_get_forms_label_plural()), 'numeric_item_price' => esc_html__('Item price must be numeric.', 'give'), 'numeric_quantity' => esc_html__('Quantity must be numeric.', 'give'), 'currency_sign' => give_currency_filter(''), 'currency_pos' => isset($give_options['currency_position']) ? $give_options['currency_position'] : 'before', 'currency_decimals' => give_currency_decimal_filter(give_get_price_decimals()), 'new_media_ui' => apply_filters('give_use_35_media_ui', 1), 'remove_text' => esc_html__('Remove', 'give'), 'type_to_search' => sprintf(esc_html__('Type to search %s', 'give'), give_get_forms_label_plural()), 'batch_export_no_class' => esc_html__('You must choose a method.', 'give'), 'batch_export_no_reqs' => esc_html__('Required fields not completed.', 'give'), 'reset_stats_warn' => __('Are you sure you want to reset Give? This process is <strong><em>not reversible</em></strong> and will delete all data regardless of test or live mode. Please be sure you have a recent backup before proceeding.', 'give'), 'price_format_guide' => sprintf(esc_html__('Please enter amount in monetary decimal ( %1$s ) format without thousand separator ( %2$s ) .', 'give'), $decimal_separator, $thousand_separator))); if (function_exists('wp_enqueue_media') && version_compare($wp_version, '3.5', '>=')) { //call for new media manager wp_enqueue_media(); } }
/** * Get Total Earnings * * @since 1.0 * * @return float $total Total earnings */ function give_get_total_earnings() { $total = get_option('give_earnings_total', false); // If no total stored in DB, use old method of calculating total earnings if (false === $total) { global $wpdb; $total = get_transient('give_earnings_total'); if (false === $total) { $total = (double) 0; $args = apply_filters('give_get_total_earnings_args', array('offset' => 0, 'number' => -1, 'status' => array('publish'), 'fields' => 'ids')); $payments = give_get_payments($args); if ($payments) { /* * If performing a purchase, we need to skip the very last payment in the database, since it calls * give_increase_total_earnings() on completion, which results in duplicated earnings for the very * first purchase */ if (did_action('give_update_payment_status')) { array_pop($payments); } if (!empty($payments)) { $payments = implode(',', $payments); $total += $wpdb->get_var("SELECT SUM(meta_value) FROM {$wpdb->postmeta} WHERE meta_key = '_give_payment_total' AND post_id IN({$payments})"); } } // Cache results for 1 day. This cache is cleared automatically when a payment is made set_transient('give_earnings_total', $total, 86400); // Store the total for the first time update_option('give_earnings_total', $total); } } if ($total < 0) { $total = 0; // Don't ever show negative earnings } return apply_filters('give_total_earnings', round($total, give_currency_decimal_filter())); }
/** * Add a donation to a given payment * * @since 1.5 * @access public * * @param int $form_id The donation form to add * @param array $args Other arguments to pass to the function * @param array $options List of donation options * * @return bool True when successful, false otherwise */ public function add_donation($form_id = 0, $args = array(), $options = array()) { $donation = new Give_Donate_Form($form_id); // Bail if this post isn't a give donation form if (!$donation || $donation->post_type !== 'give_forms') { return false; } // Set some defaults $defaults = array('price' => false, 'price_id' => false, 'fees' => array()); $args = wp_parse_args(apply_filters('give_payment_add_donation_args', $args, $donation->ID), $defaults); // Allow overriding the price if (false !== $args['price']) { $item_price = $args['price']; } else { // Deal with variable pricing if (give_has_variable_prices($donation->ID)) { $prices = maybe_unserialize(get_post_meta($form_id, '_give_donation_levels', true)); $item_price = ''; //Loop through prices foreach ($prices as $price) { //Find a match between price_id and level_id //First verify array keys exists THEN make the match if (isset($args['price_id']) && isset($price['_give_id']['level_id']) && $args['price_id'] == $price['_give_id']['level_id']) { $item_price = $price['_give_amount']; } } //Fallback to the lowest price point if ($item_price == '') { $item_price = give_get_lowest_price_option($donation->ID); $args['price_id'] = give_get_lowest_price_id($donation->ID); } } else { //Simple form price $item_price = give_get_form_price($donation->ID); } } // Sanitizing the price here so we don't have a dozen calls later $item_price = give_sanitize_amount($item_price); $total = round($item_price, give_currency_decimal_filter()); //Add Options $default_options = array(); if (false !== $args['price_id']) { $default_options['price_id'] = (int) $args['price_id']; } $options = wp_parse_args($options, $default_options); // Do not allow totals to go negative if ($total < 0) { $total = 0; } $donation = array('name' => $donation->post_title, 'id' => $donation->ID, 'price' => round($total, give_currency_decimal_filter()), 'subtotal' => round($total, give_currency_decimal_filter()), 'fees' => $args['fees'], 'price_id' => $args['price_id'], 'action' => 'add', 'options' => $options); $this->pending['donations'][] = $donation; $this->increase_subtotal($total); return true; }