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.
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
bm_id | string | ID Business Manager Facebook |
name | string | Nama BM |
account_id | string | Account ID Facebook |
is_active | boolean | Status stok |
is_deleted | boolean | Flag soft delete |
deleted_at | datetime | SoftDeletes |
created_by, updated_by, timestamps | — | Standar |
Relasi
| Method | Tipe | Target |
|---|---|---|
stockAdsAccounts() | HasMany | StockAdsAccount |
memberBms() | HasMany | MemberBm |
stock_ads_accounts
Stok akun iklan — inventaris yang siap disewakan.
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
stock_bm_id | UUID (FK) | → stock_bms.id |
ads_id | string | ID akun iklan Facebook |
name | string | Nama akun iklan |
account_status | integer | Status dari Meta (cast integer) |
currency | string | Mata uang akun |
timezone_name | string | Timezone |
balance | decimal:2 | Saldo riil Facebook |
amount_spent | decimal:2 | Total spend |
spend_cap | decimal:2 | Limit spend cap |
last_synced_at | datetime | Sync terakhir dari Meta |
sync_status | string | idle / syncing / error |
is_deleted | boolean | Flag soft delete |
is_active | boolean | Status stok |
meta_data | array | Cast JSON — data tambahan dari Meta |
deleted_at | datetime | SoftDeletes |
created_by, updated_by, timestamps | — | Standar |
Relasi
| Method | Tipe | Target |
|---|---|---|
stockBm() | BelongsTo | StockBm |
adsAccounts() | HasMany | AdsAccount (akun yang disewakan) |
member_bms
Business Manager yang di-assign ke member (member dapat pakai BM milik konco).
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
member_id | UUID (FK) | → members.id |
stock_bm_id | UUID (FK) | → stock_bms.id |
bm_id | string | ID BM Facebook |
name | string | Nama BM |
is_active | boolean | |
is_verified | boolean | Status verifikasi partner agency |
| timestamps | — |
Relasi
| Method | Tipe | Target |
|---|---|---|
member() | BelongsTo | Member |
stockBm() | BelongsTo | StockBm |
adsAccounts() | HasMany | AdsAccount |
ads_account_business_managers
Pivot many-to-many antara ads_accounts dan member_bms.
| Field | Tipe |
|---|---|
id | UUID (PK) |
ads_account_id | UUID (FK) |
member_bm_id | UUID (FK) |
| timestamps | — |
facebook_businesses
Cache data BM dari Meta Graph API — hasil import via API engine.
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
user_facebook_token_id | UUID (FK) | Token Facebook yang dipakai import |
bm_id | string | ID BM dari Meta |
name | string | Nama BM |
verification_status | string | Status verifikasi BM |
country | string | Negara |
primary_page | array (JSON) | Info page utama |
metadata | array (JSON) | Data tambahan |
| timestamps | — |
facebook_ad_accounts
Cache ad accounts dari Meta — hasil import via API engine.
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
user_facebook_token_id | UUID (FK) | Token yang dipakai |
business_id | UUID (FK) | → facebook_businesses.id |
account_id | string | ID akun iklan Meta |
name | string | Nama akun |
account_status | integer | Status dari Meta |
currency | string | Mata uang |
timezone_name | string | Timezone |
balance | decimal:2 | Saldo |
amount_spent | decimal:2 | Total spend |
spend_cap | decimal:2 | Spend cap |
insights | array (JSON) | Metrik performa cache |
last_synced_at | datetime | |
| timestamps | — |
user_facebook_tokens
Long-lived token Facebook per user (terutama admin yang melakukan import).
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
user_id | UUID (FK) | → users.id |
facebook_user_id | string | ID user Facebook |
facebook_user_name | string | Nama user Facebook |
access_token | text | Encrypted (Crypt::encrypt + SALTED_CREAMY salt) |
expires_at | datetime | Masa berlaku (60 hari setelah refresh) |
is_active | boolean | |
needs_reauth | boolean | Flag bila refresh gagal |
| timestamps | — |
Token refresh
Command facebook:refresh-tokens (di API engine, dailyAt('02:00')):
$tokens = UserFacebookToken::active()
->where('expires_at', '<=', now()->addDays(7))
->where('expires_at', '>', now())
->get();
foreach ($tokens as $token) {
$longLivedData = $this->apiService->getLongLivedToken($token->access_token);
$token->update([
'access_token' => Crypt::encrypt($newToken . '|' . env('SALTED_CREAMY')),
'expires_at' => now()->addDays(60),
]);
}Threshold: 7 hari sebelum expired. Bila gagal: needs_reauth = true.
Import jobs (import_jobs)
Tracking progress import massal BM/Ad Accounts via queue.
| Field | Tipe | Catatan |
|---|---|---|
id | UUID (PK) | |
user_facebook_token_id | UUID (FK) | Token yang dipakai |
type | string | bm / ad_accounts |
status | string | pending / processing / completed / failed / cancelled |
total_items | integer | Total yang akan di-import |
processed_items | integer | Sudah diproses |
error_message | text (nullable) | Bila failed |
started_at | datetime | |
completed_at | datetime | |
| timestamps | — |
Endpoint tracking: GET /api/facebook/import-jobs/{jobId}, GET /api/facebook/import-jobs/{jobId}/cancel.
Langkah berikutnya
- Detail alur import massal? Lihat API Reference > Facebook OAuth BM.
- Schema akun iklan yang disewa? Lihat Ads Accounts.
- Detail token refresh? Baca External Services.