D
Engineering

Stock BM & Ads Schema

Skema tabel stock_bms, stock_ads_accounts, member_bms, facebook_businesses, facebook_ad_accounts, user_facebook_tokens. Stok inventaris BM & ad accounts untuk disewakan ke member.

Skema stok Business Manager & Ad Accounts — inventaris yang siap disewakan ke member. Data stok di-sync dari Meta Graph API via API engine (import massal lewat queue jobs).

stock_bms

Stok Business Manager — inventaris BM yang dimiliki agensi/konco.

FieldTipeCatatan
idUUID (PK)
bm_idstringID Business Manager Facebook
namestringNama BM
account_idstringAccount ID Facebook
is_activebooleanStatus stok
is_deletedbooleanFlag soft delete
deleted_atdatetimeSoftDeletes
created_by, updated_by, timestamps—Standar

Relasi

MethodTipeTarget
stockAdsAccounts()HasManyStockAdsAccount
memberBms()HasManyMemberBm

stock_ads_accounts

Stok akun iklan — inventaris yang siap disewakan.

FieldTipeCatatan
idUUID (PK)
stock_bm_idUUID (FK)→ stock_bms.id
ads_idstringID akun iklan Facebook
namestringNama akun iklan
account_statusintegerStatus dari Meta (cast integer)
currencystringMata uang akun
timezone_namestringTimezone
balancedecimal:2Saldo riil Facebook
amount_spentdecimal:2Total spend
spend_capdecimal:2Limit spend cap
last_synced_atdatetimeSync terakhir dari Meta
sync_statusstringidle / syncing / error
is_deletedbooleanFlag soft delete
is_activebooleanStatus stok
meta_dataarrayCast JSON — data tambahan dari Meta
deleted_atdatetimeSoftDeletes
created_by, updated_by, timestamps—Standar

Relasi

MethodTipeTarget
stockBm()BelongsToStockBm
adsAccounts()HasManyAdsAccount (akun yang disewakan)

member_bms

Business Manager yang di-assign ke member (member dapat pakai BM milik konco).

FieldTipeCatatan
idUUID (PK)
member_idUUID (FK)→ members.id
stock_bm_idUUID (FK)→ stock_bms.id
bm_idstringID BM Facebook
namestringNama BM
is_activeboolean
is_verifiedbooleanStatus verifikasi partner agency
timestamps—

Relasi

MethodTipeTarget
member()BelongsToMember
stockBm()BelongsToStockBm
adsAccounts()HasManyAdsAccount

ads_account_business_managers

Pivot many-to-many antara ads_accounts dan member_bms.

FieldTipe
idUUID (PK)
ads_account_idUUID (FK)
member_bm_idUUID (FK)
timestamps—

facebook_businesses

Cache data BM dari Meta Graph API — hasil import via API engine.

FieldTipeCatatan
idUUID (PK)
user_facebook_token_idUUID (FK)Token Facebook yang dipakai import
bm_idstringID BM dari Meta
namestringNama BM
verification_statusstringStatus verifikasi BM
countrystringNegara
primary_pagearray (JSON)Info page utama
metadataarray (JSON)Data tambahan
timestamps—

facebook_ad_accounts

Cache ad accounts dari Meta — hasil import via API engine.

FieldTipeCatatan
idUUID (PK)
user_facebook_token_idUUID (FK)Token yang dipakai
business_idUUID (FK)→ facebook_businesses.id
account_idstringID akun iklan Meta
namestringNama akun
account_statusintegerStatus dari Meta
currencystringMata uang
timezone_namestringTimezone
balancedecimal:2Saldo
amount_spentdecimal:2Total spend
spend_capdecimal:2Spend cap
insightsarray (JSON)Metrik performa cache
last_synced_atdatetime
timestamps—

user_facebook_tokens

Long-lived token Facebook per user (terutama admin yang melakukan import).

FieldTipeCatatan
idUUID (PK)
user_idUUID (FK)→ users.id
facebook_user_idstringID user Facebook
facebook_user_namestringNama user Facebook
access_tokentextEncrypted (Crypt::encrypt + SALTED_CREAMY salt)
expires_atdatetimeMasa berlaku (60 hari setelah refresh)
is_activeboolean
needs_reauthbooleanFlag bila refresh gagal
timestamps—

Token refresh

Command facebook:refresh-tokens (di API engine, dailyAt('02:00')):

php
$tokens = UserFacebookToken::active()
    ->where('expires_at', '<=', now()->addDays(7))
    ->where('expires_at', '>', now())
    ->get();

foreach ($tokens as $token) &#123;
    $longLivedData = $this->apiService->getLongLivedToken($token->access_token);
    $token->update([
        'access_token' => Crypt::encrypt($newToken . '|' . env('SALTED_CREAMY')),
        'expires_at'   => now()->addDays(60),
    ]);
&#125;

Threshold: 7 hari sebelum expired. Bila gagal: needs_reauth = true.

Import jobs (import_jobs)

Tracking progress import massal BM/Ad Accounts via queue.

FieldTipeCatatan
idUUID (PK)
user_facebook_token_idUUID (FK)Token yang dipakai
typestringbm / ad_accounts
statusstringpending / processing / completed / failed / cancelled
total_itemsintegerTotal yang akan di-import
processed_itemsintegerSudah diproses
error_messagetext (nullable)Bila failed
started_atdatetime
completed_atdatetime
timestamps—

Endpoint tracking: GET /api/facebook/import-jobs/&#123;jobId&#125;, GET /api/facebook/import-jobs/&#123;jobId&#125;/cancel.

Langkah berikutnya