55namespace Laravelcm \Subscriptions \Models ;
66
77use Carbon \Carbon ;
8+ use Carbon \CarbonInterface ;
89use Illuminate \Database \Eloquent \Builder ;
10+ use Illuminate \Database \Eloquent \Collection ;
911use Illuminate \Database \Eloquent \Factories \HasFactory ;
1012use Illuminate \Database \Eloquent \Model ;
1113use Illuminate \Database \Eloquent \Relations \HasMany ;
2123
2224/**
2325 * @property-read int|string $id
24- * @property string $subscriber_type
25- * @property string $slug
26- * @property array $title
27- * @property array $description
28- * @property Carbon|null $trial_ends_at
29- * @property Carbon|null $starts_at
30- * @property Carbon|null $ends_at
31- * @property Carbon|null $cancels_at
32- * @property Carbon|null $canceled_at
33- * @property Carbon|null $created_at
34- * @property Carbon|null $updated_at
35- * @property Carbon|null $deleted_at
26+ * @property-read string $subscriber_type
27+ * @property-read int|string $subscriber_id
28+ * @property-read string $slug
29+ * @property-read array $name
30+ * @property-read array $description
31+ * @property-read int|string $plan_id
32+ * @property-read ?CarbonInterface $trial_ends_at
33+ * @property-read ?CarbonInterface $starts_at
34+ * @property-read ?CarbonInterface $ends_at
35+ * @property-read ?CarbonInterface $cancels_at
36+ * @property-read ?CarbonInterface $canceled_at
37+ * @property-read CarbonInterface $created_at
38+ * @property-read CarbonInterface $updated_at
39+ * @property-read ?CarbonInterface $deleted_at
3640 * @property-read Plan $plan
37- * @property-read \Illuminate\Database\Eloquent\ Collection|\Laravelcm\Subscriptions\Models\ SubscriptionUsage[] $usage
41+ * @property-read Collection<int, SubscriptionUsage> $usage
3842 * @property-read Model $subscriber
39- *
40- * @method static \Illuminate\Database\Eloquent\Builder|Subscription byPlanId($planId)
41- * @method static \Illuminate\Database\Eloquent\Builder|Subscription findEndedPeriod()
42- * @method static \Illuminate\Database\Eloquent\Builder|Subscription findEndedTrial()
43- * @method static \Illuminate\Database\Eloquent\Builder|Subscription findEndingPeriod($dayRange = 3)
44- * @method static \Illuminate\Database\Eloquent\Builder|Subscription findEndingTrial($dayRange = 3)
45- * @method static \Illuminate\Database\Eloquent\Builder|Subscription ofSubscriber(\Illuminate\Database\Eloquent\Model $subscriber)
46- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCanceledAt($value)
47- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCancelsAt($value)
48- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCreatedAt($value)
49- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereDeletedAt($value)
50- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereDescription($value)
51- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereEndsAt($value)
52- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereId($value)
53- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereTitle($value)
54- * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePlanId($value)
55- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereSlug($value)
56- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereStartsAt($value)
57- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereTrialEndsAt($value)
58- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUpdatedAt($value)
59- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereSubscriberId($value)
60- * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereSubscriberType($value)
6143 */
6244class Subscription extends Model
6345{
@@ -127,7 +109,11 @@ public function getSlugOptions(): SlugOptions
127109 return SlugOptions::create ()
128110 ->doNotGenerateSlugsOnUpdate ()
129111 ->generateSlugsFrom ('name ' )
130- ->saveSlugsTo ('slug ' );
112+ ->saveSlugsTo ('slug ' )
113+ ->extraScope (fn ($ builder ) => $ builder
114+ ->where ('subscriber_type ' , $ this ->subscriber_type )
115+ ->where ('subscriber_id ' , $ this ->subscriber_id )
116+ );
131117 }
132118
133119 public function subscriber (): MorphTo
@@ -167,10 +153,10 @@ public function ended(): bool
167153
168154 public function cancel (bool $ immediately = false ): self
169155 {
170- $ this ->canceled_at = Carbon::now ();
156+ $ this ->fill ([ ' canceled_at ' => Carbon::now ()] );
171157
172158 if ($ immediately ) {
173- $ this ->ends_at = $ this ->canceled_at ;
159+ $ this ->fill ([ ' ends_at ' => $ this ->canceled_at ]) ;
174160 }
175161
176162 $ this ->save ();
@@ -190,7 +176,7 @@ public function changePlan(Plan $plan): self
190176 }
191177
192178 // Attach new plan to subscription
193- $ this ->plan_id = $ plan ->getKey ();
179+ $ this ->fill ([ ' plan_id ' => $ plan ->getKey ()] );
194180 $ this ->save ();
195181
196182 return $ this ;
@@ -217,7 +203,7 @@ public function renew(): self
217203
218204 // Renew period
219205 $ subscription ->setNewPeriod ();
220- $ subscription ->canceled_at = null ;
206+ $ subscription ->fill ([ ' canceled_at ' => null ]) ;
221207 $ subscription ->save ();
222208 });
223209
@@ -300,8 +286,10 @@ protected function setNewPeriod(string $invoice_interval = '', ?int $invoice_per
300286 start: $ start ?? Carbon::now ()
301287 );
302288
303- $ this ->starts_at = $ period ->getStartDate ();
304- $ this ->ends_at = $ period ->getEndDate ();
289+ $ this ->fill ([
290+ 'starts_at ' => $ period ->getStartDate (),
291+ 'ends_at ' => $ period ->getEndDate (),
292+ ]);
305293
306294 return $ this ;
307295 }
@@ -310,6 +298,7 @@ public function recordFeatureUsage(string $featureSlug, int $uses = 1, bool $inc
310298 {
311299 $ feature = $ this ->plan ->features ()->where ('slug ' , $ featureSlug )->first ();
312300
301+ /** @var SubscriptionUsage $usage */
313302 $ usage = $ this ->usage ()->firstOrNew ([
314303 'subscription_id ' => $ this ->getKey (),
315304 'feature_id ' => $ feature ->getKey (),
@@ -320,16 +309,18 @@ public function recordFeatureUsage(string $featureSlug, int $uses = 1, bool $inc
320309 if ($ usage ->valid_until === null ) {
321310 // Set date from subscription creation date so the reset
322311 // period match the period specified by the subscription's plan.
323- $ usage ->valid_until = $ feature ->getResetDate ($ this ->created_at );
312+ $ usage ->fill ([ ' valid_until ' => $ feature ->getResetDate ($ this ->created_at )] );
324313 } elseif ($ usage ->expired ()) {
325314 // If the usage record has been expired, let's assign
326315 // a new expiration date and reset the uses to zero.
327- $ usage ->valid_until = $ feature ->getResetDate ($ usage ->valid_until );
328- $ usage ->used = 0 ;
316+ $ usage ->fill ([
317+ 'valid_until ' => $ feature ->getResetDate ($ usage ->valid_until ),
318+ 'used ' => 0 ,
319+ ]);
329320 }
330321 }
331322
332- $ usage ->used = $ incremental ? $ usage ->used + $ uses : $ uses ;
323+ $ usage ->fill ([ ' used ' => $ incremental ? $ usage ->used + $ uses : $ uses]) ;
333324
334325 $ usage ->save ();
335326
0 commit comments