Your IP : 216.73.216.224


Current Path : /var/www/html/plugins/osmembership/deleteaccount/src/Extension/
Upload File :
Current File : /var/www/html/plugins/osmembership/deleteaccount/src/Extension/DeleteAccount.php

<?php
/**
 * @package        Joomla
 * @subpackage     Membership Pro
 * @author         Tuan Pham Ngoc
 * @copyright      Copyright (C) 2012 - 2026 Ossolution Team
 * @license        GNU/GPL, see LICENSE.php
 */

namespace JoomDonation\MembershipPro\Plugin\MembershipPro\DeleteAccount\Extension;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\User\UserFactoryAwareTrait;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Event\DispatcherInterface;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;

defined('_JEXEC') or die;

class DeleteAccount extends CMSPlugin implements SubscriberInterface
{
	use DatabaseAwareTrait;
	use UserFactoryAwareTrait;

	public static function getSubscribedEvents(): array
	{
		return [
			'onSubscriptionAfterDelete' => 'onSubscriptionAfterDelete',
		];
	}

	/**
	 * Constructor.
	 *
	 * @param   DispatcherInterface  $dispatcher  The dispatcher
	 * @param   array                $config      An optional associative array of configuration settings
	 */
	public function __construct(DispatcherInterface $dispatcher, array $config)
	{
		parent::__construct($dispatcher, $config);
	}

	/**
	 * Recalculate some important subscription information when a subscription record is being deleted
	 *
	 * @param   Event  $event
	 *
	 * @return void
	 */
	public function onSubscriptionAfterDelete(Event $event): void
	{
		/**
		 * @var string                        $context
		 * @var \OSMembershipTableSubscriber  $row
		 */
		[$context, $row] = array_values($event->getArguments());

		if (!$row->user_id)
		{
			return;
		}

		$db    = $this->getDatabase();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from('#__osmembership_subscribers')
			->where('user_id = ' . $row->user_id)
			->where('(published >= 1 OR payment_method LIKE "os_offline%")');
		$db->setQuery($query);

		// No subscription records left
		if (!$db->loadResult())
		{
			$user              = $this->getUserFactory()->loadUserById($row->user_id);
			$excludeUserGroups = $this->params->get('exclude_user_groups', [3, 4, 5, 6, 7, 8]);

			if (is_string($excludeUserGroups))
			{
				$excludeUserGroups = explode(',', $excludeUserGroups);
			}

			$excludeUserGroups = array_unique(array_merge($excludeUserGroups, [7, 8]));

			if ($user->id && count(array_intersect($user->groups, $excludeUserGroups)) === 0)
			{
				// Delete the user account
				$user->delete();

				// Delete the remaining orphans records
				$query->clear()
					->delete('#__osmembership_subscribers')
					->where('user_id = ' . $user->id);
				$db->setQuery($query)
					->execute();
			}
		}
	}
}