Your IP : 216.73.216.95


Current Path : /var/test/www/html/wp-content/plugins/give/src/Session/SessionDonation/SessionObjects/
Upload File :
Current File : /var/test/www/html/wp-content/plugins/give/src/Session/SessionDonation/SessionObjects/Donation.php

<?php
namespace Give\Session\SessionDonation\SessionObjects;

use DateTime;
use Give\Helpers\ArrayDataSet;
use Give\Session\Objects;
use Give\ValueObjects\CardInfo;
use Give\ValueObjects\DonorInfo;
use Give\ValueObjects\ValueObjects;
use InvalidArgumentException;


/**
 * Class Donation
 *
 * This class is use to represent donation session data as object.
 * You can add custom data but that data only store momentarily because of donation session time limit.
 * This does not represent actual Donation model instead of that it has few donation related information which required for donation processing.
 *
 * @package Give\Session\SessionDonation\SessionObjects
 */
class Donation implements Objects {
	/**
	 * Donation id.
	 *
	 * @since 2.7.0
	 * @var array
	 */
	public $id;

	/**
	 * Sanitized donation total amount.
	 *
	 * @since 2.7.0
	 * @var string
	 */
	public $totalAmount;

	/**
	 * Donation purchase key.
	 *
	 * @since 2.7.0
	 * @var string
	 */
	public $purchaseKey;

	/**
	 * Donor email.
	 *
	 * @since 2.7.0
	 * @var string
	 */
	public $donorEmail;

	/**
	 * Donor email.
	 *
	 * @since 2.7.0
	 * @var DateTime
	 */
	public $createdAt;

	/**
	 * Payment gateway id.
	 *
	 * @since 2.7.0
	 * @var array
	 */
	public $paymentGateway;

	/**
	 * Array of properties and their cast type.
	 *
	 * @var ValueObjects[]
	 */
	private $caseTo = [
		'formEntry' => FormEntry::class,
		'donorInfo' => DonorInfo::class,
		'cardInfo'  => CardInfo::class,
	];

	/**
	 * Take array and return object.
	 *
	 * @param $array
	 *
	 * @return Donation
	 */
	public static function fromArray( $array ) {
		$expectedKeys = [ 'id', 'totalAmount', 'purchaseKey', 'donorEmail', 'createdAt', 'paymentGateway', 'formEntry', 'cardInfo', 'donorInfo' ];

		if ( ! ArrayDataSet::hasRequiredKeys( $array, $expectedKeys ) ) {
			throw new InvalidArgumentException(
				'Invalid Donation object, must have the exact following keys: ' . implode( ', ', $expectedKeys )
			);
		}

		$donation = new self();

		$array['donorInfo'] = $donation->renameKeyInDonorInfo( $array['donorInfo'] );
		$array['cardInfo']  = $donation->filterCardInfoKeys( $array['cardInfo'] );

		foreach ( $array as $key => $value ) {
			if ( array_key_exists( $key, $donation->caseTo ) ) {
				$class            = $donation->caseTo[ $key ];
				$donation->{$key} = $class::fromArray( $value );
				continue;
			}

			$donation->{$key} = is_array( $value ) ?
				json_decode( json_encode( $value ) ) // Convert unlisted array type session data to stdClass object
				: $value;
		}

		return $donation;
	}

	/**
	 * Rename array key in donor info
	 *
	 * @since 2.7.0
	 * @param array $array
	 *
	 * @return array
	 */
	private function renameKeyInDonorInfo( $array ) {
		return ArrayDataSet::renameKeys(
			$array,
			[
				'id'    => 'wpUserId',
				'title' => 'honorific',
			]
		);
	}

	/**
	 * Filter array keys in card info
	 *
	 * @since 2.7.0
	 * @param $array
	 * @return array
	 */
	private function filterCardInfoKeys( $array ) {
		$array = $this->removePrefixFromArrayKeys( $array, [ 'card' ] );
		$array = ArrayDataSet::renameKeys(
			$array,
			[
				'address'  => 'line1',
				'address2' => 'line2',
			]
		);
		$array = ArrayDataSet::moveArrayItemsUnderArrayKey( $array, [ 'line1', 'line2', 'city', 'state', 'country', 'zip' ], 'address' );

		// Rename zip to postal code.
		$array['address']['postalCode'] = $array['address']['zip'];
		unset( $array['address']['zip'] );

		return $array;
	}

	/**
	 * Remove prefix from array key.
	 *
	 * @param array $array
	 * @param array $prefixes
	 *
	 * @return array
	 */
	private function removePrefixFromArrayKeys( $array, $prefixes ) {
		foreach ( $array as $key => $value ) {
			$newKey = lcfirst( str_replace( (array) $prefixes, '', $key ) );

			if ( $key !== $newKey ) {
				unset( $array[ $key ] );
			}

			if ( is_array( $value ) ) {
				$array[ $newKey ] = $this->removePrefixFromArrayKeys( $value, $prefixes );
				continue;
			}

			$array[ $newKey ] = $value;

		}

		return $array;
	}
}