Version 5.0.13
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user