| 1 |
<?php |
| 2 |
|
| 3 |
namespace Give\PaymentGateways\DataTransferObjects; |
| 4 |
|
| 5 |
use Exception; |
| 6 |
use Give\Donations\Models\Donation; |
| 7 |
use Give\Donations\Properties\BillingAddress; |
| 8 |
use Give\Donations\ValueObjects\DonationStatus; |
| 9 |
use Give\Framework\Support\ValueObjects\Money; |
| 10 |
use Give\ValueObjects\Address; |
| 11 |
use Give\ValueObjects\CardInfo; |
| 12 |
use Give\ValueObjects\DonorInfo; |
| 13 |
|
| 14 |
/** |
| 15 |
* Class FormData |
| 16 |
* @since 2.18.0 |
| 17 |
*/ |
| 18 |
final class FormData |
| 19 |
{ |
| 20 |
/** |
| 21 |
* @var float |
| 22 |
*/ |
| 23 |
public $price; |
| 24 |
/** |
| 25 |
* @var string |
| 26 |
*/ |
| 27 |
public $formTitle; |
| 28 |
/** |
| 29 |
* @var string |
| 30 |
*/ |
| 31 |
public $date; |
| 32 |
/** |
| 33 |
* @var string |
| 34 |
*/ |
| 35 |
public $purchaseKey; |
| 36 |
/** |
| 37 |
* @var string |
| 38 |
*/ |
| 39 |
public $currency; |
| 40 |
/** |
| 41 |
* @var array |
| 42 |
*/ |
| 43 |
public $userInfo; |
| 44 |
/** |
| 45 |
* @var string |
| 46 |
*/ |
| 47 |
public $paymentGateway; |
| 48 |
/** |
| 49 |
* @var string |
| 50 |
*/ |
| 51 |
public $gatewayNonce; |
| 52 |
/** |
| 53 |
* @var array |
| 54 |
*/ |
| 55 |
public $postData; |
| 56 |
/** |
| 57 |
* @var CardInfo |
| 58 |
*/ |
| 59 |
public $cardInfo; |
| 60 |
/** |
| 61 |
* @var int |
| 62 |
*/ |
| 63 |
public $formId; |
| 64 |
/** |
| 65 |
* @var string |
| 66 |
*/ |
| 67 |
public $priceId; |
| 68 |
/** |
| 69 |
* @var string |
| 70 |
*/ |
| 71 |
public $formIdPrefix; |
| 72 |
/** |
| 73 |
* @var string |
| 74 |
*/ |
| 75 |
public $currentUrl; |
| 76 |
/** |
| 77 |
* @var string |
| 78 |
*/ |
| 79 |
public $formMinimum; |
| 80 |
/** |
| 81 |
* @var string |
| 82 |
*/ |
| 83 |
public $formMaximum; |
| 84 |
/** |
| 85 |
* @var string |
| 86 |
*/ |
| 87 |
public $formHash; |
| 88 |
/** |
| 89 |
* @var string |
| 90 |
*/ |
| 91 |
public $amount; |
| 92 |
/** |
| 93 |
* @var string |
| 94 |
*/ |
| 95 |
public $userId; |
| 96 |
/** |
| 97 |
* @var Address |
| 98 |
*/ |
| 99 |
public $billingAddress; |
| 100 |
/** |
| 101 |
* @var DonorInfo |
| 102 |
*/ |
| 103 |
public $donorInfo; |
| 104 |
|
| 105 |
/** @var bool */ |
| 106 |
public $anonymous; |
| 107 |
/** |
| 108 |
* @var string|null |
| 109 |
*/ |
| 110 |
public $company; |
| 111 |
|
| 112 |
/** |
| 113 |
* Convert data from request into DTO |
| 114 |
* |
| 115 |
* @since 2.22.0 add support for company field |
| 116 |
* @since 2.18.0 |
| 117 |
*/ |
| 118 |
public static function fromRequest(array $request): FormData |
| 119 |
{ |
| 120 |
$self = new static(); |
| 121 |
|
| 122 |
$self->price = $request['price']; |
| 123 |
$self->date = $request['date']; |
| 124 |
$self->purchaseKey = $request['purchase_key']; |
| 125 |
$self->currency = give_get_currency($request['post_data']['give-form-id'], $request); |
| 126 |
$self->userInfo = $request['user_info']; |
| 127 |
$self->postData = $request['post_data']; |
| 128 |
$self->formTitle = $request['post_data']['give-form-title']; |
| 129 |
$self->formId = (int)$request['post_data']['give-form-id']; |
| 130 |
$self->priceId = $request['post_data']['give-price-id'] ?? ''; |
| 131 |
$self->formIdPrefix = $request['post_data']['give-form-id-prefix']; |
| 132 |
$self->currentUrl = $request['post_data']['give-current-url']; |
| 133 |
$self->formMinimum = $request['post_data']['give-form-minimum']; |
| 134 |
$self->formMaximum = $request['post_data']['give-form-maximum']; |
| 135 |
$self->formHash = $request['post_data']['give-form-hash']; |
| 136 |
$self->amount = $request['post_data']['give-amount']; |
| 137 |
$self->paymentGateway = $request['post_data']['give-gateway']; |
| 138 |
$self->gatewayNonce = $request['gateway_nonce']; |
| 139 |
$self->donorInfo = DonorInfo::fromArray([ |
| 140 |
'wpUserId' => $request['user_info']['id'], |
| 141 |
'firstName' => $request['user_info']['first_name'], |
| 142 |
'lastName' => $request['user_info']['last_name'], |
| 143 |
'email' => $request['user_info']['email'], |
| 144 |
'honorific' => ! empty($request['user_info']['title']) ? $request['user_info']['title'] : '', |
| 145 |
'address' => $request['user_info']['address'], |
| 146 |
]); |
| 147 |
$self->cardInfo = CardInfo::fromArray([ |
| 148 |
'name' => $request['card_info']['card_name'], |
| 149 |
'cvc' => $request['card_info']['card_cvc'], |
| 150 |
'expMonth' => $request['card_info']['card_exp_month'], |
| 151 |
'expYear' => $request['card_info']['card_exp_year'], |
| 152 |
'number' => $request['card_info']['card_number'], |
| 153 |
]); |
| 154 |
$self->billingAddress = Address::fromArray([ |
| 155 |
'line1' => $request['card_info']['card_address'], |
| 156 |
'line2' => $request['card_info']['card_address_2'], |
| 157 |
'city' => $request['card_info']['card_city'], |
| 158 |
'state' => $request['card_info']['card_state'], |
| 159 |
'country' => $request['card_info']['card_country'], |
| 160 |
'postalCode' => $request['card_info']['card_zip'], |
| 161 |
]); |
| 162 |
|
| 163 |
$self->anonymous = isset($request['post_data']['give_anonymous_donation']) && (bool)absint( |
| 164 |
$request['post_data']['give_anonymous_donation'] |
| 165 |
); |
| 166 |
|
| 167 |
$self->company = !empty($request['post_data']['give_company_name']) ? $request['post_data']['give_company_name'] : null; |
| 168 |
|
| 169 |
return $self; |
| 170 |
} |
| 171 |
|
| 172 |
/** |
| 173 |
* @since 3.2.0 added support for honorific field |
| 174 |
* @since 2.22.0 add support for company field |
| 175 |
* @since 2.19.6 |
| 176 |
* @throws Exception |
| 177 |
*/ |
| 178 |
public function toDonation($donorId): Donation |
| 179 |
{ |
| 180 |
$donation = new Donation([ |
| 181 |
'status' => DonationStatus::PENDING(), |
| 182 |
'gatewayId' => $this->paymentGateway, |
| 183 |
'amount' => Money::fromDecimal($this->price, $this->currency), |
| 184 |
'donorId' => $donorId, |
| 185 |
'honorific' => $this->donorInfo->honorific, |
| 186 |
'firstName' => $this->donorInfo->firstName, |
| 187 |
'lastName' => $this->donorInfo->lastName, |
| 188 |
'email' => $this->donorInfo->email, |
| 189 |
'formId' => $this->formId, |
| 190 |
'formTitle' => $this->formTitle, |
| 191 |
'billingAddress' => BillingAddress::fromArray([ |
| 192 |
'country' => $this->billingAddress->country, |
| 193 |
'city' => $this->billingAddress->city, |
| 194 |
'state' => $this->billingAddress->state, |
| 195 |
'zip' => $this->billingAddress->postalCode, |
| 196 |
'address1' => $this->billingAddress->line1, |
| 197 |
'address2' => $this->billingAddress->line2, |
| 198 |
]), |
| 199 |
'levelId' => $this->priceId, |
| 200 |
'anonymous' => $this->anonymous, |
| 201 |
'company' => $this->company |
| 202 |
]); |
| 203 |
|
| 204 |
/** |
| 205 |
* Since 2018, we have been updating the donor's company field based on their donation. |
| 206 |
* The company in donation meta never changes, but the company in donor meta gets updated based on the most recent donation in which that donor supplied a company. |
| 207 |
* |
| 208 |
* @see https://github.com/impress-org/givewp/issues/2453#issuecomment-373103211 |
| 209 |
*/ |
| 210 |
if ($donation->company) { |
| 211 |
give()->donor_meta->update_meta($donorId, '_give_donor_company', $donation->company); |
| 212 |
} |
| 213 |
|
| 214 |
return $donation; |
| 215 |
} |
| 216 |
} |
| 217 |
|