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

View File

@ -3,10 +3,14 @@ package es.verdnatura.presentation.view.feature.delivery.activity
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.location.Location import android.location.Location
import android.view.View
import android.widget.ImageView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.gms.location.LocationResult import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationServices
import com.google.gson.Gson 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.BaseActivity
import es.verdnatura.presentation.base.LocationUpdateCallback import es.verdnatura.presentation.base.LocationUpdateCallback
import es.verdnatura.presentation.base.database 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.SignListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.component.CustomDialog 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.ClientTicketSalix
import es.verdnatura.presentation.view.feature.delivery.model.MyLocation 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.SignedTickets
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -44,9 +55,11 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private lateinit var ticketsSet: HashSet<Long> private lateinit var ticketsSet: HashSet<Long>
private lateinit var clientTicket: ClientTicketSalix private lateinit var clientTicket: ClientTicketSalix
private lateinit var db: DeliveryDatabase private lateinit var db: DeliveryDatabase
private lateinit var deliveryViewModel: DeliveryViewModel
private lateinit var listClaimTicketObservations : List<TicketObservation>
override fun init() { override fun init() {
deliveryViewModel = DeliveryViewModel(application as MobileApplication)
when (intent.getStringExtra("objectSigned")) { when (intent.getStringExtra("objectSigned")) {
"ticket" -> { "ticket" -> {
@ -58,28 +71,53 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
} }
} }
setEvents() setEvents()
(application as MobileApplication).setSignListener(this) (application as MobileApplication).setSignListener(this)
db = database(this.applicationContext) db = database(this.applicationContext)
} }
private fun setToolBar() { 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() { private fun showDialogConfirm() {
val customDialog = CustomDialog(this) val customDialog = CustomDialog(this)
customDialog.setTitle(getString(R.string.confirm)) customDialog.setTitle(getString(R.string.confirm))
.setDescription(getString(R.string.sureSign)) .setDescription(getString(R.string.sureSign)).setOkButton(getString(R.string.ok)) {
.setOkButton(getString(R.string.ok)) {
reviewDistance() reviewDistance()
customDialog.dismiss() customDialog.dismiss()
}.setKoButton(getString(R.string.cancel)) { }.setKoButton(getString(R.string.cancel)) {
customDialog.dismiss() customDialog.dismiss()
} }.show()
.show()
} }
private fun reviewDistance() { private fun reviewDistance() {
@ -98,13 +136,11 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
if (locationCurrent.distanceTo(locationClient) > 100) { if (locationCurrent.distanceTo(locationClient) > 100) {
val customDialogDistance = CustomDialog(this) val customDialogDistance = CustomDialog(this)
customDialogDistance.setTitle(getString(R.string.confirm)) customDialogDistance.setTitle(getString(R.string.confirm)).setDescription(
.setDescription(
getString(R.string.locationDiferent) + getString(R.string.distance) + locationCurrent.distanceTo( getString(R.string.locationDiferent) + getString(R.string.distance) + locationCurrent.distanceTo(
locationClient locationClient
) )
) ).setOkButton(getString(R.string.keep)) {
.setOkButton(getString(R.string.keep)) {
uploadImage(MyLocation(locationClient.longitude, locationClient.latitude)) uploadImage(MyLocation(locationClient.longitude, locationClient.latitude))
customDialogDistance.dismiss() customDialogDistance.dismiss()
@ -112,8 +148,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
}.setKoButton(getString(R.string.modify)) { }.setKoButton(getString(R.string.modify)) {
uploadImage(lastLocationCurrent) uploadImage(lastLocationCurrent)
customDialogDistance.dismiss() customDialogDistance.dismiss()
} }.show()
.show()
} else { } else {
uploadImage(MyLocation(locationClient.longitude, locationClient.latitude)) uploadImage(MyLocation(locationClient.longitude, locationClient.latitude))
} }
@ -133,39 +168,80 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private fun setViews(clientTicketList: ClientTicketSalix) { 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) { private fun uploadImage(location: MyLocation) {
val deliveryViewModel = DeliveryViewModel(application as MobileApplication)
val drawing = binding.ink.bitmap 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() val queryMap: MutableMap<String?, String?> = HashMap()
queryMap["tickets"] = ticketsSet.toString() queryMap["tickets"] = ticketsSet.toString()
queryMap["location"] = Gson().toJson(location) queryMap["location"] = Gson().toJson(location)
queryMap["signedTime"] = queryMap["signedTime"] = SimpleDateFormat("yyyy-LL-dd HH:mm", Locale.getDefault()).format(
SimpleDateFormat("yyyy-LL-dd HH:mm", Locale.getDefault()).format( Date()
Date() )
)
var mySign = val mySign = SignedTickets(
SignedTickets( queryMap, baseContext.externalCacheDir.toString() + "/" + file.name
queryMap, )
baseContext.externalCacheDir.toString() + "/" + file.name
)
deliveryViewModel.saveSign( deliveryViewModel.saveSign(
mySign.fileName, mySign.queryMapList, mySign.fileName, mySign.queryMapList,
@ -189,7 +265,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
} }
@Throws(IOException::class) @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" var fileNameSign = baseContext.externalCacheDir.toString() + "/sign"
for (ticket in tickets) { for (ticket in tickets) {
fileNameSign += "_$ticket" fileNameSign += "_$ticket"
@ -213,9 +289,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
private fun setLocation() { private fun setLocation() {
ActivityCompat.requestPermissions( ActivityCompat.requestPermissions(
this, this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 111
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
111
) )
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
locationUpdateCallback = this locationUpdateCallback = this
@ -224,9 +298,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
} }
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(
requestCode: Int, requestCode: Int, permissions: Array<out String>, grantResults: IntArray
permissions: Array<out String>,
grantResults: IntArray
) { ) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults)
@ -243,7 +315,7 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
setMessage(getString(R.string.manuallyPermission)) setMessage(getString(R.string.manuallyPermission))
setPositiveButton( setPositiveButton(
"Aceptar" "Aceptar"
) { dialog, which -> ) { _, _ ->
finish() finish()
} }
@ -261,18 +333,16 @@ class SignedActivity : BaseActivity<ActivitySignBinding>(), LocationUpdateCallba
setMessage(getString(R.string.advicePermission)) setMessage(getString(R.string.advicePermission))
setPositiveButton( setPositiveButton(
getString(R.string.accept) getString(R.string.accept)
) { dialog, which -> ) { dialog, _ ->
dialog.dismiss() dialog.dismiss()
ActivityCompat.requestPermissions( ActivityCompat.requestPermissions(
activity, activity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 111
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
111
) )
} }
setNegativeButton( setNegativeButton(
getString(R.string.cancel) getString(R.string.cancel)
) { dialog, which -> ) { _, _ ->
finish() finish()
} }
} }

View File

@ -57,8 +57,7 @@ data class Ticket(
data class TicketObservation data class TicketObservation
( (
var ticketFk: Long, var ticketFk: Long,
var description: String, var description: String
var observationTypeFk: Int
) )
@Entity(tableName = "signedPending") @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.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.RouteList 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.Ticket
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import okhttp3.MediaType import okhttp3.MediaType
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
@ -76,6 +77,8 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
val responseNotes: LiveData<Boolean> = _responseNotes val responseNotes: LiveData<Boolean> = _responseNotes
var loadNotes: LiveData<Event<Boolean>> = _responseNotes.map { Event(it) } 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>() } private val _expeditionList by lazy { MutableLiveData<ExpeditionList>() }
val expeditionList: LiveData<ExpeditionList> = _expeditionList val expeditionList: LiveData<ExpeditionList> = _expeditionList
@ -87,6 +90,20 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
private val _responseStateList by lazy { MutableLiveData<ResponseItemVO>() } private val _responseStateList by lazy { MutableLiveData<ResponseItemVO>() }
val responseStateList: LiveData<ResponseItemVO> = _responseStateList 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( fun companyGetFiscaldata(
userId: Int userId: Int
@ -302,8 +319,6 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
}) })
} }
fun updateNotesFromDropOff( fun updateNotesFromDropOff(
ticketFK: Long, description: String ticketFK: Long, description: String

View File

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

View File

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

View File

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

View File

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