diff --git a/app/build.gradle b/app/build.gradle
index 4608ae75..65e05a02 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,8 +14,8 @@ android {
applicationId "es.verdnatura"
minSdkVersion 21
targetSdkVersion 29
- versionCode 34
- versionName "5.2.4"
+ versionCode 39
+ versionName "5.2.9"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f5442cc2..ee231f59 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
> {
+ val params:ArrayList = ArrayList();
+ params.add(sectorFk)
+ return restClient!!.itemPlacementSupplyGetOrder("json","1",usuario,password,"application/json",params)
+ }
+
+ fun itemPlacementSupplyCloseOrder(usuario:String,password:String,id:String,quantity:String) : Call {
+ val params:ArrayList = ArrayList();
+ params.add(id)
+ params.add(quantity)
+ return restClient!!.itemPlacementSupplyCloseOrder("json","1",usuario,password,"application/json",params)
+ }
+
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/domain/GetSacadorControladorUserCase.kt b/app/src/main/java/es/verdnatura/domain/GetSacadorControladorUserCase.kt
index 24828f1a..fceb687c 100644
--- a/app/src/main/java/es/verdnatura/domain/GetSacadorControladorUserCase.kt
+++ b/app/src/main/java/es/verdnatura/domain/GetSacadorControladorUserCase.kt
@@ -52,6 +52,14 @@ class GetSacadorControladorUserCase : RestClient() {
return restClient!!.itemShelvingSaleSupplyAdd("json","1",usuario,password,"application/json",params)
}
+ fun itemShelvingPlacementSupplyAdd(usuario:String,password:String,itemShelvingFk:String,itemPlacementSupplyFk:String,quantity:String) : Call {
+ val params:ArrayList = ArrayList();
+ params.add(itemShelvingFk)
+ params.add(itemPlacementSupplyFk)
+ params.add(quantity)
+ return restClient!!.itemShelvingPlacementSupplyAdd("json","1",usuario,password,"application/json",params)
+ }
+
fun collectionStickerPrint(usuario:String,password:String,collectionFk: String,sectorFk: String) : Call {
val params:ArrayList = ArrayList()
params.add(collectionFk)
diff --git a/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
index 958ae309..bd6033ff 100644
--- a/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
+++ b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
@@ -68,6 +68,25 @@ interface VerdnaturaService {
Call>
+ @POST("almacennew/itemPlacementSupplyGetOrder")
+ fun itemPlacementSupplyGetOrder(@Header("aplicacion") aplicacion: String,
+ @Header("version") version: String,
+ @Header("user") user: String,
+ @Header("pass") pass: String,
+ @Header("Content-Type") content_type: String,
+ @Body params: List):
+ Call>
+
+ @POST("almacennew/itemPlacementSupplyCloseOrder")
+ fun itemPlacementSupplyCloseOrder(@Header("aplicacion") aplicacion: String,
+ @Header("version") version: String,
+ @Header("user") user: String,
+ @Header("pass") pass: String,
+ @Header("Content-Type") content_type: String,
+ @Body params: List):
+ Call
+
+
//SACADORES / CONTROLADORES ========================================================================>
@@ -124,6 +143,15 @@ interface VerdnaturaService {
@Body params: List):
Call
+ @POST("almacennew/itemShelvingPlacementSupplyAdd")
+ fun itemShelvingPlacementSupplyAdd(@Header("aplicacion") aplicacion: String,
+ @Header("version") version: String,
+ @Header("user") user: String,
+ @Header("pass") pass: String,
+ @Header("Content-Type") content_type: String,
+ @Body params: List):
+ Call
+
@POST("almacennew/collectionStickerPrint")
fun collectionStickerPrint(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt
index 74bcd7b5..9483c883 100644
--- a/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt
@@ -1,19 +1,38 @@
package es.verdnatura.presentation.base
+import android.Manifest
+import android.Manifest.permission
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.media.AudioManager
+import android.os.Build
import android.os.Bundle
+import android.speech.RecognitionListener
+import android.speech.RecognizerIntent
+import android.speech.SpeechRecognizer
+import android.speech.tts.TextToSpeech
+import android.speech.tts.UtteranceProgressListener
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
+import androidx.core.content.PermissionChecker.checkCallingOrSelfPermission
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
+import es.verdnatura.domain.toast
+import es.verdnatura.presentation.common.mediaCurrentVolume
+import es.verdnatura.presentation.common.mediaMaxVolume
+import es.verdnatura.presentation.common.setMediaVolume
import org.koin.androidx.viewmodel.ext.android.viewModel
+import java.util.*
import kotlin.reflect.KClass
abstract class BaseFragment(viewModelClass: KClass) :
- Fragment() {
+ Fragment(), TextToSpeech.OnInitListener , RecognitionListener{
protected val PREFS_USER = "es.verdnatura.user.prefs"
@@ -25,10 +44,35 @@ abstract class BaseFragment(viewModelCla
protected val SECTORFK = "sectorFk"
protected val WAREHOUSEFK = "warehouseFk"
protected val RECORDAR = "recordar"
+ protected val VOZ = "voz"
protected val viewModel: V by viewModel(viewModelClass)
protected lateinit var binding: T
+ private var textToSpeech: TextToSpeech? = null
+ private var mAudioManager:AudioManager? = null
+ protected var mSpeechRecognizer: SpeechRecognizer? = null
+ private var mSpeechRecognizerIntent: Intent? = null
+
+ protected val NEW_COLLECTION = 0
+ protected val LISTO = 1
+ protected val CANCEL = 2
+ protected val VOLVER = 3
+ protected val REPITE = 4
+ protected val OTRO = 5
+ protected val FALTA = 6
+ protected val ERROR = -1
+
+ val allowedStrings =
+ Arrays.asList(
+ "cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete",
+ "ocho", "nueve", "diez", "once", "doce", "trece", "catorce",
+ "quince", "dieziseis", "diezisiete", "dieziocho", "diezinueve", "veinte",
+ "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa",
+ "cien", "mil"
+ )
+
+
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -37,11 +81,11 @@ abstract class BaseFragment(viewModelCla
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
-
initDataBinding()
getBundleArguments()
observeViewModel()
-
+ runSound()
+ requestRecordAudioPermission()
init()
}
@@ -52,6 +96,32 @@ abstract class BaseFragment(viewModelCla
open fun getBundleArguments() {}
open fun addBindingVariables() {}
+ open fun setSpeak() {
+ //VOZ
+ textToSpeech = TextToSpeech(requireContext(),this)
+ mAudioManager = requireActivity().getSystemService(Context.AUDIO_SERVICE) as AudioManager
+ }
+
+ open fun initialize(){
+ //ESCUCHA
+ try {
+ mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(requireContext())
+ mSpeechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
+ mSpeechRecognizerIntent!!.putExtra(
+ RecognizerIntent.EXTRA_LANGUAGE_MODEL,
+ RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
+ )
+ mSpeechRecognizerIntent!!.putExtra(
+ RecognizerIntent.EXTRA_LANGUAGE,
+ Locale.getDefault()
+ )
+ mSpeechRecognizerIntent!!.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true)
+ mSpeechRecognizer?.setRecognitionListener(this)
+ startListening()
+ }catch (e:Exception){
+ cancelSpeech()
+ }
+ }
private fun initDataBinding() {
binding = DataBindingUtil.bind(view!!)!!
@@ -62,4 +132,268 @@ abstract class BaseFragment(viewModelCla
}
+ override fun onInit(status: Int) {
+ if (status == TextToSpeech.SUCCESS) {
+ val spanish = Locale("es", "ES")
+ textToSpeech!!.language = spanish
+ textToSpeech!!.setOnUtteranceProgressListener(object: UtteranceProgressListener() {
+ override fun onDone(utteranceId: String?) {
+ Log.i("SPEEAK","on done")
+ requireActivity().runOnUiThread(Runnable {
+ if (mSpeechRecognizer != null){
+ mSpeechRecognizer!!.destroy()
+ mSpeechRecognizer = null
+ }
+ initialize()
+
+ })
+ }
+
+ override fun onError(utteranceId: String?) {
+ "Error to speak".toast(requireContext())
+ }
+
+ override fun onStart(utteranceId: String?) {
+ Log.i("SPEEAK","on start")
+ runSound()
+
+ }
+
+ })
+ }else{
+ "La voz no se ha podido iniciar".toast(requireContext())
+ }
+ }
+
+ private fun runSound(){
+ // Get the maximum media/music volume
+ val maxVolume = mAudioManager?.mediaMaxVolume
+ mAudioManager?.setMediaVolume(maxVolume!! / 2)
+ }
+
+ private fun muteSound() {
+ if (mAudioManager?.mediaCurrentVolume != 0){
+ mAudioManager?.setMediaVolume(0)
+ }
+
+ }
+
+ fun speak(frase:String) {
+ textToSpeech!!.speak(frase, TextToSpeech.QUEUE_FLUSH, null, "frase")
+ }
+
+ open fun startListening() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ muteSound()
+ }
+ mSpeechRecognizer!!.startListening(mSpeechRecognizerIntent)
+ }
+
+
+ override fun onReadyForSpeech(params: Bundle?) {
+ Log.i("Speech", "onReadyForSpeech")
+ }
+
+ override fun onBeginningOfSpeech() {
+ Log.i("Speech", "onBeginningOfSpeech")
+ }
+
+ override fun onRmsChanged(rmsdB: Float) {}
+
+ override fun onBufferReceived(buffer: ByteArray?) {
+ Log.i("Speech", "onBufferReceived")
+ }
+
+ override fun onEndOfSpeech() {
+ Log.i("Speech", "onEndOfSpeech")
+ }
+
+ override fun onError(error: Int) {
+ Log.i("Speech", "onError "+error)
+ mSpeechRecognizer!!.destroy()
+ mSpeechRecognizer = null
+ initialize()
+ }
+
+ override fun onResults(results: Bundle) {}
+
+ override fun onPartialResults(partialResults: Bundle?) {
+ Log.i("Speech", "onPartialResults")
+ }
+
+ override fun onEvent(eventType: Int, params: Bundle?) {
+ Log.i("Speech", "onEvent")
+ }
+
+ open fun checkText(text: String): Int {
+
+ //check for nuevo
+ val nuevo = getMatch(text, "nuevo")
+
+ //check for listo
+ val listo = getMatch(text, "listo")
+
+ //check for cancelar
+ val cancelar = getMatch(text, "cancelar")
+
+ //check for volver
+ val volver = getMatch(text, "volver")
+
+ //check for repite
+ val repite = getMatch(text, "repite")
+
+ //check for siguiente
+ val otro = getMatch(text, "otro")
+
+ //check for FALTA
+ val falta = getMatch(text, "falta")
+ val words = IntArray(7)
+ words[0] = nuevo
+ words[1] = listo
+ words[2] = cancelar
+ words[3] = volver
+ words[4] = repite
+ words[5] = otro
+ words[6] = falta
+ return getMax(words)
+ }
+
+ private fun getMax(a: IntArray): Int {
+ var max = a[0]
+ var pos = 0
+ for (i in a.indices) {
+ if (a[i] > max) {
+ max = a[i]
+ pos = i
+ }
+ }
+ return if (max < 80) {
+ -1
+ } else pos
+ }
+
+ private fun getMatch(a: String, b: String): Int {
+ var count = 0
+ val cha = a.toCharArray()
+ val chb = b.toCharArray()
+ for (i in cha) {
+ for (x in chb) {
+ if (x == i) {
+ count += 1
+ break
+ }
+ }
+ }
+ val numChar = a.length
+ return count * 100 / numChar
+ }
+
+ private fun requestRecordAudioPermission() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ val requiredPermission: String = Manifest.permission.RECORD_AUDIO
+ val res = context!!.checkCallingOrSelfPermission(requiredPermission)
+ // If the user previously denied this permission then show a message explaining why
+ // this permission is needed
+ if (res == PackageManager.PERMISSION_DENIED) {
+ requestPermissions(arrayOf(requiredPermission), 101)
+ }
+ }
+ }
+
+ fun cancelSpeech(){
+ if (mSpeechRecognizer != null){
+ mSpeechRecognizer!!.destroy()
+ mSpeechRecognizer = null
+ }
+ }
+
+ /*open fun wordToNumber(input: String?): Int {
+ var input = input
+ var isValidInput = true
+ var result = 0
+ var finalResult = 0
+ if (input != null && input.length > 0) {
+ input = input.replace("-".toRegex(), " ")
+ input = input.toLowerCase().replace(" and".toRegex(), " ")
+ val splittedParts =
+ input.trim { it <= ' ' }.split("\\s+".toRegex()).toTypedArray()
+ for (str in splittedParts) {
+ if (!es.verdnatura.warehouse.UTILS.Utils.allowedStrings.contains(str)) {
+ isValidInput = false
+ return -1
+ }
+ }
+ if (isValidInput) {
+ for (str in splittedParts) {
+ if (str.equals("cero", ignoreCase = true)) {
+ result += 0
+ } else if (str.equals("uno", ignoreCase = true)) {
+ result += 1
+ } else if (str.equals("dos", ignoreCase = true)) {
+ result += 2
+ } else if (str.equals("tres", ignoreCase = true)) {
+ result += 3
+ } else if (str.equals("cuatro", ignoreCase = true)) {
+ result += 4
+ } else if (str.equals("cinco", ignoreCase = true)) {
+ result += 5
+ } else if (str.equals("seis", ignoreCase = true)) {
+ result += 6
+ } else if (str.equals("siete", ignoreCase = true)) {
+ result += 7
+ } else if (str.equals("ocho", ignoreCase = true)) {
+ result += 8
+ } else if (str.equals("nueve", ignoreCase = true)) {
+ result += 9
+ } else if (str.equals("diez", ignoreCase = true)) {
+ result += 10
+ } else if (str.equals("once", ignoreCase = true)) {
+ result += 11
+ } else if (str.equals("doce", ignoreCase = true)) {
+ result += 12
+ } else if (str.equals("trece", ignoreCase = true)) {
+ result += 13
+ } else if (str.equals("catorce", ignoreCase = true)) {
+ result += 14
+ } else if (str.equals("quince", ignoreCase = true)) {
+ result += 15
+ } else if (str.equals("dieziseis", ignoreCase = true)) {
+ result += 16
+ } else if (str.equals("diezisiete", ignoreCase = true)) {
+ result += 17
+ } else if (str.equals("dieziocho", ignoreCase = true)) {
+ result += 18
+ } else if (str.equals("diezinueve", ignoreCase = true)) {
+ result += 19
+ } else if (str.equals("veinte", ignoreCase = true)) {
+ result += 20
+ } else if (str.equals("treinta", ignoreCase = true)) {
+ result += 30
+ } else if (str.equals("cuarenta", ignoreCase = true)) {
+ result += 40
+ } else if (str.equals("cincuenta", ignoreCase = true)) {
+ result += 50
+ } else if (str.equals("sesenta", ignoreCase = true)) {
+ result += 60
+ } else if (str.equals("setenta", ignoreCase = true)) {
+ result += 70
+ } else if (str.equals("ochenta", ignoreCase = true)) {
+ result += 80
+ } else if (str.equals("noventa", ignoreCase = true)) {
+ result += 90
+ } else if (str.equals("cien", ignoreCase = true)) {
+ result *= 100
+ } else if (str.equals("mil", ignoreCase = true)) {
+ result *= 1000
+ finalResult += result
+ result = 0
+ }
+ }
+ finalResult += result
+ return finalResult
+ }
+ }
+ return finalResult
+ }*/
}
+
diff --git a/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt
index d216a2a2..ce59a4c6 100644
--- a/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt
+++ b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt
@@ -5,6 +5,7 @@ import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
+import android.media.AudioManager
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
@@ -140,4 +141,24 @@ fun Activity.hideKeyboard() {
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
val hideSoftInputFromWindow = inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
-}
\ No newline at end of file
+}
+
+// Extension function to change media volume programmatically
+fun AudioManager.setMediaVolume(volumeIndex:Int) {
+ // Set media volume level
+ this.setStreamVolume(
+ AudioManager.STREAM_MUSIC, // Stream type
+ volumeIndex, // Volume index
+ AudioManager.FLAG_SHOW_UI// Flags
+ )
+}
+
+
+// Extension property to get media maximum volume index
+val AudioManager.mediaMaxVolume:Int
+ get() = this.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
+
+
+// Extension property to get media/music current volume index
+val AudioManager.mediaCurrentVolume:Int
+ get() = this.getStreamVolume(AudioManager.STREAM_MUSIC)
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt
index f3feb108..32c172e3 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt
@@ -25,6 +25,7 @@ class AjustesFragment : BaseFragment(Aj
private var password:String? = ""
private lateinit var customDialog: CustomDialog
private var sectorListVO:List = listOf()
+ private var vozList:List = listOf()
private var prefs: SharedPreferences? = null
private var ajustesAdapter: AjustesAdapter? = null
@@ -36,7 +37,7 @@ class AjustesFragment : BaseFragment(Aj
override fun onCreate(savedInstanceState: Bundle?) {
prefs = activity!!.getSharedPreferences(PREFS_USER,0)
customDialog = CustomDialog(requireContext())
- viewModel.inititializeDefaultAjusts(prefs!!.getString(SECTORDESCRIP,getString(R.string.Sinsector)).toString(),prefs!!.getInt(SECTORFK,0),prefs!!.getInt(WAREHOUSEFK,0))
+ viewModel.inititializeDefaultAjusts(prefs!!.getString(SECTORDESCRIP,getString(R.string.Sinsector)).toString(),prefs!!.getInt(SECTORFK,0),prefs!!.getInt(WAREHOUSEFK,0),prefs!!.getString(VOZ,"NO").toString())
super.onCreate(savedInstanceState)
}
@@ -64,7 +65,12 @@ class AjustesFragment : BaseFragment(Aj
}else if (item.id == 2){
getString(R.string.Nodisponibleenestaversión).toast(requireContext())
}else if (item.id == 3){
- getString(R.string.Nodisponibleenestaversión).toast(requireContext())
+ val listVoz : ArrayList = ArrayList()
+ listVoz.add("NO")
+ listVoz.add("YES")
+ vozList = listVoz
+ val array = arrayOfNulls(listVoz.size)
+ showDialogVoz(array = listVoz.toArray(array))
}
}
})
@@ -133,6 +139,33 @@ class AjustesFragment : BaseFragment(Aj
dialog.show()
}
+ private fun showDialogVoz(array:Array){
+ val builder = AlertDialog.Builder(this.context)
+
+
+ builder.setTitle(getString(R.string.Seleccionaunsector))
+ builder.setItems(array) { _, which ->
+ val selected = array[which]
+ vozList.forEach {
+ if (it.equals(selected)){
+ val editor = prefs!!.edit()
+ editor.putString(VOZ,it)
+ editor.apply()
+
+ viewModel.ajustesitem.get(3).selected = it
+ ajustesAdapter!!.notifyDataSetChanged()
+
+ return@forEach
+ }
+ }
+
+
+ }
+
+ val dialog = builder.create()
+ dialog.show()
+ }
+
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt
index e7729d43..711db855 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt
@@ -34,7 +34,7 @@ class AjustesViewModel : BaseViewModel() {
- fun inititializeDefaultAjusts(sectorDescrip: String,sectorFk : Int, warehouseFk : Int) {
+ fun inititializeDefaultAjusts(sectorDescrip: String,sectorFk : Int, warehouseFk : Int,vozDescrip:String) {
_ajustesitem.add(
AjustesItemVO(0,
"Sector",
@@ -60,7 +60,7 @@ class AjustesViewModel : BaseViewModel() {
_ajustesitem.add(
AjustesItemVO(3,
"Voz",
- "",
+ vozDescrip,
0,
0)
)
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt
index 5f35090d..b0296888 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt
@@ -6,6 +6,7 @@ import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
import android.os.Bundle
+import android.speech.SpeechRecognizer
import android.util.Log
import android.view.View
import android.view.inputmethod.EditorInfo
@@ -51,6 +52,7 @@ class CollectionFragment(
private var sectorFk = ""
private var warehouseFk = ""
private var token = ""
+ private var voz = ""
private var sales:List = listOf()
private var saleAdapter:SaleAdapter? = null
private var lm : LinearLayoutManager? = null
@@ -75,6 +77,11 @@ class CollectionFragment(
private var myKM: KeyguardManager? = null
+ private var state = 0
+
+ private var mIsListening = false
+ private var placementPicked:PlacementVO? = null
+
companion object {
fun newInstance(collection:CollectionVO,type:String) = CollectionFragment(collection,type)
@@ -94,6 +101,7 @@ class CollectionFragment(
sectorFk = prefs.getInt(SECTORFK,1).toString()
token = prefs.getString(TOKEN,"").toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
+ voz = prefs.getString(VOZ,"NO").toString()
mperror = MediaPlayer.create((activity as MainActivity),R.raw.error)
mpok = MediaPlayer.create((activity as MainActivity),R.raw.ok)
if (collection.tickets.isEmpty()){
@@ -121,6 +129,10 @@ class CollectionFragment(
toolbar_title.text = "collectionTicket_get"
setToolBar()
setEvents()
+ if (type == SACADOR && voz != "NO"){
+ setSpeak()
+ }
+
if (collection.tickets.isNotEmpty()){
createCollectionList()
}
@@ -160,7 +172,9 @@ class CollectionFragment(
}
private fun scanRequest(){
- scan_input.requestFocus()
+ if (scan_input != null) {
+ scan_input.requestFocus()
+ }
hideKeyboards()
}
@@ -194,7 +208,9 @@ class CollectionFragment(
}
private fun hideKeyboards(){
- requireActivity().hideKeyboard()
+ try{
+ requireActivity().hideKeyboard()
+ }catch (e:Exception){}
}
override fun observeViewModel() {
@@ -291,15 +307,28 @@ class CollectionFragment(
//CREATE LIST
private fun createCollectionList(){
+ state = 0
+ if (type == SACADOR && voz != "NO"){
+ // initialize()
+ speak("Colección cargada, diga listo para empezar.")
+ }
+
toolbar_title.text = collection.collectionFk
splash_progress.visibility = View.GONE
var salesList:ArrayList = ArrayList()
tickets = ArrayList()
collection.tickets.forEach { ticket ->
ticket.sales.forEach {saleVO ->
- salesList.add(saleVO)
- if (tickets.firstOrNull { it == saleVO.ticketFk}.isNullOrEmpty())
- tickets.add(saleVO.ticketFk)
+ if (type == SACADOR && saleVO.quantity != "0"){
+ salesList.add(saleVO)
+ if (tickets.firstOrNull { it == saleVO.ticketFk}.isNullOrEmpty())
+ tickets.add(saleVO.ticketFk)
+ }else if (type == CONTROLADOR){
+ salesList.add(saleVO)
+ if (tickets.firstOrNull { it == saleVO.ticketFk}.isNullOrEmpty())
+ tickets.add(saleVO.ticketFk)
+ }
+
}
}
@@ -351,6 +380,7 @@ class CollectionFragment(
setScrollListener(lm!!)
changeInitTicketState()
+
}
private fun setScrollListener(lm: LinearLayoutManager){
@@ -362,6 +392,8 @@ class CollectionFragment(
})
}
+
+
//SEARCH AND MARK
private fun findSale(txtscan:String){
goBack = false
@@ -372,27 +404,30 @@ class CollectionFragment(
for (saleVO in sales) {
if(saleVO.isPrepared != "1" && saleVO.isPreviousPrepared != "1"){
//1- Por itemFk
- if (txtscan == saleVO.itemFk){
+ /* if (txtscan == saleVO.itemFk){
mpok!!.start()
isOk = true
markLine(index,type)
break
- }
+ }*/
//2- Por carro
- var shelvingIndex = 0
- for (placementVO in saleVO.placements){
- if (txtscan.toUpperCase() == placementVO.shelving.toUpperCase() && placementVO.visible != "(0)"){
- mpok!!.start()
- isOk = true
- showShelving(index,shelvingIndex)
- isBreak = true
- break
+ if (saleVO.placements != null){
+ var shelvingIndex = 0
+ for (placementVO in saleVO.placements){
+ if (placementVO.shelving != null && placementVO.visible != null && txtscan.toUpperCase() == placementVO.shelving.toUpperCase() && placementVO.visible != "(0)"){
+ mpok!!.start()
+ isOk = true
+ showShelving(index,shelvingIndex)
+ isBreak = true
+ break
+ }
+ shelvingIndex+=1
}
- shelvingIndex+=1
+ if (isBreak) break
}
- if (isBreak) break
+
//3- Por barcode
- saleVO.Barcodes.forEach { barcode ->
+ /*saleVO.Barcodes.forEach { barcode ->
if (txtscan == barcode){
mpok!!.start()
isOk = true
@@ -400,7 +435,7 @@ class CollectionFragment(
isBreak = true
}
}
- if (isBreak) break
+ if (isBreak) break*/
}
index += 1
}
@@ -528,6 +563,7 @@ class CollectionFragment(
}
private fun markLine(position:Int,newType: String){
+ state = 0
if (type == SACADOR){
sales[position].isPrepared = if (sales[position].isPrepared == "1") "0" else "1"
if (sales[position].isPrepared == "1"){
@@ -546,12 +582,17 @@ class CollectionFragment(
private fun setListPosition(position:Int,isFromBack:Boolean){
storedPosition = position
if (type == SACADOR){
- fragment_sacador_collections.addViewObserver {
- lm!!.scrollToPositionWithOffset(position,0)
+ if (fragment_sacador_collections != null){
+ fragment_sacador_collections.addViewObserver {
+ lm!!.scrollToPositionWithOffset(position,0)
+ }
}
+
}else if (isFromBack){
- fragment_sacador_collections.addViewObserver {
- lm!!.scrollToPositionWithOffset(position,0)
+ if (fragment_sacador_collections != null) {
+ fragment_sacador_collections.addViewObserver {
+ lm!!.scrollToPositionWithOffset(position, 0)
+ }
}
}
@@ -569,7 +610,7 @@ class CollectionFragment(
}
private fun unMarkLine(position: Int,newType: String){
-
+ state = 0
if (sales[position].isPrepared == "1"){
customDialog.setTitle("Desmarcar linea").setDescription("Vas a desmarcar la linea: "+sales[position].itemFk+ " ¿Estás seguro?").setOkButton("Desmarcar"){
sales[position].isPrepared = "0"
@@ -642,9 +683,9 @@ class CollectionFragment(
try {
customDialogList.setTitle("$shelving($item) $total de $longName").setOkButton("Coger") {
if (customDialogList.getValueTwo().isNotEmpty()) {
- if (customDialogList.getValue().toBigInteger() > total.toBigInteger()) {
+ if (isNumber(customDialogList.getValue()) && customDialogList.getValue().toInt() > total.toInt()) {
"La cantidad supera a la disponible".toast(requireContext())
- } else {
+ } else if (isNumber(customDialogList.getValue())) {
if (checkItemScan(customDialogList.getValueTwo())) {
onQuantityOfShelvingSelected(itemShelvingFk)
mpok?.start()
@@ -661,6 +702,8 @@ class CollectionFragment(
}
scanRequest()
hideKeyboards()
+ }else{
+ "cantidad introducida erronea".toast(requireContext())
}
} else {
@@ -675,21 +718,22 @@ class CollectionFragment(
}.setHintValue("Cantidad que coges:").setValue(total).setHintValueTwo("Escanea item")
.setValueTwo("").show()
}catch (e:Exception){}
-
+ try{
customDialogList.getEditTextTwo().post(Runnable {
customDialogList.getEditTextTwo().requestFocusFromTouch()
val lManager: InputMethodManager =
activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
lManager.hideSoftInputFromWindow(customDialogList.getEditTextTwo().windowToken, InputMethodManager.SHOW_FORCED)
})
+ }catch (e:Exception){}
try {
customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (customDialogList.getValueTwo().isNotEmpty()) {
try {
- if (customDialogList.getValue().toBigInteger() > total.toBigInteger()) {
+ if (isNumber(customDialogList.getValue()) && customDialogList.getValue().toInt() > total.toInt()) {
"La cantidad supera a la disponible".toast(requireContext())
- } else {
+ } else if (isNumber(customDialogList.getValue())) {
if (checkItemScan(customDialogList.getValueTwo())) {
onQuantityOfShelvingSelected(itemShelvingFk)
mpok?.start()
@@ -703,7 +747,10 @@ class CollectionFragment(
code = customDialogList.getValueTwo()
)
customDialogList.dismiss()
+ scanRequest()
}
+ }else{
+ "cantidad introducida erronea".toast(requireContext())
}
}catch (e:Exception){
@@ -756,27 +803,39 @@ class CollectionFragment(
return false
}
- private fun onQuantityOfShelvingSelected(itemShelvingFk:String){
+ private fun onQuantityOfShelvingSelected(itemShelvingFk:String,quantity:String = "0"){
//1 - MODIFICAR CANTIDAD DEL CARRO
try {
val shelvingVisible = sales[storedPosition].placements[storedShelvingPosition].visible.substring(1,sales[storedPosition].placements[storedShelvingPosition].visible.indexOf(")"))
- sales[storedPosition].placements[storedShelvingPosition].visible =
- "("+(shelvingVisible.toInt() - customDialogList.getValue().toInt()).toString()+")"
+ if (quantity == "0"){
+ sales[storedPosition].placements[storedShelvingPosition].visible = "("+(shelvingVisible.toInt() - customDialogList.getValue().toInt()).toString()+")"
+ }else{
+ sales[storedPosition].placements[storedShelvingPosition].visible = "("+(shelvingVisible.toInt() - quantity.toInt()).toString()+")"
+ }
+
viewModel.itemShelvingSaleSupplyAdd(
usuario = user,
password = password,
itemShelvingFk = itemShelvingFk,
saleFk = sales[storedPosition].saleFk,
- quantity = customDialogList.getValue()
+ quantity = if (quantity != "0") quantity else customDialogList.getValue()
)
}catch (e:Exception){}
//2- MODIFICAR EL PICKED DEL SALE
try{
- sales[storedPosition].pickedQuantity = (sales[storedPosition].pickedQuantity.toInt() + customDialogList.getValue().toInt()).toString()
+ if (quantity == "0") {
+ sales[storedPosition].pickedQuantity =
+ (sales[storedPosition].pickedQuantity.toInt() + customDialogList.getValue()
+ .toInt()).toString()
+ }else{
+ sales[storedPosition].pickedQuantity =
+ (sales[storedPosition].pickedQuantity.toInt() +quantity
+ .toInt()).toString()
+ }
}catch (e:Exception){}
//3- MARCAR LINEA
@@ -1278,7 +1337,164 @@ class CollectionFragment(
customDialogList.getRecyclerView().layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
-
+
+ fun isNumber(num:String) : Boolean{
+ var numberInt = 0
+ try{
+ numberInt = num.toInt()
+ return true
+ }catch (e: Exception){
+ return false
+ }
+ }
+
+ //VOZ
+ override fun onResults(results: Bundle) {
+ super.onResults(results)
+ Log.i("Speech", "onResults")
+ val matches = results
+ .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
+ if (matches != null) {
+ Log.i("RESPUESTA", matches[0])
+ mIsListening = false
+ mSpeechRecognizer!!.cancel()
+ getText(matches[0])
+ }
+ }
+
+ private fun getText(text:String){
+ val pos = checkText(text)
+ when (pos) {
+ NEW_COLLECTION -> {
+
+ }
+ CANCEL -> {
+
+ }
+ LISTO -> {
+ state += 1
+ speakOrder()
+ }
+ VOLVER -> {
+
+ }
+ REPITE -> {
+ speakOrder()
+ }
+ OTRO -> {
+ speak("Orden no registrada")
+ }
+ FALTA -> {
+ speak("Orden no registrada")
+ }
+ else -> speak("Orden no registrada")
+ }
+ }
+
+ private fun speakOrder(){
+ if (type == SACADOR){
+ if (state == 0){
+ speak("Colección cargada, diga listo para empezar.")
+ }else{
+ var index = 0
+ for (sale in sales){
+ if (sale.isPrepared == "0" && sale.isPreviousPrepared == "0" && sale.isControlled == "0"){
+ if (state == 1){
+ //cantar pasillo
+ if (sale.placements.size > 0){
+ var placementIndex = 0
+ for (placement in sale.placements){
+ var visible = placement.visible
+ visible = visible.replace("(","")
+ visible = visible.replace(")","")
+ var quantityVisible = 0
+ try {
+ quantityVisible = visible.toInt()
+ }catch (e:Exception){}
+
+ if (quantityVisible > 0){
+ val pasillo = placement.placement.subSequence(0,sale.placements[0].placement.indexOf("-")).toString()
+ val sector = placement.placement.subSequence(sale.placements[0].placement.indexOf("-")+1,sale.placements[0].placement.length).toString()
+ var letras:ArrayList = ArrayList()
+ val carro = placement.shelving
+ var carroSeparate:StringBuilder = StringBuilder("")
+ for (l in carro){
+ carroSeparate.append(l)
+ carroSeparate.append(" ")
+ }
+ try {
+ speak("Pasillo "+pasillo.toInt()+ ", Sector "+sector.toInt()+ ", "+carroSeparate.toString())
+ }catch (e:Exception){
+ speak("Pasillo "+pasillo+ " Sector "+sector+" Carro "+carro)
+ }
+ placementPicked = placement
+ storedShelvingPosition = placementIndex
+ break
+ }
+
+ placementIndex += 1
+ }
+
+
+ }else{
+ speak("El item "+sale.itemFk+" no se encuentra disponible. Se necesita actuación manual.")
+ }
+
+ }else if (state == 2){
+ //cantar articulo
+ try {
+ val item = sale.itemFk
+ val cantidad = sale.quantity.toInt() - sale.pickedQuantity.toInt()
+ speak("Item "+item.toInt()+ ", Cantidad: "+cantidad)
+ }catch (e:Exception){
+ speak("Se necesita actuación manual")
+ }
+ }else if (state == 3){
+ //marcar linea
+ var visible = placementPicked!!.visible
+ visible = visible.replace("(","")
+ visible = visible.replace(")","")
+ var quantityVisible = 0
+ try {
+ quantityVisible = visible.toInt()
+ }catch (e:Exception){}
+
+ var needPicked = 0
+ try {
+ needPicked = sale.quantity.toInt() - sale.pickedQuantity.toInt()
+ }catch (e:Exception){}
+
+ storedPosition = index
+ if (quantityVisible < needPicked){
+ onQuantityOfShelvingSelected(itemShelvingFk = placementPicked!!.itemShelvingSaleFk,quantity = quantityVisible.toString())
+ }else{
+ onQuantityOfShelvingSelected(itemShelvingFk = placementPicked!!.itemShelvingSaleFk,quantity = needPicked.toString())
+ }
+
+ state = 0
+ speak("Acción registrada. Diga listo para continuar")
+
+ }
+
+ break
+
+ }
+
+ index += 1
+ }
+
+ if (index >= sales.size){
+ speak("Colección completada. Muchas gracias")
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ cancelSpeech()
+ super.onDestroy()
+ }
+
}
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt
index 9e25cef4..6a4d5113 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt
@@ -30,6 +30,7 @@ import es.verdnatura.presentation.view.feature.parking.fragment.ParkingFragment
import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroFragment
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.presacador.fragment.PreSacadorFragment
+import es.verdnatura.presentation.view.feature.reposicion.fragment.ReposicionFragment
import es.verdnatura.presentation.view.feature.sacador.fragment.SacadorFragment
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.shelvingparking.fragment.ShelvingParkingFragment
@@ -168,6 +169,9 @@ class MainActivity : BaseActivity() , OnPasillerosItemClick
"Pre Sacador" -> {
addFragmentOnTop(PreSacadorFragment.newInstance())
}
+ "Reposición" -> {
+ addFragmentOnTop(ReposicionFragment.newInstance())
+ }
"Consultar artículo" -> {
addFragmentOnTop(ItemCardFragment.newInstance(entryPoint))
}
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt
index a997aa70..202646be 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt
@@ -41,6 +41,8 @@ class PasilleroFragment : BaseFragment,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
+ private val onQuantityClick: OnQuantityClickListener,
private val onSaleClickListener: OnSaleClickListener
): RecyclerView.Adapter () {
var context: Context? = null
@@ -64,6 +66,19 @@ class PreSacadorAdapter (
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Consultar artículo"),sale.itemFk)
}
+ itemArticleQuantity.setOnClickListener {
+ onQuantityClick.onQuantityClick(sale)
+ }
+
+ itemArticleQuantityPicked.setOnClickListener {
+ onQuantityClick.onQuantityClick(sale)
+ }
+
+ if (sale.quantity == sale.pickedQuantity){
+ sale.isPreviousPrepared = "1"
+ }else{
+ sale.isPreviousPrepared = "0"
+ }
//SEMAFORO
if (sale.isPreviousPrepared == "1"){
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorFragment.kt
index af2e354d..01f703a8 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorFragment.kt
@@ -21,6 +21,7 @@ import es.verdnatura.presentation.common.*
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.component.CustomDialogList
+import es.verdnatura.presentation.view.component.CustomDialogThreeButtons
import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
@@ -57,6 +58,9 @@ class PreSacadorFragment : BaseFragment = ArrayList()
private var placementSupplyAdapter : BarcodeAdapter? = null
private lateinit var customDialogInput: CustomDialogInput
+ private lateinit var customDialogThreeButtons: CustomDialogThreeButtons
+ private var token = ""
+ private var ticketFk = ""
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
@@ -68,6 +72,7 @@ class PreSacadorFragment : BaseFragment 6){
//es ticket
+ ticketFk = scan_input.text.toString()
searchTicket(scan_input.text.toString())
}else{
//es sale
@@ -196,7 +203,16 @@ class PreSacadorFragment : BaseFragment
+ if (saleVO.idMovimiento == sale.saleFk){
+ showQuantityDialog(index)
+ }
+ }
+ }
+
+ },object :
OnSaleClickListener {
override fun onSaleClick(sale: SaleVO) {
sales.forEachIndexed { index, saleVO ->
@@ -235,7 +251,7 @@ class PreSacadorFragment : BaseFragment>() }
val salesList: LiveData>
@@ -35,6 +38,10 @@ class PreSacadorViewModel : BaseViewModel() {
val responseCode: LiveData
get() = _responseCode
+ private val _responseIncQuantity by lazy { MutableLiveData() }
+ val responseIncQuantity: LiveData
+ get() = _responseIncQuantity
+
fun ticketToPrePrepare(usuario:String,password:String,ticketFk:String,sectorFk:String){
getPreSacadorUseCase.ticketToPrePrepare(usuario,password,ticketFk,sectorFk).enqueue(object :
@@ -173,4 +180,67 @@ class PreSacadorViewModel : BaseViewModel() {
}
})
}
+
+ fun saleMove(usuario:String,password:String,saleFk: String,quantity: String,originalQuantity : String){
+ getSacadorControladorUserCase.saleMove(usuario,password,saleFk,quantity,originalQuantity).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada saleMove")
+ }else{
+ _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+ fun collectionMissingTrash(usuario:String,password:String,saleFk: String,quantity: String,type:String,warehouseFk:String,originalQuantity: String){
+ getSacadorControladorUserCase.collectionMissingTrash(usuario,password,saleFk,quantity,type,warehouseFk,originalQuantity).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionMissingTrash")
+ }else{
+ _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+ fun collectionIncreaseQuantity(usuario:String,password:String,saleFk: String,quantity: String){
+ getSacadorControladorUserCase.collectionIncreaseQuantity(usuario,password,saleFk,quantity).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _responseIncQuantity.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _responseIncQuantity.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionIncreaseQuantity")
+ }else{
+ _responseIncQuantity.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+ fun sendChekingPresence(token:String,workerId:String,message:String){
+ try{
+ getLoginUserCase.sendChekingPresence(token,workerId.toInt(),message).enqueue(object : Callback{
+ override fun onResponse(call: Call, response: Response) {
+ Log.i("Salix","Mensaje enviado a salix")
+ }
+
+ override fun onFailure(call: Call, t: Throwable) {
+ Log.i("Salix Error",""+t.message)
+ }
+ })
+ }catch (e:Exception){}
+
+ }
}
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/mapper/SaleMapper.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/mapper/SaleMapper.kt
index 56020ef2..8a6f6c2b 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/mapper/SaleMapper.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/mapper/SaleMapper.kt
@@ -15,10 +15,30 @@ fun PreSacadorItemVO.toSale() : SaleVO {
line1 = longName,
line2 = if (subName.isNullOrEmpty()) "" else subName,
pickedQuantity = picked.toString(),
- workerFk = trabajador,
+ workerFk = if (trabajador.isNullOrEmpty()) { "0" } else trabajador,
originalQuantity = quantity.toString(),
placements = carros,
- agencyName = trabajador
+ agencyName = if (trabajador.isNullOrEmpty()) { "" } else trabajador
+ )
+}
+
+
+fun PreSacadorItemVO.toSaleReposicion() : SaleVO {
+ return SaleVO(
+ ticketFk = id,
+ level = "1",
+ saleFk = idMovimiento,
+ itemFk = itemFk,
+ quantity = quantity.toString(),
+ longName = longName,
+ isPreviousPrepared = if ((quantity - saldo) == 0) "1" else "0",
+ line1 = longName,
+ line2 = if (subName.isNullOrEmpty()) "" else subName,
+ pickedQuantity = (quantity - saldo).toString(),
+ workerFk = if (trabajador.isNullOrEmpty()) { "0" } else trabajador,
+ originalQuantity = quantity.toString(),
+ placements = carros,
+ agencyName = if (trabajador.isNullOrEmpty()) { "" } else trabajador
)
}
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/adapter/ReposicionAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/adapter/ReposicionAdapter.kt
new file mode 100644
index 00000000..d26d5623
--- /dev/null
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/adapter/ReposicionAdapter.kt
@@ -0,0 +1,103 @@
+package es.verdnatura.presentation.view.feature.reposicion.adapter
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import es.verdnatura.R
+import es.verdnatura.databinding.ItemArticleRowBinding
+import es.verdnatura.presentation.common.OnPasillerosItemClickListener
+import es.verdnatura.presentation.common.OnQuantityClickListener
+import es.verdnatura.presentation.common.OnSaleClickListener
+import es.verdnatura.presentation.view.feature.collection.adapter.PlacementAdapter
+import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
+import es.verdnatura.presentation.view.feature.presacador.adapter.PreSacadorAdapter
+import es.verdnatura.presentation.view.feature.presacador.mapper.toSale
+import es.verdnatura.presentation.view.feature.presacador.mapper.toSaleReposicion
+import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
+import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
+
+class ReposicionAdapter (
+ private val items: List,
+ private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
+ private val onSaleClickListener: OnSaleClickListener
+): RecyclerView.Adapter () {
+ var context: Context? = null
+ var position:Int = 0
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AjustesItemHolder {
+ this.context = parent.context
+ return AjustesItemHolder(
+ ItemArticleRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
+ )
+ }
+
+ override fun getItemCount() =items.size
+
+ override fun onBindViewHolder(holder: AjustesItemHolder, position: Int) {
+ this.position = position
+ holder.bind(items[position])
+ }
+
+ inner class AjustesItemHolder(
+ val binding: ItemArticleRowBinding
+ ) : RecyclerView.ViewHolder(binding.root){
+ fun bind(preSale: PreSacadorItemVO) {
+ binding.apply {
+
+ val sale : SaleVO = preSale.toSaleReposicion()
+
+
+ itemRowLayout.visibility = View.GONE
+
+ if (sale.pickedQuantity.isNullOrEmpty())
+ sale.pickedQuantity = "0"
+
+ val childLayoutManager = LinearLayoutManager(context!!, RecyclerView.HORIZONTAL, false)
+
+ itemArticlePlacements.apply {
+ layoutManager = childLayoutManager
+ adapter = PlacementAdapter(sale.placements,onPasillerosItemClickListener)
+ }
+
+ //CLICK EVENTS
+ contentLayout.setOnClickListener {
+ onSaleClickListener.onSaleClick(sale)
+ }
+
+ itemArticleItemFk.setOnClickListener {
+ onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Consultar artículo"),sale.itemFk)
+ }
+
+
+ if (sale.quantity == sale.pickedQuantity){
+ sale.isPreviousPrepared = "1"
+ }else{
+ sale.isPreviousPrepared = "0"
+ }
+
+ //SEMAFORO
+ if (sale.isPreviousPrepared == "1"){
+ itemArticleRowSemaforoPre.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_sky_blue))
+ }else{
+ itemArticleRowSemaforoPre.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_warm_grey))
+ }
+
+
+
+ if (sale.isPreviousPrepared == "1"){
+ contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_sky_blue))
+ }else{
+ contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_black))
+ }
+
+
+ //ASIGNAMOS VALOR A LA VSITA
+ this.sale = sale
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionFragment.kt
new file mode 100644
index 00000000..1e0485b6
--- /dev/null
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionFragment.kt
@@ -0,0 +1,597 @@
+package es.verdnatura.presentation.view.feature.reposicion.fragment
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.graphics.drawable.Drawable
+import android.media.MediaPlayer
+import android.os.Bundle
+import android.view.View
+import android.view.inputmethod.EditorInfo
+import android.view.inputmethod.InputMethodManager
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.LinearLayoutManager
+import es.verdnatura.R
+import es.verdnatura.databinding.ReposicionFragmentBinding
+import es.verdnatura.domain.ConstAndValues
+import es.verdnatura.domain.toast
+import es.verdnatura.presentation.base.BaseFragment
+import es.verdnatura.presentation.common.*
+import es.verdnatura.presentation.view.component.CustomDialog
+import es.verdnatura.presentation.view.component.CustomDialogInput
+import es.verdnatura.presentation.view.component.CustomDialogList
+import es.verdnatura.presentation.view.component.CustomDialogThreeButtons
+import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter
+import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
+import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
+import es.verdnatura.presentation.view.feature.main.activity.MainActivity
+import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroFragment
+import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
+import es.verdnatura.presentation.view.feature.presacador.adapter.PreSacadorAdapter
+import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
+import es.verdnatura.presentation.view.feature.reposicion.adapter.ReposicionAdapter
+import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyListVO
+import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
+import kotlinx.android.synthetic.main.activity_main.*
+import kotlinx.android.synthetic.main.reposicion_fragment.*
+import kotlinx.android.synthetic.main.reposicion_fragment.fragment_sacador_collections
+import kotlinx.android.synthetic.main.reposicion_fragment.scan_input
+import kotlinx.android.synthetic.main.reposicion_fragment.splash_progress
+import kotlinx.android.synthetic.main.toolbar.*
+
+class ReposicionFragment : BaseFragment(
+ ReposicionViewModel::class){
+
+ private var user = ""
+ private var password = ""
+ private var sectorFk = ""
+ private var warehouseFk = ""
+
+ private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
+
+ private lateinit var customDialog: CustomDialog
+ private lateinit var customDialogList: CustomDialogList
+ private lateinit var customDialogInput: CustomDialogInput
+ private lateinit var customDialogThreeButtons: CustomDialogThreeButtons
+
+ private var sales:ArrayList = ArrayList()
+
+ private var lm : LinearLayoutManager? = null
+ private var saleAdapter: ReposicionAdapter? = null
+
+ var mperror: MediaPlayer? = null
+ var mpok: MediaPlayer? = null
+
+ private var storedBackPosition : Int = 0
+ private var storedShelvingPosition:Int = 0
+ private var storedPosition: Int = 0
+ private var listPlacementSupply:ArrayList = ArrayList()
+ private var itemShelvingFkStored : String = ""
+ private var placementSupplyAdapter : BarcodeAdapter? = null
+
+ private var goBack:Boolean = false
+ private var goBack2:Boolean = false
+
+ companion object {
+ fun newInstance() = ReposicionFragment()
+ }
+
+ override fun onAttach(context: Context) {
+ if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
+ super.onAttach(context)
+ }
+
+ override fun getLayoutId(): Int = R.layout.reposicion_fragment
+
+ override fun init() {
+ customDialog = CustomDialog(requireContext())
+ customDialogList = CustomDialogList(requireContext())
+ customDialogInput = CustomDialogInput(requireContext())
+ customDialogThreeButtons = CustomDialogThreeButtons(requireContext())
+ activity!!.main_bottom_navigation.visibility = View.GONE
+ splash_progress.visibility = View.GONE
+ toolbar_title.text = "itemPlacementSupplyGetOrder"
+ setToolBar()
+ setEvents()
+ super.init()
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
+ user = prefs.getString(USER,"").toString()
+ password = prefs.getString(PASSWORD,"").toString()
+ sectorFk = prefs.getInt(SECTORFK,1).toString()
+ warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
+
+ mperror = MediaPlayer.create((activity as MainActivity),R.raw.error)
+ mpok = MediaPlayer.create((activity as MainActivity),R.raw.ok)
+
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onPause() {
+ goBack = true
+ goBack2 = true
+ super.onPause()
+ }
+
+
+ private fun setEvents(){
+ backButton.setOnClickListener {
+ activity!!.onBackPressed()
+ }
+
+ btn_obtener.setOnClickListener {
+ splash_progress.visibility = View.VISIBLE
+ viewModel.itemPlacementSupplyGetOrder(usuario = user,password = password,sectorFk = sectorFk)
+ }
+
+ btn_cancelar.setOnClickListener {
+
+ customDialog.setTitle("Confirmar").setDescription("¿Estás seguro de cerrar el pedido?").setKoButton("Cerrar"){
+ scanRequest()
+ customDialog.dismiss()
+ }.setOkButton("Cerrar"){
+ splash_progress.visibility = View.VISIBLE
+ if (sales.count() > 0){
+ viewModel.itemPlacementSupplyCloseOrder(usuario = user,password = password,id = sales[0].id,quantity = sales[0].quantity.toString())
+ }
+ customDialog.dismiss()
+
+ }.show()
+
+
+
+ }
+
+ //ESCANER =========
+ hideKeyboards()
+ scan_input.requestFocus()
+ scan_input.setOnEditorActionListener { v, actionId, event ->
+ if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
+ if (!scan_input.text.toString().isNullOrEmpty()){
+
+ if (sales.count() > 0 && sales[0].saldo == 0){
+ "Pedido completado".toast(requireContext())
+ }else{
+ findSale(scan_input.text.toString())
+ }
+
+
+ }
+ scan_input.setText("")
+ hideKeyboards()
+ return@setOnEditorActionListener true
+ }
+ true
+ }
+
+ hideKeyboards()
+
+
+ //LISTA =========
+ collection_swipe.setOnRefreshListener {
+ splash_progress.visibility = View.VISIBLE
+ viewModel.itemPlacementSupplyGetOrder(usuario = user,password = password,sectorFk = sectorFk)
+ collection_swipe.isRefreshing = false
+ }
+
+ }
+
+ private fun hideKeyboards(){
+ requireActivity().hideKeyboard()
+ }
+
+ override fun observeViewModel() {
+ with(viewModel){
+ salesList.observe(viewLifecycleOwner, Observer {
+ splash_progress.visibility = View.GONE
+ createSaleList(it)
+ })
+
+ placementSuppleyList.observe(viewLifecycleOwner, Observer {
+ splash_progress.visibility = View.GONE
+ if (!goBack) printShelvingResult(it)
+ goBack = false
+ })
+
+ responseCode.observe(viewLifecycleOwner, Observer {
+ splash_progress.visibility = View.GONE
+ if (!goBack2){
+ if (it.isError){
+ customDialog.setTitle("Error").setDescription(it.errorMessage).setKoButton("Cerrar"){
+ scanRequest()
+ customDialog.dismiss()
+ }.show()
+ }else{
+ if (checkItemScan(it.response)){
+ scanRequest()
+ customDialogList.dismiss()
+ mpok?.start()
+ onQuantityOfShelvingSelected(itemShelvingFkStored)
+ }else{
+ customDialogList.setValueTwo("")
+ showErrorMessage("El resultado del procedimiento barcodeToItem de la etiqueta escaneada es: " +it.response)
+ mperror?.start()
+ }
+ }
+ }
+
+ goBack2 = false
+
+ })
+
+ responseClose.observe(viewLifecycleOwner, Observer {
+ splash_progress.visibility = View.GONE
+ sales.clear()
+ saleAdapter!!.notifyDataSetChanged()
+ btn_cancelar.visibility = View.GONE
+ })
+ }
+
+
+ super.observeViewModel()
+ }
+
+ private fun createSaleList(salesList : List){
+ splash_progress.visibility = View.GONE
+ if (salesList.isNullOrEmpty()){
+ customDialog.setTitle("Reposición").setDescription("No existen pedidos para reponer").setKoButton("Cancelar"){
+ if (sales.count()>0){
+ sales.clear()
+ saleAdapter!!.notifyDataSetChanged()
+ }
+ customDialog.dismiss()
+ }.show()
+ scan_input.visibility = View.GONE
+ btn_cancelar.visibility = View.GONE
+ }else if(salesList.count() > 0 && salesList[0].saldo == 0){
+ "Pedido completado".toast(requireContext())
+ scan_input.visibility = View.GONE
+ btn_cancelar.visibility = View.GONE
+ }else{
+
+ scan_input.visibility = View.VISIBLE
+ btn_cancelar.visibility = View.VISIBLE
+
+ sales = ArrayList()
+ salesList.forEach {
+ sales.add(it)
+ }
+ lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+
+ saleAdapter = ReposicionAdapter(sales,pasillerosItemClickListener!!,object :
+ OnSaleClickListener {
+ override fun onSaleClick(sale: SaleVO) {
+ sales.forEachIndexed { index, saleVO ->
+ if (saleVO.idMovimiento == sale.saleFk) {
+ if (saleVO.quantity != saleVO.picked) {
+ showScanner(index, saleVO)
+ } else {
+ unMarkLine(index)
+ }
+ }
+ }
+ }
+ })
+ fragment_sacador_collections.adapter = saleAdapter
+ fragment_sacador_collections.layoutManager = lm
+
+ }
+ }
+
+
+ //SEARCH AND MARK
+ private fun findSale(txtscan:String){
+ var index = 0
+ var isBreak = false
+ var isOk = false
+
+ for (saleVO in sales) {
+ if(saleVO.quantity != saleVO.picked){
+ //1- Por carro
+ var shelvingIndex = 0
+ for (placementVO in saleVO.carros){
+ if (txtscan.toUpperCase() == placementVO.shelving.toUpperCase()){
+ mpok!!.start()
+ isOk = true
+ showShelving(index,shelvingIndex)
+ isBreak = true
+ break
+ }
+ shelvingIndex+=1
+ }
+ if (isBreak) break
+ }
+ index += 1
+ }
+
+ if (!isOk) {
+ mperror!!.start()
+ ("Elemento escaneado no encontrado: "+txtscan).toast(requireContext())
+ }
+
+ }
+
+ private fun findSale(txtscan:String,position: Int){
+ var index = 0
+ var isBreak = false
+ var isOk = false
+
+ val saleVO = sales[position]
+
+ if(saleVO.quantity != saleVO.picked){
+ //1- Por carro
+ var shelvingIndex = 0
+ for (placementVO in saleVO.carros){
+ if (txtscan.toUpperCase() == placementVO.shelving.toUpperCase()){
+ mpok!!.start()
+ isOk = true
+ showShelving(position,shelvingIndex)
+ isBreak = true
+ break
+ }
+ shelvingIndex+=1
+ }
+ }
+ index += 1
+
+
+ if (!isOk) {
+ mperror!!.start()
+ ("Elemento escaneado no encontrado: "+txtscan).toast(requireContext())
+ }
+
+ }
+
+ //SHELVINGS
+ private fun showShelving(position:Int,shelvingPosition:Int){
+ storedShelvingPosition = shelvingPosition
+ storedPosition = position
+ splash_progress.visibility = View.VISIBLE
+ var quantityGet = "0"
+ try{
+ quantityGet = (sales[position].saldo - sales[position].picked).toString()
+ }catch (e:Exception){}
+ viewModel.itemPlacementSupplyAiming(
+ usuario = user,
+ password = password,
+ itemFk = sales[position].itemFk,
+ quantity = quantityGet,
+ shelvingFk = sales[position].carros[shelvingPosition].shelving
+ )
+ }
+
+ private fun printShelvingResult(placementSupplyListVO: PlacementSupplyListVO){
+ var shelving = ""
+ var item = ""
+ var longName = ""
+ var total = "0"
+ var itemShelvingFk = "0"
+ if (!placementSupplyListVO.list.isEmpty()){
+ val placement = placementSupplyListVO.list[0]
+ shelving = placement.shelving
+ item = placement.itemFk
+ longName = placement.longName
+ total = placement.total
+ itemShelvingFk = placement.itemShelvingFk
+ }
+ listPlacementSupply = ArrayList()
+ placementSupplyListVO.list.forEach {
+ listPlacementSupply.add(BarcodeVO(code = it.proposal))
+ }
+
+ customDialogList.setTitle("$shelving($item) $total de $longName").setOkButton("Coger"){
+ if (customDialogList.getValueTwo().isNotEmpty()){
+ if (checkItemScan(customDialogList.getValueTwo())){
+ onQuantityOfShelvingSelected(itemShelvingFk)
+ mpok?.start()
+ customDialogList.dismiss()
+ }else{
+ itemShelvingFkStored = itemShelvingFk
+ splash_progress.visibility = View.VISIBLE
+ viewModel.getIdFromCode(
+ usuario = user,
+ password = password,
+ code = customDialogList.getValueTwo()
+ )
+ customDialogList.dismiss()
+ }
+ scanRequest()
+ hideKeyboards()
+ }else{
+ "Escanea item para validar".toast(requireContext())
+ }
+
+
+ }.setKoButton("Cerrar"){
+ scanRequest()
+ hideKeyboards()
+ customDialogList.dismiss()
+ }.setHintValue("Cantidad que coges:").setValue(total).setHintValueTwo("Escanea item").setValueTwo("").show()
+
+
+ customDialogList.getEditTextTwo().post(Runnable {
+ customDialogList.getEditTextTwo().requestFocusFromTouch()
+ val lManager: InputMethodManager =
+ activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ lManager.hideSoftInputFromWindow(customDialogList.getEditTextTwo().windowToken, InputMethodManager.SHOW_FORCED)
+ })
+
+ customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event ->
+ if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
+ if (customDialogList.getValueTwo().isNotEmpty()){
+ if (checkItemScan(customDialogList.getValueTwo())){
+ onQuantityOfShelvingSelected(itemShelvingFk)
+ mpok?.start()
+ customDialogList.dismiss()
+ }else{
+ itemShelvingFkStored = itemShelvingFk
+ splash_progress.visibility = View.VISIBLE
+ viewModel.getIdFromCode(
+ usuario = user,
+ password = password,
+ code = customDialogList.getValueTwo()
+ )
+ customDialogList.dismiss()
+ }
+ }else{
+ "Escanea item para validar".toast(requireContext())
+ }
+ scanRequest()
+ hideKeyboards()
+ return@setOnEditorActionListener true
+
+ }
+ false
+ }
+
+ placementSupplyAdapter = BarcodeAdapter(listPlacementSupply,object: OnBarcodeRowClickListener {
+ override fun onBarcodeRowClickListener(item: BarcodeVO) {
+ placementSupplyListVO.list.forEach {
+ if (it.proposal == item.code){
+ customDialogList.setValue(it.total)
+ total = it.total
+ itemShelvingFk = it.itemShelvingFk
+ }
+ }
+
+ }
+ },showDelete = false)
+
+ customDialogList.getRecyclerView().adapter = placementSupplyAdapter
+
+ customDialogList.getRecyclerView().layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+
+ }
+
+ private fun onQuantityOfShelvingSelected(itemShelvingFk:String){
+ //1 - MODIFICAR CANTIDAD DEL CARRO
+ try {
+ val shelvingVisible = sales[storedPosition].carros[storedShelvingPosition].stockTotal
+
+ sales[storedPosition].carros[storedShelvingPosition].stockTotal = (shelvingVisible.toInt() - customDialogList.getValue().toInt()).toString()
+
+ viewModel.itemShelvingPlacementSupplyAdd(
+ usuario = user,
+ password = password,
+ itemShelvingFk = itemShelvingFk,
+ itemPlacementSupplyFk = sales[storedPosition].id,
+ quantity = customDialogList.getValue()
+ )
+
+ }catch (e:Exception){}
+
+ //2- MODIFICAR EL PICKED DEL SALE
+ try{
+ sales[storedPosition].saldo = sales[storedPosition].saldo - customDialogList.getValue().toInt()
+ }catch (e:Exception){}
+
+ //3- MARCAR LINEA
+ markLine(storedPosition)
+
+
+ }
+
+
+ //OTROS
+ private fun setToolBar(){
+ toolbar_subtitle.visibility = View.VISIBLE
+
+ val listIcons:ArrayList = ArrayList()
+ val iconPrint : Drawable = resources.getDrawable(R.drawable.ic_print_black_24dp,resources.newTheme())
+ val iconParking : Drawable = resources.getDrawable(R.drawable.ic_local_parking_black_24dp,resources.newTheme())
+ //val iconTransferir : Drawable = resources.getDrawable(R.drawable.ic_swap_horiz_black_24dp,resources.newTheme())
+
+ //listIcons.add(iconPrint)
+ listIcons.add(iconParking)
+ //listIcons.add(iconTransferir)
+
+ toolbar_icons.adapter = ToolBarAdapter(listIcons,object: OnOptionsSelectedListener {
+ override fun onOptionsItemSelected(item: Drawable) {
+ if (item == iconPrint){
+
+ }else if (item == iconParking){
+ pasillerosItemClickListener?.onPasillerosItemClickListener(PasillerosItemVO(title = "Parking"),"")
+ }
+ }
+ })
+ toolbar_icons.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
+ }
+
+
+ private fun scanRequest(){
+ scan_input.requestFocus()
+ hideKeyboards()
+ }
+
+ private fun checkItemScan(valueToCheck:String):Boolean{
+ val saleToCheck = sales[storedPosition]
+ return saleToCheck.itemFk == valueToCheck
+ }
+
+ private fun showErrorMessage(text:String){
+ customDialog.setTitle("Error al marcar la linea").setDescription(text).setKoButton("Cerrar"){
+ customDialog.dismiss()
+ }.show()
+ }
+
+ private fun showScanner(index:Int, sale:PreSacadorItemVO){
+ customDialogInput.setTitle(""+sale.itemFk).setDescription("Escanea el carro para el item seleccionado").setOkButton("Aceptar"){
+ if (!customDialogInput.getValue().isNullOrEmpty()) {
+ findSale(customDialogInput.getValue(),index)
+ }
+ customDialogInput.setValue("")
+ scanRequest()
+ customDialogInput.dismiss()
+ hideKeyboards()
+ }.setKoButton("Cancelar"){
+ customDialogInput.dismiss()
+ }.setValue("").show()
+ customDialogInput.getEditText().requestFocus()
+ customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
+ if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
+ if (!customDialogInput.getValue().isNullOrEmpty()) {
+ findSale(customDialogInput.getValue(),index)
+ }
+ customDialogInput.setValue("")
+ scanRequest()
+ customDialogInput.dismiss()
+ hideKeyboards()
+ return@setOnEditorActionListener true
+ }
+ false
+ }
+
+ }
+
+
+ private fun unMarkLine(position: Int){
+
+ if (sales[position].quantity == sales[position].picked){
+ customDialog.setTitle("Desmarcar linea").setDescription("Vas a desmarcar la linea: "+sales[position].itemFk+ " ¿Estás seguro?").setOkButton("Desmarcar"){
+ sales[position].picked = 0
+ saleAdapter!!.notifyDataSetChanged()
+
+ /*viewModel.saleTrackingDel(
+ usuario = user,
+ password = password,
+ saleFk = sales[position].idMovimiento
+ )*/
+ scanRequest()
+ customDialog.dismiss()
+ }.setKoButton("Cancelar"){
+ scanRequest()
+ customDialog.dismiss()
+ }.show()
+ }
+
+
+
+ }
+
+ private fun markLine(position:Int){
+ saleAdapter!!.notifyDataSetChanged()
+ }
+
+
+}
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionViewModel.kt
new file mode 100644
index 00000000..b671a06a
--- /dev/null
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/reposicion/fragment/ReposicionViewModel.kt
@@ -0,0 +1,149 @@
+package es.verdnatura.presentation.view.feature.reposicion.fragment
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import es.verdnatura.domain.GetPreSacadorUseCase
+import es.verdnatura.domain.GetSacadorControladorUserCase
+import es.verdnatura.domain.GetUbicadorUserCase
+import es.verdnatura.presentation.base.BaseViewModel
+import es.verdnatura.presentation.common.ResponseItemVO
+import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
+import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyListVO
+import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyVO
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class ReposicionViewModel : BaseViewModel() {
+ private val getPreSacadorUseCase: GetPreSacadorUseCase = GetPreSacadorUseCase()
+ private val getUbicadorUserCase: GetUbicadorUserCase = GetUbicadorUserCase()
+ private val getSacadorControladorUserCase: GetSacadorControladorUserCase = GetSacadorControladorUserCase()
+
+ private val _salesList by lazy { MutableLiveData>() }
+ val salesList: LiveData>
+ get() = _salesList
+
+ private val _response by lazy { MutableLiveData() }
+ val response: LiveData
+ get() = _response
+
+ private val _responseClose by lazy { MutableLiveData() }
+ val responseClose: LiveData
+ get() = _responseClose
+
+ private val _placementSuppleyList by lazy { MutableLiveData() }
+ val placementSuppleyList: LiveData
+ get() = _placementSuppleyList
+
+ private val _responseCode by lazy { MutableLiveData() }
+ val responseCode: LiveData
+ get() = _responseCode
+
+ fun itemPlacementSupplyGetOrder(usuario:String,password:String,sectorFk:String){
+ getPreSacadorUseCase.itemPlacementSupplyGetOrder(usuario,password,sectorFk).enqueue(object :
+ Callback> {
+ override fun onFailure(call: Call>, t: Throwable) {
+ _salesList.value = listOf()
+ }
+ override fun onResponse(
+ call: Call>,
+ response: Response>
+ ) {
+ if (response.body() != null){
+ _salesList.value = response.body()?.let { it }
+ }else{
+ _salesList.value = listOf()
+ }
+ }
+ })
+ }
+
+ fun parking(usuario: String,password: String,ticketFk: String,parking:String){
+ getUbicadorUserCase.shelvingPark(usuario,password,ticketFk,parking).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada shelvingPark")
+ }else{
+ _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+ fun itemPlacementSupplyAiming(usuario:String,password:String,shelvingFk:String,quantity:String,itemFk:String){
+ getSacadorControladorUserCase.itemPlacementSupplyAiming(usuario,password,shelvingFk,quantity,itemFk).enqueue(object :
+ Callback> {
+ override fun onFailure(call: Call>, t: Throwable) {
+ val listError:ArrayList = ArrayList()
+ listError.add(PlacementSupplyVO(isError = true,errorMessage = t.message!!))
+ _placementSuppleyList.value = PlacementSupplyListVO(listError)
+ }
+ override fun onResponse(
+ call: Call>,
+ response: Response>
+ ) {
+ if (response.body() != null){
+ _placementSuppleyList.value = response.body()?.let { PlacementSupplyListVO(it) }
+ }else{
+ val listError:ArrayList = ArrayList()
+ listError.add(PlacementSupplyVO(isError = true,errorMessage = "Error en la llamada de itemPlacementSupplyAiming"))
+ _placementSuppleyList.value = PlacementSupplyListVO(listError)
+ }
+ }
+ })
+ }
+
+ fun getIdFromCode(usuario:String,password:String,code: String){
+ getSacadorControladorUserCase.getIdFromCode(usuario,password,code).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _responseCode.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _responseCode.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada barcodeToItem")
+ }else{
+ _responseCode.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+
+ fun itemShelvingPlacementSupplyAdd(usuario:String,password:String,itemShelvingFk:String,itemPlacementSupplyFk:String,quantity:String){
+ getSacadorControladorUserCase.itemShelvingPlacementSupplyAdd(usuario,password,itemShelvingFk,itemPlacementSupplyFk,quantity).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemShelvingPlacementSupplyAdd")
+ }else{
+ _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+ fun itemPlacementSupplyCloseOrder(usuario:String,password:String,id:String,quantity:String){
+ getPreSacadorUseCase.itemPlacementSupplyCloseOrder(usuario,password,id,quantity).enqueue(object : Callback{
+ override fun onFailure(call: Call, t: Throwable) {
+ _responseClose.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ if (response.body() == null){
+ _responseClose.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemPlacementSupplyCloseOrder")
+ }else{
+ _responseClose.value = ResponseItemVO(isError = false,response = response.body()!!)
+ }
+ }
+ })
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragment.kt
index aed9c36a..a4b3757f 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragment.kt
@@ -178,8 +178,15 @@ class UbicadorFragment(
viewModel.shelvingPark(user,password,shelvingFk,customDialogInput.getValue())
customDialogInput.dismiss()
parking = customDialogInput.getValue()
- toolbar_title.text = shelvingFk.toUpperCase() + " P: "+parking+ " E: "+etiquetas
- mpok!!.start()
+ if (toolbar_title != null && shelvingFk != null && parking != null && etiquetas != null){
+ toolbar_title.text = shelvingFk.toUpperCase() + " P: "+parking+ " E: "+etiquetas
+ }else{
+ toolbar_title.text = ""
+ }
+ if (mpok != null) {
+ mpok!!.start()
+ }
+
return@setOnEditorActionListener true
}
false
@@ -204,10 +211,10 @@ class UbicadorFragment(
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
viewModel.shelvingChange(user,password,shelvingFk,customDialogInput.getValue())
- customDialogInput.dismiss()
shelvingFk = customDialogInput.getValue()
toolbar_title.text = shelvingFk.toUpperCase() + " P: "+parking+ " E: "+etiquetas
mpok!!.start()
+ customDialogInput.dismiss()
return@setOnEditorActionListener true
}
false
diff --git a/app/src/main/res/drawable/ic_baseline_all_inbox_24.xml b/app/src/main/res/drawable/ic_baseline_all_inbox_24.xml
new file mode 100644
index 00000000..9d07048c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_all_inbox_24.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/item_article_row.xml b/app/src/main/res/layout/item_article_row.xml
index 57c71dcd..db0d7be7 100644
--- a/app/src/main/res/layout/item_article_row.xml
+++ b/app/src/main/res/layout/item_article_row.xml
@@ -90,8 +90,7 @@
android:layout_height="wrap_content"
android:paddingTop="@dimen/layout_margin_min"
android:paddingBottom="@dimen/layout_margin_min"
- android:background="@color/verdnatura_black"
- style="@style/LayoutClickable">
+ android:background="@color/verdnatura_black">
+ android:maxLines="1"/>
+ app:layout_constraintTop_toTopOf="parent" />
+ android:layout_marginEnd="@dimen/layout_margin_min">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/reposicion_fragment.xml b/app/src/main/res/layout/reposicion_fragment.xml
new file mode 100644
index 00000000..5941dd00
--- /dev/null
+++ b/app/src/main/res/layout/reposicion_fragment.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index cfa162ca..534437fa 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -86,4 +86,6 @@
Rechazar
Existe una versión nueva, es recomendable actualizar.
Actualizar
+ Reposición
+ Obtener
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 77708981..92b1294b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -85,4 +85,6 @@
Reject
There is a new version, it is recommended to update.
Update
+ Replacement
+ Get