D
Engineering

Database

Konco memakai PostgreSQL (web app) dan MySQL/MariaDB (API engine). Semua primary key UUID string via trait App\Traits\UUID. 55+ model dikategorikan: Order, AdsAccount, Stock, Ticket, Transfer, Fee, Coupon, Notification.

Konco memakai dua database terpisah — PostgreSQL untuk dazo-whitelist (web app, default pgsql) dan MySQL/MariaDB untuk dazo-whitelist-api (engine). Seluruh tabel utama memakai UUID string sebagai primary key via trait App\Traits\UUID.

Koneksi database

RepoDefault driverDB
dazo-whitelistpgsql (PostgreSQL)konco_db (default)
dazo-whitelist-apimysql (MySQL/MariaDB)konco_api_db

Primary key: UUID

Semua model utama memakai UUIDv4 string. Trait App\Traits\UUID (app/Traits/UUID.php) otomatis generate UUID saat creating event:

php
trait UUID
{
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if ($model->getKey() === null) {
                $model->setAttribute($model->getKeyName(), Str::uuid()->toString());
            }
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

Di migration, primary key didefinisikan sebagai:

php
$table->uuid('id')->primary();

Trait wajib model

TraitLokasiFungsi
App\Traits\UUIDapp/Traits/UUID.phpGenerate UUIDv4 primary key, set $keyType='string', $incrementing=false
App\Traits\WithAuthorapp/Traits/WithAuthor.phpAuto-isi created_by / updated_by dari Auth::id() saat saving event
App\Traits\DateTimeTraitapp/Traits/DateTimeTrait.phpUtility date/time formatting

Contoh model baru:

php
use App\Traits\UUID;
use App\Traits\WithAuthor;

class YourModel extends Model
{
    use UUID, WithAuthor;

    protected $keyType = 'string';
    public $incrementing = false;
}

Model dazo-whitelist (55+)

Dikategorikan berdasarkan domain:

Order & Payment

ModelCatatan
OrderMaster order — polymorphic ke OrderSubscribe, OrderTopup, OrderWithdraw, OrderTransferBalance, OrderDeduct, OrderPayment, OrderBusinessManager
OrderSubscribeOrder sewa akun
OrderTopupOrder top up spend cap
OrderWithdrawOrder penarikan saldo
OrderTransferBalance + OrderTransferBalanceDetailOrder transfer saldo antar-akun
OrderDeductOrder biaya admin/fee
OrderPaymentOrder pembayaran
OrderBusinessManagerOrder BM
PaymentRecord pembayaran
PaymentMethodMaster metode pembayaran
RefundRecord refund
BankAccountMaster rekening bank

Ads & Stock

ModelCatatan
AdsAccountAkun iklan member — konstanta EXPIRED_BEFORE=7, EXPIRED_AFTER=4
StockAdsAccountStok akun iklan (inventaris)
StockBmStok Business Manager
MemberBmBM milik member
AdsAccountBusinessManagerRelasi akun iklan ↔ BM
AdsAccountFundingFunding history akun iklan
AdCampaignCampaign cache
AdAdsetAd set cache
AdAdAd cache
AdsExportScheduleJadwal export laporan iklan (daily/weekly)
UserAdsColumnPreferencePreferensi kolom ads manager per user
PixelConfigurationKonfigurasi pixel
FacebookBusiness / FacebookAdAccountData BM/Ad Account dari Meta (cache lokal)
UserFacebookTokenToken Facebook per user (di web app)

Admin Request & Approval

ModelCatatan
AdminRequestMaster request — approval workflow (akun baru, topup, transfer, withdraw, refund, rename, share pixel)
AdminRequestItemItem detail per request
AdminRequestHistoryAudit log perubahan status request

Ticketing

ModelCatatan
TicketMaster tiket bantuan
TicketMessagePesan tiket (member ↔ admin) — event TicketMessageCreated
TicketAdsAccountRelasi tiket ↔ akun iklan
TicketActivityAudit aktivitas tiket (status change)
AttachmentLampiran pesan tiket

Transfer Balance

ModelCatatan
TransferBalanceMaster transaksi transfer saldo antar-akun
TransferBalanceDetailDetail per-item transfer

Fee & Coupon

ModelCatatan
FeeSettingMaster tarif sewa, biaya admin, persentase topup
FeeSegmentSegment fee per tier member
FeeSegmentMemberMapping member ke segment
CouponMaster voucher
CouponForTarget member kupon

User & Team & Auth

ModelCatatan
UserUser gabungan (admin + member) — guard dibedakan via role
MemberProfil member
TeamTim member
Role / PermissionSpatie RBAC
UserAuthenticatorGoogle 2FA secret per user
NotificationNotifikasi in-app
NotificationSettingPreferensi notifikasi per user

System

ModelCatatan
ConfigKey-value store — termasuk api_token Passport client
ApplicationAplikasi klien Passport (id, secret, public_key)
WebhookLogAudit trail webhook payment gateway
ImportJobProgress import massal BM/Ad Accounts
NewsPengumuman sistem
SubscribeMaster paket subscription

Model dazo-whitelist-api (16)

ModelCatatan
ApplicationAplikasi klien Passport — verify RSA signature
UserUser admin API engine
UserFacebookTokenLong-lived token Facebook + needs_reauth flag
StockBmStok BM
StockAdsAccountStok akun iklan
AdsAccountAkun iklan aktif
AdsAccountFundingFunding history
MemberBmBM member
TransferBalance / TransferBalanceDetailTransfer saldo
ImportJobProgress import massal
AdminRequest / AdminRequestItemMirror request dari web app
OrderMirror order
FacebookAdAccountCache ad account dari Meta
JobsModel untuk tabel jobs queue worker

Migration vs seeder

dazo-whitelist memakai migration standar Laravel untuk schema (database/migrations/). Tidak seperti dazoapp yang memakai MongoDB + seeder, Konco memakai PostgreSQL relasional — migration adalah sumber kebenaran schema.

Tabel utama menggunakan pola:

php
Schema::create('ads_accounts', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->foreignUuid('stock_ads_account_id')->constrained();
    $table->foreignUuid('member_bm_id')->constrained();
    $table->date('expired');
    $table->boolean('is_active')->default(true);
    $table->uuid('created_by')->nullable();
    $table->uuid('updated_by')->nullable();
    $table->timestamps();
});

Konstanta penting

KonstantaLokasiNilaiDampak
AdsAccount::EXPIRED_BEFOREapp/Models/AdsAccount.php:267Hari sebelum expired untuk trigger reminder H-7
AdsAccount::EXPIRED_AFTERapp/Models/AdsAccount.php:274Hari grace period setelah expired sebelum deactivate

Raw query PostgreSQL

Beberapa query memakai syntax PostgreSQL spesifik — break bila pindah MySQL:

LokasiSyntaxCatatan
AdsExpired.php:188-190data::jsonb ->> 'model' = ?Query JSONB kolom data di tabel notifications
WithdrawIndexWire.php:126INTERVAL '4 days'Interval date
AdsBalanceIndexWire.php:114INTERVAL '4 days'Interval date

Langkah berikutnya