File: /var/www/html/wpmuhibbah/wp-content/plugins/give/src/Tracking/TrackingData/DonationFormsData.php
<?php
namespace Give\Tracking\TrackingData;
use Give\DonationForms\Models\DonationForm;
use Give\Framework\Database\DB;
use Give\Helpers\ArrayDataSet;
use Give\Helpers\Form\Template;
use Give\Helpers\Form\Utils;
use Give\Tracking\Contracts\TrackData;
use Give\Tracking\Helpers\DonationStatuses;
use Give\Tracking\Helpers\FormBlocks;
use Give\Tracking\Repositories\TrackEvents;
/**
* Class DonationFormsData
*
* Represents donation forms data
*
* @package Give\Tracking\TrackingData
* @since 2.10.0
*/
class DonationFormsData implements TrackData
{
protected $formIds = [];
protected $formRevenues = [];
protected $formDonorCounts = [];
/**
* @var TrackEvents
*/
protected $trackEvents;
/**
* DonationFormsData constructor.
*
* @param TrackEvents $trackEvents
*/
public function __construct(TrackEvents $trackEvents)
{
$this->trackEvents = $trackEvents;
}
/**
* @inheritdoc
*/
public function get()
{
$this->setFormIds();
if (! $this->formIds) {
return [];
}
$this->setRevenues()
->setDonorCounts();
return $this->getData();
}
/**
* Get forms data.
*
* @since 3.10.0 Add check for event block.
* @since 3.0.0 Add support for v3 forms
* @since 2.10.0
* @return array
*/
protected function getData()
{
if (! $this->formIds) {
return [];
}
$data = [];
foreach ($this->formIds as $formId) {
$temp = [
'form_id' => (int)$formId,
'form_url' => untrailingslashit(get_permalink($formId)),
'form_name' => get_post_field('post_name', $formId, 'db'),
'form_type' => give()->form_meta->get_meta($formId, '_give_price_option', true),
'form_template' => $this->getFormTemplate($formId),
'donor_count' => $this->formDonorCounts[$formId],
'revenue' => $this->formRevenues[$formId],
'event_block' => (int) FormBlocks::formId($formId)->hasBlock('givewp/event-tickets'),
];
$this->addAddonsInformation($temp, $formId);
$data[] = $temp;
}
return $data;
}
/**
* Set form ids.
*
* @since 2.10.0
* @return self
*/
protected function setFormIds()
{
global $wpdb;
$statues = DonationStatuses::getCompletedDonationsStatues(true);
$time = $this->trackEvents->getRequestTime();
$this->formIds = DB::get_col(
"
SELECT DISTINCT dm.meta_value
FROM {$wpdb->donationmeta} as dm
INNER JOIN {$wpdb->posts} as p ON dm.donation_id = p.ID
INNER JOIN {$wpdb->donationmeta} as dm2 ON dm.donation_id = dm2.donation_id
WHERE p.post_status IN ({$statues})
AND p.post_date>='{$time}'
AND p.post_type='give_payment'
AND dm2.meta_key='_give_payment_mode'
AND dm2.meta_value='live'
AND dm.meta_key='_give_payment_form_id'
"
);
return $this;
}
/**
* Set forms revenues.
*
* @since 2.10.0
* @return self
*/
protected function setRevenues()
{
global $wpdb;
$formIds = ArrayDataSet::getStringSeparatedByCommaEnclosedWithSingleQuote($this->formIds);
$defaultResult = array_combine(
$this->formIds,
array_fill(0, count($this->formIds), 0) // Set default revenue to 0
);
$result = DB::get_results(
"
SELECT SUM(r.amount) as amount, r.form_id
FROM {$wpdb->give_revenue} as r
INNER JOIN {$wpdb->donationmeta} as dm ON r.donation_id = dm.donation_id
WHERE dm.meta_key='_give_payment_mode'
AND dm.meta_value='live'
AND r.form_id IN ({$formIds})
GROUP BY form_id
",
ARRAY_A
);
if ($result) {
$result = array_map(
'absint',
array_combine(
wp_list_pluck($result, 'form_id'),
wp_list_pluck($result, 'amount')
)
);
}
$this->formRevenues = array_replace($defaultResult, $result);
return $this;
}
/**
* Set forms revenues till current date.
*
* @since 2.10.0
*
* @return self
*/
protected function setDonorCounts()
{
global $wpdb;
$formIds = ArrayDataSet::getStringSeparatedByCommaEnclosedWithSingleQuote($this->formIds);
$statues = DonationStatuses::getCompletedDonationsStatues(true);
$defaultResult = array_combine(
$this->formIds,
array_fill(0, count($this->formIds), 0) // Set default donor count to 0
);
$result = DB::get_results(
"
SELECT COUNT(DISTINCT dm2.meta_value) as donor_count, dm.meta_value as form_id
FROM {$wpdb->donationmeta} as dm
INNER JOIN {$wpdb->posts} as p ON donation_id = p.ID
INNER JOIN {$wpdb->donationmeta} as dm2 ON dm.donation_id = dm2.donation_id
INNER JOIN {$wpdb->donors} as donor ON dm2.meta_value = donor.id
INNER JOIN {$wpdb->donationmeta} as dm3 ON dm.donation_id = dm3.donation_id
WHERE p.post_status IN ({$statues})
AND dm3.meta_key='_give_payment_mode'
AND dm3.meta_value='live'
AND dm.meta_key='_give_payment_form_id'
AND dm.meta_value IN ({$formIds})
AND dm2.meta_key='_give_payment_donor_id'
AND donor.purchase_value > 0
GROUP BY dm.meta_value
",
ARRAY_A
);
if ($result) {
$result = array_map(
'absint',
array_combine(
wp_list_pluck($result, 'form_id'),
wp_list_pluck($result, 'donor_count')
)
);
}
$this->formDonorCounts = array_replace($defaultResult, $result);
return $this;
}
/**
* Add addon information whether or not they active for donation form.
*
* @since 2.10.0
*
* @param array $array
* @param int $formId
*/
private function addAddonsInformation(&$array, $formId)
{
$array = array_merge(
$array,
[
'recurring_donations' => (int)apply_filters('give_telemetry_form_uses_addon_recurring', false, $formId),
'fee_recovery' => (int)apply_filters('give_telemetry_form_uses_addon_fee_recovery', false, $formId),
'form_field_manager' => (int)apply_filters(
'give_telemetry_form_uses_addon_form_field_manager',
false,
$formId
),
]
);
}
/**
* This function is used to get the form template.
*
* @since 3.0.0
*/
private function getFormTemplate(int $formId): string
{
if (Utils::isV3Form($formId)) {
/* @var DonationForm $form */
$form = DonationForm::find($formId);
return $form->settings->designId . ' (V3)';
}
$formTemplate = Template::getActiveID($formId);
return ( ! $formTemplate || 'legacy' === $formTemplate )
? 'legacy'
: $formTemplate;
}
}