PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.7.1
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.7.1
4.7.2 4.7.1 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 / Abilities / Abilities / CreateCoupon.php
surecart / app / src / Abilities / Abilities Last commit date
AbstractAbility.php 2 weeks ago ArchiveProduct.php 4 months ago CancelSubscription.php 4 months ago CreateCoupon.php 4 months ago CreateCustomer.php 4 months ago CreateFulfillment.php 4 months ago CreateInvoice.php 2 months ago CreatePrice.php 2 months ago CreateProduct.php 4 months ago CreatePromotion.php 4 months ago CreateRefund.php 2 months ago DeleteCoupon.php 4 months ago DeleteCustomer.php 4 months ago DeleteFulfillment.php 4 months ago DeletePromotion.php 4 months ago DuplicateProduct.php 4 months ago FilterCustomers.php 2 months ago FilterOrders.php 2 months ago FilterSubscriptions.php 2 months ago GetAbandonedCheckout.php 3 months ago GetCoupon.php 4 months ago GetCustomer.php 4 months ago GetCustomersFilterSchema.php 2 months ago GetFulfillment.php 4 months ago GetFulfillmentItem.php 4 months ago GetLicense.php 4 months ago GetOrder.php 4 months ago GetOrderStatistics.php 4 months ago GetOrdersFilterSchema.php 2 months ago GetProduct.php 4 months ago GetPromotion.php 4 months ago GetRefund.php 4 months ago GetStoreDashboard.php 4 months ago GetStoreInfo.php 4 months ago GetSubscription.php 4 months ago GetSubscriptionsFilterSchema.php 2 months ago ListAbandonedCheckouts.php 3 months ago ListCoupons.php 4 months ago ListCustomers.php 4 months ago ListFulfillments.php 4 months ago ListLicenses.php 4 months ago ListOrders.php 4 months ago ListPrices.php 4 months ago ListProducts.php 4 months ago ListPromotions.php 4 months ago ListRefunds.php 4 months ago ListSubscriptions.php 4 months ago UpdateCoupon.php 4 months ago UpdateCustomer.php 4 months ago UpdateFulfillment.php 4 months ago UpdateInvoice.php 4 months ago UpdatePrice.php 4 months ago UpdateProduct.php 4 months ago UpdatePromotion.php 4 months ago UpdateSubscriptionRenewalDate.php 4 months ago
CreateCoupon.php
190 lines
1 <?php
2
3 namespace SureCart\Abilities\Abilities;
4
5 use SureCart\Models\Coupon;
6
7 /**
8 * Create a new coupon/discount.
9 */
10 class CreateCoupon extends AbstractAbility {
11
12 /**
13 * {@inheritDoc}
14 */
15 public function get_name(): string {
16 return 'surecart/create-coupon';
17 }
18
19 /**
20 * {@inheritDoc}
21 */
22 public function get_label(): string {
23 return __( 'Create Coupon', 'surecart' );
24 }
25
26 /**
27 * {@inheritDoc}
28 */
29 public function get_description(): string {
30 return __( 'Create a new SureCart coupon with a discount amount or percentage, duration, and optional redemption limits. Coupons define the discount logic and can be linked to one or more promotion codes.', 'surecart' );
31 }
32
33 /**
34 * {@inheritDoc}
35 */
36 public function get_annotations(): array {
37 return array(
38 'readonly' => false,
39 'destructive' => false,
40 'idempotent' => false,
41 );
42 }
43
44 /**
45 * {@inheritDoc}
46 */
47 public function get_instructions(): string {
48 return 'Set either amount_off (in smallest currency unit) or percent_off (0-100), not both. Duration can be once, repeating, or forever. For repeating, also set duration_in_months. Each call creates a new coupon.';
49 }
50
51 /**
52 * {@inheritDoc}
53 */
54 public function check_permission(): bool {
55 return current_user_can( 'publish_sc_coupons' );
56 }
57
58 /**
59 * {@inheritDoc}
60 */
61 public function get_input_schema(): array {
62 return array(
63 'type' => 'object',
64 'properties' => array(
65 'name' => array(
66 'type' => 'string',
67 'description' => __( 'Coupon name displayed to customers.', 'surecart' ),
68 ),
69 'percent_off' => array(
70 'type' => 'number',
71 'description' => __( 'Percentage discount (e.g., 10 for 10% off). Use this or amount_off, not both.', 'surecart' ),
72 ),
73 'amount_off' => array(
74 'type' => 'integer',
75 'description' => __( 'Fixed amount discount in smallest currency unit (e.g., cents). Use this or percent_off, not both.', 'surecart' ),
76 ),
77 'currency' => array(
78 'type' => 'string',
79 'description' => __( 'Three-letter ISO currency code for amount_off (e.g., usd).', 'surecart' ),
80 'default' => 'usd',
81 ),
82 'duration' => array(
83 'type' => 'string',
84 'description' => __( 'Coupon duration: once, repeating, or forever.', 'surecart' ),
85 'enum' => array( 'once', 'repeating', 'forever' ),
86 'default' => 'once',
87 ),
88 'duration_in_months' => array(
89 'type' => 'integer',
90 'description' => __( 'Number of months the coupon applies when duration is repeating.', 'surecart' ),
91 ),
92 'max_redemptions' => array(
93 'type' => 'integer',
94 'description' => __( 'Maximum total redemptions across all customers.', 'surecart' ),
95 ),
96 'max_redemptions_per_customer' => array(
97 'type' => 'integer',
98 'description' => __( 'Maximum redemptions per individual customer.', 'surecart' ),
99 ),
100 'min_subtotal_amount' => array(
101 'type' => 'integer',
102 'description' => __( 'Minimum checkout subtotal required in smallest currency unit.', 'surecart' ),
103 ),
104 'max_subtotal_amount' => array(
105 'type' => 'integer',
106 'description' => __( 'Maximum checkout subtotal allowed in smallest currency unit.', 'surecart' ),
107 ),
108 'product_ids' => array(
109 'type' => 'array',
110 'items' => array( 'type' => 'string' ),
111 'description' => __( 'Product IDs this coupon applies to. Empty means all products.', 'surecart' ),
112 ),
113 'redeem_by' => array(
114 'type' => 'integer',
115 'description' => __( 'Unix timestamp after which the coupon expires.', 'surecart' ),
116 ),
117 ),
118 'required' => array( 'name' ),
119 );
120 }
121
122 /**
123 * {@inheritDoc}
124 */
125 public function get_output_schema(): array {
126 return array(
127 'type' => 'object',
128 'properties' => array(
129 'success' => array( 'type' => 'boolean' ),
130 'coupon' => array( 'type' => 'object' ),
131 ),
132 );
133 }
134
135 /**
136 * {@inheritDoc}
137 */
138 public function execute( array $input ) {
139 $allowed_durations = array( 'once', 'repeating', 'forever' );
140 $duration = sanitize_text_field( $input['duration'] ?? 'once' );
141 if ( ! in_array( $duration, $allowed_durations, true ) ) {
142 return $this->error(
143 'invalid_duration',
144 /* translators: %s: comma-separated list of valid duration values */
145 sprintf( __( 'Invalid duration. Allowed values: %s', 'surecart' ), implode( ', ', $allowed_durations ) )
146 );
147 }
148
149 $data = array(
150 'name' => sanitize_text_field( $input['name'] ),
151 'duration' => $duration,
152 );
153
154 if ( ! empty( $input['percent_off'] ) && ! empty( $input['amount_off'] ) ) {
155 return $this->error( 'invalid_input', __( 'You cannot set both percent_off and amount_off. Please use one or the other.', 'surecart' ) );
156 }
157
158 if ( ! empty( $input['percent_off'] ) ) {
159 $data['percent_off'] = floatval( $input['percent_off'] );
160 } elseif ( ! empty( $input['amount_off'] ) ) {
161 $data['amount_off'] = absint( $input['amount_off'] );
162 $data['currency'] = sanitize_text_field( $input['currency'] ?? 'usd' );
163 }
164
165 // Optional integer fields.
166 $int_fields = array( 'duration_in_months', 'max_redemptions', 'max_redemptions_per_customer', 'min_subtotal_amount', 'max_subtotal_amount', 'redeem_by' );
167 foreach ( $int_fields as $field ) {
168 if ( isset( $input[ $field ] ) ) {
169 $data[ $field ] = absint( $input[ $field ] );
170 }
171 }
172
173 // Product restrictions.
174 if ( isset( $input['product_ids'] ) && is_array( $input['product_ids'] ) ) {
175 $data['product_ids'] = array_map( 'sanitize_text_field', $input['product_ids'] );
176 }
177
178 $coupon = Coupon::create( $data );
179 if ( is_wp_error( $coupon ) ) {
180 return $coupon;
181 }
182
183 return $this->success(
184 array(
185 'coupon' => $this->model_to_array( $coupon ),
186 )
187 );
188 }
189 }
190