From c033a265161fb376e064efa0441bb915f3994f8c Mon Sep 17 00:00:00 2001 From: riz081 Date: Wed, 2 Jul 2025 12:47:09 +0700 Subject: [PATCH] Implement API ke Form Bantuan --- .../bdkipoc/bantuan/BantuanFormActivity.java | 195 ++++++++++++------ .../main/res/layout/activity_bantuan_form.xml | 29 ++- 2 files changed, 158 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/com/example/bdkipoc/bantuan/BantuanFormActivity.java b/app/src/main/java/com/example/bdkipoc/bantuan/BantuanFormActivity.java index feea10c..d9f0753 100644 --- a/app/src/main/java/com/example/bdkipoc/bantuan/BantuanFormActivity.java +++ b/app/src/main/java/com/example/bdkipoc/bantuan/BantuanFormActivity.java @@ -44,8 +44,9 @@ public class BantuanFormActivity extends AppCompatActivity { // UI Components private EditText etTicketCode; - private Spinner spinnerSource, spinnerIssue, spinnerMerchant, spinnerAssign, spinnerResolvedDate; - private TextView tvStatus; + private Spinner spinnerSource, spinnerIssue, spinnerMerchant, spinnerAssign; + private TextView tvStatus, tvResolvedDate; + private LinearLayout llResolvedDate; private Button btnKirim; private LinearLayout backNavigation; private LinearLayout successScreen; @@ -60,6 +61,7 @@ public class BantuanFormActivity extends AppCompatActivity { private List sourceList = new ArrayList<>(); private List issueList = new ArrayList<>(); private List assignList = new ArrayList<>(); + private List merchantList = new ArrayList<>(); // Inner class for parameter details public static class ParameterDetail { @@ -94,6 +96,7 @@ public class BantuanFormActivity extends AppCompatActivity { // Load dynamic data first, then setup spinners loadHeaderParams(); loadUsers(); + loadMerchants(); setupListeners(); @@ -114,7 +117,10 @@ public class BantuanFormActivity extends AppCompatActivity { spinnerIssue = findViewById(R.id.spinner_issue); spinnerMerchant = findViewById(R.id.spinner_merchant); spinnerAssign = findViewById(R.id.spinner_assign); - spinnerResolvedDate = findViewById(R.id.spinner_resolved_date); + + // Resolved Date components + llResolvedDate = findViewById(R.id.ll_resolved_date); + tvResolvedDate = findViewById(R.id.tv_resolved_date); // Status (read-only) tvStatus = findViewById(R.id.tv_status); @@ -232,6 +238,93 @@ public class BantuanFormActivity extends AppCompatActivity { }); } + private void loadMerchants() { + String authToken = LoginActivity.getToken(this); + if (authToken == null || authToken.isEmpty()) { + LoginActivity.logout(this); + return; + } + + executor.execute(() -> { + HttpURLConnection connection = null; + try { + URL url = new URL("https://be-edc.msvc.app/merchants/list?location_id=0"); + connection = (HttpURLConnection) url.openConnection(); + + connection.setRequestMethod("GET"); + connection.setRequestProperty("Authorization", "Bearer " + authToken); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + + int responseCode = connection.getResponseCode(); + + if (responseCode == 200) { + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + // Parse response + JSONObject jsonResponse = new JSONObject(response.toString()); + JSONArray dataArray = jsonResponse.getJSONArray("data"); + + // Clear existing list + merchantList.clear(); + + // Process each merchant + for (int i = 0; i < dataArray.length(); i++) { + JSONObject merchant = dataArray.getJSONObject(i); + String status = merchant.getString("status"); + + // Only add active merchants + if ("1".equals(status)) { + int id = merchant.getInt("id"); + String name = merchant.getString("name"); + String merchantCode = merchant.optString("merchant_code", ""); + + // Only add merchants that have merchant_code + if (!merchantCode.isEmpty()) { + merchantList.add(new ParameterDetail(id, name)); + } + } + } + + // Update UI on main thread + mainHandler.post(() -> { + setupSpinners(); + updateButtonState(); + }); + + } else if (responseCode == 401) { + mainHandler.post(() -> { + Toast.makeText(this, "Session expired. Please login again.", Toast.LENGTH_LONG).show(); + LoginActivity.logout(this); + }); + } else { + mainHandler.post(() -> { + Toast.makeText(this, "Failed to load merchants. Error: " + responseCode, Toast.LENGTH_LONG).show(); + // Setup with empty data + setupSpinners(); + }); + } + + } catch (Exception e) { + mainHandler.post(() -> { + Toast.makeText(this, "Network error loading merchants: " + e.getMessage(), Toast.LENGTH_LONG).show(); + // Setup with empty data + setupSpinners(); + }); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + }); + } + private void showSuccessScreen() { Log.d(TAG, "Showing success screen"); @@ -370,23 +463,12 @@ public class BantuanFormActivity extends AppCompatActivity { issueAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerIssue.setAdapter(issueAdapter); - // Setup Merchant Spinner (Static - unchanged) - String[] merchantOptions = { - "Pilih Merchant", - "Surabaya", - "Jakarta Selatan", - "Jakarta Pusat", - "Jakarta Barat", - "Palembang", - "Bogor Timur", - "Bandung Utara", - "Yogyakarta Selatan", - "Cilacap Barat", - "Bekasi Timur", - "Tangerang Selatan", - "Depok Tengah", - "Kediri Kota" - }; + // Setup Merchant Spinner (Dynamic) + List merchantOptions = new ArrayList<>(); + merchantOptions.add("Pilih Merchant"); + for (ParameterDetail merchant : merchantList) { + merchantOptions.add(merchant.name); + } ArrayAdapter merchantAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, merchantOptions); merchantAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -403,12 +485,7 @@ public class BantuanFormActivity extends AppCompatActivity { assignAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerAssign.setAdapter(assignAdapter); - // Setup Resolved Date Spinner with date picker - String[] dateOptions = {"Pilih Tanggal Resolved", "Pilih dari kalender"}; - ArrayAdapter dateAdapter = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_item, dateOptions); - dateAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - spinnerResolvedDate.setAdapter(dateAdapter); + // Setup Resolved Date components (no spinner setup needed) // Set status to fixed value if (tvStatus != null) { @@ -466,19 +543,10 @@ public class BantuanFormActivity extends AppCompatActivity { public void onNothingSelected(android.widget.AdapterView parent) {} }); - // Resolved Date spinner listener - spinnerResolvedDate.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(android.widget.AdapterView parent, View view, int position, long id) { - if (position == 1) { // "Pilih dari kalender" - showDatePicker(); - } - updateButtonState(); - } - - @Override - public void onNothingSelected(android.widget.AdapterView parent) {} - }); + // Resolved Date click listener + if (llResolvedDate != null) { + llResolvedDate.setOnClickListener(v -> showDatePicker()); + } // Text watcher for EditText field setupTextWatcher(); @@ -560,13 +628,13 @@ public class BantuanFormActivity extends AppCompatActivity { SimpleDateFormat displayFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()); String displayDate = displayFormat.format(selectedCalendar.getTime()); - // Update spinner to show selected date - String[] updatedOptions = {"Pilih Tanggal Resolved", displayDate}; - ArrayAdapter updatedAdapter = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_item, updatedOptions); - updatedAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - spinnerResolvedDate.setAdapter(updatedAdapter); - spinnerResolvedDate.setSelection(1); + // Update TextView to show selected date + if (tvResolvedDate != null) { + tvResolvedDate.setText(displayDate); + tvResolvedDate.setTextColor(0xFF000000); // Black color for selected date + } + + Log.d(TAG, "Date selected: " + displayDate + " (API format: " + selectedResolvedDate + ")"); // Update button state after date selection updateButtonState(); @@ -576,6 +644,9 @@ public class BantuanFormActivity extends AppCompatActivity { calendar.get(Calendar.DAY_OF_MONTH) ); + // Set minimum date to today to prevent past dates + datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis()); + datePickerDialog.show(); } @@ -594,22 +665,10 @@ public class BantuanFormActivity extends AppCompatActivity { } private int getMerchantId(int position) { - switch (position) { - case 1: return 1; // Surabaya - case 2: return 2; // Jakarta Selatan - case 3: return 3; // Jakarta Pusat - case 4: return 4; // Jakarta Barat - case 5: return 5; // Palembang - case 6: return 6; // Bogor Timur - case 7: return 7; // Bandung Utara - case 8: return 8; // Yogyakarta Selatan - case 9: return 9; // Cilacap Barat - case 10: return 10; // Bekasi Timur - case 11: return 11; // Tangerang Selatan - case 12: return 12; // Depok Tengah - case 13: return 13; // Kediri Kota - default: return 0; + if (position > 0 && position <= merchantList.size()) { + return merchantList.get(position - 1).id; } + return 0; } private int getAssignId(int position) { @@ -655,6 +714,14 @@ public class BantuanFormActivity extends AppCompatActivity { return; } + if (merchantId == 0) { + Log.e(TAG, "Invalid merchant ID: " + merchantId + ", position: " + spinnerMerchant.getSelectedItemPosition()); + Toast.makeText(this, "Error: Merchant tidak valid", Toast.LENGTH_SHORT).show(); + btnKirim.setEnabled(true); + btnKirim.setText("Kirim Sekarang"); + return; + } + if (assignId == 0) { Log.e(TAG, "Invalid assign ID: " + assignId + ", position: " + spinnerAssign.getSelectedItemPosition()); Toast.makeText(this, "Error: Assign To tidak valid", Toast.LENGTH_SHORT).show(); @@ -853,8 +920,12 @@ public class BantuanFormActivity extends AppCompatActivity { if (spinnerIssue != null) spinnerIssue.setSelection(0); if (spinnerMerchant != null) spinnerMerchant.setSelection(0); if (spinnerAssign != null) spinnerAssign.setSelection(0); - if (spinnerResolvedDate != null) spinnerResolvedDate.setSelection(0); + // Reset resolved date + if (tvResolvedDate != null) { + tvResolvedDate.setText("Pilih Tanggal Resolved"); + tvResolvedDate.setTextColor(0xFFAAAAAA); // Light gray color + } selectedResolvedDate = ""; // Update button state after clearing form diff --git a/app/src/main/res/layout/activity_bantuan_form.xml b/app/src/main/res/layout/activity_bantuan_form.xml index 5361c84..37f7592 100644 --- a/app/src/main/res/layout/activity_bantuan_form.xml +++ b/app/src/main/res/layout/activity_bantuan_form.xml @@ -200,13 +200,34 @@ android:layout_marginBottom="8dp" android:textStyle="bold" /> - + android:clickable="true" + android:focusable="true"> + + + + + + @@ -262,7 +283,7 @@ android:id="@+id/success_icon" android:layout_width="120dp" android:layout_height="120dp" - android:src="@drawable/ic_check_circle" + android:src="@drawable/ic_success_payment" android:layout_marginBottom="32dp" android:scaleType="centerInside" android:contentDescription="Success Icon" />