add confirm complete order

This commit is contained in:
shaulascr
2025-04-20 02:30:26 +07:00
parent 2db0d2b27d
commit 8d13991e83
8 changed files with 146 additions and 5 deletions

View File

@ -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
)

View File

@ -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<Any>
)
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
)

View File

@ -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<ListProvinceResponse>
@PUT("store/order/update")
suspend fun confirmOrder(
@Body confirmOrder : CompletedOrderRequest
): Response<CompletedOrderResponse>
}

View File

@ -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<Add
}
}
suspend fun confirmOrderCompleted(request: CompletedOrderRequest): Result<CompletedOrderResponse> {
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)
}
}
}

View File

@ -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<List<OrderListItemsItem>>()
val orderItems: LiveData<List<OrderListItemsItem>> get() = _orderItems
private val _orderCompletionStatus = MutableLiveData<Result<CompletedOrderResponse>>()
val orderCompletionStatus: LiveData<Result<CompletedOrderResponse>> = _orderCompletionStatus
// LiveData untuk status loading
private val _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean> get() = _isLoading
@ -69,4 +73,6 @@ class PaymentViewModel(private val repository: OrderRepository) : ViewModel() {
}
}
}
}

View File

@ -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<ViewState<List<OrdersItem>>>()
val orders: LiveData<ViewState<List<OrdersItem>>> = _orders
private val _orderCompletionStatus = MutableLiveData<Result<CompletedOrderResponse>>()
val orderCompletionStatus: LiveData<Result<CompletedOrderResponse>> = _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
}
}
}

View File

@ -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<OrderHistoryAdapter.OrderViewHolder>() {
private val orders = mutableListOf<OrdersItem>()
@ -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 {

View File

@ -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()
}
}
}
}
}