From 51882ff634a4a91723e5c863961e19c993e46b40 Mon Sep 17 00:00:00 2001 From: Gracia Hotmauli <95269134+hotmauligracia@users.noreply.github.com> Date: Tue, 3 Jun 2025 00:23:19 +0700 Subject: [PATCH] sells detail --- app/src/main/AndroidManifest.xml | 10 +- .../AddShippingReceiptResponse.kt | 2 +- .../KonfirmasiTagihanResponse.kt | 2 +- .../store/sells/OrderDetailResponse.kt | 129 ++++++ .../{orders => sells}/OrderListResponse.kt | 2 +- .../PaymentConfirmationResponse.kt | 2 +- .../UpdateOrderItemResponse.kt | 2 +- .../data/api/retrofit/ApiService.kt | 6 +- .../data/repository/SellsRepository.kt | 4 +- .../ui/profile/mystore/MyStoreActivity.kt | 7 + .../mystore/sells/DetailSellsActivity.kt | 129 ++++++ .../ui/profile/mystore/sells/SellsAdapter.kt | 7 +- .../mystore/sells/SellsListFragment.kt | 17 +- .../mystore/sells/SellsProductAdapter.kt | 14 +- .../sells/payment/DetailPaymentActivity.kt | 4 +- .../sells/shipment/DetailShipmentActivity.kt | 2 +- .../utils/viewmodel/SellsViewModel.kt | 4 +- .../res/layout/activity_detail_payment.xml | 12 +- .../main/res/layout/activity_detail_sells.xml | 395 ++++++++++++++++++ .../res/layout/activity_detail_shipment.xml | 12 +- app/src/main/res/layout/item_sells.xml | 12 +- 21 files changed, 722 insertions(+), 52 deletions(-) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/{orders => sells}/AddShippingReceiptResponse.kt (70%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/{orders => sells}/KonfirmasiTagihanResponse.kt (85%) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/OrderDetailResponse.kt rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/{orders => sells}/OrderListResponse.kt (98%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/{orders => sells}/PaymentConfirmationResponse.kt (69%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/{orders => sells}/UpdateOrderItemResponse.kt (89%) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/DetailSellsActivity.kt create mode 100644 app/src/main/res/layout/activity_detail_sells.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cedc9c4..1704677 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,6 +29,9 @@ android:theme="@style/Theme.Ecommerce_serang" android:usesCleartextTraffic="true" tools:targetApi="31"> + @@ -54,19 +57,12 @@ - - ? = null, + + @field:SerializedName("auto_completed_at") + val autoCompletedAt: Any? = null, + + @field:SerializedName("is_store_location") + val isStoreLocation: Boolean? = null, + + @field:SerializedName("qris_image") + val qrisImage: String? = null, + + @field:SerializedName("voucher_name") + val voucherName: Any? = null, + + @field:SerializedName("payment_status") + val paymentStatus: Any? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("payment_amount") + val paymentAmount: Any? = null, + + @field:SerializedName("cancel_reason") + val cancelReason: Any? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("province_id") + val provinceId: Int? = null, + + @field:SerializedName("courier") + val courier: String? = null, + + @field:SerializedName("subdistrict") + val subdistrict: String? = null, + + @field:SerializedName("service") + val service: String? = null, + + @field:SerializedName("pay_info_num") + val payInfoNum: String? = null, + + @field:SerializedName("shipment_price") + val shipmentPrice: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("payment_info_id") + val paymentInfoId: Int? = null, + + @field:SerializedName("detail") + val detail: String? = null, + + @field:SerializedName("postal_code") + val postalCode: String? = null, + + @field:SerializedName("order_id") + val orderId: Int? = null, + + @field:SerializedName("username") + val username: String? = null, + + @field:SerializedName("city_id") + val cityId: Int? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/OrderListResponse.kt similarity index 98% rename from app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt rename to app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/OrderListResponse.kt index d981252..8c58937 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/OrderListResponse.kt @@ -1,4 +1,4 @@ -package com.alya.ecommerce_serang.data.api.response.store.orders +package com.alya.ecommerce_serang.data.api.response.store.sells import com.google.gson.annotations.SerializedName diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/PaymentConfirmationResponse.kt similarity index 69% rename from app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt rename to app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/PaymentConfirmationResponse.kt index 8f9156a..2a06288 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/PaymentConfirmationResponse.kt @@ -1,4 +1,4 @@ -package com.alya.ecommerce_serang.data.api.response.store.orders +package com.alya.ecommerce_serang.data.api.response.store.sells import com.google.gson.annotations.SerializedName diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/UpdateOrderItemResponse.kt similarity index 89% rename from app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt rename to app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/UpdateOrderItemResponse.kt index f56b81b..0f736f4 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/sells/UpdateOrderItemResponse.kt @@ -1,4 +1,4 @@ -package com.alya.ecommerce_serang.data.api.response.store.orders +package com.alya.ecommerce_serang.data.api.response.store.sells import com.google.gson.annotations.SerializedName 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 17784e6..8ef69e7 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 @@ -66,7 +66,7 @@ import com.alya.ecommerce_serang.data.api.response.order.ComplaintResponse import com.alya.ecommerce_serang.data.api.response.order.CompletedOrderResponse import com.alya.ecommerce_serang.data.api.response.product.CreateSearchResponse import com.alya.ecommerce_serang.data.api.response.product.SearchHistoryResponse -import com.alya.ecommerce_serang.data.api.response.store.orders.PaymentConfirmationResponse +import com.alya.ecommerce_serang.data.api.response.store.sells.PaymentConfirmationResponse import com.alya.ecommerce_serang.data.api.response.store.product.CreateProductResponse import com.alya.ecommerce_serang.data.api.response.store.product.DeleteProductResponse import com.alya.ecommerce_serang.data.api.response.store.product.UpdateProductResponse @@ -325,7 +325,7 @@ interface ApiService { @GET("mystore/orders/{status}") suspend fun getSellList( @Path("status") status: String - ): Response + ): Response @PUT("store/order/update") suspend fun confirmOrder( @@ -336,7 +336,7 @@ interface ApiService { suspend fun updateOrder( @Query("order_id") orderId: Int?, @Query("status") status: String - ): Response + ): Response @Multipart @POST("addcomplaint") 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 3e991d5..076e6e5 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 @@ -2,8 +2,8 @@ package com.alya.ecommerce_serang.data.repository import android.util.Log import com.alya.ecommerce_serang.data.api.dto.PaymentConfirmRequest -import com.alya.ecommerce_serang.data.api.response.store.orders.OrderListResponse -import com.alya.ecommerce_serang.data.api.response.store.orders.PaymentConfirmationResponse +import com.alya.ecommerce_serang.data.api.response.store.sells.OrderListResponse +import com.alya.ecommerce_serang.data.api.response.store.sells.PaymentConfirmationResponse import com.alya.ecommerce_serang.data.api.retrofit.ApiService class SellsRepository(private val apiService: ApiService) { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt index d76b9b0..a1d78b1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt @@ -48,6 +48,13 @@ class MyStoreActivity : AppCompatActivity() { enableEdgeToEdge() + binding.header.headerTitle.text = "Toko Saya" + + binding.header.headerLeftIcon.setOnClickListener { + onBackPressed() + finish() + } + viewModel.loadMyStore() viewModel.myStoreProfile.observe(this){ user -> diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/DetailSellsActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/DetailSellsActivity.kt new file mode 100644 index 0000000..87cdd04 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/DetailSellsActivity.kt @@ -0,0 +1,129 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells + +import android.os.Bundle +import android.util.Log +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.alya.ecommerce_serang.data.api.response.store.sells.Orders +import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig +import com.alya.ecommerce_serang.data.repository.SellsRepository +import com.alya.ecommerce_serang.databinding.ActivityDetailSellsBinding +import com.alya.ecommerce_serang.utils.BaseViewModelFactory +import com.alya.ecommerce_serang.utils.SessionManager +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel +import com.google.gson.Gson +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import java.util.TimeZone +import kotlin.getValue + +class DetailSellsActivity : AppCompatActivity() { + private lateinit var binding: ActivityDetailSellsBinding + private lateinit var sessionManager: SessionManager + + private var sells: Orders? = null + private lateinit var productAdapter: SellsProductAdapter + + private val viewModel: SellsViewModel by viewModels { + BaseViewModelFactory { + val apiService = ApiConfig.getApiService(sessionManager) + val sellsRepository = SellsRepository(apiService) + SellsViewModel(sellsRepository) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityDetailSellsBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.header.headerTitle.text = "Detail Pesanan" + binding.header.headerLeftIcon.setOnClickListener { + onBackPressed() + finish() + } + + productAdapter = SellsProductAdapter() + binding.rvProductItems.apply { + adapter = productAdapter + layoutManager = LinearLayoutManager(this@DetailSellsActivity) + } + + val sellsJson = intent.getStringExtra("sells") + if (sellsJson != null) { + try { + sells = Gson().fromJson(sellsJson, Orders::class.java) + showOrderDetails() + } catch (e: Exception) { + Log.e("DetailSellsActivity", "Failed to parse order data", e) + } + } else { + Log.e("DetailSellsActivity", "Order data is missing") + } + } + + private fun showOrderDetails() { + sells?.let { sell -> + when (sell.orderStatus) { + "pending", "unpaid" -> { + binding.tvOrderSellsTitle.text = "Pesanan Belum Dibayar" + } + "shipped" -> { + binding.tvOrderSellsTitle.text = "Pesanan Telah Dikirim" + } + "delivered" -> { + binding.tvOrderSellsTitle.text = "Pesanan Telah Sampai" + } + "completed" -> { + binding.tvOrderSellsTitle.text = "Pesanan Selesai" + } + "canceled" -> { + binding.tvOrderSellsTitle.text = "Pesanan Dibatalkan" + } + } + + binding.tvOrderNumber.text = sell.orderId.toString() + binding.tvOrderCustomer.text = sell.username + binding.tvOrderDate.text = formatDate(sell.updatedAt.toString()) + binding.tvOrderTotalProduct.text = "(${sell.orderItems?.size} Barang)" + binding.tvOrderSubtotal.text = formatPrice(sell.totalAmount.toString()) + binding.tvOrderShipPrice.text = formatPrice(sell.shipmentPrice.toString()) + binding.tvOrderPrice.text = formatPrice(sell.totalAmount.toString()) + binding.tvOrderRecipient.text = sell.username + binding.tvOrderRecipientNum.text = sell.receiptNum.toString() + + sell.orderItems?.let { + productAdapter.submitList(it.filterNotNull()) + } + } + } + + private fun formatDate(dateString: String): String { + return try { + val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault()) + inputFormat.timeZone = TimeZone.getTimeZone("UTC") + + val outputFormat = SimpleDateFormat("dd MMM yyyy, HH.mm", Locale("id", "ID")) + + val date = inputFormat.parse(dateString) + + date?.let { + val calendar = Calendar.getInstance() + calendar.time = it + + outputFormat.format(calendar.time) + } ?: dateString + } catch (e: Exception) { + Log.e("DateFormatting", "Error formatting date: ${e.message}") + dateString + } + } + + private fun formatPrice(price: String): String { + val priceDouble = price.toDoubleOrNull() ?: 0.0 + val formattedPrice = String.format(Locale("id", "ID"), "Rp%,.0f", priceDouble) + return formattedPrice + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt index 181f0e5..4fadaab 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt @@ -11,12 +11,11 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.BuildConfig.BASE_URL import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.store.orders.OrdersItem +import com.alya.ecommerce_serang.data.api.response.store.sells.OrdersItem import com.alya.ecommerce_serang.ui.profile.mystore.sells.payment.DetailPaymentActivity import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment.DetailShipmentActivity import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel import com.bumptech.glide.Glide -import com.google.android.material.button.MaterialButton import com.google.gson.Gson import java.text.SimpleDateFormat import java.util.Calendar @@ -67,9 +66,9 @@ class SellsAdapter( private val layoutPayments: View = itemView.findViewById(R.id.layout_payments) private val layoutShipments: View = itemView.findViewById(R.id.layout_shipments) - private var tvSellsTitle: TextView = itemView.findViewById(R.id.tv_payment_title) + private var tvSellsTitle: TextView = itemView.findViewById(R.id.tv_order_sells_title) private var tvSellsNumber: TextView = itemView.findViewById(R.id.tv_payment_number) - private var tvSellsDueDesc: TextView = itemView.findViewById(R.id.tv_payment_due_desc) + private var tvSellsDueDesc: TextView = itemView.findViewById(R.id.tv_order_sells_desc) private var tvSellsDue: TextView = itemView.findViewById(R.id.tv_payment_due) private var tvSellsLocation: TextView = itemView.findViewById(R.id.tv_payment_location) private var tvSellsCustomer: TextView = itemView.findViewById(R.id.tv_payment_customer) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt index a2ae776..5f7ff36 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt @@ -1,5 +1,6 @@ package com.alya.ecommerce_serang.ui.profile.mystore.sells +import android.content.Intent import android.os.Bundle import android.util.Log import android.view.LayoutInflater @@ -9,15 +10,18 @@ import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager -import com.alya.ecommerce_serang.data.api.response.store.orders.OrdersItem +import com.alya.ecommerce_serang.data.api.response.store.sells.OrdersItem import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.data.repository.SellsRepository import com.alya.ecommerce_serang.databinding.FragmentSellsListBinding import com.alya.ecommerce_serang.ui.order.address.ViewState +import com.alya.ecommerce_serang.ui.profile.mystore.sells.payment.DetailPaymentActivity +import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment.DetailShipmentActivity import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel +import com.google.gson.Gson class SellsListFragment : Fragment() { @@ -169,9 +173,14 @@ class SellsListFragment : Fragment() { private fun navigateToSellsDetail(order: OrdersItem) { Log.d(TAG, "Navigating to sells detail for order: ${order.orderId}") - // Navigate to order detail from seller's perspective - // Seller views customer's order details to manage fulfillment - Toast.makeText(requireContext(), "Customer Order ID: ${order.orderId}", Toast.LENGTH_SHORT).show() + val context = requireContext() + val intent = when (status) { + "paid" -> Intent(context, DetailPaymentActivity::class.java) + "processed" -> Intent(context, DetailShipmentActivity::class.java) + else -> Intent(context, DetailSellsActivity::class.java) + } + intent.putExtra("sells_data", Gson().toJson(order)) + context.startActivity(intent) } override fun onDestroyView() { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsProductAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsProductAdapter.kt index 2ece8da..47caa84 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsProductAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsProductAdapter.kt @@ -7,8 +7,9 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.store.orders.OrderItemsItem +import com.alya.ecommerce_serang.data.api.response.store.sells.OrderItemsItem import com.bumptech.glide.Glide +import java.util.Locale class SellsProductAdapter : RecyclerView.Adapter() { @@ -30,9 +31,8 @@ class SellsProductAdapter : RecyclerView.Adapter @@ -191,7 +191,7 @@ android:background="@color/black_50" android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/layout_payment_detail"/> + app:layout_constraintTop_toBottomOf="@id/layout_sells_detail"/> diff --git a/app/src/main/res/layout/activity_detail_sells.xml b/app/src/main/res/layout/activity_detail_sells.xml new file mode 100644 index 0000000..2b5e0da --- /dev/null +++ b/app/src/main/res/layout/activity_detail_sells.xml @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +