diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/CompletedOrderRequest.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/CompletedOrderRequest.kt new file mode 100644 index 0000000..497cc47 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/CompletedOrderRequest.kt @@ -0,0 +1,12 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.google.gson.annotations.SerializedName + +data class CompletedOrderRequest ( + @SerializedName("order_id") + val orderId : Int, + + @SerializedName("status") + val statusComplete: String + +) \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/order/CompletedOrderResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/order/CompletedOrderResponse.kt new file mode 100644 index 0000000..fe9dbcd --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/order/CompletedOrderResponse.kt @@ -0,0 +1,51 @@ +package com.alya.ecommerce_serang.data.api.response.order + +import com.google.gson.annotations.SerializedName + +data class CompletedOrderResponse( + + @field:SerializedName("message") + val message: String, + + @field:SerializedName("updatedOrder") + val updatedOrder: UpdatedOrder, + + @field:SerializedName("updatedItems") + val updatedItems: List +) + +data class UpdatedOrder( + + @field:SerializedName("auto_completed_at") + val autoCompletedAt: Any, + + @field:SerializedName("updated_at") + val updatedAt: String, + + @field:SerializedName("total_amount") + val totalAmount: String, + + @field:SerializedName("user_id") + val userId: Int, + + @field:SerializedName("address_id") + val addressId: Int, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean, + + @field:SerializedName("created_at") + val createdAt: String, + + @field:SerializedName("voucher_id") + val voucherId: Any, + + @field:SerializedName("payment_info_id") + val paymentInfoId: Any, + + @field:SerializedName("id") + val id: Int, + + @field:SerializedName("status") + val status: String +) 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 b2e3971..5426eb4 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 @@ -2,6 +2,7 @@ package com.alya.ecommerce_serang.data.api.retrofit import com.alya.ecommerce_serang.data.api.dto.AddEvidenceRequest import com.alya.ecommerce_serang.data.api.dto.CartItem +import com.alya.ecommerce_serang.data.api.dto.CompletedOrderRequest 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.LoginRequest @@ -18,6 +19,7 @@ import com.alya.ecommerce_serang.data.api.response.cart.AddCartResponse import com.alya.ecommerce_serang.data.api.response.cart.ListCartResponse import com.alya.ecommerce_serang.data.api.response.cart.UpdateCartResponse import com.alya.ecommerce_serang.data.api.response.order.AddEvidenceResponse +import com.alya.ecommerce_serang.data.api.response.order.CompletedOrderResponse import com.alya.ecommerce_serang.data.api.response.order.CourierCostResponse import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse @@ -180,4 +182,9 @@ interface ApiService { @GET("provinces") suspend fun getListProv( ): Response + + @PUT("store/order/update") + suspend fun confirmOrder( + @Body confirmOrder : CompletedOrderRequest + ): Response } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt index 7a9381d..94cfa06 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt @@ -2,6 +2,7 @@ package com.alya.ecommerce_serang.data.repository import android.util.Log import com.alya.ecommerce_serang.data.api.dto.AddEvidenceMultipartRequest +import com.alya.ecommerce_serang.data.api.dto.CompletedOrderRequest 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.OrderRequest @@ -9,6 +10,7 @@ import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy import com.alya.ecommerce_serang.data.api.dto.UserProfile import com.alya.ecommerce_serang.data.api.response.cart.DataItem import com.alya.ecommerce_serang.data.api.response.order.AddEvidenceResponse +import com.alya.ecommerce_serang.data.api.response.order.CompletedOrderResponse import com.alya.ecommerce_serang.data.api.response.order.CourierCostResponse import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse @@ -325,4 +327,28 @@ suspend fun uploadPaymentProof(request: AddEvidenceMultipartRequest): Result { + return try { + Log.d("OrderRepository", "Cinfroming order request completed: $request") + val response = apiService.confirmOrder(request) + + if(response.isSuccessful) { + val completedOrderResponse = response.body() + if (completedOrderResponse != null) { + Log.d("OrderRepository", "Order confirmed successfully: ${completedOrderResponse.message}") + Result.Success(completedOrderResponse) + } else { + Log.e("OrderRepository", "Response body was null") + Result.Error(Exception("Empty response from server")) + } + } else { + val errorBody = response.errorBody()?.string() ?: "Unknown Error" + Log.e("OrderRepository", "Error confirming order: $errorBody") + Result.Error(Exception(errorBody)) + } + } catch (e: Exception){ + Result.Error(e) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentViewModel.kt index 4626ff0..0913e22 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.AddEvidenceMultipartRequest import com.alya.ecommerce_serang.data.api.response.order.AddEvidenceResponse +import com.alya.ecommerce_serang.data.api.response.order.CompletedOrderResponse import com.alya.ecommerce_serang.data.api.response.order.OrderListItemsItem import com.alya.ecommerce_serang.data.api.response.order.Orders import com.alya.ecommerce_serang.data.repository.OrderRepository @@ -26,6 +27,9 @@ class PaymentViewModel(private val repository: OrderRepository) : ViewModel() { private val _orderItems = MutableLiveData>() val orderItems: LiveData> get() = _orderItems + private val _orderCompletionStatus = MutableLiveData>() + val orderCompletionStatus: LiveData> = _orderCompletionStatus + // LiveData untuk status loading private val _isLoading = MutableLiveData() val isLoading: LiveData get() = _isLoading @@ -69,4 +73,6 @@ class PaymentViewModel(private val repository: OrderRepository) : ViewModel() { } } } + + } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/HistoryViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/HistoryViewModel.kt index 7f65ae1..1ac5abd 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/HistoryViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/HistoryViewModel.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.CompletedOrderRequest +import com.alya.ecommerce_serang.data.api.response.order.CompletedOrderResponse import com.alya.ecommerce_serang.data.api.response.order.OrdersItem import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.data.repository.Result @@ -20,6 +22,9 @@ class HistoryViewModel(private val repository: OrderRepository) : ViewModel() { private val _orders = MutableLiveData>>() val orders: LiveData>> = _orders + private val _orderCompletionStatus = MutableLiveData>() + val orderCompletionStatus: LiveData> = _orderCompletionStatus + fun getOrderList(status: String) { _orders.value = ViewState.Loading viewModelScope.launch { @@ -45,4 +50,13 @@ class HistoryViewModel(private val repository: OrderRepository) : ViewModel() { } } } + fun confirmOrderCompleted(orderId: Int, status: String) { + viewModelScope.launch { + _orderCompletionStatus.value = Result.Loading + val request = CompletedOrderRequest(orderId, status) + + val result = repository.confirmOrderCompleted(request) + _orderCompletionStatus.value = result + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt index 45e3e6f..2dc20b7 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt @@ -18,7 +18,8 @@ import java.util.Locale import java.util.TimeZone class OrderHistoryAdapter( - private val onOrderClickListener: (OrdersItem) -> Unit + private val onOrderClickListener: (OrdersItem) -> Unit, + private val viewModel: HistoryViewModel // Add this parameter ) : RecyclerView.Adapter() { private val orders = mutableListOf() @@ -200,6 +201,8 @@ class OrderHistoryAdapter( text = itemView.context.getString(R.string.claim_order) setOnClickListener { // Handle click event + viewModel.confirmOrderCompleted(order.orderId, "completed") + } } deadlineDate.apply { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderListFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderListFragment.kt index 4c51557..4fde4f9 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderListFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderListFragment.kt @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.data.api.response.order.OrdersItem import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.OrderRepository +import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.databinding.FragmentOrderListBinding import com.alya.ecommerce_serang.ui.order.address.ViewState import com.alya.ecommerce_serang.utils.BaseViewModelFactory @@ -68,14 +69,18 @@ class OrderListFragment : Fragment() { setupRecyclerView() observeOrderList() + observeOrderCompletionStatus() loadOrders() } private fun setupRecyclerView() { - orderAdapter = OrderHistoryAdapter { order -> - // Handle order click - navigateToOrderDetail(order) - } + orderAdapter = OrderHistoryAdapter( + onOrderClickListener = { order -> + // Handle order click + navigateToOrderDetail(order) + }, + viewModel = viewModel // Pass the ViewModel to the adapter + ) orderAdapter.setFragmentStatus(status) @@ -126,4 +131,21 @@ class OrderListFragment : Fragment() { super.onDestroyView() _binding = null } + + private fun observeOrderCompletionStatus(){ + viewModel.orderCompletionStatus.observe(viewLifecycleOwner){ result -> + when(result){ + is Result.Loading -> { + + } + is Result.Success -> { + Toast.makeText(requireContext(), "Order completed successfully!", Toast.LENGTH_SHORT).show() + loadOrders() + } + is Result.Error -> { + Toast.makeText(requireContext(), "Failed to complete order: ${result.exception.message}", Toast.LENGTH_SHORT).show() + } + } + } + } } \ No newline at end of file