mirror of
https://github.com/shaulascr/ecommerce_serang.git
synced 2025-08-10 09:22:21 +00:00
add confirm complete order
This commit is contained in:
@ -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
|
||||
|
||||
)
|
@ -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
|
||||
)
|
@ -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>
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user