D
Engineering

Ads Accounts Schema

Skema tabel ads_accounts, stock_ads_accounts, ads_account_fundings, ads_account_business_managers, ad_campaigns, ad_adsets, ad_ads, ads_export_schedules. Konstanta EXPIRED_BEFORE=7, EXPIRED_AFTER=4.

Skema entitas akun iklan & stok BM Konco. Tabel utama: ads_accounts (akun iklan yang disewa member), stock_ads_accounts (inventaris), ads_account_fundings (history funding).

ads_accounts

Akun iklan yang sedang/sempat disewa member. Tabel pusat siklus subscription lifecycle.

FieldTipeCatatan
idUUID (PK)Via UUID trait
stock_ads_account_idUUID (FK)→ stock_ads_accounts.id
member_bm_idUUID (FK)→ member_bms.id
expireddatetimeTanggal akhir sewa — trigger reminder & auto-deactivation
is_activebooleanStatus aktif (dipakai scopeActive)
created_byUUIDDiisi WithAuthor
updated_byUUIDDiisi WithAuthor
deleted_atdatetimeSoft delete (SoftDeletes)
created_at, updated_atdatetimeTimestamp Laravel

Konstanta

php
// app/Models/AdsAccount.php
const EXPIRED_BEFORE = 7; // hari sebelum expired — trigger reminder
const EXPIRED_AFTER = 4;  // hari grace period — auto-deactivation

Relasi

MethodTipeTarget
stock_ads_account()BelongsToStockAdsAccount
member_bm()BelongsToMemberBm
ads_account_business_managers()HasManyAdsAccountBusinessManager
business_managers()BelongsToManyMemberBm via ads_account_business_managers
order_subscribe()BelongsToOrderSubscribe
refund()HasManyRefund

Scope penting

ScopeFungsi
scopeActive($q, $member_id = null)expired > today - 7, is_active=true, stock_ads_account aktif
scopeDummy($q, $member_id = null)expired null, stock_ads_account_id null, is_active=true
scopeWhere_member($q, $member_id)Filter by member_bm.member_id

Accessor penting

AccessorFungsi
getGraceExpiredAttribute()Return expired + 4 hari
getGraceLimitAttribute()Carbon::parse(expired)->addDays(4)
getDaysUntilExpiredAttribute()Selisih hari ke expired
getStatusTextAttribute()Status label

stock_ads_accounts

Inventaris akun iklan — stok yang bisa disewakan ke member.

FieldTipeCatatan
idUUID (PK)
stock_bm_idUUID (FK)→ stock_bms.id
ads_idstringID akun iklan Facebook
namestringNama akun iklan
account_statusintegerCast integer
currencystringMata uang
timezone_namestringTimezone
balancedecimal:2Saldo riil Facebook
amount_spentdecimal:2Total spend
spend_capdecimal:2Limit spend
last_synced_atdatetimeSync terakhir dari Meta
sync_statusstringStatus sync
is_deletedbooleanSoft delete flag
is_activebooleanStatus stok
meta_dataarrayCast JSON
deleted_atdatetimeSoftDeletes
created_by, updated_by, created_at, updated_at—Standar

ads_account_fundings

History funding akun iklan (topup/withdraw/refund records).

FieldTipeCatatan
idUUID (PK)
ads_account_idUUID (FK)→ ads_accounts.id
amountdecimal:2Nominal
typestringtopup / withdraw / refund / transfer
reference_idUUIDReference ke order/admin request
descriptiontextCatatan
created_by, updated_by, timestamps—Standar

ads_account_business_managers

Pivot relasi akun iklan ↔ BM (many-to-many).

FieldTipe
idUUID (PK)
ads_account_idUUID (FK)
member_bm_idUUID (FK)
created_at, updated_atdatetime

ad_campaigns / ad_adsets / ad_ads

Cache hierarki Meta Campaigns → AdSets → Ads.

FieldTipeCatatan
idUUID (PK)
ads_account_idUUID (FK)→ ads_accounts.id
campaign_id / adset_id / ad_idstringID Meta
namestring
statusstringACTIVE / PAUSED
daily_budget / lifetime_budgetdecimal:2
insightsarrayCast JSON — cache metrik
last_synced_atdatetime
timestamps—

ads_export_schedules

Jadwal export laporan iklan terjadwal.

FieldTipeCatatan
idUUID (PK)
user_idUUID (FK)Pemilik jadwal
ads_account_idUUID (FK)Akun yang di-export
frequencystringdaily / weekly
day_of_weekstringUntuk weekly — e.g. monday
timetimeJam export
emailstringTujuan email
is_activeboolean
timestamps—

Dispatched by scheduler jam 07:00 via SendScheduledAdsExportJob.

user_ads_column_preferences

Preferensi kolom tampilan Ads Manager per user.

FieldTipe
idUUID (PK)
user_idUUID (FK)
columnsarray (JSON)
timestamps—

pixel_configurations

Konfigurasi pixel per akun iklan.

FieldTipe
idUUID (PK)
ads_account_idUUID (FK)
pixel_idstring
configarray (JSON)
timestamps—

Langkah berikutnya