From 074a4b1f531d50bd87c386c4c35be040cf23e4f7 Mon Sep 17 00:00:00 2001 From: riz081 Date: Mon, 9 Jun 2025 01:27:59 +0700 Subject: [PATCH] Fix payment dan struk --- .../com/example/bdkipoc/QrisActivity.java | 12 +- .../example/bdkipoc/QrisResultActivity.java | 46 ++- .../com/example/bdkipoc/ReceiptActivity.java | 286 +++++++++++++++--- .../example/bdkipoc/TransactionActivity.java | 118 +++++++- .../example/bdkipoc/TransactionAdapter.java | 87 +++++- 5 files changed, 491 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/example/bdkipoc/QrisActivity.java b/app/src/main/java/com/example/bdkipoc/QrisActivity.java index d5b60d9..0ceff35 100644 --- a/app/src/main/java/com/example/bdkipoc/QrisActivity.java +++ b/app/src/main/java/com/example/bdkipoc/QrisActivity.java @@ -534,16 +534,18 @@ public class QrisActivity extends AppCompatActivity { String transactionTime = midtransResponse.getString("transaction_time"); String acquirer = midtransResponse.getString("acquirer"); String merchantId = midtransResponse.getString("merchant_id"); - String exactGrossAmount = midtransResponse.getString("gross_amount"); + + // FIXED: Send raw amount as string without decimal conversion + String rawAmountString = String.valueOf(amount); // Keep original integer amount // Log everything before launching activity Log.d("MidtransCharge", "=== LAUNCHING QRIS RESULT ACTIVITY ==="); Log.d("MidtransCharge", "qrImageUrl: " + qrImageUrl); - Log.d("MidtransCharge", "amount: " + amount); + Log.d("MidtransCharge", "amount (raw): " + amount); + Log.d("MidtransCharge", "rawAmountString: " + rawAmountString); Log.d("MidtransCharge", "referenceId: " + referenceId); Log.d("MidtransCharge", "transactionUuid (orderId): " + transactionUuid); Log.d("MidtransCharge", "transaction_id: " + transactionId); - Log.d("MidtransCharge", "exactGrossAmount: " + exactGrossAmount); Log.d("MidtransCharge", "transactionTime: " + transactionTime); Log.d("MidtransCharge", "acquirer: " + acquirer); Log.d("MidtransCharge", "merchantId: " + merchantId); @@ -552,11 +554,11 @@ public class QrisActivity extends AppCompatActivity { // Launch QrisResultActivity Intent intent = new Intent(QrisActivity.this, QrisResultActivity.class); intent.putExtra("qrImageUrl", qrImageUrl); - intent.putExtra("amount", amount); + intent.putExtra("amount", amount); // Keep as int intent.putExtra("referenceId", referenceId); intent.putExtra("orderId", transactionUuid); // Order ID intent.putExtra("transactionId", transactionId); // Actual Midtrans transaction_id - intent.putExtra("grossAmount", exactGrossAmount); // Exact gross amount from response + intent.putExtra("grossAmount", rawAmountString); // FIXED: Raw amount as string (no decimals) intent.putExtra("transactionTime", transactionTime); // For timestamp intent.putExtra("acquirer", acquirer); intent.putExtra("merchantId", merchantId); diff --git a/app/src/main/java/com/example/bdkipoc/QrisResultActivity.java b/app/src/main/java/com/example/bdkipoc/QrisResultActivity.java index eee0786..12a1174 100644 --- a/app/src/main/java/com/example/bdkipoc/QrisResultActivity.java +++ b/app/src/main/java/com/example/bdkipoc/QrisResultActivity.java @@ -511,13 +511,55 @@ public class QrisResultActivity extends AppCompatActivity { // Show success elements statusTextView.setVisibility(View.VISIBLE); statusTextView.setText("✅ Payment Successful!\n\nTransaction ID: " + transactionId + - "\nReference: " + referenceId + - "\nAmount: " + formatCurrency(grossAmount)); + "\nReference: " + referenceId + + "\nAmount: " + formatCurrency(grossAmount)); + + // Add receipt button + Button showReceiptButton = new Button(this); + showReceiptButton.setText("Show Receipt"); + showReceiptButton.setOnClickListener(v -> launchReceiptActivity()); + + // You can add this button to your layout programmatically + // or add it to your XML and show it here + returnMainButton.setVisibility(View.VISIBLE); Toast.makeText(this, "Payment simulation completed successfully!", Toast.LENGTH_LONG).show(); } + // Fixed method for launching ReceiptActivity + private void launchReceiptActivity() { + Intent intent = new Intent(this, ReceiptActivity.class); + + // Add calling activity information for proper back navigation + intent.putExtra("calling_activity", "QrisResultActivity"); + + // Pass all the transaction data using available class variables + intent.putExtra("transaction_id", transactionId); // Midtrans transaction_id + intent.putExtra("reference_id", referenceId); // Your reference ID + intent.putExtra("order_id", orderId); // Order ID (UUID) + + // Use grossAmount for both transaction_amount and gross_amount + intent.putExtra("transaction_amount", grossAmount != null ? grossAmount : "0"); + intent.putExtra("gross_amount", grossAmount); // From Midtrans response + + intent.putExtra("transaction_date", getCurrentDateTime()); + intent.putExtra("payment_method", "QRIS"); + intent.putExtra("card_type", "QRIS"); + intent.putExtra("channel_code", "QRIS"); + intent.putExtra("channel_category", "RETAIL_OUTLET"); + intent.putExtra("merchant_name", "Marcel Panjaitan"); // From your transaction data + intent.putExtra("merchant_location", "Jakarta, Indonesia"); + intent.putExtra("acquirer", acquirer); // From Midtrans response + + startActivity(intent); + } + + private String getCurrentDateTime() { + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd MMMM yyyy HH:mm", new java.util.Locale("id", "ID")); + return sdf.format(new java.util.Date()); + } + @Override public boolean onOptionsItemSelected(android.view.MenuItem item) { if (item.getItemId() == android.R.id.home) { diff --git a/app/src/main/java/com/example/bdkipoc/ReceiptActivity.java b/app/src/main/java/com/example/bdkipoc/ReceiptActivity.java index bf98eb6..d67f2be 100644 --- a/app/src/main/java/com/example/bdkipoc/ReceiptActivity.java +++ b/app/src/main/java/com/example/bdkipoc/ReceiptActivity.java @@ -5,6 +5,7 @@ import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; // ADD THIS IMPORT import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -88,17 +89,17 @@ public class ReceiptActivity extends AppCompatActivity { serviceFee = findViewById(R.id.service_fee); finalTotal = findViewById(R.id.final_total); - // Action buttons - Updated to LinearLayout + // Action buttons printButton = findViewById(R.id.print_button); emailButton = findViewById(R.id.email_button); finishButton = findViewById(R.id.finish_button); } private void setupClickListeners() { - // Back navigation - Goes back to previous activity (PaymentActivity) - backNavigation.setOnClickListener(v -> navigateBackToPrevious()); - backArrow.setOnClickListener(v -> navigateBackToPrevious()); - toolbarTitle.setOnClickListener(v -> navigateBackToPrevious()); + // Back navigation - Goes back to previous activity + backNavigation.setOnClickListener(v -> handleBackNavigation()); + backArrow.setOnClickListener(v -> handleBackNavigation()); + toolbarTitle.setOnClickListener(v -> handleBackNavigation()); // Action buttons printButton.setOnClickListener(v -> handlePrintReceipt()); @@ -109,7 +110,7 @@ public class ReceiptActivity extends AppCompatActivity { private void loadTransactionData() { Intent intent = getIntent(); if (intent != null) { - // Data dari TransactionActivity + // Data dari TransactionActivity atau QrisResultActivity String amount = intent.getStringExtra("transaction_amount"); String merchantNameStr = intent.getStringExtra("merchant_name"); String merchantLocationStr = intent.getStringExtra("merchant_location"); @@ -118,41 +119,214 @@ public class ReceiptActivity extends AppCompatActivity { String paymentMethodStr = intent.getStringExtra("payment_method"); String cardTypeStr = intent.getStringExtra("card_type"); - // Set data ke view - merchantName.setText(merchantNameStr != null ? merchantNameStr : "TOKO KLONTONG PAK EKO"); - merchantLocation.setText(merchantLocationStr != null ? merchantLocationStr : "Ciputat Baru, Tangsel"); - transactionNumber.setText(transactionId != null ? transactionId : "3429483635"); - transactionDate.setText(transactionDateStr != null ? transactionDateStr : "13 Januari 2025 13:46"); - paymentMethod.setText(paymentMethodStr != null ? paymentMethodStr : "Kartu Kredit"); - cardType.setText(cardTypeStr != null ? cardTypeStr : "BCA"); + // Additional data that might come from different sources + String referenceId = intent.getStringExtra("reference_id"); + String orderId = intent.getStringExtra("order_id"); + String grossAmount = intent.getStringExtra("gross_amount"); + String acquirer = intent.getStringExtra("acquirer"); + String channelCode = intent.getStringExtra("channel_code"); + String channelCategory = intent.getStringExtra("channel_category"); - // Format nominal - if (amount != null) { - try { - long amountValue = Long.parseLong(amount); - transactionTotal.setText(formatCurrency(amountValue)); - - // Hitung total akhir (contoh: tambah pajak 11% dan biaya layanan 500) - long tax = (long) (amountValue * 0.11); - long serviceFeeValue = 500; - long total = amountValue + tax + serviceFeeValue; - - taxPercentage.setText(formatCurrency(tax) + " (11%)"); - serviceFee.setText(formatCurrency(serviceFeeValue)); - finalTotal.setText(formatCurrency(total)); - - } catch (NumberFormatException e) { - transactionTotal.setText(amount); - finalTotal.setText(amount); - } + // Set merchant data with defaults + merchantName.setText(merchantNameStr != null ? merchantNameStr : "Marcel Panjaitan"); + merchantLocation.setText(merchantLocationStr != null ? merchantLocationStr : "Jakarta, Indonesia"); + + // Set MID and TID with defaults + midText.setText("71000026521"); // Default MID from your transaction code + tidText.setText("73001500"); // Default TID from your transaction code + + // Set transaction number - prefer reference_id, then transaction_id, then order_id + String displayTransactionNumber = null; + if (referenceId != null && !referenceId.isEmpty()) { + displayTransactionNumber = referenceId; + } else if (transactionId != null && !transactionId.isEmpty()) { + displayTransactionNumber = transactionId; + } else if (orderId != null && !orderId.isEmpty()) { + displayTransactionNumber = orderId; } + transactionNumber.setText(displayTransactionNumber != null ? displayTransactionNumber : "3429483635"); + + // Set transaction date + transactionDate.setText(transactionDateStr != null ? transactionDateStr : getCurrentDateTime()); + + // Set payment method - determine from various sources + String displayPaymentMethod = determinePaymentMethod(paymentMethodStr, channelCode, channelCategory); + paymentMethod.setText(displayPaymentMethod); + + // Set card type - prefer acquirer, then cardType, then channelCode + String displayCardType = null; + if (acquirer != null && !acquirer.isEmpty()) { + displayCardType = acquirer.toUpperCase(); + } else if (cardTypeStr != null && !cardTypeStr.isEmpty()) { + displayCardType = cardTypeStr; + } else if (channelCode != null && !channelCode.isEmpty()) { + displayCardType = channelCode.toUpperCase(); + } + cardType.setText(displayCardType != null ? displayCardType : "QRIS"); + + // Format and set amounts + setAmountData(amount, grossAmount); } } + private String determinePaymentMethod(String paymentMethodStr, String channelCode, String channelCategory) { + // If payment method is already provided and formatted, use it + if (paymentMethodStr != null && !paymentMethodStr.isEmpty()) { + return paymentMethodStr; + } + + // Determine from channel code + if (channelCode != null) { + switch (channelCode.toUpperCase()) { + case "QRIS": + return "QRIS"; + case "DEBIT": + return "Kartu Debit"; + case "CREDIT": + return "Kartu Kredit"; + case "BCA": + case "MANDIRI": + case "BNI": + case "BRI": + return "Kartu " + channelCode.toUpperCase(); + case "CASH": + return "Tunai"; + case "EDC": + return "EDC"; + default: + break; + } + } + + // Determine from channel category + if (channelCategory != null && !channelCategory.isEmpty()) { + return channelCategory.toUpperCase(); + } + + // Default + return "QRIS"; + } + + private void setAmountData(String amount, String grossAmount) { + // Use gross amount if available, otherwise use amount + String amountToUse = grossAmount != null ? grossAmount : amount; + + Log.d("ReceiptActivity", "Setting amount data - amount: " + amount + + ", grossAmount: " + grossAmount + ", using: " + amountToUse); + + if (amountToUse != null) { + try { + // Clean and parse the amount + String cleanAmount = cleanAmountString(amountToUse); + Log.d("ReceiptActivity", "Cleaned amount: " + cleanAmount); + + // Parse as long integer (Indonesian Rupiah doesn't use decimal cents) + long amountLong = Long.parseLong(cleanAmount); + + // Set transaction total + transactionTotal.setText("Rp " + formatCurrency(amountLong)); + + // Calculate tax and service fee (for QRIS, typically no additional fees) + long tax = 0; // QRIS usually doesn't have tax + long serviceFeeValue = 0; // QRIS usually doesn't have service fee + long total = amountLong + tax + serviceFeeValue; + + // Set calculated values + taxPercentage.setText("Rp 0"); + serviceFee.setText("Rp 0"); + finalTotal.setText("Rp " + formatCurrency(total)); + + } catch (NumberFormatException e) { + Log.e("ReceiptActivity", "Error parsing amount: " + amountToUse, e); + // Fallback if parsing fails + transactionTotal.setText("Rp " + amountToUse); + taxPercentage.setText("Rp 0"); + serviceFee.setText("Rp 0"); + finalTotal.setText("Rp " + amountToUse); + } + } else { + // Default values if no amount provided + transactionTotal.setText("Rp 0"); + taxPercentage.setText("Rp 0"); + serviceFee.setText("Rp 0"); + finalTotal.setText("Rp 0"); + } + } + + /** + * FIXED: Clean amount string to extract raw number correctly + * Input examples: "1000", "1000.00", "Rp 1.000", "1.000" + * Output: "1000" + */ + private String cleanAmountString(String amount) { + if (amount == null || amount.isEmpty()) { + return "0"; + } + + // Remove currency symbols and spaces first + String cleaned = amount + .replace("Rp. ", "") + .replace("Rp ", "") + .replace("IDR ", "") + .replace(" ", "") + .trim(); + + Log.d("ReceiptActivity", "After currency removal: '" + cleaned + "'"); + + // Handle decimal cases properly + if (cleaned.contains(".")) { + // Check if it contains decimal cents (like "1000.00") or thousand separator (like "1.000") + String[] parts = cleaned.split("\\."); + + if (parts.length == 2) { + String beforeDot = parts[0]; + String afterDot = parts[1]; + + // If after dot is "00" or "0", it's decimal cents - remove it + if (afterDot.equals("00") || afterDot.equals("0")) { + cleaned = beforeDot; + Log.d("ReceiptActivity", "Removed decimal cents: '" + cleaned + "'"); + } + // If after dot has 3 digits, it's thousand separator - combine them + else if (afterDot.length() == 3) { + cleaned = beforeDot + afterDot; + Log.d("ReceiptActivity", "Combined thousand separator: '" + cleaned + "'"); + } + // For other cases, try to determine based on length + else { + // If beforeDot is short (1-3 digits) and afterDot is 3 digits, it's thousand separator + if (beforeDot.length() <= 3 && afterDot.length() == 3) { + cleaned = beforeDot + afterDot; + } else { + // Otherwise, it's likely decimal - remove the decimal part + cleaned = beforeDot; + } + Log.d("ReceiptActivity", "Processed mixed format: '" + cleaned + "'"); + } + } else { + // Multiple dots - remove all dots (treat as thousand separators) + cleaned = cleaned.replace(".", ""); + Log.d("ReceiptActivity", "Removed multiple dots: '" + cleaned + "'"); + } + } + + // Remove any remaining commas (some locales use comma as thousand separator) + cleaned = cleaned.replace(",", ""); + + Log.d("ReceiptActivity", "Final cleaned amount: '" + amount + "' -> '" + cleaned + "'"); + return cleaned; + } + private String formatCurrency(long amount) { + // Use Indonesian locale formatting with dots as thousand separators return String.format("%,d", amount).replace(',', '.'); } + private String getCurrentDateTime() { + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd MMMM yyyy HH:mm", new java.util.Locale("id", "ID")); + return sdf.format(new java.util.Date()); + } + private void handlePrintReceipt() { // Handle print receipt action // In real app, this would integrate with printer @@ -170,16 +344,48 @@ public class ReceiptActivity extends AppCompatActivity { navigateToHomePage(); } - private void navigateBackToPrevious() { - // Navigate back to PaymentActivity (previous activity) - Intent intent = new Intent(this, PaymentActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); + private void handleBackNavigation() { + // Smart back navigation - go to the actual previous activity + // Check if we have a calling activity in the intent + String callingActivity = getIntent().getStringExtra("calling_activity"); + + if (callingActivity != null) { + switch (callingActivity) { + case "TransactionActivity": + // Go back to transaction list + Intent transactionIntent = new Intent(this, TransactionActivity.class); + transactionIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(transactionIntent); + break; + + case "QrisResultActivity": + // Go back to main menu since QrisResultActivity is typically finished + navigateToHomePage(); + break; + + case "PaymentActivity": + case "QrisActivity": + // Go back to payment/qris activity + Intent paymentIntent = new Intent(this, QrisActivity.class); + paymentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(paymentIntent); + break; + + default: + // Default: use system back navigation + super.onBackPressed(); + break; + } + } else { + // No calling activity specified, use system back navigation + super.onBackPressed(); + } + finish(); } private void navigateToHomePage() { - // Navigate to MainActivity/Home Page when "Selesai" button is pressed + // Navigate to MainActivity/Home Page Intent intent = new Intent(this, MainActivity.class); // Clear all previous activities from the stack and start fresh @@ -202,7 +408,7 @@ public class ReceiptActivity extends AppCompatActivity { @Override public void onBackPressed() { - // Back button behavior - goes back to previous activity - navigateBackToPrevious(); + // Use the smart back navigation + handleBackNavigation(); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bdkipoc/TransactionActivity.java b/app/src/main/java/com/example/bdkipoc/TransactionActivity.java index 7fde404..4fc82ed 100644 --- a/app/src/main/java/com/example/bdkipoc/TransactionActivity.java +++ b/app/src/main/java/com/example/bdkipoc/TransactionActivity.java @@ -11,6 +11,7 @@ import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.Toast; import android.content.Intent; +import android.util.Log; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -291,21 +292,126 @@ public class TransactionActivity extends AppCompatActivity implements Transactio @Override public void onPrintClick(Transaction transaction) { - // Buka ReceiptActivity dengan data transaksi + // Open ReceiptActivity with transaction data Intent intent = new Intent(this, ReceiptActivity.class); - // Format data sesuai kebutuhan ReceiptActivity + // Add calling activity information for proper back navigation + intent.putExtra("calling_activity", "TransactionActivity"); + + // FIXED: Extract and send raw amount properly + String rawAmount = extractRawAmount(transaction.amount); + + Log.d("TransactionActivity", "Opening receipt for transaction: " + transaction.referenceId + + ", original amount: '" + transaction.amount + "', extracted: '" + rawAmount + "'"); + + // Send transaction data to ReceiptActivity intent.putExtra("transaction_id", transaction.referenceId); - intent.putExtra("transaction_amount", transaction.amount.replace("Rp. ", "").replace(".", "")); - intent.putExtra("transaction_date", formatDate(transaction.createdAt)); // Format tanggal jika perlu - intent.putExtra("payment_method", "Kartu " + transaction.channelCode); // Contoh: "Kartu BCA" + intent.putExtra("reference_id", transaction.referenceId); + intent.putExtra("transaction_amount", rawAmount); // Send raw amount + intent.putExtra("gross_amount", rawAmount); // Consistent with transaction_amount + intent.putExtra("transaction_date", formatDate(transaction.createdAt)); + intent.putExtra("payment_method", getPaymentMethodName(transaction.channelCode, transaction.channelCategory)); intent.putExtra("card_type", transaction.channelCategory); + intent.putExtra("channel_code", transaction.channelCode); + intent.putExtra("channel_category", transaction.channelCategory); intent.putExtra("merchant_name", transaction.merchantName); - intent.putExtra("merchant_location", "Lokasi Merchant"); // Tambahkan jika ada di data + intent.putExtra("merchant_location", "Jakarta, Indonesia"); startActivity(intent); } + /** + * FIXED: Extract raw amount from formatted string properly + * Handles various amount formats from backend + */ + private String extractRawAmount(String formattedAmount) { + if (formattedAmount == null || formattedAmount.isEmpty()) { + return "0"; + } + + Log.d("TransactionActivity", "Extracting raw amount from: '" + formattedAmount + "'"); + + // Remove currency symbols and spaces + String cleaned = formattedAmount + .replace("Rp. ", "") + .replace("Rp ", "") + .replace("IDR ", "") + .replace(" ", "") + .trim(); + + // Handle dots correctly + if (cleaned.contains(".")) { + String[] parts = cleaned.split("\\."); + + if (parts.length == 2) { + String beforeDot = parts[0]; + String afterDot = parts[1]; + + // If after dot is "00" or single "0", it's decimal format + if (afterDot.equals("00") || afterDot.equals("0")) { + cleaned = beforeDot; + } + // If after dot has 3 digits, it's thousand separator + else if (afterDot.length() == 3) { + cleaned = beforeDot + afterDot; + } + // Handle other cases based on context + else { + // If beforeDot is 1-3 digits and afterDot is 3 digits, likely thousand separator + if (beforeDot.length() <= 3 && afterDot.length() == 3) { + cleaned = beforeDot + afterDot; + } else { + // Otherwise treat as decimal and remove decimal part + cleaned = beforeDot; + } + } + } else if (parts.length > 2) { + // Multiple dots - treat as thousand separators + cleaned = String.join("", parts); + } + } + + // Remove any remaining commas + cleaned = cleaned.replace(",", ""); + + // Validate result is numeric + try { + Long.parseLong(cleaned); + Log.d("TransactionActivity", "Successfully extracted: '" + formattedAmount + "' -> '" + cleaned + "'"); + return cleaned; + } catch (NumberFormatException e) { + Log.e("TransactionActivity", "Invalid amount after cleaning: '" + cleaned + "' from '" + formattedAmount + "'"); + return "0"; + } + } + + private String getPaymentMethodName(String channelCode, String channelCategory) { + if (channelCode == null) return "Unknown"; + + switch (channelCode.toUpperCase()) { + case "QRIS": + return "QRIS"; + case "DEBIT": + return "Kartu Debit"; + case "CREDIT": + return "Kartu Kredit"; + case "BCA": + case "MANDIRI": + case "BNI": + case "BRI": + return "Kartu " + channelCode.toUpperCase(); + case "CASH": + return "Tunai"; + case "EDC": + return "EDC"; + default: + if (channelCategory != null && !channelCategory.isEmpty()) { + return channelCategory.toUpperCase(); + } + return channelCode.toUpperCase(); + } + } + private String formatDate(String rawDate) { try { SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); diff --git a/app/src/main/java/com/example/bdkipoc/TransactionAdapter.java b/app/src/main/java/com/example/bdkipoc/TransactionAdapter.java index 717cf08..3da909e 100644 --- a/app/src/main/java/com/example/bdkipoc/TransactionAdapter.java +++ b/app/src/main/java/com/example/bdkipoc/TransactionAdapter.java @@ -1,5 +1,6 @@ package com.example.bdkipoc; +import android.util.Log; // ADD THIS IMPORT import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -46,11 +47,22 @@ public class TransactionAdapter extends RecyclerView.Adapter Cleaned: '" + + cleanAmount + "' -> Formatted: '" + formattedAmount + "'"); + } catch (NumberFormatException e) { - holder.amount.setText("Rp. " + t.amount); + Log.e("TransactionAdapter", "Error formatting amount: " + t.amount, e); + // Fallback: show original amount with Rp prefix if not already present + String fallback = t.amount.startsWith("Rp") ? t.amount : "Rp " + t.amount; + holder.amount.setText(fallback); } // Set status with appropriate color @@ -61,13 +73,13 @@ public class TransactionAdapter extends RecyclerView.Adapter { if (printClickListener != null) { printClickListener.onPrintClick(t); } }); - // Set click listener for print button holder.printSection.setOnClickListener(v -> { if (printClickListener != null) { printClickListener.onPrintClick(t); @@ -75,6 +87,71 @@ public class TransactionAdapter extends RecyclerView.Adapter 2) { + // Multiple dots - assume all are thousand separators + cleaned = String.join("", parts); + } + } + + // Remove any commas + cleaned = cleaned.replace(",", ""); + + Log.d("TransactionAdapter", "Cleaned result: '" + cleaned + "'"); + return cleaned; + } + + /** + * Format long amount to Indonesian Rupiah format + */ + private String formatRupiah(long amount) { + // Use dots as thousand separators (Indonesian format) + String formatted = String.format("%,d", amount).replace(',', '.'); + return "Rp. " + formatted; + } + private void setStatusColor(TextView statusTextView, String status) { String statusLower = status.toLowerCase(); int color;