mirror of
https://github.com/shaulascr/ecommerce_serang.git
synced 2025-08-13 10:42: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.AddEvidenceRequest
|
||||||
import com.alya.ecommerce_serang.data.api.dto.CartItem
|
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.CourierCostRequest
|
||||||
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
||||||
import com.alya.ecommerce_serang.data.api.dto.LoginRequest
|
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.ListCartResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.cart.UpdateCartResponse
|
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.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.CourierCostResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse
|
import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse
|
import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse
|
||||||
@ -180,4 +182,9 @@ interface ApiService {
|
|||||||
@GET("provinces")
|
@GET("provinces")
|
||||||
suspend fun getListProv(
|
suspend fun getListProv(
|
||||||
): Response<ListProvinceResponse>
|
): 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 android.util.Log
|
||||||
import com.alya.ecommerce_serang.data.api.dto.AddEvidenceMultipartRequest
|
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.CourierCostRequest
|
||||||
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
||||||
import com.alya.ecommerce_serang.data.api.dto.OrderRequest
|
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.dto.UserProfile
|
||||||
import com.alya.ecommerce_serang.data.api.response.cart.DataItem
|
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.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.CourierCostResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse
|
import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse
|
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 androidx.lifecycle.viewModelScope
|
||||||
import com.alya.ecommerce_serang.data.api.dto.AddEvidenceMultipartRequest
|
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.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.OrderListItemsItem
|
||||||
import com.alya.ecommerce_serang.data.api.response.order.Orders
|
import com.alya.ecommerce_serang.data.api.response.order.Orders
|
||||||
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
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>>()
|
private val _orderItems = MutableLiveData<List<OrderListItemsItem>>()
|
||||||
val orderItems: LiveData<List<OrderListItemsItem>> get() = _orderItems
|
val orderItems: LiveData<List<OrderListItemsItem>> get() = _orderItems
|
||||||
|
|
||||||
|
private val _orderCompletionStatus = MutableLiveData<Result<CompletedOrderResponse>>()
|
||||||
|
val orderCompletionStatus: LiveData<Result<CompletedOrderResponse>> = _orderCompletionStatus
|
||||||
|
|
||||||
// LiveData untuk status loading
|
// LiveData untuk status loading
|
||||||
private val _isLoading = MutableLiveData<Boolean>()
|
private val _isLoading = MutableLiveData<Boolean>()
|
||||||
val isLoading: LiveData<Boolean> get() = _isLoading
|
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.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
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.api.response.order.OrdersItem
|
||||||
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
||||||
import com.alya.ecommerce_serang.data.repository.Result
|
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>>>()
|
private val _orders = MutableLiveData<ViewState<List<OrdersItem>>>()
|
||||||
val orders: LiveData<ViewState<List<OrdersItem>>> = _orders
|
val orders: LiveData<ViewState<List<OrdersItem>>> = _orders
|
||||||
|
|
||||||
|
private val _orderCompletionStatus = MutableLiveData<Result<CompletedOrderResponse>>()
|
||||||
|
val orderCompletionStatus: LiveData<Result<CompletedOrderResponse>> = _orderCompletionStatus
|
||||||
|
|
||||||
fun getOrderList(status: String) {
|
fun getOrderList(status: String) {
|
||||||
_orders.value = ViewState.Loading
|
_orders.value = ViewState.Loading
|
||||||
viewModelScope.launch {
|
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
|
import java.util.TimeZone
|
||||||
|
|
||||||
class OrderHistoryAdapter(
|
class OrderHistoryAdapter(
|
||||||
private val onOrderClickListener: (OrdersItem) -> Unit
|
private val onOrderClickListener: (OrdersItem) -> Unit,
|
||||||
|
private val viewModel: HistoryViewModel // Add this parameter
|
||||||
) : RecyclerView.Adapter<OrderHistoryAdapter.OrderViewHolder>() {
|
) : RecyclerView.Adapter<OrderHistoryAdapter.OrderViewHolder>() {
|
||||||
|
|
||||||
private val orders = mutableListOf<OrdersItem>()
|
private val orders = mutableListOf<OrdersItem>()
|
||||||
@ -200,6 +201,8 @@ class OrderHistoryAdapter(
|
|||||||
text = itemView.context.getString(R.string.claim_order)
|
text = itemView.context.getString(R.string.claim_order)
|
||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
// Handle click event
|
// Handle click event
|
||||||
|
viewModel.confirmOrderCompleted(order.orderId, "completed")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deadlineDate.apply {
|
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.response.order.OrdersItem
|
||||||
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
||||||
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
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.databinding.FragmentOrderListBinding
|
||||||
import com.alya.ecommerce_serang.ui.order.address.ViewState
|
import com.alya.ecommerce_serang.ui.order.address.ViewState
|
||||||
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
|
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
|
||||||
@ -68,14 +69,18 @@ class OrderListFragment : Fragment() {
|
|||||||
|
|
||||||
setupRecyclerView()
|
setupRecyclerView()
|
||||||
observeOrderList()
|
observeOrderList()
|
||||||
|
observeOrderCompletionStatus()
|
||||||
loadOrders()
|
loadOrders()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupRecyclerView() {
|
private fun setupRecyclerView() {
|
||||||
orderAdapter = OrderHistoryAdapter { order ->
|
orderAdapter = OrderHistoryAdapter(
|
||||||
// Handle order click
|
onOrderClickListener = { order ->
|
||||||
navigateToOrderDetail(order)
|
// Handle order click
|
||||||
}
|
navigateToOrderDetail(order)
|
||||||
|
},
|
||||||
|
viewModel = viewModel // Pass the ViewModel to the adapter
|
||||||
|
)
|
||||||
|
|
||||||
orderAdapter.setFragmentStatus(status)
|
orderAdapter.setFragmentStatus(status)
|
||||||
|
|
||||||
@ -126,4 +131,21 @@ class OrderListFragment : Fragment() {
|
|||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
_binding = null
|
_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