From e115da93701eece8d5b5a58f90319b4e42eaa74a Mon Sep 17 00:00:00 2001
From: Enrique Blasco <enrique.blasco@optivamedia.com>
Date: Sun, 10 May 2020 06:53:26 +0200
Subject: [PATCH] edit barcodes

---
 .../verdnatura/domain/GetItemCardUserCase.kt  |  23 ++++
 .../es/verdnatura/domain/VerdnaturaService.kt |  28 ++++
 .../presentation/common/ResponseItemVO.kt     |   2 -
 .../presentation/common/UICallbacks.kt        |   5 +
 .../view/component/CustomDialogInput.kt       |   2 -
 .../view/component/CustomDialogList.kt        |  57 ++++++++
 .../articulo/adapter/BarcodeAdapter.kt        |  44 ++++++
 .../articulo/adapter/ItemCardAdapter.kt       |   5 +-
 .../articulo/fragment/ItemCardFragment.kt     | 126 ++++++++++++++----
 .../articulo/fragment/ItemCardViewModel.kt    |  66 ++++++++-
 .../imageview/activity/ImageViewActivity.kt   |   6 -
 .../res/drawable/ic_delete_black_24dp.xml     |   5 +
 .../layout/component_custom_edit_dialog.xml   |   1 +
 .../layout/component_custom_list_dialog.xml   |  82 ++++++++++++
 app/src/main/res/layout/item_barcode_row.xml  |  50 +++++++
 app/src/main/res/layout/item_card_row.xml     |   4 +-
 16 files changed, 457 insertions(+), 49 deletions(-)
 create mode 100644 app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt
 create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/BarcodeAdapter.kt
 create mode 100644 app/src/main/res/drawable/ic_delete_black_24dp.xml
 create mode 100644 app/src/main/res/layout/component_custom_list_dialog.xml
 create mode 100644 app/src/main/res/layout/item_barcode_row.xml

diff --git a/app/src/main/java/es/verdnatura/domain/GetItemCardUserCase.kt b/app/src/main/java/es/verdnatura/domain/GetItemCardUserCase.kt
index adb74a52..7f23ef9f 100644
--- a/app/src/main/java/es/verdnatura/domain/GetItemCardUserCase.kt
+++ b/app/src/main/java/es/verdnatura/domain/GetItemCardUserCase.kt
@@ -37,4 +37,27 @@ class GetItemCardUserCase : RestClient() {
         params.add(warehouseFk)
         return restClient!!.updateGrouping("json","1",usuario,password,"application/json",params = params)!!
     }
+
+    fun updatePacking(usuario:String,password:String,itemFk:String,value:String ,warehouseFk:String) : Call<String> {
+        val params:ArrayList<String> = ArrayList();
+        params.add(itemFk)
+        params.add(value)
+        params.add(warehouseFk)
+        return restClient!!.updatePacking("json","1",usuario,password,"application/json",params = params)!!
+    }
+
+    fun itemSaveMin(usuario:String,password:String,itemFk:String,value:String) : Call<String> {
+        val params:ArrayList<String> = ArrayList();
+        params.add(itemFk)
+        params.add(value)
+        return restClient!!.itemSaveMin("json","1",usuario,password,"application/json",params = params)!!
+    }
+
+    fun barcodes_edit(usuario:String,password:String,itemFk:String,value:String, delete:String) : Call<String> {
+        val params:ArrayList<String> = ArrayList();
+        params.add(value)
+        params.add(itemFk)
+        params.add(delete)
+        return restClient!!.barcodes_edit("json","1",usuario,password,"application/json",params = params)!!
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
index 65266116..c12e1c19 100644
--- a/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
+++ b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt
@@ -77,4 +77,32 @@ interface VerdnaturaService {
                           @Body params: List<String>):
             Call<String>
 
+    @POST("almacenv2/buy_updatePacking")
+    fun updatePacking(@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<String>):
+            Call<String>
+
+    @POST("almacenv2/itemSaveMin")
+    fun itemSaveMin(@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<String>):
+            Call<String>
+
+
+    @POST("almacenv2/barcodes_edit")
+    fun barcodes_edit(@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<String>):
+            Call<String>
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/common/ResponseItemVO.kt b/app/src/main/java/es/verdnatura/presentation/common/ResponseItemVO.kt
index 997acba2..dc9c22c2 100644
--- a/app/src/main/java/es/verdnatura/presentation/common/ResponseItemVO.kt
+++ b/app/src/main/java/es/verdnatura/presentation/common/ResponseItemVO.kt
@@ -1,7 +1,5 @@
 package es.verdnatura.presentation.common
 
-import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
-
 class ResponseItemVO (
     var response:String = "",
     var isError: Boolean = false,
diff --git a/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt
index 8e4aaf11..aa0965f9 100644
--- a/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt
+++ b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt
@@ -1,6 +1,7 @@
 package es.verdnatura.presentation.common
 
 import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
+import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
 import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
 import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
 
@@ -15,4 +16,8 @@ interface OnAjustesItemClickListener {
 
 interface OnItemCardRowClickListener {
     fun onItemCardRowClickListener(item: ItemCardRowVO)
+}
+
+interface OnBarcodeRowClickListener {
+    fun onBarcodeRowClickListener(item: BarcodeVO)
 }
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogInput.kt b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogInput.kt
index 07dd2a39..50ade35e 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogInput.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogInput.kt
@@ -3,10 +3,8 @@ package es.verdnatura.presentation.view.component
 import android.app.Dialog
 import android.content.Context
 import android.view.View
-import android.widget.EditText
 import com.google.android.material.textfield.TextInputEditText
 import es.verdnatura.R
-import kotlinx.android.synthetic.main.component_custom_dialog.*
 import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_button_ko
 import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_button_ok
 import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_description
diff --git a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt
new file mode 100644
index 00000000..7db84dd2
--- /dev/null
+++ b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt
@@ -0,0 +1,57 @@
+package es.verdnatura.presentation.view.component
+
+import android.app.Dialog
+import android.content.Context
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.textfield.TextInputEditText
+import es.verdnatura.R
+import kotlinx.android.synthetic.main.component_custom_list_dialog.*
+
+
+class CustomDialogList (context: Context) : Dialog(context, R.style.DialogTheme) {
+
+    init {
+        setContentView(R.layout.component_custom_list_dialog)
+    }
+
+    fun getRecyclerView() : RecyclerView {
+        return item_recyclerview
+    }
+
+    fun getEditText() : TextInputEditText {
+        return custom_dialog_value
+    }
+
+    fun getValue() : String {
+        return custom_dialog_value.text.toString()
+    }
+
+    fun setValue(value : String): CustomDialogList{
+        custom_dialog_value.setText(value)
+        custom_dialog_value.visibility = View.VISIBLE
+        return this
+    }
+
+    fun setTitle(title: String): CustomDialogList {
+        custom_dialog_title.visibility = View.VISIBLE
+        custom_dialog_title.text = title
+        return this
+    }
+
+
+    fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
+        custom_dialog_button_ok.visibility = View.VISIBLE
+        custom_dialog_button_ok.text = text
+        custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
+        return this
+    }
+
+    fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
+        custom_dialog_button_ko.visibility = View.VISIBLE
+        custom_dialog_button_ko.text = text
+        custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
+        return this
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/BarcodeAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/BarcodeAdapter.kt
new file mode 100644
index 00000000..c952e822
--- /dev/null
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/BarcodeAdapter.kt
@@ -0,0 +1,44 @@
+package es.verdnatura.presentation.view.feature.articulo.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import es.verdnatura.databinding.ItemBarcodeRowBinding
+import es.verdnatura.presentation.common.OnBarcodeRowClickListener
+import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
+
+class BarcodeAdapter(
+    private val items: List<BarcodeVO>,
+    private val onBarcodeRowClickListener: OnBarcodeRowClickListener
+): RecyclerView.Adapter<BarcodeAdapter.ItemHolder> () {
+
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
+        return ItemHolder(
+            ItemBarcodeRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
+        )
+    }
+
+    override fun getItemCount() =items.size
+
+    override fun onBindViewHolder(holder: ItemHolder, position: Int) {
+        holder.bind(items[position])
+
+        holder.binding.root.setOnClickListener {
+            onBarcodeRowClickListener.onBarcodeRowClickListener(items[position])
+        }
+
+    }
+
+
+    class ItemHolder(
+        val binding: ItemBarcodeRowBinding
+    ) : RecyclerView.ViewHolder(binding.root){
+        private val res = binding.root.context.resources
+        fun bind(item: BarcodeVO) {
+            binding.apply {
+                this.item = item
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemCardAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemCardAdapter.kt
index 9f5c3ae6..f270fc82 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemCardAdapter.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemCardAdapter.kt
@@ -5,12 +5,8 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import es.verdnatura.R
-import es.verdnatura.databinding.ItemAjustesRowBinding
 import es.verdnatura.databinding.ItemCardRowBinding
-import es.verdnatura.presentation.common.OnAjustesItemClickListener
 import es.verdnatura.presentation.common.OnItemCardRowClickListener
-import es.verdnatura.presentation.view.feature.ajustes.adapter.AjustesAdapter
-import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
 import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
 
 class ItemCardAdapter  (
@@ -44,6 +40,7 @@ class ItemCardAdapter  (
         fun bind(item: ItemCardRowVO) {
             binding.apply {
                 if (item.barcodes.isNotEmpty()){
+                    item.value = ""
                     item.barcodes.forEach {
                         item.value = item.value + it.code + "\n"
                     }
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt
index 7e6d1e0c..9756a410 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt
@@ -3,9 +3,7 @@ package es.verdnatura.presentation.view.feature.articulo.fragment
 
 
 import android.content.Intent
-import android.content.LocusId
 import android.content.SharedPreferences
-import android.util.Log
 import android.view.View
 import android.view.inputmethod.EditorInfo
 import androidx.lifecycle.Observer
@@ -13,12 +11,15 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import es.verdnatura.R
 import es.verdnatura.databinding.FragmentItemCardBinding
 import es.verdnatura.presentation.base.BaseFragment
+import es.verdnatura.presentation.common.OnBarcodeRowClickListener
 import es.verdnatura.presentation.common.OnItemCardRowClickListener
-import es.verdnatura.presentation.common.addFragment
 import es.verdnatura.presentation.common.loadUrl
 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.feature.articulo.adapter.BarcodeAdapter
 import es.verdnatura.presentation.view.feature.articulo.adapter.ItemCardAdapter
+import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
 import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
 import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
 import es.verdnatura.presentation.view.feature.imageview.activity.ImageViewActivity
@@ -36,13 +37,16 @@ class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>
     private var warehouseFk = ""
     private var itemFk = ""
     private var adapter : ItemCardAdapter? = null
+    private var barcodeAdapter : BarcodeAdapter? = null
     private var listItemsRow:ArrayList<ItemCardRowVO> = ArrayList()
+    private var listBarcodes:ArrayList<BarcodeVO> = ArrayList()
 
     companion object {
         fun newInstance() = ItemCardFragment()
     }
     private lateinit var customDialog: CustomDialog
     private lateinit var customDialogInput: CustomDialogInput
+    private lateinit var customDialogList: CustomDialogList
 
     override fun getLayoutId(): Int = R.layout.fragment_item_card
 
@@ -53,6 +57,7 @@ class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>
         toolbar_title.text = "ItemCard"
         customDialog = CustomDialog(requireContext())
         customDialogInput = CustomDialogInput(requireContext())
+        customDialogList = CustomDialogList(requireContext())
         super.init()
     }
 
@@ -143,39 +148,48 @@ class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>
         listItemsRow.add(ItemCardRowVO(title = "Total",value = itemInfo.total,isEditable = false))
         listItemsRow.add(ItemCardRowVO(title = "Disponible",value = itemInfo.available,isEditable = false))
         listItemsRow.add(ItemCardRowVO(title = "Ubicado",value = itemInfo.enAltillo,isEditable = false))
-        //EDITABLES
 
+        //EDITABLES
         listItemsRow.add(ItemCardRowVO(title = "SIN UBICAR",value = itemInfo.enNicho,isEditable = true, action = "itemStockUpdate"))
         listItemsRow.add(ItemCardRowVO(title = "NICHO",value = itemInfo.nicho,isEditable = true, action = "itemPlacementSave"))
         listItemsRow.add(ItemCardRowVO(title = "RESERVA",value = itemInfo.reserva,isEditable = true, action = "itemPlacementSave"))
         listItemsRow.add(ItemCardRowVO(title = "GROUPING",value = itemInfo.grouping,isEditable = true, action = "updateGrouping"))
-        listItemsRow.add(ItemCardRowVO(title = "PACKING",value = itemInfo.packing,isEditable = true))
-        listItemsRow.add(ItemCardRowVO(title = "MINIMO",value = itemInfo.min,isEditable = true))
-        listItemsRow.add(ItemCardRowVO(title = "BARCODE",barcodes = itemInfo.barcodes,isEditable = true))
+        listItemsRow.add(ItemCardRowVO(title = "PACKING",value = itemInfo.packing,isEditable = true, action = "updatePacking"))
+        listItemsRow.add(ItemCardRowVO(title = "MINIMO",value = itemInfo.min,isEditable = true, action = "itemSaveMin"))
+        listItemsRow.add(ItemCardRowVO(title = "BARCODE",barcodes = itemInfo.barcodes,isEditable = true, action = "toBarcode"))
+        listBarcodes = itemInfo.barcodes as ArrayList<BarcodeVO>
 
         adapter = ItemCardAdapter(listItemsRow,object: OnItemCardRowClickListener{
             override fun onItemCardRowClickListener(item: ItemCardRowVO) {
-                customDialogInput.setTitle(item.title!!).setDescription("Valor actual: "+item.value!!).setOkButton("Guardar"){
-                    (activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
-                    editItemCardRow(item,customDialogInput.getValue())
-                    customDialogInput.hide()
 
-                }.setKoButton("Cancelar"){
-                    (activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
-                    customDialogInput.hide()
-                }.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())
-                            editItemCardRow(item,customDialogInput.getValue())
-                        customDialogInput.setValue("")
-                        customDialogInput.hide()
+
+                if(item.action != "toBarcode"){
+                    customDialogInput.setTitle(item.title!!).setDescription("Valor actual: "+item.value!!).setOkButton("Guardar"){
                         (activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
-                        return@setOnEditorActionListener true
+                        editItemCardRow(item,customDialogInput.getValue())
+                        customDialogInput.hide()
+
+                    }.setKoButton("Cancelar"){
+                        (activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
+                        customDialogInput.hide()
+                    }.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())
+                                editItemCardRow(item,customDialogInput.getValue())
+                            customDialogInput.setValue("")
+                            customDialogInput.hide()
+                            (activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
+                            return@setOnEditorActionListener true
+                        }
+                        false
                     }
-                    false
+                }else{
+                    //BARCODE ROW
+                    prepareBarcodeDialog(item)
                 }
+
             }
         })
         itemcard_recyclerview.adapter = adapter
@@ -196,11 +210,13 @@ class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>
             "itemStockUpdate" -> viewModel.itemStockUpdate(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "0")
             "itemPlacementSave" -> viewModel.itemPlacementSave(itemFk = itemFk, warehouseFk = warehouseFk, user = user, password = password, value = value)
             "updateGrouping" -> viewModel.updateGrouping(itemFk = itemFk, user = user, password = password, value = value,warehouseFk = warehouseFk)
+            "updatePacking" -> viewModel.updatePacking(itemFk = itemFk, user = user, password = password, value = value,warehouseFk = warehouseFk)
+            "itemSaveMin" -> viewModel.itemSaveMin(itemFk = itemFk, user = user, password = password, value = value)
         }
-        changeOfflineValue(item,value)
+        changeOfflineValue(item,value, listBarcodes)
     }
 
-    private fun changeOfflineValue(item:ItemCardRowVO,newValue:String){
+    private fun changeOfflineValue(item:ItemCardRowVO,newValue:String, barcodes:List<BarcodeVO>){
         var i = 0
         var position = 0
         listItemsRow.forEach {
@@ -209,9 +225,65 @@ class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>
             }
             i = i.plus(1)
         }
-        listItemsRow.get(position).value = newValue
+        if (listItemsRow.get(position).title != "BARCODE") listItemsRow.get(position).value = newValue
+        else listItemsRow.get(position).barcodes = barcodes
         adapter?.notifyDataSetChanged()
     }
 
+    private fun prepareBarcodeDialog(itemB:ItemCardRowVO){
+
+        customDialogList.setTitle("Barcodes").setOkButton("Guardar"){
+            (activity as MainActivity).hideKeyboard(customDialogList.getEditText())
+            if (!customDialogList.getValue().isNullOrEmpty())
+                updateBarcode(customDialogList.getValue(),"0",itemB)
+            customDialogList.hide()
+
+        }.setKoButton("Cerrar"){
+            (activity as MainActivity).hideKeyboard(customDialogList.getEditText())
+            customDialogList.hide()
+        }.setValue("").show()
+
+
+        (activity as MainActivity).hideKeyboard(customDialogList.getEditText())
+        customDialogList.getEditText().setOnEditorActionListener { v, actionId, event ->
+            if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
+                if (!customDialogList.getValue().isNullOrEmpty())
+                    updateBarcode(customDialogList.getValue(),"0",itemB)
+                customDialogList.setValue("")
+                customDialogList.hide()
+                (activity as MainActivity).hideKeyboard(customDialogList.getEditText())
+                return@setOnEditorActionListener true
+            }
+            false
+        }
+
+        barcodeAdapter = BarcodeAdapter(listBarcodes,object: OnBarcodeRowClickListener{
+            override fun onBarcodeRowClickListener(item: BarcodeVO) {
+                updateBarcode(item.code!!,"1",itemB)
+            }
+        })
+        customDialogList.getRecyclerView().adapter = barcodeAdapter
+
+        customDialogList.getRecyclerView().layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+    }
+
+
+    private fun updateBarcode(code:String,delete:String,item:ItemCardRowVO){
+        if (delete == "1"){
+            var i = 0
+            var posDelete = 0
+            listBarcodes.forEach {
+                if (it.code == code)
+                    posDelete = i
+                i+=1
+            }
+            listBarcodes.removeAt(posDelete)
+        }else{
+            listBarcodes.add(BarcodeVO(code))
+        }
+        viewModel.barcodesEdit(itemFk = itemFk, user = user, password = password, value = code, delete = delete)
+        barcodeAdapter!!.notifyDataSetChanged()
+        changeOfflineValue(item,"", listBarcodes)
+    }
 
 }
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt
index 88f4be50..1b8652b2 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt
@@ -27,7 +27,7 @@ class ItemCardViewModel : BaseViewModel() {
     fun getItemCard(itemFk:String,warehouseFk:String,user:String,password:String) {
         getItemCardUserCase.getItemCard(user,password,itemFk,warehouseFk).enqueue(object :Callback<ItemCardVO>{
             override fun onFailure(call: Call<ItemCardVO>, t: Throwable) {
-                _itemcard.value = ItemCardVO(isError = true,errorMessage = t.message!!)
+                _itemcard.value = ItemCardVO(isError = true,errorMessage = "Error al OBTENER "+itemFk+ " Respuesta:"+t.message!!)
             }
 
             override fun onResponse(call: Call<ItemCardVO>, response: Response<ItemCardVO>) {
@@ -44,7 +44,7 @@ class ItemCardViewModel : BaseViewModel() {
     fun itemStockUpdate(itemFk:String,warehouseFk:String,user:String,password:String,newValue:String,isTrash:String){
         getItemCardUserCase.itemStockUpdate(user,password,itemFk,warehouseFk,newValue,isTrash).enqueue(object : Callback<String>{
             override fun onFailure(call: Call<String>, t: Throwable) {
-                _response.value = ResponseItemVO(isError = true,errorMessage = t.message!!)
+                _response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar STOCK "+itemFk+ " Respuesta:"+t.message!!)
             }
 
             override fun onResponse(call: Call<String>, response: Response<String>) {
@@ -62,12 +62,12 @@ class ItemCardViewModel : BaseViewModel() {
     fun itemPlacementSave(itemFk:String,warehouseFk:String,user:String,password:String,value:String){
         getItemCardUserCase.itemPlacementSave(user,password,itemFk,warehouseFk,value).enqueue(object : Callback<String>{
             override fun onFailure(call: Call<String>, t: Throwable) {
-                _response.value = ResponseItemVO(isError = true,errorMessage = t.message!!)
+                _response.value = ResponseItemVO(isError = true,errorMessage ="Error al guardar NICHO "+itemFk+ " Respuesta:"+t.message!!)
             }
 
             override fun onResponse(call: Call<String>, response: Response<String>) {
                 if (response.body() == null){
-                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemStockUpdate")
+                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemPlacementSave")
                 }else{
                     _response.value = ResponseItemVO(isError = false,response = response.body()!!)
                 }
@@ -80,12 +80,66 @@ class ItemCardViewModel : BaseViewModel() {
     fun updateGrouping(itemFk:String,user:String,password:String,value:String,warehouseFk: String){
         getItemCardUserCase.updateGrouping(user,password,itemFk,value,warehouseFk).enqueue(object : Callback<String>{
             override fun onFailure(call: Call<String>, t: Throwable) {
-                _response.value = ResponseItemVO(isError = true,errorMessage = t.message!!)
+                _response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar GROUPING "+itemFk+ " Respuesta:"+t.message!!)
             }
 
             override fun onResponse(call: Call<String>, response: Response<String>) {
                 if (response.body() == null){
-                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemStockUpdate")
+                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updateGrouping")
+                }else{
+                    _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+                }
+
+            }
+
+        })
+    }
+
+    fun updatePacking(itemFk:String,user:String,password:String,value:String,warehouseFk: String){
+        getItemCardUserCase.updatePacking(user,password,itemFk,value,warehouseFk).enqueue(object : Callback<String>{
+            override fun onFailure(call: Call<String>, t: Throwable) {
+                _response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar PACKING "+itemFk+ " Respuesta:"+t.message!!)
+            }
+
+            override fun onResponse(call: Call<String>, response: Response<String>) {
+                if (response.body() == null){
+                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updatePacking")
+                }else{
+                    _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+                }
+
+            }
+
+        })
+    }
+
+    fun itemSaveMin(itemFk:String,user:String,password:String,value:String){
+        getItemCardUserCase.itemSaveMin(user,password,itemFk,value).enqueue(object : Callback<String>{
+            override fun onFailure(call: Call<String>, t: Throwable) {
+                _response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar MIN "+itemFk+ " Respuesta:"+t.message!!)
+            }
+
+            override fun onResponse(call: Call<String>, response: Response<String>) {
+                if (response.body() == null){
+                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updatePacking")
+                }else{
+                    _response.value = ResponseItemVO(isError = false,response = response.body()!!)
+                }
+
+            }
+
+        })
+    }
+
+    fun barcodesEdit(itemFk:String,user:String,password:String,value:String,delete:String){
+        getItemCardUserCase.barcodes_edit(user,password,itemFk,value,delete).enqueue(object : Callback<String>{
+            override fun onFailure(call: Call<String>, t: Throwable) {
+                _response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar BARCODES "+itemFk+ " Respuesta:"+t.message!!)
+            }
+
+            override fun onResponse(call: Call<String>, response: Response<String>) {
+                if (response.body() == null){
+                    _response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemBarcode_update")
                 }else{
                     _response.value = ResponseItemVO(isError = false,response = response.body()!!)
                 }
diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/imageview/activity/ImageViewActivity.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/imageview/activity/ImageViewActivity.kt
index d4d5c8c9..64b58521 100644
--- a/app/src/main/java/es/verdnatura/presentation/view/feature/imageview/activity/ImageViewActivity.kt
+++ b/app/src/main/java/es/verdnatura/presentation/view/feature/imageview/activity/ImageViewActivity.kt
@@ -1,11 +1,5 @@
 package es.verdnatura.presentation.view.feature.imageview.activity
 
-import android.graphics.Bitmap
-import android.graphics.drawable.Drawable
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.target.CustomTarget
-import com.bumptech.glide.request.transition.Transition
 import es.verdnatura.R
 import es.verdnatura.databinding.ActivityImageviewBinding
 import es.verdnatura.presentation.base.BaseActivity
diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete_black_24dp.xml
new file mode 100644
index 00000000..389a6a12
--- /dev/null
+++ b/app/src/main/res/drawable/ic_delete_black_24dp.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#FFFFFF"
+    android:viewportHeight="24.0" android:viewportWidth="24.0"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#FFFFFF" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
+</vector>
diff --git a/app/src/main/res/layout/component_custom_edit_dialog.xml b/app/src/main/res/layout/component_custom_edit_dialog.xml
index 543e2641..5b0f575b 100644
--- a/app/src/main/res/layout/component_custom_edit_dialog.xml
+++ b/app/src/main/res/layout/component_custom_edit_dialog.xml
@@ -60,6 +60,7 @@
         </com.google.android.material.textfield.TextInputLayout>
 
 
+
         <Button
             android:id="@+id/custom_dialog_button_ok"
             style="@style/DefaultButton.NormalButton"
diff --git a/app/src/main/res/layout/component_custom_list_dialog.xml b/app/src/main/res/layout/component_custom_list_dialog.xml
new file mode 100644
index 00000000..83bccc07
--- /dev/null
+++ b/app/src/main/res/layout/component_custom_list_dialog.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    style="@style/DialogTheme"
+    android:layout_height="match_parent"
+    android:layout_margin="@dimen/layout_margin_1"
+    app:cardBackgroundColor="@color/verdnatura_black_8"
+    app:cardCornerRadius="@dimen/dialog_radius">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="@dimen/default_layout_margin"
+        android:descendantFocusability="beforeDescendants"
+        android:focusableInTouchMode="true">
+
+        <TextView
+            android:id="@+id/custom_dialog_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/layout_margin_1"
+            android:layout_marginBottom="@dimen/layout_margin_min"
+            android:textAlignment="center"
+            android:textColor="@color/verdnatura_white"
+            android:textSize="@dimen/h6"
+            android:textStyle="bold"
+            android:visibility="gone"
+            tools:text="¿Estás seguro de que deseas eliminar el dispositivo de celia?"
+            tools:visibility="visible" />
+
+
+
+        <com.google.android.material.textfield.TextInputLayout
+            android:id="@+id/textinputlayout_username"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textColorHint="@android:color/darker_gray"
+            android:layout_marginTop="@dimen/layout_margin_min">
+
+            <com.google.android.material.textfield.TextInputEditText
+                android:id="@+id/custom_dialog_value"
+                style="@style/InputLineTextSearch"
+                android:layout_width="match_parent"
+                android:backgroundTint="@android:color/white"
+                android:hint="Nuevo valor"
+                android:inputType="text"
+                android:lines="1"
+                android:maxLines="1"
+                android:textColor="@color/verdnatura_white"
+                android:textColorHint="@android:color/darker_gray" />
+        </com.google.android.material.textfield.TextInputLayout>
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/item_recyclerview"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:clipToPadding="false"
+            tools:listitem="@layout/item_barcode_row"/>
+
+        <Button
+            android:id="@+id/custom_dialog_button_ok"
+            style="@style/DefaultButton.NormalButton"
+            android:layout_width="match_parent"
+            android:layout_marginTop="@dimen/default_layout_margin"
+            android:visibility="gone"
+            tools:text="Eliminar"
+            tools:visibility="visible" />
+
+        <Button
+            android:id="@+id/custom_dialog_button_ko"
+            style="@style/DefaultButton.TransparentButton"
+            android:layout_width="match_parent"
+            android:layout_marginTop="@dimen/default_layout_margin"
+            android:layout_marginBottom="@dimen/default_layout_margin"
+            android:visibility="gone"
+            tools:text="Cancelar"
+            tools:visibility="visible" />
+    </LinearLayout>
+</androidx.cardview.widget.CardView>
diff --git a/app/src/main/res/layout/item_barcode_row.xml b/app/src/main/res/layout/item_barcode_row.xml
new file mode 100644
index 00000000..f2e984b7
--- /dev/null
+++ b/app/src/main/res/layout/item_barcode_row.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tool="http://schemas.android.com/tools">
+
+    <data>
+
+        <variable
+            name="item"
+            type="es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO" />
+    </data>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <LinearLayout
+            android:id="@+id/item_row_layout"
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/verdnatura_black_5"
+            android:padding="@dimen/pasilleros_margin_main_menu">
+
+            <TextView
+                android:id="@+id/item_title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@{item.code}"
+                android:textColor="@color/verdnatura_white"
+                android:textSize="@dimen/h7"
+                android:gravity="center_vertical"
+                android:layout_marginLeft="@dimen/pasilleros_margin_main_menu"
+                android:textStyle="bold"/>
+
+
+            <ImageView
+                android:layout_marginLeft="@dimen/default_layout_margin"
+                android:id="@+id/item_image"
+                android:layout_width="30dp"
+                android:layout_height="27dp"
+                android:scaleType="centerCrop"
+                android:src="@drawable/ic_delete_black_24dp" />
+        </LinearLayout>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/verdnatura_black_9"/>
+    </LinearLayout>
+</layout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_card_row.xml b/app/src/main/res/layout/item_card_row.xml
index 87051c25..916b2927 100644
--- a/app/src/main/res/layout/item_card_row.xml
+++ b/app/src/main/res/layout/item_card_row.xml
@@ -28,7 +28,7 @@
                 android:layout_weight="1"
                 android:text="@{item.title}"
                 android:textColor="@color/verdnatura_white"
-                android:textSize="@dimen/h7"
+                android:textSize="@dimen/h8"
                 android:gravity="center_vertical"
                 android:layout_marginLeft="@dimen/pasilleros_margin_main_menu"
                 android:textStyle="bold"/>
@@ -39,7 +39,7 @@
                 android:layout_height="wrap_content"
                 android:text="@{item.value}"
                 android:textColor="@color/verdnatura_pumpkin_orange"
-                android:textSize="@dimen/h7"
+                android:textSize="@dimen/h8"
                 android:gravity="center_vertical"
                 android:layout_marginLeft="@dimen/pasilleros_margin_main_menu"/>