D
Modul

Subscription

Paket berlangganan platform, add-on, invoice, upgrade/downgrade/expired handling. Cron tiap menit untuk downgrade.

Modul subscription mengelola paket berlangganan merchant: pembelian, invoice, upgrade/downgrade, dan expired handling via cron.

File kunci

FileBarisPeran
app/Http/Controllers/SubscriptionController.php487Checkout, invoice, payment, expired
app/Models/SubscriptionInvoice.php57Invoice + accessor display_payment_status
app/Models/SubscriptionPayment.php24Payment record
app/Models/Package.php25Paket berlangganan
app/Models/Addon.php26Add-on (fitur tambahan)
app/Console/Commands/Downgrade.php452Cron app:downgrade tiap menit
app/Console/Commands/AddonExpired.php83Cron app:addon-expired tiap menit
app/Console/Commands/SubscriptionNotif.php142Cron notif:subscription harian

Model

SubscriptionInvoice

Field: store_id, package_id, plan (bulan), total, unique_total (3 digit random), user (snapshot), package (snapshot), addon (snapshot), type ('package'), payment_status (unpaid/pending/confirmed/paid/failed), expired_at, bukti_transfer.

Accessor display_payment_status — return failed jika bank kosong atau created_at + payment_expire_period < now.

Cron — 3 command

CommandFrekuensiFungsi
app:downgradeeveryMinuteDisable device/product/team yang melampaui kuota paket baru
app:addon-expiredeveryMinuteReset features ke main_features_exist saat addon expired
notif:subscriptiondailyNotif H-7/H-3/H-1 sebelum paket expired

Route

Web (routes/web.php:299)

Prefix /subscription:

MethodPathFungsi
GET/subscriptionIndex
GET/subscription/checkout-form/{id}Checkout form
GET/subscription/confirm/{id}Confirm
GET/subscription/pyment/{id}Payment (typo pyment)
GET/subscription/invoice/{id}Invoice

API (routes/api.php:386)

Prefix /subscription:

MethodPathFungsi
POST/subscription/buyBeli (lama)
POST/subscription/confirm_buyBeli v2
POST/subscription/checkout_v2Checkout v2 + dispatch PaymentTimer
POST/subscription/sendUpload bukti transfer
POST/subscription/failed_transaction/{id}Reset ke unpaid

Temuan

  • list() pakai $id tidak terdefinisi (:94-100) — method juga tidak terdaftar di route. Kemungkinan mati
  • get_features seluruhnya di-comment (:462-486) — route POST /get_features aktif tapi return null. Endpoint mati
  • SubscriptionNotif scope variabel salah (:33-72) — loop pertama assign $storeId & $teamRole dari UserStore terakhir, loop kedua pakai nilai itu untuk semua store → semua notif terkirim ke store/owner yang salah
  • Typo pyment di route (web.php:305) — user yang ketik payment akan 404
  • PaymentTimer job dispatch tanpa queue worker.env QUEUE_CONNECTION=sync → job blocking dalam request, delay tidak berfungsi
  • Downgrade dead codehandleDowngradeAiAgent, handleDowngradeBroadcast, handleDowngradeOrder ada tapi tidak dipanggil dari handle()
  • Downgrade duplikasi eksekusi — downgrade dijalankan 2x untuk store yang masih dalam masa downgrade
  • Permission check tidak konsistenbuy, send, failed_transaction tidak authorize