PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.19.2
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.19.2
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / Models / Checkout.php
surecart / app / src / Models Last commit date
Traits 2 years ago AbandonedCheckout.php 3 years ago AbandonedCheckoutProtocol.php 3 years ago Account.php 3 years ago AccountPortalSession.php 4 years ago Activation.php 2 years ago AffiliationProtocol.php 2 years ago ApiToken.php 3 years ago BalanceTransaction.php 4 years ago Brand.php 4 years ago Bump.php 2 years ago BuyLink.php 2 years ago CancellationAct.php 3 years ago CancellationReason.php 3 years ago Charge.php 4 years ago Checkout.php 2 years ago Collection.php 2 years ago Component.php 4 years ago Coupon.php 4 years ago Customer.php 2 years ago CustomerLink.php 4 years ago CustomerNotificationProtocol.php 4 years ago DatabaseModel.php 2 years ago Download.php 4 years ago Event.php 4 years ago Form.php 3 years ago Fulfillment.php 3 years ago FulfillmentItem.php 3 years ago IncomingWebhook.php 2 years ago Integration.php 2 years ago Invoice.php 4 years ago License.php 2 years ago LineItem.php 2 years ago ManualPaymentMethod.php 3 years ago Media.php 3 years ago Model.php 2 years ago ModelInterface.php 4 years ago Order.php 2 years ago OrderProtocol.php 4 years ago PaymentIntent.php 4 years ago PaymentMethod.php 4 years ago Period.php 3 years ago PortalProtocol.php 4 years ago PortalSession.php 4 years ago Price.php 3 years ago Processor.php 3 years ago Product.php 2 years ago ProductCollection.php 2 years ago ProductGroup.php 2 years ago ProductMedia.php 3 years ago Promotion.php 4 years ago ProvisionalAccount.php 3 years ago Purchase.php 2 years ago Refund.php 4 years ago RegisteredWebhook.php 2 years ago ReturnItem.php 2 years ago ReturnReason.php 2 years ago ReturnRequest.php 2 years ago ShippingMethod.php 3 years ago ShippingProfile.php 3 years ago ShippingProtocol.php 3 years ago ShippingRate.php 3 years ago ShippingZone.php 3 years ago Statistic.php 4 years ago Subscription.php 2 years ago SubscriptionProtocol.php 4 years ago TaxProtocol.php 4 years ago TaxRegistration.php 4 years ago TaxZone.php 4 years ago Upload.php 4 years ago Upsell.php 2 years ago UpsellFunnel.php 2 years ago User.php 2 years ago Variant.php 2 years ago VariantOption.php 2 years ago VariantValue.php 2 years ago VerificationCode.php 3 years ago Webhook.php 2 years ago WebhookRegistration.php 2 years ago
Checkout.php
344 lines
1 <?php
2
3 namespace SureCart\Models;
4
5 use SureCart\Models\Traits\HasCustomer;
6 use SureCart\Models\Traits\HasSubscriptions;
7 use SureCart\Models\LineItem;
8 use SureCart\Models\Traits\CanFinalize;
9 use SureCart\Models\Traits\HasDiscount;
10 use SureCart\Models\Traits\HasPaymentIntent;
11 use SureCart\Models\Traits\HasPaymentMethod;
12 use SureCart\Models\Traits\HasProcessorType;
13 use SureCart\Models\Traits\HasPurchases;
14 use SureCart\Models\Traits\HasShippingAddress;
15
16 /**
17 * Order model
18 */
19 class Checkout extends Model {
20 use HasCustomer,
21 HasSubscriptions,
22 HasDiscount,
23 HasShippingAddress,
24 HasPaymentIntent,
25 HasPaymentMethod,
26 HasPurchases,
27 CanFinalize,
28 HasProcessorType;
29
30 /**
31 * Rest API endpoint
32 *
33 * @var string
34 */
35 protected $endpoint = 'checkouts';
36
37 /**
38 * Object name
39 *
40 * @var string
41 */
42 protected $object_name = 'checkout';
43
44 /**
45 * Need to pass the processor type on create
46 *
47 * @param array $attributes Optional attributes.
48 * @param string $type stripe, paypal, etc.
49 */
50 public function __construct( $attributes = [], $type = '' ) {
51 $this->processor_type = $type;
52 parent::__construct( $attributes );
53 }
54
55 /**
56 * Set attributes during write actions.
57 *
58 * @return void
59 */
60 protected function setWriteAttributes() {
61 $this->setAttribute( 'ip_address', $this->getIPAddress() );
62 if ( isset( $_COOKIE['sc_click_id'] ) ) {
63 $this->setAttribute( 'last_click', $_COOKIE['sc_click_id'] );
64 }
65 }
66
67 /**
68 * Set the upsell funnel attribute
69 *
70 * @param object $value The data array.
71 * @return void
72 */
73 public function setUpsellFunnelAttribute( $value ) {
74 $this->setRelation( 'upsell_funnel', $value, UpsellFunnel::class );
75 }
76
77 /**
78 * Set the upsell funnel attribute
79 *
80 * @param object $value The data array.
81 * @return void
82 */
83 public function setCurrentUpsellAttribute( $value ) {
84 $this->setRelation( 'current_upsell', $value, Upsell::class );
85 }
86
87 /**
88 * Set the recommended bumps attribute
89 *
90 * @param object $value Subscription data array.
91 * @return void
92 */
93 public function setRecommendedBumpsAttribute( $value ) {
94 $this->setCollection( 'recommended_bumps', $value, Bump::class );
95 }
96
97 /**
98 * Create a new model
99 *
100 * @param array $attributes Attributes to create.
101 *
102 * @return $this|\WP_Error|false
103 */
104 protected function create( $attributes = [] ) {
105 $this->setWriteAttributes();
106 return parent::create( $attributes );
107 }
108
109 /**
110 * Update the model
111 *
112 * @param array $attributes Attributes to create.
113 *
114 * @return $this|\WP_Error|false
115 */
116 protected function update( $attributes = [] ) {
117 $this->setWriteAttributes();
118 return parent::update( $attributes );
119 }
120
121 /**
122 * Get the IP address of the user
123 *
124 * TOD0: Move this to a helper class.
125 *
126 * @return string
127 */
128 protected function getIPAddress() {
129 return $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? '';
130 }
131
132 /**
133 * Set the product attribute
134 *
135 * @param object $value Product properties.
136 * @return void
137 */
138 public function setLineItemsAttribute( $value ) {
139 $this->setCollection( 'line_items', $value, LineItem::class );
140 }
141
142 /**
143 * Finalize the session for checkout.
144 *
145 * @return $this|\WP_Error
146 */
147 protected function manuallyPay() {
148 if ( $this->fireModelEvent( 'manually_paying' ) === false ) {
149 return false;
150 }
151
152 if ( empty( $this->attributes['id'] ) ) {
153 return new \WP_Error( 'not_saved', 'Please create the checkout session.' );
154 }
155
156 $finalized = \SureCart::request(
157 $this->endpoint . '/' . $this->attributes['id'] . '/manually_pay/',
158 [
159 'method' => 'PATCH',
160 'query' => $this->query,
161 'body' => [
162 $this->object_name => $this->getAttributes(),
163 ],
164 ]
165 );
166
167 if ( is_wp_error( $finalized ) ) {
168 return $finalized;
169 }
170
171 $this->resetAttributes();
172
173 $this->fill( $finalized );
174
175 $this->fireModelEvent( 'manually_paid' );
176
177 return $this;
178 }
179
180 /**
181 * Cancel an checkout
182 *
183 * @return $this|\WP_Error
184 */
185 protected function cancel() {
186 if ( $this->fireModelEvent( 'cancelling' ) === false ) {
187 return false;
188 }
189
190 if ( empty( $this->attributes['id'] ) ) {
191 return new \WP_Error( 'not_saved', 'Please create the order.' );
192 }
193
194 $cancelled = $this->makeRequest(
195 [
196 'method' => 'PATCH',
197 'query' => $this->query,
198 'body' => [
199 $this->object_name => $this->getAttributes(),
200 ],
201 ],
202 $this->endpoint . '/' . $this->attributes['id'] . '/cancel/'
203 );
204
205 if ( is_wp_error( $cancelled ) ) {
206 return $cancelled;
207 }
208
209 $this->resetAttributes();
210
211 $this->fill( $cancelled );
212
213 $this->fireModelEvent( 'cancelled' );
214
215 return $this;
216 }
217
218 /**
219 * Offer a bump.
220 *
221 * @param string|\SureCart\Models\Bump $bump The bump object.
222 *
223 * @return true|\WP_Error
224 */
225 protected function offerBump( $bump ) {
226 if ( $this->fireModelEvent( 'offering_bump' ) === false ) {
227 return false;
228 }
229
230 if ( empty( $this->attributes['id'] ) ) {
231 return new \WP_Error( 'not_saved', 'Please create the checkout.' );
232 }
233
234 $id = is_a( $bump, Bump::class ) ? $bump->id : $bump;
235
236 if ( empty( $id ) ) {
237 return new \WP_Error( 'not_saved', 'Please pass an upsell.' );
238 }
239
240 $offered = $this->makeRequest(
241 [
242 'method' => 'PATCH',
243 'query' => $this->query,
244 'body' => [
245 $this->object_name => $this->getAttributes(),
246 ],
247 ],
248 $this->endpoint . '/' . $this->attributes['id'] . '/offer_bump/' . $id
249 );
250
251 if ( is_wp_error( $offered ) ) {
252 return $offered;
253 }
254
255 return true;
256 }
257
258 /**
259 * Offer an upsell.
260 *
261 * @param string|\SureCart\Models\Upsell $upsell The upsell object.
262 *
263 * @return true|\WP_Error
264 */
265 protected function offerUpsell( $upsell ) {
266 if ( $this->fireModelEvent( 'offering_upsell' ) === false ) {
267 return false;
268 }
269
270 if ( empty( $this->attributes['id'] ) ) {
271 return new \WP_Error( 'not_saved', 'Please create the checkout.' );
272 }
273
274 $id = is_a( $upsell, Upsell::class ) ? $upsell->id : $upsell;
275
276 if ( empty( $id ) ) {
277 return new \WP_Error( 'not_saved', 'Please pass an upsell.' );
278 }
279
280 $offered = $this->makeRequest(
281 [
282 'method' => 'PATCH',
283 'query' => $this->query,
284 'body' => [
285 $this->object_name => $this->getAttributes(),
286 ],
287 ],
288 $this->endpoint . '/' . $this->attributes['id'] . '/offer_upsell/' . $id
289 );
290
291 if ( is_wp_error( $offered ) ) {
292 return $offered;
293 }
294
295 return true;
296 }
297
298 /**
299 * Decline an upsell.
300 *
301 * @param string|\SureCart\Models\Upsell $upsell The upsell object.
302 *
303 * @return $this|\WP_Error
304 */
305 protected function declineUpsell( $upsell ) {
306 if ( $this->fireModelEvent( 'declining_upsell' ) === false ) {
307 return false;
308 }
309
310 if ( empty( $this->attributes['id'] ) ) {
311 return new \WP_Error( 'not_saved', 'Please create the checkout.' );
312 }
313
314 $id = is_a( $upsell, Upsell::class ) ? $upsell->id : $upsell;
315
316 if ( empty( $id ) ) {
317 return new \WP_Error( 'not_saved', 'Please pass an upsell.' );
318 }
319
320 $declined = $this->makeRequest(
321 [
322 'method' => 'PATCH',
323 'query' => $this->query,
324 'body' => [
325 $this->object_name => $this->getAttributes(),
326 ],
327 ],
328 $this->endpoint . '/' . $this->attributes['id'] . '/decline_upsell/' . $id
329 );
330
331 if ( is_wp_error( $declined ) ) {
332 return $declined;
333 }
334
335 $this->resetAttributes();
336
337 $this->fill( $declined );
338
339 $this->fireModelEvent( 'declined' );
340
341 return $this;
342 }
343 }
344