Prepare BizOne portal production wallet and UI

This commit is contained in:
2026-05-22 13:13:10 +07:00
parent 36be8607e0
commit 5144207c42
124 changed files with 11034 additions and 7720 deletions

View File

@ -0,0 +1,58 @@
CREATE TABLE "wallets" (
"id" TEXT NOT NULL,
"owner_key" TEXT NOT NULL,
"currency" TEXT NOT NULL DEFAULT 'IDR',
"balance_minor" INTEGER NOT NULL DEFAULT 0,
"held_minor" INTEGER NOT NULL DEFAULT 0,
"status" TEXT NOT NULL DEFAULT 'active',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "wallets_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wallet_transactions" (
"id" TEXT NOT NULL,
"wallet_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"direction" TEXT NOT NULL,
"amount_minor" INTEGER NOT NULL,
"balance_before_minor" INTEGER NOT NULL,
"balance_after_minor" INTEGER NOT NULL,
"status" TEXT NOT NULL DEFAULT 'posted',
"reference_type" TEXT,
"reference_id" TEXT,
"description" TEXT,
"metadata_json" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wallet_transactions_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "payment_orders" (
"id" TEXT NOT NULL,
"wallet_id" TEXT NOT NULL,
"provider" TEXT NOT NULL DEFAULT 'midtrans',
"provider_order_id" TEXT NOT NULL,
"amount_minor" INTEGER NOT NULL,
"currency" TEXT NOT NULL DEFAULT 'IDR',
"status" TEXT NOT NULL DEFAULT 'pending',
"snap_token" TEXT,
"redirect_url" TEXT,
"paid_at" TIMESTAMP(3),
"expired_at" TIMESTAMP(3),
"metadata_json" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "payment_orders_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "wallets_owner_key_key" ON "wallets"("owner_key");
CREATE INDEX "wallet_transactions_wallet_id_created_at_idx" ON "wallet_transactions"("wallet_id", "created_at");
CREATE INDEX "wallet_transactions_reference_type_reference_id_idx" ON "wallet_transactions"("reference_type", "reference_id");
CREATE UNIQUE INDEX "payment_orders_provider_order_id_key" ON "payment_orders"("provider_order_id");
CREATE INDEX "payment_orders_wallet_id_status_idx" ON "payment_orders"("wallet_id", "status");
ALTER TABLE "wallet_transactions" ADD CONSTRAINT "wallet_transactions_wallet_id_fkey" FOREIGN KEY ("wallet_id") REFERENCES "wallets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "payment_orders" ADD CONSTRAINT "payment_orders_wallet_id_fkey" FOREIGN KEY ("wallet_id") REFERENCES "wallets"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -231,3 +231,60 @@ model CampaignRecipient {
@@index([campaignId, sentAt])
@@map("campaign_recipients")
}
model Wallet {
id String @id @default(uuid())
ownerKey String @unique @map("owner_key")
currency String @default("IDR")
balanceMinor Int @default(0) @map("balance_minor")
heldMinor Int @default(0) @map("held_minor")
status String @default("active")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
transactions WalletTransaction[]
paymentOrders PaymentOrder[]
@@map("wallets")
}
model WalletTransaction {
id String @id @default(uuid())
walletId String @map("wallet_id")
type String
direction String
amountMinor Int @map("amount_minor")
balanceBeforeMinor Int @map("balance_before_minor")
balanceAfterMinor Int @map("balance_after_minor")
status String @default("posted")
referenceType String? @map("reference_type")
referenceId String? @map("reference_id")
description String?
metadataJson Json? @map("metadata_json")
createdAt DateTime @default(now()) @map("created_at")
wallet Wallet @relation(fields: [walletId], references: [id], onDelete: Cascade)
@@index([walletId, createdAt])
@@index([referenceType, referenceId])
@@map("wallet_transactions")
}
model PaymentOrder {
id String @id @default(uuid())
walletId String @map("wallet_id")
provider String @default("midtrans")
providerOrderId String @unique @map("provider_order_id")
amountMinor Int @map("amount_minor")
currency String @default("IDR")
status String @default("pending")
snapToken String? @map("snap_token")
redirectUrl String? @map("redirect_url")
paidAt DateTime? @map("paid_at")
expiredAt DateTime? @map("expired_at")
metadataJson Json? @map("metadata_json")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
wallet Wallet @relation(fields: [walletId], references: [id], onDelete: Cascade)
@@index([walletId, status])
@@map("payment_orders")
}