Version 5.0.13

This commit is contained in:
Neo committed 2025-12-19 19:04:57 -08:00
1 parent b89858b2ff
commit 5efe744c5f
1407 files changed
+69690 -30177

No files matched your search

@@ -48,7 +48,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
*/
public function filters( ?array $filters, Url $url ): array
{
$return = array();
$return = parent::filters( $filters, $url );
$return['nodes'] = new Node( 'achievement_filter_Donation_nodes', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : 0, FALSE, [
'url' => $url,
@@ -75,7 +75,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
*/
public function formatFilterValues( array $values ): array
{
$return = [];
$return = parent::formatFilterValues( $values );
if ( isset( $values['achievement_filter_Donation_nodes'] ) )
{
$return['nodes'] = array_keys( $values['achievement_filter_Donation_nodes'] );
@@ -136,6 +136,30 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
];
}
/**
* Determines if the member has already completed this rule.
* Used for retroactive rule completion.
* So far, this is only used in Quests, but may be used elsewhere at a later point.
*
* @param Member $member
* @param array $filters
* @return bool
*/
public function isRuleCompleted( Member $member, array $filters ) : bool
{
$query = $this->getQuery( 'count(*)', [
[ 'dl_member=?', $member->member_id ]
], null, null, $filters );
$total = $query->first();
if( !empty( $filters['milestone'] ) )
{
return $total >= $filters['milestone'];
}
return $total > 0;
}
/**
* Get identifier to prevent the member being awarded points for the same action twice
* Must be unique within within of this domain, must not exceed 32 chars.
@@ -188,7 +212,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
{
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
],
'sprintf' => [ Member::loggedIn()->language()->addToStack('donation_lc') ]
] );
@@ -198,7 +222,12 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
$conditions[] = $nodeCondition;
}
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
if( $questCondition = $this->_questFilterDescription( $rule ) )
{
$conditions[] = $questCondition;
}
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
Member::loggedIn()->language()->addToStack( 'AchievementAction__Donation_title' ),
$conditions
);
@@ -227,7 +256,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
{
return Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
count( $nodeNames ),
Member::loggedIn()->language()->addToStack( 'goals', FALSE, [ 'strtolower' => TRUE ] ) //@todo
@@ -48,7 +48,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
*/
public function filters( ?array $filters, Url $url ): array
{
$return = array();
$return = parent::filters( $filters, $url );
$return['nodes'] = new Node( 'achievement_filter_Package', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : 0, FALSE, [
'url' => $url,
@@ -75,7 +75,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
*/
public function formatFilterValues( array $values ): array
{
$return = [];
$return = parent::formatFilterValues( $values );
if ( isset( $values['achievement_filter_Package'] ) )
{
$return['nodes'] = [];
@@ -128,6 +128,38 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
return TRUE;
}
/**
* Determines if the member has already completed this rule.
* Used for retroactive rule completion.
* So far, this is only used in Quests, but may be used elsewhere at a later point.
*
* @param Member $member
* @param array $filters
* @return bool
*/
public function isRuleCompleted( Member $member, array $filters ) : bool
{
$where = [
[ 'ps_member=?', $member->member_id ]
];
iF( !empty( $filters['nodes'] ) )
{
$where[] = [ Db::i()->in( 'p_group', $filters['nodes'] ) ];
}
$total = Db::i()->select( 'count(*)', 'nexus_purchases', $where )
->join( 'nexus_packages', [ 'ps_app=? and ps_type=? ps_item_id=p_id', 'nexus', 'package' ] )
->first();
if( !empty( $filters['milestone'] ) )
{
return $total >= $filters['milestone'];
}
return $total > 0;
}
/**
* Get identifier to prevent the member being awarded points for the same action twice
* Must be unique within within of this domain, must not exceed 32 chars.
@@ -179,7 +211,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
{
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
],
'sprintf' => [ Member::loggedIn()->language()->addToStack('AchievementAction__Package_title_generic') ]
] );
@@ -190,7 +222,12 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
$conditions[] = $nodeCondition;
}
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
if( $questCondition = $this->_questFilterDescription( $rule ) )
{
$conditions[] = $questCondition;
}
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
Member::loggedIn()->language()->addToStack( 'AchievementAction__Package_title' ),
$conditions
);
@@ -219,7 +256,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
{
return Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
count( $nodeNames ),
Member::loggedIn()->language()->addToStack( 'purchase_groups_lc', FALSE )
@@ -14,6 +14,7 @@ namespace IPS\nexus\extensions\core\AchievementAction;
use IPS\core\Achievements\Actions\AchievementActionAbstract;
use IPS\core\Achievements\Rule;
use IPS\Db;
use IPS\Helpers\Form\Node;
use IPS\Helpers\Form\YesNo;
use IPS\Http\Url;
@@ -57,7 +58,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
*/
public function filters( ?array $filters, Url $url ): array
{
$return = array();
$return = parent::filters( $filters, $url );
$return['subscriptions'] = new Node( 'achievement_filter_Subscriptions', ( $filters and isset( $filters['subscriptions'] ) and $filters['subscriptions'] ) ? $filters['subscriptions'] : 0, FALSE, [
'url' => $url,
@@ -84,7 +85,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
*/
public function formatFilterValues( array $values ): array
{
$return = [];
$return = parent::formatFilterValues( $values );
if ( isset( $values['achievement_filter_Subscriptions'] ) )
{
$return['subscriptions'] = array_keys( $values['achievement_filter_Subscriptions'] );
@@ -138,6 +139,36 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
return TRUE;
}
/**
* Determines if the member has already completed this rule.
* Used for retroactive rule completion.
* So far, this is only used in Quests, but may be used elsewhere at a later point.
*
* @param Member $member
* @param array $filters
* @return bool
*/
public function isRuleCompleted( Member $member, array $filters ) : bool
{
$where = [
[ 'ps_app=?', 'nexus' ],
[ 'ps_type=?', 'subscription' ],
[ 'ps_member=?', $member->member_id ]
];
iF( !empty( $filters['subscriptions'] ) )
{
$where[] = [ Db::i()->in( 'ps_item_id', $filters['subscriptions'] ) ];
}
if( isset( $filters['subscriptions_active'] ) )
{
$where[] = [ 'ps_active=?', 1 ];
}
return (bool) Db::i()->select( 'count(*)', 'nexus_purchases', $where )->first();
}
/**
* Get identifier to prevent the member being awarded points for the same action twice
@@ -188,7 +219,12 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
$conditions[] = $nodeCondition;
}
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
if( $questCondition = $this->_questFilterDescription( $rule ) )
{
$conditions[] = $questCondition;
}
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
Member::loggedIn()->language()->addToStack( 'AchievementAction__Subscription_title' ),
$conditions
);
@@ -218,7 +254,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
{
return Member::loggedIn()->language()->addToStack( 'achievements_filter_Subscription_type', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'achievements_filter_Subscription_type',
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'achievements_filter_Subscription_type',
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_filter_Subscription_pl', FALSE, [ 'sprintf' => [
count( $nodeNames ),
Member::loggedIn()->language()->addToStack( 'nexus_sub_package_id', FALSE, [ 'strtolower' => TRUE ] )
@@ -32,6 +32,7 @@ use LogicException;
use OutOfRangeException;
use function count;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -222,7 +223,7 @@ class Admin extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -279,7 +280,7 @@ class Admin extends EditorLocationsAbstract
/* Update */
try
{
if( is_string( $package['p_page'] ) AND $callback[1] == 'parseStatic' )
if( is_string( $package['p_page'] ) AND is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$rebuilt = $callback( $package['p_page'], NULL, FALSE, 'nexus_Admin', $package['p_id'], NULL, 'pkg-pg' );
}
@@ -290,7 +291,7 @@ class Admin extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $package['p_page'] );
}
@@ -190,7 +190,7 @@ class Customer extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $member[ $fieldId ] );
}
@@ -132,7 +132,14 @@ class Purchases extends MemberFilterAbstract
}
elseif( isset( $post['nexus_bm_filters_pkg_expired'][2] ) AND $post['nexus_bm_filters_pkg_expired'][2] == 'range' )
{
$return['nexus_bm_filters_pkg_expired'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_pkg_expired'][0] ), TRUE ) );
if( empty( $post['nexus_bm_filters_pkg_expired'][0] ) or ( empty( $post['nexus_bm_filters_pkg_expired'][0]['start'] ) and empty( $post['nexus_bm_filters_pkg_expired'][0]['end'] ) ) )
{
$return['nexus_bm_filters_pkg_expired'] = false;
}
else
{
$return['nexus_bm_filters_pkg_expired'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_pkg_expired'][0] ), true ) );
}
}
else
{
@@ -182,15 +189,23 @@ class Purchases extends MemberFilterAbstract
$types[] = 'purchase.ps_cancelled=1';
}
if ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ] ) AND !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) )
if ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ] ) AND ( !empty( $data['nexus_bm_filters_pkg_expired']['range']['start'] ) or !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) ) )
{
$start = ( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'start' ] ) : NULL;
$end = new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] );
$end = ( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) ? new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) : NULL;
if ( $start )
if ( $start and $end )
{
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
}
elseif( $start )
{
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire >= {$start->getTimestamp()} )";
}
else
{
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire < {$end->getTimestamp()} )";
}
}
elseif ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'days' ] ) )
{
@@ -110,17 +110,31 @@ class Subscriptions extends MemberFilterAbstract
$return = array(
'nexus_bm_filters_subscription_pkgs' => implode( ',', $ids ),
'nexus_bm_filters_subscription_active' => ( in_array( "active", $post['nexus_bm_filters_subscription_type'] ) ),
'nexus_bm_filters_subscription_canceled' => ( in_array( "expired", $post['nexus_bm_filters_subscription_type'] ) ),
'nexus_bm_filters_subscription_expired' => ( in_array( "expired", $post['nexus_bm_filters_subscription_type'] ) ),
);
if( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'days' )
{
$return['nexus_bm_filters_type_expired_date'] = $post['nexus_bm_filters_type_expired_date'][1] ? array( 'days' => intval( $post['nexus_bm_filters_type_expired_date'][1] ) ) : FALSE;
}
elseif( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'days_lt' )
{
$return['nexus_bm_filters_type_expired_date'] = $post['nexus_bm_filters_type_expired_date'][3] ? array( 'days_lt' => intval( $post['nexus_bm_filters_type_expired_date'][3] ) ) : FALSE;
}
elseif( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'range' )
{
if( empty( $post['nexus_bm_filters_type_expired_date'][0] ) or ( empty( $post['nexus_bm_filters_type_expired_date'][0]['start'] ) and empty( $post['nexus_bm_filters_type_expired_date'][0]['end'] ) ) )
{
$return['nexus_bm_filters_type_expired_date'] = false;
}
else
{
$return['nexus_bm_filters_type_expired_date'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_type_expired_date'][0] ), true ) );
}
}
else
{
/* Normalize objects to their array form. Bulk mailer stores options as a json array where as member export does not, so $data['range']['start'] is a DateTime object */
$return['nexus_bm_filters_type_expired_date'] = ( empty($post['nexus_bm_filters_type_expired_date'][0]) ) ? FALSE : array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_type_expired_date'][0] ), TRUE ) );
$return['nexus_bm_filters_type_expired_date'] = FALSE;
}
@@ -164,25 +178,41 @@ class Subscriptions extends MemberFilterAbstract
$types[] = 'nexus_purchases.ps_active=1';
}
if ( isset( $data[ 'nexus_bm_filters_subscription_canceled' ] ) and $data[ 'nexus_bm_filters_subscription_canceled' ] )
if( isset( $data['nexus_bm_filters_subscription_expired'] ) and $data['nexus_bm_filters_subscription_expired'] )
{
$types[] = 'nexus_purchases.ps_cancelled=1';
}
if ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ] ) AND !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) )
{
$start = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) : NULL;
$end = new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] );
if ( $start )
if ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ] ) AND ( !empty( $data['nexus_bm_filters_type_expired_date']['range']['start'] ) or !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) ) )
{
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
$start = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) : NULL;
$end = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) : NULL;
if ( $start and $end )
{
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
}
elseif( $start )
{
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire >= {$start->getTimestamp()} )";
}
else
{
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$end->getTimestamp()} )";
}
}
elseif ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] ) )
{
$date = DateTime::create()->sub( new DateInterval( 'P' . $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] . 'D' ) );
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$date->getTimestamp()})";
}
elseif( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] ) AND (int) $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] )
{
$date = DateTime::create()->sub( new DateInterval( 'P' . (int) $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] . 'D' ) );
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire > {$date->getTimestamp()})";
}
else
{
$types[] = "(nexus_purchases.ps_expire < " . time() . ")";
}
}
elseif ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] ) )
{
$date = DateTime::create()->sub( new DateInterval( 'P' . $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] . 'D' ) );
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$date->getTimestamp()})";
}
if ( !empty( $types ) )
@@ -22,6 +22,7 @@ use IPS\Theme;
use function count;
use function defined;
use function is_array;
use function round;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -73,7 +74,42 @@ class Products extends OverviewStatisticsAbstract
{
/* Init Chart */
$pieBarData = array();
$numbers = $this->getBlockNumbers( $dateRange, $subBlock );
foreach ( $numbers as $key => $value )
{
if ( $key === 'statsreports_previous_total' or $key === 'statsreports_current_total' )
{
continue;
}
$pieBarData[] = [
'name' => Member::loggedIn()->language()->addToStack( $key ),
'value' => $value,
'percentage' => $numbers['statsreports_current_total'] ? round( ( $value / $numbers['statsreports_current_total'] ) * 100, 2 ) : 0
];
}
$chart = NULL;
if( count( $pieBarData ) )
{
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $numbers['statsreports_current_total'], $numbers['statsreports_previous_total'], $chart );
}
/**
* Get the numbers to add to the CSV export
*
* @param array|string|null $dateRange
* @param string|null $subBlock
*
* @return array
*/
public function getBlockNumbers( array|string $dateRange=null, string $subBlock=null ) : array
{
$numbers = array();
/* Add Rows */
$where = array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'package' ) );
$previousCount = NULL;
@@ -94,7 +130,6 @@ class Products extends OverviewStatisticsAbstract
}
$total = 0;
$chart = NULL;
foreach( Package::roots() as $package )
{
@@ -106,25 +141,13 @@ class Products extends OverviewStatisticsAbstract
if( $value > 0 )
{
$total += $value;
$pieBarData[] = array(
'name' => Member::loggedIn()->language()->addToStack('nexus_package_' . $package->id ),
'value' => $value,
'percentage' => 0
);
$numbers['nexus_package_' . $package->id] = $value;
}
}
foreach( $pieBarData as &$package )
{
$package['percentage'] = round( ( $package['value'] / $total ) * 100, 2 );
}
$numbers['statsreports_current_total'] = $total;
$numbers['statsreports_previous_total'] = $previousCount;
if( count( $pieBarData ) )
{
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, $previousCount, $chart );
return $numbers;
}
}
@@ -74,7 +74,42 @@ class Subscriptions extends OverviewStatisticsAbstract
{
/* Init Chart */
$pieBarData = array();
$numbers = $this->getBlockNumbers( $dateRange, $subBlock );
foreach ( $numbers as $key => $value )
{
if ( $key === 'statsreports_current_total' or $key === 'statsreports_previous_total' )
{
continue;
}
$pieBarData[] = [
'name' => Member::loggedIn()->language()->addToStack( $key ),
'value' => $value,
'percentage' => $numbers['statsreports_current_total'] ? round( ( $value / $numbers['statsreports_current_total'] ) * 100, 2 ) : 0
];
}
$chart = NULL;
if( count( $pieBarData ) )
{
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $numbers['statsreports_current_total'], $numbers['statsreports_previous_total'], $chart );
}
/**
* Get the numbers to add to the CSV export
*
* @param array|string|null $dateRange
* @param string|null $subBlock
*
* @return array
*/
public function getBlockNumbers( array|string $dateRange=null, string $subBlock=null ) : array
{
/* Init Chart */
$numbers = array();
/* Add Rows */
$where = array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'subscription' ) );
$previousCount = NULL;
@@ -90,12 +125,15 @@ class Subscriptions extends OverviewStatisticsAbstract
$interval = static::getInterval( $dateRange );
$initialTimestamp = $currentDate->sub( $interval )->getTimestamp();
$where = array( array( 'ps_start > ?', $initialTimestamp ) );
$previousCount = Db::i()->select( 'COUNT(*)', 'nexus_purchases', array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'subscription' ), array( 'ps_start BETWEEN ? AND ?', $currentDate->sub( $interval )->getTimestamp(), $initialTimestamp ) ) )->first();
$previousWhere = array(
array( 'ps_app=?', 'nexus' ),
array( 'ps_type=?', 'subscription' ),
array( 'ps_start BETWEEN ? AND ?', $currentDate->sub( $interval )->getTimestamp(), $initialTimestamp )
);
$previousCount = Db::i()->select( 'COUNT(*)', 'nexus_purchases', $previousWhere )->first();
}
$total = 0;
$chart = NULL;
foreach( Package::roots() as $package )
{
@@ -108,24 +146,13 @@ class Subscriptions extends OverviewStatisticsAbstract
{
$total += $value;
$pieBarData[] = array(
'name' => Member::loggedIn()->language()->addToStack('nexus_subs_' . $package->id ),
'value' => $value,
'percentage' => 0
);
$numbers['nexus_subs_' . $package->id] = $value;
}
}
foreach( $pieBarData as &$package )
{
$package['percentage'] = round( ( $package['value'] / $total ) * 100, 2 );
}
$numbers['statsreports_current_total'] = $total;
$numbers['statsreports_previous_total'] = $previousCount;
if( count( $pieBarData ) )
{
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, $previousCount, $chart );
return $numbers;
}
}