generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Role { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(50) name String @db.VarChar(100) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") users User[] @@map("roles") } model User { id BigInt @id @default(autoincrement()) roleId BigInt @map("role_id") role Role @relation(fields: [roleId], references: [id], onDelete: Restrict) name String @db.VarChar(150) username String? @unique @db.VarChar(50) email String? @unique @db.VarChar(150) emailVerifiedAt DateTime? @map("email_verified_at") phone String? @db.VarChar(50) passwordHash String? @map("password_hash") @db.VarChar(255) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") purchases Purchase[] receipts Receipt[] createdTransformations LotTransformation[] @relation("TransformationCreatedBy") createdStockAdjustments StockAdjustment[] @relation("StockAdjustmentCreatedBy") createdWashings LotWashing[] @relation("WashingCreatedBy") completedWashings LotWashing[] @relation("WashingCompletedBy") createdConsignments Consignment[] @relation("ConsignmentCreatedBy") createdRegularSales RegularSale[] @relation("RegularSaleCreatedBy") createdJitSales JitSale[] @relation("JitSaleCreatedBy") createdFundRequests FundRequest[] @relation("FundRequestCreatedBy") passwordResetTokens PasswordResetToken[] emailVerificationTokens EmailVerificationToken[] auditTrails AuditTrail[] @@map("users") } model AuditTrail { id BigInt @id @default(autoincrement()) userId BigInt? @map("user_id") user User? @relation(fields: [userId], references: [id], onDelete: SetNull) action String @db.VarChar(100) entityType String @map("entity_type") @db.VarChar(100) entityId String? @map("entity_id") @db.VarChar(100) method String @db.VarChar(10) pathname String @db.VarChar(255) statusCode Int @map("status_code") summary String? @db.VarChar(255) metadata Json? occurredAt DateTime @default(now()) @map("occurred_at") @@index([action, occurredAt]) @@index([entityType, occurredAt]) @@index([userId, occurredAt]) @@map("audit_trails") } model PasswordResetToken { id BigInt @id @default(autoincrement()) userId BigInt @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) tokenHash String @unique @map("token_hash") @db.VarChar(255) purpose String @default("RESET_PASSWORD") @db.VarChar(50) expiresAt DateTime @map("expires_at") usedAt DateTime? @map("used_at") createdAt DateTime @default(now()) @map("created_at") @@map("password_reset_tokens") } model EmailVerificationToken { id BigInt @id @default(autoincrement()) userId BigInt @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) tokenHash String @unique @map("token_hash") @db.VarChar(255) expiresAt DateTime @map("expires_at") usedAt DateTime? @map("used_at") createdAt DateTime @default(now()) @map("created_at") @@map("email_verification_tokens") } model Buyer { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(50) name String @db.VarChar(150) phone String? @db.VarChar(50) email String? @db.VarChar(150) bankName String? @map("bank_name") @db.VarChar(100) bankAccountNumber String? @map("bank_account_number") @db.VarChar(100) address String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") contactPeople BuyerContactPerson[] consignmentsAsBuyer Consignment[] @relation("ConsignmentBuyer") regularSalesAsBuyer RegularSale[] @relation("RegularSaleBuyer") jitSalesAsBuyer JitSale[] @relation("JitSaleBuyer") @@map("buyers") } model BuyerContactPerson { id BigInt @id @default(autoincrement()) buyerId BigInt @map("buyer_id") buyer Buyer @relation(fields: [buyerId], references: [id], onDelete: Cascade) name String @db.VarChar(150) mobilePhone String? @map("mobile_phone") @db.VarChar(50) email String? @db.VarChar(150) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("buyer_contact_people") } model Employee { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) email String? @db.VarChar(150) mobile String? @db.VarChar(50) position String @db.VarChar(150) address String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") receivedPurchases Purchase[] @@map("employees") } model Courier { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) address String? phone String? @db.VarChar(50) website String? @db.VarChar(255) email String? @db.VarChar(150) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") purchases Purchase[] regularSales RegularSale[] jitSales JitSale[] @@map("couriers") } model WashingPlace { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) address String? phone String? @db.VarChar(50) website String? @db.VarChar(255) email String? @db.VarChar(150) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") contactPeople WashingPlaceContactPerson[] washings LotWashing[] @@map("washing_places") } model WashingPlaceContactPerson { id BigInt @id @default(autoincrement()) washingPlaceId BigInt @map("washing_place_id") washingPlace WashingPlace @relation(fields: [washingPlaceId], references: [id], onDelete: Cascade) name String @db.VarChar(150) mobilePhone String? @map("mobile_phone") @db.VarChar(50) email String? @db.VarChar(150) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("washing_place_contact_people") } model Grade { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) legacyCode String? @unique @map("legacy_code") @db.VarChar(20) isMangkok Boolean @default(false) @map("is_mangkok") name String @db.VarChar(150) description String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") buyPriceStandards GradeBuyPriceStandard[] sellPriceStandards GradeSellPriceStandard[] purchaseLines PurchaseLine[] receiptLines ReceiptLine[] lots InventoryLot[] jitSaleLines JitSaleLine[] @@map("grades") } model GradeBuyPriceStandard { id BigInt @id @default(autoincrement()) gradeId BigInt @map("grade_id") grade Grade @relation(fields: [gradeId], references: [id], onDelete: Cascade) startDate DateTime @map("start_date") @db.Date endDate DateTime? @map("end_date") @db.Date minPrice Decimal @map("min_price") @db.Decimal(18, 2) maxPrice Decimal @map("max_price") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("grade_buy_price_standards") } model GradeSellPriceStandard { id BigInt @id @default(autoincrement()) gradeId BigInt @map("grade_id") grade Grade @relation(fields: [gradeId], references: [id], onDelete: Cascade) startDate DateTime @map("start_date") @db.Date endDate DateTime? @map("end_date") @db.Date minPrice Decimal @map("min_price") @db.Decimal(18, 2) maxPrice Decimal @map("max_price") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("grade_sell_price_standards") } model Warehouse { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(50) name String @db.VarChar(100) address String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") locations WarehouseLocation[] receiptLines ReceiptLine[] lots InventoryLot[] purchaseLines PurchaseLine[] @@map("warehouses") } model Unit { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(50) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") purchaseLines PurchaseLine[] receiptLines ReceiptLine[] lots InventoryLot[] @@map("units") } model Currency { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(10) name String @db.VarChar(100) description String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("currencies") } model Bank { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(3) name String @unique @db.VarChar(150) address String? status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") agentBankAccounts AgentBankAccount[] salesBankAccounts SalesBankAccount[] companyBankAccounts CompanyBankAccount[] @@map("banks") } model ProfitShareScheme { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) shareAgent Decimal @map("share_agent") @db.Decimal(5, 2) shareCompany Decimal @map("share_company") @db.Decimal(5, 2) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") agents Agent[] purchases Purchase[] jitSaleLines JitSaleLine[] @@map("profit_share_schemes") } model Agent { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) identityType String @map("identity_type") @db.VarChar(20) identityNumber String @map("identity_number") @db.VarChar(100) mobilePhone String? @map("mobile_phone") @db.VarChar(50) email String? @db.VarChar(150) address String? notes String? joinDate DateTime @map("join_date") @db.Date profitShareSchemeId BigInt @map("profit_share_scheme_id") profitShareScheme ProfitShareScheme @relation(fields: [profitShareSchemeId], references: [id], onDelete: Restrict) currentBalance Decimal @default(0) @map("current_balance") @db.Decimal(18, 2) capitalBalance Decimal @default(0) @map("capital_balance") @db.Decimal(18, 2) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") bankAccounts AgentBankAccount[] balanceMutations AgentBalanceMutation[] fundRequests FundRequest[] purchases Purchase[] @relation("PurchaseAgent") buyoutPurchases Purchase[] @relation("PurchaseBuyoutSourceAgent") jitSaleLines JitSaleLine[] @@unique([identityType, identityNumber]) @@map("agents") } model AgentBankAccount { id BigInt @id @default(autoincrement()) agentId BigInt @map("agent_id") agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade) bankId BigInt @map("bank_id") bank Bank @relation(fields: [bankId], references: [id], onDelete: Restrict) accountNumber String @map("account_number") @db.VarChar(100) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") fundRequests FundRequest[] @@unique([agentId, bankId, accountNumber]) @@map("agent_bank_accounts") } model AgentBalanceMutation { id BigInt @id @default(autoincrement()) agentId BigInt @map("agent_id") agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade) balanceType String @map("balance_type") @db.VarChar(30) direction String @db.VarChar(10) source String @db.VarChar(50) amount Decimal @db.Decimal(18, 2) balanceAfter Decimal @map("balance_after") @db.Decimal(18, 2) occurredAt DateTime @default(now()) @map("occurred_at") effectiveDate DateTime? @map("effective_date") @db.Date referenceType String? @map("reference_type") @db.VarChar(50) referenceId String? @map("reference_id") @db.VarChar(100) referenceNo String? @map("reference_no") @db.VarChar(100) notes String? metadata Json? @@index([agentId, occurredAt]) @@index([agentId, balanceType, occurredAt]) @@map("agent_balance_mutations") } model FundRequest { id BigInt @id @default(autoincrement()) requestNo String @unique @map("request_no") @db.VarChar(50) referenceNo String @map("reference_no") @db.VarChar(100) transferType String @map("transfer_type") @db.VarChar(30) agentId BigInt @map("agent_id") agent Agent @relation(fields: [agentId], references: [id], onDelete: Restrict) agentBankAccountId BigInt @map("agent_bank_account_id") agentBankAccount AgentBankAccount @relation(fields: [agentBankAccountId], references: [id], onDelete: Restrict) companyBankAccountId BigInt? @map("company_bank_account_id") companyBankAccount CompanyBankAccount? @relation(fields: [companyBankAccountId], references: [id], onDelete: Restrict) agentBankNameSnapshot String @map("agent_bank_name_snapshot") @db.VarChar(150) agentAccountNumberSnapshot String @map("agent_account_number_snapshot") @db.VarChar(100) companyBankNameSnapshot String @map("company_bank_name_snapshot") @db.VarChar(150) companyAccountNumberSnapshot String @map("company_account_number_snapshot") @db.VarChar(100) amount Decimal @db.Decimal(18, 2) currencyCode String @default("IDR") @map("currency_code") @db.VarChar(10) transferredAt DateTime @map("transferred_at") transferProofFileUrl String? @map("transfer_proof_file_url") @db.VarChar(255) status String @default("SUBMITTED") @db.VarChar(20) createdById BigInt @map("created_by") createdBy User @relation("FundRequestCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([agentId, transferredAt]) @@index([transferType, transferredAt]) @@map("fund_requests") } model Sales { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(20) name String @db.VarChar(150) identityType String @map("identity_type") @db.VarChar(20) identityNumber String @map("identity_number") @db.VarChar(100) mobilePhone String? @map("mobile_phone") @db.VarChar(50) email String? @db.VarChar(150) address String? notes String? joinDate DateTime @map("join_date") @db.Date commissionBalance Decimal @default(0) @map("commission_balance") @db.Decimal(18, 2) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") bankAccounts SalesBankAccount[] consignments Consignment[] @relation("ConsignmentSales") commissionMutations SalesCommissionMutation[] @@unique([identityType, identityNumber]) @@map("sales") } model SalesCommissionMutation { id BigInt @id @default(autoincrement()) salesId BigInt @map("sales_id") sales Sales @relation(fields: [salesId], references: [id], onDelete: Cascade) source String @db.VarChar(50) direction String @db.VarChar(10) amount Decimal @db.Decimal(18, 2) balanceAfter Decimal @map("balance_after") @db.Decimal(18, 2) occurredAt DateTime @default(now()) @map("occurred_at") effectiveDate DateTime? @map("effective_date") @db.Date referenceType String? @map("reference_type") @db.VarChar(50) referenceId String? @map("reference_id") @db.VarChar(100) referenceNo String? @map("reference_no") @db.VarChar(100) notes String? metadata Json? @@index([salesId, occurredAt]) @@map("sales_commission_mutations") } model SalesBankAccount { id BigInt @id @default(autoincrement()) salesId BigInt @map("sales_id") sales Sales @relation(fields: [salesId], references: [id], onDelete: Cascade) bankId BigInt @map("bank_id") bank Bank @relation(fields: [bankId], references: [id], onDelete: Restrict) accountNumber String @map("account_number") @db.VarChar(100) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@unique([salesId, bankId, accountNumber]) @@map("sales_bank_accounts") } model WarehouseLocation { id BigInt @id @default(autoincrement()) warehouseId BigInt @map("warehouse_id") warehouse Warehouse @relation(fields: [warehouseId], references: [id], onDelete: Restrict) code String @db.VarChar(50) name String @db.VarChar(100) locationType String? @map("location_type") @db.VarChar(50) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") receiptLines ReceiptLine[] lots InventoryLot[] purchaseLines PurchaseLine[] @@unique([warehouseId, code]) @@map("warehouse_locations") } model AdjustmentReason { id BigInt @id @default(autoincrement()) code String @unique @db.VarChar(50) name String @db.VarChar(100) category String @db.VarChar(50) status String @default("ACTIVE") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") stockAdjustments StockAdjustment[] @@map("adjustment_reasons") } model Purchase { id BigInt @id @default(autoincrement()) purchaseNo String @unique @map("purchase_no") @db.VarChar(50) purchaseType String @default("REGULAR") @map("purchase_type") @db.VarChar(30) purchaseDate DateTime @map("purchase_date") @db.Date supplierInvoiceNo String? @map("supplier_invoice_no") @db.VarChar(100) agentId BigInt? @map("agent_id") agent Agent? @relation("PurchaseAgent", fields: [agentId], references: [id], onDelete: Restrict) buyoutSourceAgentId BigInt? @map("buyout_source_agent_id") buyoutSourceAgent Agent? @relation("PurchaseBuyoutSourceAgent", fields: [buyoutSourceAgentId], references: [id], onDelete: Restrict) profitShareSchemeId BigInt? @map("profit_share_scheme_id") profitShareScheme ProfitShareScheme? @relation(fields: [profitShareSchemeId], references: [id], onDelete: Restrict) courierId BigInt? @map("courier_id") courier Courier? @relation(fields: [courierId], references: [id], onDelete: Restrict) receivedByEmployeeId BigInt? @map("received_by_employee_id") receivedByEmployee Employee? @relation(fields: [receivedByEmployeeId], references: [id], onDelete: Restrict) receivedAt DateTime? @map("received_at") moistureBuyPercent Decimal? @map("moisture_buy_percent") @db.Decimal(7, 2) moistureReceivedPercent Decimal? @map("moisture_received_percent") @db.Decimal(7, 2) aboveAverageRatioPercent Decimal? @map("above_average_ratio_percent") @db.Decimal(7, 2) mkSharePercent Decimal? @map("mk_share_percent") @db.Decimal(7, 2) nonMkSharePercent Decimal? @map("non_mk_share_percent") @db.Decimal(7, 2) shippingCost Decimal? @map("shipping_cost") @db.Decimal(18, 2) incomingOperationalCost Decimal? @map("incoming_operational_cost") @db.Decimal(18, 2) afterArrivalOperationalCost Decimal? @map("after_arrival_operational_cost") @db.Decimal(18, 2) status String @default("DRAFT") @db.VarChar(20) notes String? createdById BigInt @map("created_by") createdBy User @relation(fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lines PurchaseLine[] receipts Receipt[] lots InventoryLot[] analysis PurchaseAnalysis? lotAllocations LotPurchaseAllocation[] realizationEntries PurchaseRealizationEntry[] realizationSummary PurchaseRealizationSummary? @@map("purchases") } model PurchaseLine { id BigInt @id @default(autoincrement()) purchaseId BigInt @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Cascade) gradeId BigInt? @map("grade_id") grade Grade? @relation(fields: [gradeId], references: [id], onDelete: Restrict) sourceLotId BigInt? @map("source_lot_id") sourceLot InventoryLot? @relation("OfficeBuyoutSourceLot", fields: [sourceLotId], references: [id], onDelete: Restrict) qtyOrdered Decimal @map("qty_ordered") @db.Decimal(18, 3) purchaseMoisturePercent Decimal? @map("purchase_moisture_percent") @db.Decimal(7, 2) qtyReceived Decimal @default(0) @map("qty_received") @db.Decimal(18, 3) qtyAccepted Decimal @default(0) @map("qty_accepted") @db.Decimal(18, 3) qtyRejected Decimal @map("qty_rejected") @db.Decimal(18, 3) moistureReceivedPercent Decimal? @map("moisture_received_percent") @db.Decimal(7, 2) unitId BigInt @map("unit_id") unit Unit @relation(fields: [unitId], references: [id], onDelete: Restrict) unitPrice Decimal @map("unit_price") @db.Decimal(18, 2) buyoutMalUnitPriceSnapshot Decimal? @map("buyout_mal_unit_price_snapshot") @db.Decimal(18, 2) buyoutAgentSharePercent Decimal? @map("buyout_agent_share_percent") @db.Decimal(5, 2) buyoutProfitAmount Decimal? @map("buyout_profit_amount") @db.Decimal(18, 2) buyoutAgentCommission Decimal? @map("buyout_agent_commission") @db.Decimal(18, 2) marketReferencePrice Decimal? @map("market_reference_price") @db.Decimal(18, 2) unitCost Decimal @default(0) @map("unit_cost") @db.Decimal(18, 2) malUnitPrice Decimal? @map("mal_unit_price") @db.Decimal(18, 2) subtotal Decimal @db.Decimal(18, 2) classificationStatus String @default("FINAL") @map("classification_status") @db.VarChar(20) warehouseId BigInt? @map("warehouse_id") warehouse Warehouse? @relation(fields: [warehouseId], references: [id], onDelete: Restrict) warehouseLocationId BigInt? @map("warehouse_location_id") warehouseLocation WarehouseLocation? @relation(fields: [warehouseLocationId], references: [id], onDelete: Restrict) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") receiptLines ReceiptLine[] lots InventoryLot[] lotAllocations LotPurchaseAllocation[] @@map("purchase_lines") } model Receipt { id BigInt @id @default(autoincrement()) receiptNo String @unique @map("receipt_no") @db.VarChar(50) purchaseId BigInt @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Restrict) receiptDate DateTime @map("receipt_date") @db.Date status String @default("DRAFT") @db.VarChar(20) notes String? receivedById BigInt @map("received_by") receivedBy User @relation(fields: [receivedById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lines ReceiptLine[] lots InventoryLot[] @@map("receipts") } model ReceiptLine { id BigInt @id @default(autoincrement()) receiptId BigInt @map("receipt_id") receipt Receipt @relation(fields: [receiptId], references: [id], onDelete: Cascade) purchaseLineId BigInt @map("purchase_line_id") purchaseLine PurchaseLine @relation(fields: [purchaseLineId], references: [id], onDelete: Restrict) gradeId BigInt? @map("grade_id") grade Grade? @relation(fields: [gradeId], references: [id], onDelete: Restrict) qtyReceived Decimal @map("qty_received") @db.Decimal(18, 3) qtyAccepted Decimal @map("qty_accepted") @db.Decimal(18, 3) qtyRejected Decimal @default(0) @map("qty_rejected") @db.Decimal(18, 3) moisturePercent Decimal? @map("moisture_percent") @db.Decimal(7, 2) unitId BigInt @map("unit_id") unit Unit @relation(fields: [unitId], references: [id], onDelete: Restrict) unitCost Decimal @map("unit_cost") @db.Decimal(18, 2) warehouseId BigInt @map("warehouse_id") warehouse Warehouse @relation(fields: [warehouseId], references: [id], onDelete: Restrict) warehouseLocationId BigInt? @map("warehouse_location_id") warehouseLocation WarehouseLocation? @relation(fields: [warehouseLocationId], references: [id], onDelete: Restrict) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lots InventoryLot[] @@map("receipt_lines") } model InventoryLot { id BigInt @id @default(autoincrement()) lotCode String @unique @map("lot_code") @db.VarChar(100) parentLotId BigInt? @map("parent_lot_id") parentLot InventoryLot? @relation("LotHierarchy", fields: [parentLotId], references: [id], onDelete: Restrict) childLots InventoryLot[] @relation("LotHierarchy") sourceType String @map("source_type") @db.VarChar(30) sourceRefId BigInt? @map("source_ref_id") purchaseId BigInt? @map("purchase_id") purchase Purchase? @relation(fields: [purchaseId], references: [id], onDelete: Restrict) purchaseLineId BigInt? @map("purchase_line_id") purchaseLine PurchaseLine? @relation(fields: [purchaseLineId], references: [id], onDelete: Restrict) receiptId BigInt? @map("receipt_id") receipt Receipt? @relation(fields: [receiptId], references: [id], onDelete: Restrict) receiptLineId BigInt? @map("receipt_line_id") receiptLine ReceiptLine? @relation(fields: [receiptLineId], references: [id], onDelete: Restrict) gradeId BigInt? @map("grade_id") grade Grade? @relation(fields: [gradeId], references: [id], onDelete: Restrict) warehouseId BigInt @map("warehouse_id") warehouse Warehouse @relation(fields: [warehouseId], references: [id], onDelete: Restrict) warehouseLocationId BigInt? @map("warehouse_location_id") warehouseLocation WarehouseLocation? @relation(fields: [warehouseLocationId], references: [id], onDelete: Restrict) originalQty Decimal @map("original_qty") @db.Decimal(18, 3) availableQty Decimal @map("available_qty") @db.Decimal(18, 3) reservedQty Decimal @default(0) @map("reserved_qty") @db.Decimal(18, 3) damagedQty Decimal @default(0) @map("damaged_qty") @db.Decimal(18, 3) shrinkageQty Decimal @default(0) @map("shrinkage_qty") @db.Decimal(18, 3) finalMoisturePercent Decimal? @map("final_moisture_percent") @db.Decimal(7, 2) aboveAverageRatioPercent Decimal? @map("above_average_ratio_percent") @db.Decimal(7, 2) unitId BigInt @map("unit_id") unit Unit @relation(fields: [unitId], references: [id], onDelete: Restrict) unitCost Decimal @map("unit_cost") @db.Decimal(18, 2) receivedAt DateTime @map("received_at") status String @default("ACTIVE") @db.VarChar(20) qrCodeValue String? @map("qr_code_value") @db.VarChar(255) barcodeValue String? @map("barcode_value") @db.VarChar(255) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") sourcedBuyoutLines PurchaseLine[] @relation("OfficeBuyoutSourceLot") transformationInputs LotTransformationInput[] @relation("TransformationInputLot") transformationOutputs LotTransformationOutput[] @relation("TransformationOutputLot") stockAdjustments StockAdjustment[] washings LotWashing[] consignmentLines ConsignmentLine[] regularSaleLines RegularSaleLine[] purchaseAllocations LotPurchaseAllocation[] realizationEntries PurchaseRealizationEntry[] @@map("inventory_lots") } model Consignment { id BigInt @id @default(autoincrement()) consignmentNo String @unique @map("consignment_no") @db.VarChar(50) consignmentDate DateTime @map("consignment_date") @db.Date salesId BigInt @map("sales_id") sales Sales @relation("ConsignmentSales", fields: [salesId], references: [id], onDelete: Restrict) buyerId BigInt @map("buyer_id") buyer Buyer @relation("ConsignmentBuyer", fields: [buyerId], references: [id], onDelete: Restrict) status String @default("OPEN") @db.VarChar(20) notes String? createdById BigInt @map("created_by") createdBy User @relation("ConsignmentCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lines ConsignmentLine[] @@map("consignments") } model ConsignmentLine { id BigInt @id @default(autoincrement()) consignmentId BigInt @map("consignment_id") consignment Consignment @relation(fields: [consignmentId], references: [id], onDelete: Cascade) lotId BigInt @map("lot_id") lot InventoryLot @relation(fields: [lotId], references: [id], onDelete: Restrict) qtyConsigned Decimal @map("qty_consigned") @db.Decimal(18, 3) availableQtySnapshot Decimal @map("available_qty_snapshot") @db.Decimal(18, 3) malUnitPriceSnapshot Decimal? @map("mal_unit_price_snapshot") @db.Decimal(18, 2) agentNameSnapshot String? @map("agent_name_snapshot") @db.VarChar(150) agentSharePercent Decimal? @map("agent_share_percent") @db.Decimal(5, 2) status String @default("OPEN") @db.VarChar(20) notes String? closeDate DateTime? @map("close_date") @db.Date sellingPrice Decimal? @map("selling_price") @db.Decimal(18, 2) qtySold Decimal @default(0) @map("qty_sold") @db.Decimal(18, 3) qtyReturned Decimal @default(0) @map("qty_returned") @db.Decimal(18, 3) qtyShrinkage Decimal @default(0) @map("qty_shrinkage") @db.Decimal(18, 3) salesCommission Decimal @default(0) @map("sales_commission") @db.Decimal(18, 2) agentCommission Decimal @default(0) @map("agent_commission") @db.Decimal(18, 2) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("consignment_lines") } model RegularSale { id BigInt @id @default(autoincrement()) saleNo String @unique @map("sale_no") @db.VarChar(50) saleDate DateTime @map("sale_date") @db.Date buyerId BigInt @map("buyer_id") buyer Buyer @relation("RegularSaleBuyer", fields: [buyerId], references: [id], onDelete: Restrict) buyerCurrencyCode String @map("buyer_currency_code") @db.VarChar(10) companyCurrencyCode String @map("company_currency_code") @db.VarChar(10) exchangeRate Decimal? @map("exchange_rate") @db.Decimal(18, 6) courierId BigInt? @map("courier_id") courier Courier? @relation(fields: [courierId], references: [id], onDelete: Restrict) shippingCostBuyer Decimal @default(0) @map("shipping_cost_buyer") @db.Decimal(18, 2) shippingCostCompany Decimal @default(0) @map("shipping_cost_company") @db.Decimal(18, 2) shippingReceiptFileUrl String? @map("shipping_receipt_file_url") @db.VarChar(255) closeDate DateTime? @map("close_date") @db.Date totalNominalBuyer Decimal @default(0) @map("total_nominal_buyer") @db.Decimal(18, 2) totalNominalCompany Decimal @default(0) @map("total_nominal_company") @db.Decimal(18, 2) totalAgentCommission Decimal @default(0) @map("total_agent_commission") @db.Decimal(18, 2) status String @default("IN_PROGRESS") @db.VarChar(20) notes String? createdById BigInt @map("created_by") createdBy User @relation("RegularSaleCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lines RegularSaleLine[] @@map("regular_sales") } model RegularSaleLine { id BigInt @id @default(autoincrement()) regularSaleId BigInt @map("regular_sale_id") regularSale RegularSale @relation(fields: [regularSaleId], references: [id], onDelete: Cascade) lotId BigInt @map("lot_id") lot InventoryLot @relation(fields: [lotId], references: [id], onDelete: Restrict) availableQtySnapshot Decimal @map("available_qty_snapshot") @db.Decimal(18, 3) malUnitPriceSnapshot Decimal? @map("mal_unit_price_snapshot") @db.Decimal(18, 2) agentId BigInt? @map("agent_id") agentNameSnapshot String? @map("agent_name_snapshot") @db.VarChar(150) agentSharePercent Decimal? @map("agent_share_percent") @db.Decimal(5, 2) qtyPlanned Decimal @map("qty_planned") @db.Decimal(18, 3) sellingPricePlanned Decimal @map("selling_price_planned") @db.Decimal(18, 2) qtyActualSold Decimal? @map("qty_actual_sold") @db.Decimal(18, 3) qtyReturned Decimal? @map("qty_returned") @db.Decimal(18, 3) qtyShrinkage Decimal? @map("qty_shrinkage") @db.Decimal(18, 3) sellingPriceActual Decimal? @map("selling_price_actual") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@unique([regularSaleId, lotId]) @@map("regular_sale_lines") } model JitSale { id BigInt @id @default(autoincrement()) saleNo String @unique @map("sale_no") @db.VarChar(50) saleDate DateTime @map("sale_date") @db.Date buyerId BigInt @map("buyer_id") buyer Buyer @relation("JitSaleBuyer", fields: [buyerId], references: [id], onDelete: Restrict) buyerCurrencyCode String @map("buyer_currency_code") @db.VarChar(10) companyCurrencyCode String @map("company_currency_code") @db.VarChar(10) exchangeRate Decimal? @map("exchange_rate") @db.Decimal(18, 6) courierId BigInt? @map("courier_id") courier Courier? @relation(fields: [courierId], references: [id], onDelete: Restrict) shippingCostBuyer Decimal @default(0) @map("shipping_cost_buyer") @db.Decimal(18, 2) shippingCostCompany Decimal @default(0) @map("shipping_cost_company") @db.Decimal(18, 2) shippingReceiptFileUrl String? @map("shipping_receipt_file_url") @db.VarChar(255) closeDate DateTime? @map("close_date") @db.Date totalNominalBuyer Decimal @default(0) @map("total_nominal_buyer") @db.Decimal(18, 2) totalNominalCompany Decimal @default(0) @map("total_nominal_company") @db.Decimal(18, 2) totalAgentCommission Decimal @default(0) @map("total_agent_commission") @db.Decimal(18, 2) status String @default("OPEN") @db.VarChar(20) notes String? createdById BigInt @map("created_by") createdBy User @relation("JitSaleCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lines JitSaleLine[] @@map("jit_sales") } model JitSaleLine { id BigInt @id @default(autoincrement()) jitSaleId BigInt @map("jit_sale_id") jitSale JitSale @relation(fields: [jitSaleId], references: [id], onDelete: Cascade) gradeId BigInt @map("grade_id") grade Grade @relation(fields: [gradeId], references: [id], onDelete: Restrict) qtyPlanned Decimal @map("qty_planned") @db.Decimal(18, 3) qtyActualSold Decimal? @map("qty_actual_sold") @db.Decimal(18, 3) malUnitPrice Decimal @map("mal_unit_price") @db.Decimal(18, 2) sellingPricePlanned Decimal @map("selling_price_planned") @db.Decimal(18, 2) sellingPriceActual Decimal? @map("selling_price_actual") @db.Decimal(18, 2) agentId BigInt? @map("agent_id") agent Agent? @relation(fields: [agentId], references: [id], onDelete: Restrict) agentNameSnapshot String? @map("agent_name_snapshot") @db.VarChar(150) profitShareSchemeId BigInt? @map("profit_share_scheme_id") profitShareScheme ProfitShareScheme? @relation(fields: [profitShareSchemeId], references: [id], onDelete: Restrict) profitShareSchemeName String? @map("profit_share_scheme_name") @db.VarChar(150) agentSharePercent Decimal? @map("agent_share_percent") @db.Decimal(5, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("jit_sale_lines") } model StockAdjustment { id BigInt @id @default(autoincrement()) adjustmentNo String @unique @map("adjustment_no") @db.VarChar(50) lotId BigInt @map("lot_id") lot InventoryLot @relation(fields: [lotId], references: [id], onDelete: Restrict) adjustmentReasonId BigInt @map("adjustment_reason_id") adjustmentReason AdjustmentReason @relation(fields: [adjustmentReasonId], references: [id], onDelete: Restrict) adjustmentDate DateTime @map("adjustment_date") @db.Date qtyChange Decimal @map("qty_change") @db.Decimal(18, 3) availableQtyBefore Decimal @map("available_qty_before") @db.Decimal(18, 3) availableQtyAfter Decimal @map("available_qty_after") @db.Decimal(18, 3) notes String? createdById BigInt @map("created_by") createdBy User @relation("StockAdjustmentCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("stock_adjustments") } model LotTransformation { id BigInt @id @default(autoincrement()) transformationNo String @unique @map("transformation_no") @db.VarChar(50) transformationType String @default("MIX") @map("transformation_type") @db.VarChar(30) transformationDate DateTime @map("transformation_date") @db.Date status String @default("FINALIZED") @db.VarChar(20) remainderMode String? @map("remainder_mode") @db.VarChar(30) remainderQty Decimal? @map("remainder_qty") @db.Decimal(18, 3) processingLossMode String? @map("processing_loss_mode") @db.VarChar(30) processingLossQty Decimal? @map("processing_loss_qty") @db.Decimal(18, 3) notes String? createdById BigInt @map("created_by") createdBy User @relation("TransformationCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") inputs LotTransformationInput[] outputs LotTransformationOutput[] @@map("lot_transformations") } model LotTransformationInput { id BigInt @id @default(autoincrement()) transformationId BigInt @map("transformation_id") transformation LotTransformation @relation(fields: [transformationId], references: [id], onDelete: Cascade) sourceLotId BigInt @map("source_lot_id") sourceLot InventoryLot @relation("TransformationInputLot", fields: [sourceLotId], references: [id], onDelete: Restrict) qtyUsed Decimal @map("qty_used") @db.Decimal(18, 3) unitCostSnapshot Decimal @map("unit_cost_snapshot") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@unique([transformationId, sourceLotId]) @@map("lot_transformation_inputs") } model LotTransformationOutput { id BigInt @id @default(autoincrement()) transformationId BigInt @map("transformation_id") transformation LotTransformation @relation(fields: [transformationId], references: [id], onDelete: Cascade) resultLotId BigInt @unique @map("result_lot_id") resultLot InventoryLot @relation("TransformationOutputLot", fields: [resultLotId], references: [id], onDelete: Restrict) qtyProduced Decimal @map("qty_produced") @db.Decimal(18, 3) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("lot_transformation_outputs") } model PurchaseAnalysis { id BigInt @id @default(autoincrement()) purchaseId BigInt @unique @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Cascade) status String @default("DRAFT") @db.VarChar(20) weightBuy Decimal? @map("weight_buy") @db.Decimal(18, 3) weightReceived Decimal? @map("weight_received") @db.Decimal(18, 3) weightFinal Decimal? @map("weight_final") @db.Decimal(18, 3) moistureBuyPercent Decimal? @map("moisture_buy_percent") @db.Decimal(7, 2) moistureReceivedPercent Decimal? @map("moisture_received_percent") @db.Decimal(7, 2) moistureFinalPercent Decimal? @map("moisture_final_percent") @db.Decimal(7, 2) aboveAverageRatioPercent Decimal? @map("above_average_ratio_percent") @db.Decimal(7, 2) averagePrice Decimal? @map("average_price") @db.Decimal(18, 2) modalBeli Decimal? @map("modal_beli") @db.Decimal(18, 2) modalMasuk Decimal? @map("modal_masuk") @db.Decimal(18, 2) modalJual Decimal? @map("modal_jual") @db.Decimal(18, 2) modalBarang Decimal? @map("modal_barang") @db.Decimal(18, 2) totalModalBeli Decimal? @map("total_modal_beli") @db.Decimal(18, 2) totalModalMal Decimal? @map("total_modal_mal") @db.Decimal(18, 2) marketReferencePrice Decimal? @map("market_reference_price") @db.Decimal(18, 2) marketValuationTotal Decimal? @map("market_valuation_total") @db.Decimal(18, 2) agentProfitShareTotal Decimal @default(0) @map("agent_profit_share_total") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") costEntries PurchaseAnalysisCostEntry[] @@map("purchase_analyses") } model PurchaseAnalysisCostEntry { id BigInt @id @default(autoincrement()) analysisId BigInt @map("analysis_id") analysis PurchaseAnalysis @relation(fields: [analysisId], references: [id], onDelete: Cascade) costType String @map("cost_type") @db.VarChar(50) description String? @db.VarChar(255) amount Decimal @db.Decimal(18, 2) proofFileUrl String? @map("proof_file_url") @db.VarChar(255) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("purchase_analysis_cost_entries") } model LotPurchaseAllocation { id BigInt @id @default(autoincrement()) lotId BigInt @map("lot_id") lot InventoryLot @relation(fields: [lotId], references: [id], onDelete: Cascade) purchaseId BigInt @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Cascade) purchaseLineId BigInt? @map("purchase_line_id") purchaseLine PurchaseLine? @relation(fields: [purchaseLineId], references: [id], onDelete: SetNull) sourceType String @map("source_type") @db.VarChar(30) sourceRefId BigInt? @map("source_ref_id") agentIdSnapshot BigInt? @map("agent_id_snapshot") profitShareSchemeIdSnapshot BigInt? @map("profit_share_scheme_id_snapshot") qtyAllocated Decimal @map("qty_allocated") @db.Decimal(18, 3) costTotalAllocated Decimal @map("cost_total_allocated") @db.Decimal(18, 2) unitCostSnapshot Decimal @map("unit_cost_snapshot") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") realizationEntries PurchaseRealizationEntry[] @@index([lotId]) @@index([purchaseId]) @@index([purchaseLineId]) @@index([sourceType, sourceRefId]) @@map("lot_purchase_allocations") } model PurchaseRealizationEntry { id BigInt @id @default(autoincrement()) purchaseId BigInt @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Cascade) lotId BigInt? @map("lot_id") lot InventoryLot? @relation(fields: [lotId], references: [id], onDelete: SetNull) allocationId BigInt? @map("allocation_id") allocation LotPurchaseAllocation? @relation(fields: [allocationId], references: [id], onDelete: SetNull) eventType String @map("event_type") @db.VarChar(40) referenceType String @map("reference_type") @db.VarChar(40) referenceId BigInt? @map("reference_id") occurredAt DateTime @map("occurred_at") qtyIn Decimal @default(0) @map("qty_in") @db.Decimal(18, 3) qtyOut Decimal @default(0) @map("qty_out") @db.Decimal(18, 3) qtyShrinkage Decimal @default(0) @map("qty_shrinkage") @db.Decimal(18, 3) amountCost Decimal @default(0) @map("amount_cost") @db.Decimal(18, 2) amountRevenue Decimal @default(0) @map("amount_revenue") @db.Decimal(18, 2) amountExpense Decimal @default(0) @map("amount_expense") @db.Decimal(18, 2) amountProfit Decimal @default(0) @map("amount_profit") @db.Decimal(18, 2) agentSharePercentSnapshot Decimal? @map("agent_share_percent_snapshot") @db.Decimal(7, 2) agentAmount Decimal @default(0) @map("agent_amount") @db.Decimal(18, 2) notes String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([purchaseId, occurredAt]) @@index([lotId]) @@index([allocationId]) @@index([referenceType, referenceId]) @@index([eventType, occurredAt]) @@map("purchase_realization_entries") } model PurchaseRealizationSummary { id BigInt @id @default(autoincrement()) purchaseId BigInt @unique @map("purchase_id") purchase Purchase @relation(fields: [purchaseId], references: [id], onDelete: Cascade) status String @default("OPEN") @db.VarChar(20) qtyOpening Decimal @default(0) @map("qty_opening") @db.Decimal(18, 3) qtyRemaining Decimal @default(0) @map("qty_remaining") @db.Decimal(18, 3) qtySold Decimal @default(0) @map("qty_sold") @db.Decimal(18, 3) qtyReturned Decimal @default(0) @map("qty_returned") @db.Decimal(18, 3) qtyShrinkage Decimal @default(0) @map("qty_shrinkage") @db.Decimal(18, 3) costOpeningTotal Decimal @default(0) @map("cost_opening_total") @db.Decimal(18, 2) costAdditionalTotal Decimal @default(0) @map("cost_additional_total") @db.Decimal(18, 2) revenueTotal Decimal @default(0) @map("revenue_total") @db.Decimal(18, 2) profitLossTotal Decimal @default(0) @map("profit_loss_total") @db.Decimal(18, 2) agentSharePercent Decimal? @map("agent_share_percent") @db.Decimal(7, 2) agentProfitTotal Decimal @default(0) @map("agent_profit_total") @db.Decimal(18, 2) closedAt DateTime? @map("closed_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([status]) @@index([closedAt]) @@map("purchase_realization_summaries") } model LotWashing { id BigInt @id @default(autoincrement()) washingNo String @unique @map("washing_no") @db.VarChar(50) lotId BigInt @map("lot_id") lot InventoryLot @relation(fields: [lotId], references: [id], onDelete: Restrict) washingPlaceId BigInt @map("washing_place_id") washingPlace WashingPlace @relation(fields: [washingPlaceId], references: [id], onDelete: Restrict) washingCost Decimal @map("washing_cost") @db.Decimal(18, 2) durationHours Int @map("duration_hours") receiptFileUrl String? @map("receipt_file_url") @db.VarChar(255) status String @default("IN_PROGRESS") @db.VarChar(20) startedAt DateTime @default(now()) @map("started_at") expectedDoneAt DateTime @map("expected_done_at") completedAt DateTime? @map("completed_at") beforeQty Decimal @map("before_qty") @db.Decimal(18, 3) afterQty Decimal? @map("after_qty") @db.Decimal(18, 3) shrinkageQty Decimal? @map("shrinkage_qty") @db.Decimal(18, 3) beforeGradeName String? @map("before_grade_name") @db.VarChar(100) afterGradeName String? @map("after_grade_name") @db.VarChar(100) beforeWarehouseName String @map("before_warehouse_name") @db.VarChar(150) beforeLocationName String? @map("before_location_name") @db.VarChar(150) afterWarehouseName String? @map("after_warehouse_name") @db.VarChar(150) afterLocationName String? @map("after_location_name") @db.VarChar(150) createdById BigInt @map("created_by") createdBy User @relation("WashingCreatedBy", fields: [createdById], references: [id], onDelete: Restrict) completedById BigInt? @map("completed_by") completedBy User? @relation("WashingCompletedBy", fields: [completedById], references: [id], onDelete: Restrict) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([lotId, status]) @@map("lot_washings") } model AppSetting { id BigInt @id @default(autoincrement()) singletonKey String @unique @default("SYSTEM") @map("singleton_key") @db.VarChar(30) companyName String? @map("company_name") @db.VarChar(150) companyEmail String? @map("company_email") @db.VarChar(150) companyPhone String? @map("company_phone") @db.VarChar(50) companyBankName String? @map("company_bank_name") @db.VarChar(150) companyBankAccountNumber String? @map("company_bank_account_number") @db.VarChar(80) companyAddress String? @map("company_address") companyTimezone String @default("Asia/Jakarta") @map("company_timezone") @db.VarChar(80) smtpHost String? @map("smtp_host") @db.VarChar(150) smtpPort Int? @map("smtp_port") smtpSecure Boolean @default(true) @map("smtp_secure") smtpUser String? @map("smtp_user") @db.VarChar(150) smtpPassword String? @map("smtp_password") @db.VarChar(255) smtpFromName String? @map("smtp_from_name") @db.VarChar(150) smtpFromEmail String? @map("smtp_from_email") @db.VarChar(150) purchasePrefix String @default("PO") @map("purchase_prefix") @db.VarChar(20) receiptPrefix String @default("RCV") @map("receipt_prefix") @db.VarChar(20) lotPrefix String @default("LOT") @map("lot_prefix") @db.VarChar(20) adjustmentPrefix String @default("STA") @map("adjustment_prefix") @db.VarChar(20) transformationPrefix String @default("MIX") @map("transformation_prefix") @db.VarChar(20) fundRequestPrefix String @default("FR") @map("fund_request_prefix") @db.VarChar(20) washingPrefix String @default("WSH") @map("washing_prefix") @db.VarChar(20) regularSalePrefix String @default("SRG") @map("regular_sale_prefix") @db.VarChar(20) jitSalePrefix String @default("SJT") @map("jit_sale_prefix") @db.VarChar(20) consignmentPrefix String @default("TJT") @map("consignment_prefix") @db.VarChar(20) defaultLocale String @default("id") @map("default_locale") @db.VarChar(10) currencyCode String @default("IDR") @map("currency_code") @db.VarChar(10) dateFormat String @default("DD/MM/YYYY") @map("date_format") @db.VarChar(30) passwordMinLength Int @default(8) @map("password_min_length") sessionTimeoutMinutes Int @default(720) @map("session_timeout_minutes") requireEmailVerification Boolean @default(true) @map("require_email_verification") auditRetentionDays Int @default(365) @map("audit_retention_days") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") companyBankAccounts CompanyBankAccount[] @@map("app_settings") } model CompanyBankAccount { id BigInt @id @default(autoincrement()) appSettingId BigInt @map("app_setting_id") appSetting AppSetting @relation(fields: [appSettingId], references: [id], onDelete: Cascade) bankId BigInt @map("bank_id") bank Bank @relation(fields: [bankId], references: [id], onDelete: Restrict) accountNumber String @map("account_number") @db.VarChar(100) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") fundRequests FundRequest[] @@unique([appSettingId, bankId, accountNumber]) @@map("company_bank_accounts") }