feat Ticketobservation refs #7541

This commit is contained in:
Sergio De la torre 2024-07-10 10:59:10 +02:00
parent 3e37ca1c3d
commit 89a4cff1ed
8 changed files with 144 additions and 50 deletions

View File

@ -26,6 +26,7 @@ import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLog
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary
import es.verdnatura.presentation.view.feature.delivery.model.RouteDelivery
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import es.verdnatura.presentation.view.feature.diadeventa.model.ItemShelvingSaleDate
import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO
import es.verdnatura.presentation.view.feature.historicoshelving.model.ItemShelvingLog
@ -231,6 +232,11 @@ interface SalixService {
@Body params: Any
): Call<Any>
@GET("TicketObservations")
fun getTicketObservations(
@Query("filter") filter: String,
): Call<List<TicketObservation>>
@POST("TicketObservations/upsertWithWhere")
fun updateNoteFromDropOff(
@Query("where") where: Any? = null,

View File

@ -3,10 +3,14 @@ package es.verdnatura.presentation.view.feature.delivery.activity
import android.Manifest
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.location.Location
import android.view.View
import android.widget.ImageView
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.google.gson.Gson
@ -18,11 +22,18 @@ import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseActivity
import es.verdnatura.presentation.base.LocationUpdateCallback
import es.verdnatura.presentation.base.database
import es.verdnatura.presentation.common.GeneralAdapter
import es.verdnatura.presentation.common.GeneralItem
import es.verdnatura.presentation.common.OnGeneralItemRowClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.SignListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogList
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix
import es.verdnatura.presentation.view.feature.delivery.model.MyLocation
import es.verdnatura.presentation.view.feature.delivery.model.SignedTickets
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -44,9 +55,11 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private lateinit var ticketsSet: HashSet<Long>
private lateinit var clientTicket: ClientTicketSalix
private lateinit var db: DeliveryDatabase
private lateinit var deliveryViewModel: DeliveryViewModel
private lateinit var listClaimTicketObservations : List<TicketObservation>
override fun init() {
deliveryViewModel = DeliveryViewModel(application as MobileApplication)
when (intent.getStringExtra("objectSigned")) {
"ticket" -> {
@ -58,28 +71,53 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
}
}
setEvents()
(application as MobileApplication).setSignListener(this)
db = database(this.applicationContext)
}
private fun setToolBar() {
binding.mainToolbar.toolbarTitle.text = getString(R.string.sign)
// binding.mainToolbar.toolbarIcons.visibility = View.GONE
val listIcons: ArrayList<ImageView> = ArrayList()
val iconObservation = ImageView(this)
iconObservation.setImageResource(R.drawable.ic_claim_ui)
iconObservation.tooltipText = "Muestra las observaciones de reclamaciones"
listIcons.add(iconObservation)
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconObservation.drawable -> {
showNotes(listClaimTicketObservations)
}
}
}
})
binding.mainToolbar.toolbarIcons.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
}
private fun showDialogConfirm() {
val customDialog = CustomDialog(this)
customDialog.setTitle(getString(R.string.confirm))
.setDescription(getString(R.string.sureSign))
.setOkButton(getString(R.string.ok)) {
.setDescription(getString(R.string.sureSign)).setOkButton(getString(R.string.ok)) {
reviewDistance()
customDialog.dismiss()
}.setKoButton(getString(R.string.cancel)) {
customDialog.dismiss()
}
.show()
}.show()
}
private fun reviewDistance() {
@ -98,13 +136,11 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
if (locationCurrent.distanceTo(locationClient) > 100) {
val customDialogDistance = CustomDialog(this)
customDialogDistance.setTitle(getString(R.string.confirm))
.setDescription(
customDialogDistance.setTitle(getString(R.string.confirm)).setDescription(
getString(R.string.locationDiferent) + getString(R.string.distance) + locationCurrent.distanceTo(
locationClient
)
)
.setOkButton(getString(R.string.keep)) {
).setOkButton(getString(R.string.keep)) {
uploadImage(MyLocation(locationClient.longitude, locationClient.latitude))
customDialogDistance.dismiss()
@ -112,8 +148,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
}.setKoButton(getString(R.string.modify)) {
uploadImage(lastLocationCurrent)
customDialogDistance.dismiss()
}
.show()
}.show()
} else {
uploadImage(MyLocation(locationClient.longitude, locationClient.latitude))
}
@ -133,39 +168,80 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private fun setViews(clientTicketList: ClientTicketSalix) {
if (clientTicketList != null) {
binding.nameAddress.text = clientTicketList.nickname
ticketsSet = HashSet()
var sum = 0
for (exp in clientTicketList.tickets) {
ticketsSet.add(exp.Id)
sum += exp.Packages
binding.nameAddress.text = clientTicketList.nickname
ticketsSet = HashSet()
var sum = 0
for (exp in clientTicketList.tickets) {
ticketsSet.add(exp.Id)
sum += exp.Packages
}
binding.idTickets.text = ticketsSet.toList().toString()
binding.totalPackages.text = sum.toString()
}
//Tarea 7541
/* deliveryViewModel.getTicketObservations(ticketsSet.toList())
deliveryViewModel.responseObservations.observe(this) {
listClaimTicketObservations = it
if (it.isNotEmpty()) {
showNotes(it)
setToolBar()
}
}*/
binding.idTickets.text = ticketsSet.toList().toString()
binding.totalPackages.text = sum.toString()
}
private fun showNotes(listClaimObservations: List<TicketObservation>) {
val ticketNotes: MutableList<GeneralItem> = mutableListOf()
//Tarea 6275
for (item in listClaimObservations) {
ticketNotes.add(
GeneralItem(
text = "${item.ticketFk}:${item.description}", code = ""
)
)
}
val customDialogList = CustomDialogList(this)
customDialogList.setValueVisibility(View.GONE)
customDialogList.setTitle(getString(R.string.notesClaim)).setKoButton(
getString(
R.string.accept
)
) {
customDialogList.dismiss()
}.hideDialog().show()
val listObservationsAdapter =
GeneralAdapter(ticketNotes, object : OnGeneralItemRowClickListener {
override fun OnGeneralItemRowClickListener(item: GeneralItem) {
customDialogList.dismiss()
}
})
customDialogList.getRecyclerView().adapter = listObservationsAdapter
customDialogList.getRecyclerView().layoutManager =
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
}
private fun uploadImage(location: MyLocation) {
val deliveryViewModel = DeliveryViewModel(application as MobileApplication)
val drawing = binding.ink.bitmap
val file = File(BitMapToString(drawing, tickets = ticketsSet.toList()))
val file = File(bitMapToString(drawing, tickets = ticketsSet.toList()))
val queryMap: MutableMap<String?, String?> = HashMap()
queryMap["tickets"] = ticketsSet.toString()
queryMap["location"] = Gson().toJson(location)
queryMap["signedTime"] =
SimpleDateFormat("yyyy-LL-dd HH:mm", Locale.getDefault()).format(
Date()
)
queryMap["signedTime"] = SimpleDateFormat("yyyy-LL-dd HH:mm", Locale.getDefault()).format(
Date()
)
var mySign =
SignedTickets(
queryMap,
baseContext.externalCacheDir.toString() + "/" + file.name
)
val mySign = SignedTickets(
queryMap, baseContext.externalCacheDir.toString() + "/" + file.name
)
deliveryViewModel.saveSign(
mySign.fileName, mySign.queryMapList,
@ -189,7 +265,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
}
@Throws(IOException::class)
fun BitMapToString(bitmap: Bitmap, tickets: List<Long>): String {
fun bitMapToString(bitmap: Bitmap, tickets: List<Long>): String {
var fileNameSign = baseContext.externalCacheDir.toString() + "/sign"
for (ticket in tickets) {
fileNameSign += "_$ticket"
@ -213,9 +289,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private fun setLocation() {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
111
this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 111
)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
locationUpdateCallback = this
@ -224,9 +298,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
requestCode: Int, permissions: Array<out String>, grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
@ -243,7 +315,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
setMessage(getString(R.string.manuallyPermission))
setPositiveButton(
"Aceptar"
) { dialog, which ->
) { _, _ ->
finish()
}
@ -261,18 +333,16 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
setMessage(getString(R.string.advicePermission))
setPositiveButton(
getString(R.string.accept)
) { dialog, which ->
) { dialog, _ ->
dialog.dismiss()
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
111
activity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 111
)
}
setNegativeButton(
getString(R.string.cancel)
) { dialog, which ->
) { _, _ ->
finish()
}
}

View File

@ -57,8 +57,7 @@ data class Ticket(
data class TicketObservation
(
var ticketFk: Long,
var description: String,
var observationTypeFk: Int
var description: String
)
@Entity(tableName = "signedPending")

View File

@ -23,6 +23,7 @@ import es.verdnatura.presentation.view.feature.delivery.model.RouteDeliveryList
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.RouteList
import es.verdnatura.presentation.view.feature.delivery.model.Ticket
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.RequestBody
@ -76,6 +77,8 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
val responseNotes: LiveData<Boolean> = _responseNotes
var loadNotes: LiveData<Event<Boolean>> = _responseNotes.map { Event(it) }
private val _responseObservations by lazy { MutableLiveData<List<TicketObservation>>() }
val responseObservations: LiveData<List<TicketObservation>> = _responseObservations
private val _expeditionList by lazy { MutableLiveData<ExpeditionList>() }
val expeditionList: LiveData<ExpeditionList> = _expeditionList
@ -87,6 +90,20 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
private val _responseStateList by lazy { MutableLiveData<ResponseItemVO>() }
val responseStateList: LiveData<ResponseItemVO> = _responseStateList
fun getTicketObservations(
listTickets: List<Long>
) {
salix.getTicketObservations(
filter = """{ "where": { "observationTypeFk": 11,"ticketFk": { "inq": $listTickets } },
| "fields":["description", "ticketFk"]}""".trimMargin()
).enqueue(object : SalixCallback<List<TicketObservation>>(context) {
override fun onSuccess(response: Response<List<TicketObservation>>) {
_responseObservations.value = response.body()
}
})
}
fun companyGetFiscaldata(
userId: Int
@ -302,8 +319,6 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun updateNotesFromDropOff(
ticketFK: Long, description: String

View File

@ -836,5 +836,6 @@
<string name="errorInputQuantity">Error al introducir cantidad</string>
<string name="txtName">%1$s %2$s</string>
<string name="selectPrinterEmergency">La impresora seleccionada es solo para emergencias.¿Estás seguro?</string>
<string name="notesClaim">Notas de reclamaciones</string>
</resources>

View File

@ -836,5 +836,6 @@
<string name="errorInputQuantity">Error al introducir cantidad</string>
<string name="txtName">%1$s %2$s</string>
<string name="selectPrinterEmergency">La impresora seleccionada es solo para emergencias.¿Estás seguro?</string>
<string name="notesClaim">Notas de reclamaciones</string>
</resources>

View File

@ -836,5 +836,6 @@
<string name="errorInputQuantity">Error al introducir cantidad</string>
<string name="txtName">%1$s %2$s</string>
<string name="selectPrinterEmergency">La impresora seleccionada es solo para emergencias.¿Estás seguro?</string>
<string name="notesClaim">Notas de reclamaciones</string>
</resources>

View File

@ -838,5 +838,6 @@
<string name="errorInputQuantity">Error al introducir cantidad</string>
<string name="txtName">%1$s %2$s</string>
<string name="selectPrinterEmergency">La impresora seleccionada es solo para emergencias.¿Estás seguro?</string>
<string name="notesClaim">Notas de reclamaciones</string>
</resources>