diff --git a/app/build.gradle b/app/build.gradle index 226a62c..adac532 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ dependencies { annotationProcessor 'androidx.room:room-compiler:2.2.5' - + implementation 'com.afollestad.material-dialogs:bottomsheets:3.2.1' implementation 'com.afollestad.material-dialogs:core:3.3.0' implementation 'com.afollestad.material-dialogs:input:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3beef69..6534775 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,9 +7,9 @@ diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/DB/DAO/ArticulosDAO.kt b/app/src/main/java/com/focasoftware/deboinventariov20/DB/DAO/ArticulosDAO.kt index 0750bff..d56629c 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/DB/DAO/ArticulosDAO.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/DB/DAO/ArticulosDAO.kt @@ -61,6 +61,9 @@ interface InvBodyDAO { @Query("SELECT * FROM $TABLA_INV_B WHERE INV_NUM =:inven ORDER BY INV_FEI DESC") suspend fun fetchAllInvBody(inven:Int): List + + @Query("SELECT * FROM $TABLA_INV_B WHERE INV_NUM =:numInventario AND SEC=:sector AND COD=:codigo") + suspend fun fetchArtInInvBody(sector: String, codigo: String, numInventario: String): InvBody } @Dao interface ServeInvDao { diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/SplashActivity.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/SplashActivity.kt index 146ffe6..3867e7e 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/ui/SplashActivity.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/ui/SplashActivity.kt @@ -15,7 +15,7 @@ class SplashActivity : Activity() { val bac = object : Thread(){ override fun run(){ try { - Thread.sleep(500) + Thread.sleep(5) val intent = Intent(baseContext, MainActivity:: class.java) startActivity(intent) finish() diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/descripcionFragment/DescripcionFragment.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/descripcionFragment/DescripcionFragment.kt index e58e4b1..3776ce6 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/ui/descripcionFragment/DescripcionFragment.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/ui/descripcionFragment/DescripcionFragment.kt @@ -1,5 +1,6 @@ package com.focasoftware.deboinventariov20.ui.descripcionFragment +import android.app.AlertDialog import android.content.Context import android.content.SharedPreferences import android.graphics.Canvas @@ -25,9 +26,8 @@ import com.focasoftware.deboinventariov20.Model.Articles import com.focasoftware.deboinventariov20.Model.InvBody import com.focasoftware.deboinventariov20.R import com.focasoftware.deboinventariov20.ui.inventario.InventarioFragment -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.android.synthetic.main.login_dialog.view.* +import kotlinx.coroutines.* class DescripcionFragment : Fragment() { private var artAcargar2: List? = null @@ -40,8 +40,8 @@ class DescripcionFragment : Fragment() { private var numeroInventario = 0 lateinit var navController: NavController lateinit var sharedPreferences: SharedPreferences - private var indice=0 - + private var indice = 0 + private var artCargadoEnBD: InvBody? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) sharedPreferences = requireActivity().getSharedPreferences("SP_INFO", Context.MODE_PRIVATE) @@ -78,29 +78,37 @@ class DescripcionFragment : Fragment() { adapter = viewAdapter2 layoutManager = viewManager2 } - val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { + val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { override fun onMove(p0: RecyclerView, p1: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { return false } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, position: Int) { - val type = InputType.TYPE_CLASS_NUMBER - MaterialDialog(requireContext()).show { - title(text = "Producto: ${(viewAdapter2 as DescripcionListAdapter).items2?.get(indice)!!.descripcion}") - message(R.string.sMensajeEncontrado) - input (waitForPositiveButton = false ,hint = "99.99", inputType = type){ materialDialog, charSequence -> - cantidad = 0F - cantidad = charSequence.toString().toFloat() - } -// .input("Cantidad",1,,1,0,InputType.TYPE_CLASS_NUMBER,0,waitForPositiveButton = true,false,positiveButton ()) - positiveButton(R.string.btnOk) { - dismiss() - var indice = 0 - indice=viewHolder.layoutPosition + + var indice = 0 + indice = viewHolder.layoutPosition + GlobalScope.launch(Dispatchers.Main) { + //TODO BUSCO EN BASE DE DATOS + artCargadoEnBD = buscarCodigoDeboEnBD((viewAdapter2 as DescripcionListAdapter).items2?.get(indice)?.sector.toString(), + (viewAdapter2 as DescripcionListAdapter).items2?.get(indice)?.codigo.toString(), + numeroInventario.toString()) + if (artCargadoEnBD == null) { + val type = InputType.TYPE_CLASS_NUMBER + MaterialDialog(requireContext()).show { + title(text = "Producto: ${(viewAdapter2 as DescripcionListAdapter).items2?.get(indice)!!.descripcion}") + message(R.string.sMensajeEncontrado) + input(waitForPositiveButton = false, hint = "99.99", inputType = type) { materialDialog, charSequence -> + cantidad = 0F + cantidad = charSequence.toString().toFloat() + } + positiveButton(R.string.btnOk) { + dismiss() + } + }.cancelOnTouchOutside(false).cornerRadius(10F) val body = InvBody(numeroInventario, (viewAdapter2 as DescripcionListAdapter).items2?.get(indice)!!.sector, - // TODO PREPARO PARA MANDAR A CARGAR EN LA BD + // TODO: PREPARO PARA MANDAR A CARGAR EN LA BD (viewAdapter2 as DescripcionListAdapter).items2?.get(indice)!!.codigo, (viewAdapter2 as DescripcionListAdapter).items2?.get(indice)!!.descripcion, cantidad.toString(), @@ -114,8 +122,39 @@ class DescripcionFragment : Fragment() { InventarioFragment().ObtenerFechaActual()) InsertarArtEnDB(body)// TODO: MANDO A CARGAR A LA BASE DE DATOS VolverAinventario() + } else if (artCargadoEnBD != null) { + + val mDialogView = LayoutInflater.from(context).inflate(R.layout.login_dialog, null) + val mBuilder = AlertDialog.Builder(context).setView(mDialogView).setTitle("Producto '${artCargadoEnBD!!.descripcion}', se encuentra cargado.").setCancelable(false) + mDialogView.tvCantInicial.text = artCargadoEnBD!!.cantTomada + + val mAlertDialog = mBuilder.show() + mDialogView.rbSumar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() + mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.rbRestar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + if (mDialogView.tvCantInicial.text.toString().toFloat() <= mDialogView.tvNuevaCantidad.text.toString().toFloat()) { + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() - mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + } + mDialogView.rbMdodificar.setOnClickListener { + mDialogView.tvgenerico4.text = (mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.btnAceptar.setOnClickListener { + mAlertDialog.dismiss() + val name = mDialogView.tvgenerico4.text.toString().toFloat() + //updateCantidad(artCargadoEnBD.sector.toString(),artCargadoEnBD.codigo.toString(), name) + } + mDialogView.dialogCancelBtn.setOnClickListener { + mAlertDialog.dismiss() + } + + VolverAinventario() } - }.cancelOnTouchOutside(false).cornerRadius(10F) + } + } override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) { @@ -147,7 +186,8 @@ class DescripcionFragment : Fragment() { } } } - fun VolverAinventario(){ + + fun VolverAinventario() { val editor = sharedPreferences.edit() editor?.putString("Inventario", numeroInventario.toString()) @@ -155,5 +195,22 @@ class DescripcionFragment : Fragment() { editor.commit() navController.navigate(R.id.action_descripcionFragment_to_inventarioFragment) } + + suspend fun buscarCodigoDeboEnBD(sector: String, codigo: String, numInventario: String): InvBody? { + //TODO BUSQUEDA POR CODIGO DE BARRAS + var busqueda: InvBody? = null + return GlobalScope.async(Dispatchers.IO) { + busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchArtInInvBody(sector, codigo, numInventario) + return@async busqueda + }.await() + } + + fun updateCantidad(sector: String, codigo: String, cantidad: Float) { + lifecycleScope.launch { + withContext(Dispatchers.IO) { + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector, codigo) + } + } + } } diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/DialogNoEncontrado.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/DialogNoEncontrado.kt index e356bdd..dff625b 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/DialogNoEncontrado.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/DialogNoEncontrado.kt @@ -24,8 +24,7 @@ class DialogNoEncontrado : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val args = requireArguments() - val title = args.getString("title") - val s = args.getString("s") + val builder: AlertDialog.Builder = AlertDialog.Builder(requireActivity()) val inflater = requireActivity().layoutInflater; diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/InsertCant.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/InsertCant.kt new file mode 100644 index 0000000..c4cdff6 --- /dev/null +++ b/app/src/main/java/com/focasoftware/deboinventariov20/ui/dialogos/InsertCant.kt @@ -0,0 +1,19 @@ +package com.focasoftware.deboinventariov20.ui.dialogos + +import android.app.Dialog +import android.content.Context +import android.view.View +import android.widget.EditText +import com.focasoftware.deboinventariov20.R + +class InsertCant(ctxt: Context) : Dialog(ctxt) { + + private val editT: EditText + fun get_text(): String { + return editT.text.toString() + } + init { + super.setContentView(R.layout.ingresar_cantidad) + editT = super.findViewById(R.id.etCantidad) as EditText + } +} \ No newline at end of file diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InsertCant.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InsertCant.kt deleted file mode 100644 index 06f4221..0000000 --- a/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InsertCant.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.focasoftware.deboinventariov20.ui.inventario - -import android.app.Dialog -import android.content.Context -import android.view.View -import android.widget.EditText -import com.focasoftware.deboinventariov20.R - -class InsertCant(ctxt: Context) : Dialog(ctxt) { - - private val editT: EditText - fun get_text(): String { - return editT.text.toString() - } - init { - super.setContentView(R.layout.ingresar_cantidad) - editT = super.findViewById(R.id.etCantidad) as EditText - } -} \ No newline at end of file diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InventarioFragment.kt b/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InventarioFragment.kt index 491b60e..094abd8 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InventarioFragment.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/ui/inventario/InventarioFragment.kt @@ -1,5 +1,6 @@ package com.focasoftware.deboinventariov20.ui.inventario +import android.app.AlertDialog import android.content.Context import android.content.SharedPreferences import android.graphics.Canvas @@ -31,6 +32,7 @@ import com.focasoftware.deboinventariov20.Model.InvBody import com.focasoftware.deboinventariov20.Model.InvHead import com.focasoftware.deboinventariov20.R import kotlinx.android.synthetic.main.fragment_inventario.* +import kotlinx.android.synthetic.main.login_dialog.view.* import kotlinx.coroutines.* import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -50,7 +52,7 @@ class InventarioFragment : Fragment() { private lateinit var navController: NavController private var InventarioNuevo: Int = 0 private var iEstado = 0 - private var iBusquedaPor=0 + private var iBusquedaPor = 0 private var fCant = 0F private var bFirst = false private lateinit var deleteIcon: Drawable @@ -77,7 +79,6 @@ class InventarioFragment : Fragment() { rcInventarios = v.findViewById(R.id.rcInventarios) val tvTitulo = v.findViewById(R.id.tvTitulo) - if (InventarioNuevo == 0) {// TODO: SI INVETNARIO NUEVO GlobalScope.launch(Dispatchers.Main) { //TODO: BUSCO EL ULTIMO INVENTARIO EN LA BD PARA PODER CREAR EL PROXIMO @@ -116,46 +117,36 @@ class InventarioFragment : Fragment() { listArticulos[indiceDelArtEncontrado].cantTomada = fCant viewAdapter.notifyDataSetChanged() } else { - // val mDialogView = LayoutInflater.from(context).inflate(R.layout.login_dialog, null) - // val mBuilder = AlertDialog.Builder(context).setView(mDialogView).setTitle("Login Form").setCancelable(false) - // val mAlertDialog = mBuilder.show() - // mDialogView.dialogLoginBtn.setOnClickListener { - // mAlertDialog.dismiss() - // //get text from EditTexts of custom layout - // val name = mDialogView.dialogNameEt.text.toString() - // val email = mDialogView.dialogEmailEt.text.toString() - // val password = mDialogView.dialogPasswEt.text.toString() - // fCant = 0F - // fCant = name.toFloat() - // } - // mDialogView.dialogCancelBtn.setOnClickListener { - // mAlertDialog.dismiss() - // } - fCant = listArticulos[indiceDelArtEncontrado].cantTomada - - val type = InputType.TYPE_CLASS_NUMBER - MaterialDialog(requireContext()).show { - - title(text = "Producto '$sChangeUpper', se encuentra cargado.") - message(R.string.sMensajeEncontrado) - input(waitForPositiveButton = false, hint = "99.99", inputType = type) { materialDialog, charSequence -> - // val inputField = materialDialog.getInputField() - // val isValid = charSequence.isEmpty() - // - // inputField.error = if (isValid) null else "El campo no puede quedar vacio" - // materialDialog.setActionButtonEnabled(WhichButton.POSITIVE, isValid) - fCant = 0F - fCant = charSequence.toString().toFloat() + val mDialogView = LayoutInflater.from(context).inflate(R.layout.login_dialog, null) + val mBuilder = AlertDialog.Builder(context).setView(mDialogView).setTitle("Producto '${listArticulos[indiceDelArtEncontrado].descripcion}', se encuentra cargado.") + .setCancelable(false) + mDialogView.tvCantInicial.text = listArticulos[indiceDelArtEncontrado].cantTomada.toString() + val mAlertDialog = mBuilder.show() + mDialogView.rbSumar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() + mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.rbRestar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + if (mDialogView.tvCantInicial.text.toString().toFloat() <= mDialogView.tvNuevaCantidad.text.toString().toFloat()) { + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() - mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() } - positiveButton(R.string.btnOk) { - //TODO ACTUALIZO CANTIADAD EN BD - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), fCant) - //TODO ACTUALIZO CANTIDAD EN RV - listArticulos[indiceDelArtEncontrado].cantTomada = fCant - viewAdapter.notifyDataSetChanged() - dismiss() - } - }.cancelOnTouchOutside(false).cornerRadius(10F) + } + mDialogView.rbMdodificar.setOnClickListener { + mDialogView.tvgenerico4.text = (mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.btnAceptar.setOnClickListener { + mAlertDialog.dismiss() + val name = mDialogView.tvgenerico4.text.toString().toFloat() + fCant = 0F + fCant = name + listArticulos[indiceDelArtEncontrado].cantTomada = fCant + updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), fCant) + viewAdapter.notifyDataSetChanged() + } + mDialogView.dialogCancelBtn.setOnClickListener { + mAlertDialog.dismiss() + } } } else if (indiceDelArtEncontrado == -1) {// no lo encontro en el RV, lo va a buscar en al BD @@ -163,7 +154,7 @@ class InventarioFragment : Fragment() { GlobalScope.launch(Dispatchers.Main) { //TODO BUSCO EN BASE DE DATOS val artEncontrado = buscarCBEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) - ContinuarCargaCB(artEncontrado) + ContinuarCargaCB(artEncontrado)//TODO SE MANDA CERO POR QUE ES UN ARTICULO ESCANEADO NUEVO PARA QUE SEA COMPATIBLE } } @@ -228,31 +219,62 @@ class InventarioFragment : Fragment() { listArticulos[indiceDelArtEncontrado].cantTomada = fCant viewAdapter.notifyDataSetChanged() } else { - fCant = listArticulos[indiceDelArtEncontrado].cantTomada - val type = InputType.TYPE_CLASS_NUMBER - MaterialDialog(requireContext()).show { - - title(text = "Producto '$sChangeUpper', se encuentra cargado.") - message(R.string.sCantidadNueva) - input (waitForPositiveButton = false ,hint = "99.99", inputType = type){ materialDialog, charSequence -> - fCant = 0F - fCant = charSequence.toString().toFloat() - } - positiveButton(R.string.btnOk) { - //TODO ACTUALIZO CANTIADAD EN BD - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), fCant) - //TODO ACTUALIZO CANTIDAD EN RV - listArticulos[indiceDelArtEncontrado].cantTomada = fCant - viewAdapter.notifyDataSetChanged() - dismiss() + val mDialogView = LayoutInflater.from(context).inflate(R.layout.login_dialog, null) + val mBuilder = AlertDialog.Builder(context).setView(mDialogView).setTitle("Producto '${listArticulos[indiceDelArtEncontrado].descripcion}', se encuentra cargado.") + .setCancelable(false) + mDialogView.tvCantInicial.text = listArticulos[indiceDelArtEncontrado].cantTomada.toString() + val mAlertDialog = mBuilder.show() + mDialogView.rbSumar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() + mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.rbRestar.setOnClickListener { + if (mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) mDialogView.tvNuevaCantidad.setText("0") + if (mDialogView.tvCantInicial.text.toString().toFloat() <= mDialogView.tvNuevaCantidad.text.toString().toFloat()) { + mDialogView.tvgenerico4.text = (mDialogView.tvCantInicial.text.toString().toFloat() - mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() } - }.cancelOnTouchOutside(false).cornerRadius(10F) + } + mDialogView.rbMdodificar.setOnClickListener { + mDialogView.tvgenerico4.text = (mDialogView.tvNuevaCantidad.text.toString().toFloat()).toString() + } + mDialogView.btnAceptar.setOnClickListener { + mAlertDialog.dismiss() + val name = mDialogView.tvgenerico4.text.toString().toFloat() + fCant = 0F + fCant = name + listArticulos[indiceDelArtEncontrado].cantTomada = fCant + updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), fCant) + viewAdapter.notifyDataSetChanged() + } + mDialogView.dialogCancelBtn.setOnClickListener { + mAlertDialog.dismiss() + } +// fCant = listArticulos[indiceDelArtEncontrado].cantTomada +// val type = InputType.TYPE_CLASS_NUMBER +// MaterialDialog(requireContext()).show { +// +// title(text = "Producto '$sChangeUpper', se encuentra cargado.") +// message(R.string.sCantidadNueva) +// input(waitForPositiveButton = false, hint = "99.99", inputType = type) { materialDialog, charSequence -> +// fCant = 0F +// fCant = charSequence.toString().toFloat() +// } +// positiveButton(R.string.btnOk) { +// //TODO ACTUALIZO CANTIADAD EN BD +// updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), fCant) +// //TODO ACTUALIZO CANTIDAD EN RV +// listArticulos[indiceDelArtEncontrado].cantTomada = fCant +// viewAdapter.notifyDataSetChanged() +// dismiss() +// } +// }.cancelOnTouchOutside(false).cornerRadius(10F) } } else if (indiceDelArtEncontrado == -1) {// no lo encontro en el RV, lo va a buscar en al BD GlobalScope.launch(Dispatchers.Main) { //TODO BUSCO EN BASE DE DATOS + listArticulos[indiceDelArtEncontrado].cantTomada val artEncontrado = buscarCBEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) ContinuarCargaCB(artEncontrado) } @@ -321,21 +343,21 @@ class InventarioFragment : Fragment() { ivCamara.setImageResource(R.drawable.codbar) etCodigoBarras.hint = "Busqueda por C. Barras" swSumaUno.visibility = View.VISIBLE - iBusquedaPor=0 + iBusquedaPor = 0 iEstado = 1 } 1 -> { ivCamara.setImageResource(R.drawable.desc) etCodigoBarras.hint = "Busqueda por Descripción" swSumaUno.visibility = View.GONE - iBusquedaPor=1 + iBusquedaPor = 1 iEstado = 2 } 2 -> { ivCamara.setImageResource(R.drawable.cod_origen) etCodigoBarras.hint = "Busqueda por C. Origen" swSumaUno.visibility = View.GONE - iBusquedaPor=2 + iBusquedaPor = 2 iEstado = 0 } } @@ -450,18 +472,19 @@ class InventarioFragment : Fragment() { private fun ContinuarCargaCB(artAcargar: Articles?) { - if (artAcargar != null) {//Si lo encuentra en la BD - if (swSumaUno!!.isChecked) {// SI ESTA +1, PONE CANTIDAD 1 + if (artAcargar != null) {// TODO: Si lo encuentra en la BD + if (swSumaUno!!.isChecked) {//TODO: SI ESTA +1, PONE CANTIDAD 1 fCant = 0F fCant += 1F cargarArtEnBd(artAcargar, fCant) cargarRecicler(artAcargar, fCant) } else {//SI NO ESTA +1 PREGUNTA CANTIDAD + val type = InputType.TYPE_CLASS_PHONE MaterialDialog(requireContext()).show { title(text = "Producto: $sChangeUpper") - message(R.string.sMensajeEncontrado) + message(text = "Ingrese la cantidad") input(waitForPositiveButton = false, hint = "99.99", inputType = type) { materialDialog, charSequence -> // val inputField = materialDialog.getInputField() // val isValid = charSequence.isEmpty() diff --git a/app/src/main/res/drawable-v24/icono_inventario_big.png b/app/src/main/res/drawable-v24/icono_inventario_big.png new file mode 100644 index 0000000000000000000000000000000000000000..273ed51ef8ec87524fa7585973fce8b482156b96 GIT binary patch literal 13619 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

nxjz2p~HAb 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 + + + + + + + + + + +