From 454498d6eb95d5a98e1c4a0712343cd7c71d518f Mon Sep 17 00:00:00 2001 From: Gracia Hotmauli <95269134+hotmauligracia@users.noreply.github.com> Date: Thu, 12 Jun 2025 23:11:30 +0700 Subject: [PATCH] payment and shipment confirmation --- .../data/api/dto/ConfirmPaymentRequest.kt | 11 ++++ .../data/api/dto/ConfirmShipmentRequest.kt | 11 ++++ .../data/api/retrofit/ApiService.kt | 14 ++--- .../data/repository/SellsRepository.kt | 16 ++--- .../ui/profile/ProfileFragment.kt | 4 +- .../product/ChangePriceBottomSheetFragment.kt | 60 +++++++++++++++++++ .../mystore/product/ProductActivity.kt | 3 +- .../profile/mystore/product/ProductAdapter.kt | 4 +- .../profile/DetailStoreProfileActivity.kt | 3 +- .../sells/payment/DetailPaymentActivity.kt | 8 +++ .../utils/viewmodel/SellsViewModel.kt | 10 ++-- .../fragment_change_price_bottom_sheet.xml | 14 +++++ 12 files changed, 129 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmPaymentRequest.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmShipmentRequest.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ChangePriceBottomSheetFragment.kt create mode 100644 app/src/main/res/layout/fragment_change_price_bottom_sheet.xml diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmPaymentRequest.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmPaymentRequest.kt new file mode 100644 index 0000000..f957332 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmPaymentRequest.kt @@ -0,0 +1,11 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.google.gson.annotations.SerializedName + +data class ConfirmPaymentRequest( + @SerializedName("order_id") + val orderId: Int, + + @SerializedName("status") + val status: String +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmShipmentRequest.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmShipmentRequest.kt new file mode 100644 index 0000000..d4669a0 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ConfirmShipmentRequest.kt @@ -0,0 +1,11 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.google.gson.annotations.SerializedName + +data class ConfirmShipmentRequest( + @SerializedName("receipt_num") + val receiptNum: String, + + @SerializedName("order_id") + val orderId: Int +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt index f9a1ec7..a081e8e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt @@ -7,6 +7,8 @@ import com.alya.ecommerce_serang.data.api.dto.CancelOrderReq import com.alya.ecommerce_serang.data.api.dto.CartItem import com.alya.ecommerce_serang.data.api.dto.CityResponse import com.alya.ecommerce_serang.data.api.dto.CompletedOrderRequest +import com.alya.ecommerce_serang.data.api.dto.ConfirmPaymentRequest +import com.alya.ecommerce_serang.data.api.dto.ConfirmShipmentRequest import com.alya.ecommerce_serang.data.api.dto.CourierCostRequest import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest import com.alya.ecommerce_serang.data.api.dto.FcmReq @@ -337,22 +339,14 @@ interface ApiService { @Body confirmOrder : CompletedOrderRequest ): Response - @PUT("store/order/update") - suspend fun updateOrder( - @Part("order_id") orderId: Int?, - @Part("status") status: String - ): Response - @PUT("store/payment/update") suspend fun confirmPayment( - @Part("order_id") orderId: Int?, - @Part("status") status: String + @Body confirmPayment : ConfirmPaymentRequest ): Response @PUT("store/shipping/receiptnum") suspend fun confirmShipment( - @Part("receipt_num") receiptNum: String, - @Part("order_id") orderId: Int? + @Body confirmShipment: ConfirmShipmentRequest ): Response @Multipart diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/SellsRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/SellsRepository.kt index e2313b6..68544ae 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/SellsRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/SellsRepository.kt @@ -1,6 +1,8 @@ package com.alya.ecommerce_serang.data.repository import android.util.Log +import com.alya.ecommerce_serang.data.api.dto.ConfirmPaymentRequest +import com.alya.ecommerce_serang.data.api.dto.ConfirmShipmentRequest import com.alya.ecommerce_serang.data.api.dto.PaymentConfirmRequest import com.alya.ecommerce_serang.data.api.response.store.GenericResponse import com.alya.ecommerce_serang.data.api.response.store.sells.OrderDetailResponse @@ -45,22 +47,20 @@ class SellsRepository(private val apiService: ApiService) { } } - suspend fun confirmPayment(orderId: Int, status: String): Response { + suspend fun confirmPayment(request: ConfirmPaymentRequest): Response { return try { - Log.d("SellsRepository", "Calling confirmPayment with orderId=$orderId, status=$status") - apiService.confirmPayment(orderId, status) + Log.d("SellsRepository", "Calling confirmPayment with orderId=${request.orderId}, status=${request.status}") + apiService.confirmPayment(request) } catch (e: Exception) { Log.e("SellsRepository", "Error during confirmPayment", e) throw e } } - suspend fun confirmShipment(orderId: Int, receiptNum: String): Response { + suspend fun confirmShipment(request: ConfirmShipmentRequest): Response { return try { - apiService.confirmShipment( - receiptNum = receiptNum, - orderId = orderId - ) + Log.d("SellsRepository", "Calling confirmShipment with orderId=${request.orderId}, receipt num=${request.receiptNum}") + apiService.confirmShipment(request) } catch (e: Exception) { throw e } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt index 7f73254..25b7a0f 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt @@ -71,11 +71,11 @@ class ProfileFragment : Fragment() { Log.d("Profile Fragment", "Check store $hasStore") if (hasStore == true){ - binding.tvBukaToko.text = "Buka Toko Saya" + binding.tvBukaToko.text = "Lihat Toko Saya" val intentBuka = Intent(requireContext(), MyStoreActivity::class.java) startActivity(intentBuka) } else { - binding.tvBukaToko.text = "Daftar Toko Saya" + binding.tvBukaToko.text = "Buka Toko" val intentBuka = Intent(requireContext(), RegisterStoreActivity::class.java) startActivity(intentBuka) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ChangePriceBottomSheetFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ChangePriceBottomSheetFragment.kt new file mode 100644 index 0000000..0d8be50 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ChangePriceBottomSheetFragment.kt @@ -0,0 +1,60 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.product + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.alya.ecommerce_serang.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [ChangePriceBottomSheetFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class ChangePriceBottomSheetFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_change_price_bottom_sheet, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment ChangePriceBottomSheetFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + ChangePriceBottomSheetFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt index 9c4aee5..45a3cbd 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt @@ -40,7 +40,6 @@ class ProductActivity : AppCompatActivity() { binding.progressBar.visibility = View.VISIBLE viewModel.loadMyStoreProducts() - } override fun onResume() { @@ -58,7 +57,7 @@ class ProductActivity : AppCompatActivity() { binding.progressBar.visibility = View.GONE val products = result.data binding.rvStoreProduct.adapter = ProductAdapter(products) { - Toast.makeText(this, "Clicked: ${it.name}", Toast.LENGTH_SHORT).show() + Toast.makeText(this, "Produk: ${it.name}", Toast.LENGTH_SHORT).show() } } is Result.Error -> { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt index ba9dc2f..c249fb0 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt @@ -45,9 +45,9 @@ class ProductAdapter( } val imageUrl = if (product.image.startsWith("/")) { - BASE_URL + product.image.removePrefix("/") // Append base URL if the path starts with "/" + BASE_URL + product.image.removePrefix("/") } else { - product.image // Use as is if it's already a full URL + product.image } Glide.with(itemView.context) .load(imageUrl) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt index e0437b8..9a1f174 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt @@ -5,6 +5,7 @@ import android.app.AlertDialog import android.content.Intent import android.net.Uri import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -177,7 +178,7 @@ class DetailStoreProfileActivity : AppCompatActivity() { } viewModel.errorMessage.observe(this) { - Toast.makeText(this, it, Toast.LENGTH_SHORT).show() + Log.e("DetailStoreProfileActivity", "Error: $it") } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/DetailPaymentActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/DetailPaymentActivity.kt index 36679ae..4b6ca0f 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/DetailPaymentActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/DetailPaymentActivity.kt @@ -39,6 +39,8 @@ import java.util.Calendar import java.util.Locale import java.util.TimeZone import androidx.core.graphics.drawable.toDrawable +import androidx.recyclerview.widget.LinearLayoutManager +import com.alya.ecommerce_serang.ui.profile.mystore.sells.DetailSellsActivity class DetailPaymentActivity : AppCompatActivity() { @@ -67,6 +69,12 @@ class DetailPaymentActivity : AppCompatActivity() { finish() } + productAdapter = SellsProductAdapter() + binding.rvProductItems.apply { + adapter = productAdapter + layoutManager = LinearLayoutManager(this@DetailPaymentActivity) + } + val sellsJson = intent.getStringExtra("sells_data") if (sellsJson != null) { try { diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt index 5b8c0f4..63ec528 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt @@ -5,15 +5,15 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.ConfirmPaymentRequest +import com.alya.ecommerce_serang.data.api.dto.ConfirmShipmentRequest import com.alya.ecommerce_serang.data.api.dto.OrderItemsItem -import com.alya.ecommerce_serang.data.api.dto.PaymentConfirmRequest import com.alya.ecommerce_serang.data.api.response.store.sells.Orders import com.alya.ecommerce_serang.data.api.response.store.sells.OrdersItem import com.alya.ecommerce_serang.data.api.response.store.sells.PaymentConfirmationResponse import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.data.repository.SellsRepository import com.alya.ecommerce_serang.ui.order.address.ViewState -import com.alya.ecommerce_serang.ui.order.history.HistoryViewModel import kotlinx.coroutines.launch class SellsViewModel(private val repository: SellsRepository) : ViewModel() { @@ -175,7 +175,8 @@ class SellsViewModel(private val repository: SellsRepository) : ViewModel() { viewModelScope.launch { try { - val response = repository.confirmPayment(orderId, status) + val request = ConfirmPaymentRequest(orderId, status) + val response = repository.confirmPayment(request) if (response.isSuccessful) { val body = response.body() Log.d(TAG, "confirmPayment success: ${body?.message}") @@ -201,7 +202,8 @@ class SellsViewModel(private val repository: SellsRepository) : ViewModel() { _isLoading.value = true viewModelScope.launch { try { - val response = repository.confirmShipment(orderId, receiptNum) + val request = ConfirmShipmentRequest(receiptNum, orderId) + val response = repository.confirmShipment(request) if (response.isSuccessful) { _message.value = response.body()?.message ?: "Berhasil mengonfirmasi pengiriman" _isSuccess.value = true diff --git a/app/src/main/res/layout/fragment_change_price_bottom_sheet.xml b/app/src/main/res/layout/fragment_change_price_bottom_sheet.xml new file mode 100644 index 0000000..9e7b5ba --- /dev/null +++ b/app/src/main/res/layout/fragment_change_price_bottom_sheet.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file