HEX
Server: LiteSpeed
System: Linux server315.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: globfdxw (6114)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/globfdxw/www/wp-content/plugins/give/src/PaymentGateways/Stripe/Repositories/Settings.php
<?php

namespace Give\PaymentGateways\Stripe\Repositories;

use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
use Give\PaymentGateways\Exceptions\InvalidPropertyName;
use Give\PaymentGateways\Stripe\Exceptions\DuplicateStripeAccountName;
use Give\PaymentGateways\Stripe\Exceptions\StripeAccountAlreadyConnected;
use Give\PaymentGateways\Stripe\Models\AccountDetail as AccountDetailModel;

use Stripe\Account;

use function esc_html__;
use function give_stripe_get_all_accounts;
use function give_update_option;

/**
 * Class Settings
 * @package GiveStripe\Settings\Repositories
 *
 * @since 2.13.0
 */
class Settings
{
    /**
     * @since 2.13.0
     * @return array
     */
    public function getAllStripeAccounts()
    {
        return give_stripe_get_all_accounts();
    }

    /**
     * @since 2.19.0
     *
     * @param string $stripeAccountId
     *
     * @return AccountDetailModel
     * @throws InvalidPropertyName|InvalidArgumentException
     */
    public function getStripeAccountById($stripeAccountId)
    {
        $stripeAccounts = give_stripe_get_all_accounts();

        if (array_key_exists($stripeAccountId, $stripeAccounts)) {
            return AccountDetailModel::fromArray($stripeAccounts[$stripeAccountId]);
        }


        throw new InvalidArgumentException( esc_html__( 'Invalid Stripe account id.', 'give') );
    }

    /**
     * @since 2.13.0
     *
     * @param int $formId
     *
     * @return bool|mixed|string
     */
    public static function getDefaultStripeAccountSlugForDonationForm($formId)
    {
        return give()->form_meta->get_meta($formId, '_give_stripe_default_account', true);
    }

    /**
     * @since 2.13.0
     *
     * @param int $formId
     * @param     $stripeAccountSlug
     *
     * @return bool
     */
    public static function setDefaultStripeAccountSlugForDonationForm($formId, $stripeAccountSlug)
    {
        return give()->form_meta->update_meta($formId, '_give_stripe_default_account', $stripeAccountSlug);
    }

    /**
     * @since 2.13.0
     * @return string
     */
    public function getDefaultStripeAccountSlug()
    {
        return give_stripe_get_default_account_slug();
    }

    /**
     * @since 2.13.0
     * @return bool
     */
    public function hasDefaultGlobalStripeAccountSlug()
    {
        return (bool)$this->getDefaultStripeAccountSlug();
    }

    /**
     * @since 2.13.0
     *
     * @param string $accountSlug
     *
     * @return bool
     */
    public function setDefaultGlobalStripeAccountSlug($accountSlug)
    {
        return give_update_option('_give_stripe_default_account', $accountSlug);
    }

    /**
     * @since 2.13.0
     * @throws StripeAccountAlreadyConnected
     * @throws DuplicateStripeAccountName|InvalidPropertyName
     */
    public function addNewStripeAccount(AccountDetailModel $stripeAccount)
    {
        $allAccounts = give_stripe_get_all_accounts();
        $accountSlug = $stripeAccount->accountSlug;

        if (!$this->isUniqueAccountName($stripeAccount->accountName, $allAccounts)) {
            throw new DuplicateStripeAccountName(esc_html__('Stripe account already exist with same name.', 'give'));
        }

        if (
            array_key_exists($accountSlug, $allAccounts) ||
            $this->isAccountAlreadyConnected($stripeAccount, $allAccounts)
        ) {
            throw new StripeAccountAlreadyConnected(esc_html__('Stripe account already connected', 'give'));
        }

        $allAccounts[$accountSlug] = $stripeAccount->toArray();

        return give_update_option('_give_stripe_get_all_accounts', $allAccounts);
    }

    /**
     * @since 2.13.0
     */
    public function updateStripeAccount(AccountDetailModel $stripeAccount)
    {
        $allAccounts = give_stripe_get_all_accounts();
        $accountSlug = $stripeAccount->accountSlug;

        if (array_key_exists($accountSlug, $allAccounts)) {
            $accountDetails = $stripeAccount->toArray();

            // account_id, account_slug  are unique value which used to reference to connect stripe account.
            // They can not be renamed.
            unset($accountDetails['account_id'], $accountDetails['account_slug']);

            $allAccounts[$accountSlug] = $stripeAccount->toArray();

            return give_update_option('_give_stripe_get_all_accounts', $allAccounts);
        }

        return false;
    }

    /**
     * @since 2.13.0
     *
     * @param AccountDetailModel $stripeAccount
     * @param array $allAccounts
     *
     * @return bool
     * @throws InvalidPropertyName
     */
    public function isAccountAlreadyConnected(AccountDetailModel $stripeAccount, $allAccounts)
    {
        foreach ($allAccounts as $account) {
            $savedStripeAccount = AccountDetailModel::fromArray($account);

            if (
                $savedStripeAccount->liveSecretKey === $stripeAccount->liveSecretKey &&
                $savedStripeAccount->livePublishableKey === $stripeAccount->livePublishableKey &&
                $savedStripeAccount->testSecretKey === $stripeAccount->testSecretKey &&
                $savedStripeAccount->testPublishableKey === $stripeAccount->testPublishableKey
            ) {
                return true;
            }
        }

        return false;
    }

    /**
     * @since 2.13.0
     *
     * @param string $stripeAccountName
     * @param array $allAccounts
     *
     * @return bool
     * @throws InvalidPropertyName
     */
    public function isUniqueAccountName($stripeAccountName, $allAccounts)
    {
        foreach ($allAccounts as $account) {
            $savedStripeAccount = AccountDetailModel::fromArray($account);

            if ($savedStripeAccount->accountName === $stripeAccountName) {
                return false;
            }
        }

        return true;
    }
}