# Sample Transaction Data Insertion Script # Run with: mix run insert_sample_transactions.exs alias PlatformCore.Repo alias RiskCore.PosTransaction alias DaProductApp.Transactions.Transaction alias RiskCore.Workers.TransactionRiskEvaluator IO.puts("Starting sample transaction data insertion...") IO.puts("Note: Risk evaluation jobs will be queued and processed asynchronously by Oban workers") # ============================================================================ # POS Transactions - Sample Data # ============================================================================ pos_transactions = [ %{ s_tid: "T12345", s_mid: "M001", total_amount: Decimal.new("250000.00"), # High value - should trigger rules currency_code: "784", # AED masked_card_no: "5***********1234", mcc_code: "5411", created_dateTime: NaiveDateTime.utc_now(), approval_code: "123456", reference_no: "260309000001", # Shortened to 12 chars response_code: "00", entry_mode: "051", # Chip proc_code: "000000", mti: "0200" }, %{ s_tid: "T67890", s_mid: "M002", total_amount: Decimal.new("1750.50"), currency_code: "784", masked_card_no: "4***********5678", mcc_code: "5812", created_dateTime: NaiveDateTime.utc_now(), approval_code: "789012", reference_no: "260309000002", response_code: "00", entry_mode: "071", # Contactless proc_code: "000000", mti: "0200" }, %{ s_tid: "T11111", s_mid: "M003", total_amount: Decimal.new("500000.00"), # High value currency_code: "784", masked_card_no: "3***********9012", mcc_code: "5999", created_dateTime: NaiveDateTime.utc_now(), approval_code: "345678", reference_no: "260309000003", response_code: "00", entry_mode: "901", # Swipe proc_code: "000000", mti: "0200" }, %{ s_tid: "T12345", s_mid: "M001", total_amount: Decimal.new("15000.00"), # Round figure currency_code: "784", masked_card_no: "6***********3456", mcc_code: "5411", created_dateTime: NaiveDateTime.utc_now(), approval_code: "901234", reference_no: "260309000004", response_code: "00", entry_mode: "051", proc_code: "000000", mti: "0200" }, %{ s_tid: "T22222", s_mid: "M004", total_amount: Decimal.new("89500.75"), currency_code: "784", masked_card_no: "5***********7890", mcc_code: "7011", created_dateTime: NaiveDateTime.utc_now(), approval_code: "567890", reference_no: "260309000005", response_code: "00", entry_mode: "071", proc_code: "000000", mti: "0200" } ] IO.puts("\n=== Inserting POS Transactions ===") pos_results = Enum.map(pos_transactions, fn attrs -> # Insert using raw SQL to match actual table structure query = """ INSERT INTO pos_transaction (s_tid, s_mid, total_amount, currency_code, masked_card_no, mcc_code, created_dateTime, approval_code, reference_no, response_code, entry_mode, proc_code, mti) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """ params = [ attrs.s_tid, attrs.s_mid, attrs.total_amount, attrs.currency_code, attrs.masked_card_no, attrs.mcc_code, attrs.created_dateTime, attrs.approval_code, attrs.reference_no, attrs.response_code, attrs.entry_mode, attrs.proc_code, attrs.mti ] case Repo.query(query, params) do {:ok, result} -> txn_id = result.last_insert_id IO.puts("✓ Created POS transaction ID: #{txn_id} - Amount: #{attrs.total_amount} AED - Card: #{attrs.masked_card_no}") # Queue risk evaluation job %{transaction_id: txn_id, transaction_type: "POS"} |> TransactionRiskEvaluator.new() |> Oban.insert() IO.puts(" → Risk evaluation job queued") {:ok, txn_id} {:error, error} -> IO.puts("✗ Failed to create POS transaction") IO.inspect(error) {:error, error} end end) # ============================================================================ # QR Transactions - Sample Data # ============================================================================ qr_transactions = [ %{ patient_name: "Ahmed Hassan", uhid: "UH123456", charge_rate: Decimal.new("350000.00"), # High value - should trigger rules email: "ahmed@example.com", mobile_no: "971501234567", processing_id: "PROC2026030900001", user_id: "USER001", pay_mode: "UPI", location_id: "LOC001", transaction_location: "Dubai Mall", status: "completed", transaction_id: "QR2026030900001", transaction_amount: Decimal.new("350000.00"), device_id: "DEV12345" }, %{ patient_name: "Fatima Ali", uhid: "UH789012", charge_rate: Decimal.new("2500.00"), email: "fatima@example.com", mobile_no: "971502345678", processing_id: "PROC2026030900002", user_id: "USER002", pay_mode: "QR_PAYMENT", location_id: "LOC002", transaction_location: "Abu Dhabi", status: "completed", transaction_id: "QR2026030900002", transaction_amount: Decimal.new("2500.00"), device_id: "DEV67890" }, %{ patient_name: "Mohammed Khan", uhid: "UH345678", charge_rate: Decimal.new("125000.00"), email: "mohammed@example.com", mobile_no: "971503456789", processing_id: "PROC2026030900003", user_id: "USER003", pay_mode: "UPI", location_id: "LOC003", transaction_location: "Sharjah", status: "completed", transaction_id: "QR2026030900003", transaction_amount: Decimal.new("125000.00"), device_id: "DEV11111" }, %{ patient_name: "Sara Ahmed", uhid: "UH901234", charge_rate: Decimal.new("50000.00"), # Round figure email: "sara@example.com", mobile_no: "971504567890", processing_id: "PROC2026030900004", user_id: "USER004", pay_mode: "WALLET", location_id: "LOC001", transaction_location: "Dubai Mall", status: "completed", transaction_id: "QR2026030900004", transaction_amount: Decimal.new("50000.00"), device_id: "DEV12345" }, %{ patient_name: "Ali Hassan", uhid: "UH567890", charge_rate: Decimal.new("8750.25"), email: "ali@example.com", mobile_no: "971505678901", processing_id: "PROC2026030900005", user_id: "USER005", pay_mode: "QR_PAYMENT", location_id: "LOC004", transaction_location: "Ajman", status: "completed", transaction_id: "QR2026030900005", transaction_amount: Decimal.new("8750.25"), device_id: "DEV22222" } ] IO.puts("\n=== Inserting QR Transactions ===") qr_results = Enum.map(qr_transactions, fn attrs -> case Repo.insert(Transaction.changeset(%Transaction{}, attrs)) do {:ok, txn} -> IO.puts("✓ Created QR transaction: #{txn.transaction_id} - Amount: #{attrs.transaction_amount} AED") # Queue risk evaluation job %{transaction_id: txn.id, transaction_type: "QR"} |> TransactionRiskEvaluator.new() |> Oban.insert() IO.puts(" → Risk evaluation job queued") {:ok, txn} {:error, changeset} -> IO.puts("✗ Failed to create QR transaction: #{attrs.transaction_id}") IO.inspect(changeset.errors) {:error, changeset} end end) # Summary pos_success = Enum.count(pos_results, fn {status, _} -> status == :ok end) qr_success = Enum.count(qr_results, fn {status, _} -> status == :ok end) IO.puts("\n" <> String.duplicate("=", 70)) IO.puts("SUMMARY") IO.puts(String.duplicate("=", 70)) IO.puts("POS Transactions: #{pos_success}/#{length(pos_transactions)} created successfully") IO.puts("QR Transactions: #{qr_success}/#{length(qr_transactions)} created successfully") IO.puts("Total: #{pos_success + qr_success}/#{length(pos_transactions) + length(qr_transactions)} transactions") IO.puts(String.duplicate("=", 70)) IO.puts("\n✓ Sample data insertion complete!") IO.puts("Navigate to Risk Management Dashboard to see flagged transactions.")