From 2b4f7165e7cb403443dd04e7a4ba918288115691 Mon Sep 17 00:00:00 2001 From: Mauricio Sanchez Date: Thu, 24 Sep 2020 18:45:43 -0300 Subject: [PATCH] 24092020 1900 --- ...rdar Inventario Din\303\241mico-Insercion.xlsx" | Bin 0 -> 11693 bytes "API Guardar Inventario Din\303\241mico.docx" | Bin 0 -> 13743 bytes app/build.gradle | 3 +- .../deboinventariov20/DB/DAO/ArticulosDAO.kt | 21 ++- .../deboinventariov20/Model/ProductosApi.kt | 11 -- .../deboinventariov20/Model/ProductosService.kt | 52 ------ .../focasoftware/deboinventariov20/Model/Tablas.kt | 10 + .../deboinventariov20/Model/WebService.kt | 71 +++++++ .../deboinventariov20/Model/WebServiceApi.kt | 18 ++ .../deboinventariov20/UI/SplashActivity.kt | 2 +- .../deboinventariov20/UI/Utils/Utils.kt | 11 +- .../actualizacionMaestros/ActuaMaestrosFragment.kt | 141 +++++++++----- .../UI/descripCorigenFragment/CodigoOriFragment.kt | 10 +- .../UI/descripcionFragment/DescripcionFragment.kt | 8 +- .../UI/inventario/InventarioFragment.kt | 203 ++++++++++++++------- .../UI/inventario/ProductosListAdapter.kt | 3 +- .../main/res/layout-xlarge/item_codigo_origen.xml | 5 +- 17 files changed, 372 insertions(+), 197 deletions(-) create mode 100644 "API Guardar Inventario Din\303\241mico-Insercion.xlsx" create mode 100644 "API Guardar Inventario Din\303\241mico.docx" delete mode 100644 app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosApi.kt delete mode 100644 app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosService.kt create mode 100644 app/src/main/java/com/focasoftware/deboinventariov20/Model/WebService.kt create mode 100644 app/src/main/java/com/focasoftware/deboinventariov20/Model/WebServiceApi.kt diff --git "a/API Guardar Inventario Din\303\241mico-Insercion.xlsx" "b/API Guardar Inventario Din\303\241mico-Insercion.xlsx" new file mode 100644 index 0000000000000000000000000000000000000000..61d6f52d45e863de7e08c943d4f516d13ab3c09c GIT binary patch literal 11693 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 literal 0 HcmV?d00001 diff --git a/app/build.gradle b/app/build.gradle index 583ea31..901fb90 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,6 +28,7 @@ android { } } compileOptions { + coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -54,7 +55,7 @@ dependencies { testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' //Room implementation 'androidx.room:room-ktx:2.2.5' 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 4fb2f9c..7b4e62c 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 @@ -51,19 +51,22 @@ interface InvHeadDAO { suspend fun deleteAllArticulos() @Query("DELETE FROM $TABLA_INV_H WHERE INV_NUM=:inven") - suspend fun deleteinvHead(inven: Long) + suspend fun deleteinvHead(inven: Int) @Query("SELECT * FROM $TABLA_INV_H ORDER BY INV_FEI") suspend fun fetchAllInvHead(): List @Query("SELECT INV_LUG FROM $TABLA_INV_H WHERE INV_NUM=:inven") - suspend fun fetchAreaInvH (inven: Long): Boolean + suspend fun fetchAreaInvH (inven: Int): Boolean @Query("SELECT INV_PRODCONT FROM $TABLA_INV_H WHERE INV_NUM=:inven") - suspend fun consultaCantidadInvH (inven: Long): Int + suspend fun consultaCantidadInvH (inven: Int): Int @Query("UPDATE $TABLA_INV_H SET INV_PRODCONT=:cant WHERE INV_NUM=:inven") - suspend fun updateInvBody(inven: Long,cant: Int) + suspend fun updateInvBody(inven: Int,cant: Int) + + @Query("SELECT INV_PRODCONT FROM $TABLA_INV_H WHERE INV_NUM=:inven") + suspend fun foundInvHead (inven: Int): InvHead } @Dao @@ -75,19 +78,19 @@ interface InvBodyDAO { suspend fun deleteAllInvBody() @Query("DELETE FROM $TABLA_INV_B WHERE INV_NUM =:inven") - suspend fun deleteInvBody(inven: Long) + suspend fun deleteInvBody(inven: Int) - @Query("UPDATE $TABLA_INV_B SET CANT=:cant WHERE SEC=:sec AND COD=:cod") - suspend fun UpdateInvBody(cant: Float, sec: Long, cod: Long) + @Query("UPDATE $TABLA_INV_B SET CANT=:cant , INV_FEF=:actFechaHora WHERE SEC=:sec AND COD=:cod") + suspend fun updateInvBody(cant: Float, sec: Long, cod: Long, actFechaHora:String) @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: Long, codigo: Long, numInventario: Long): InvBody + suspend fun fetchArtInInvBody(sector: Long, codigo: Long, numInventario: Int): InvBody @Query("DELETE FROM $TABLA_INV_B WHERE INV_NUM =:numInventario AND SEC=:sector AND COD=:codigo") - suspend fun deleteItemFromInvBody(sector: Long, codigo: Long, numInventario: Long): Int + suspend fun deleteItemFromInvBody(sector: Long, codigo: Long, numInventario: Int): Int } @Dao diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosApi.kt b/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosApi.kt deleted file mode 100644 index e060b3f..0000000 --- a/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosApi.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.focasoftware.deboinventariov20.Model - -import retrofit2.Response -import retrofit2.http.GET - -interface ProductosApi { - - @GET("articulos/articulosCodBarra") - suspend fun getProductos(): Response> - -} \ No newline at end of file diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosService.kt b/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosService.kt deleted file mode 100644 index 80c4f3b..0000000 --- a/app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosService.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.focasoftware.deboinventariov20.Model - -import com.focasoftware.deboinventariov20.UI.actualizacionMaestros.BASE_URL -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import java.net.SocketTimeoutException -import java.util.concurrent.TimeUnit - -object ProductosService { - private val TIME_OUT: Long - get() { - return 15 - } - private val interceptor = run { - val httpLoggingInterceptor = HttpLoggingInterceptor() - httpLoggingInterceptor.apply { - httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY - } - } - private val okHttpClient = OkHttpClient.Builder() - .addNetworkInterceptor(interceptor) // same for .addInterceptor(...) - .connectTimeout(TIME_OUT, TimeUnit.SECONDS) //Backend is really slow - .writeTimeout(TIME_OUT, TimeUnit.SECONDS) - .readTimeout(TIME_OUT, TimeUnit.SECONDS) - .build() - fun getProductosService(): ProductosApi { - return Retrofit.Builder() - .client(okHttpClient) - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .build() - .create(ProductosApi::class.java) - } -} -//fun prubaConexion(){ -// for (retries in 0..2) { -// try { -// val client: HttpClient = createHttpClientWithDefaultSocketFactory(null, null) -// val response: HttpResponse = client.execute(get) -// val statusCode: Int = response.getStatusLine().getStatusCode() -// return if (statusCode != 200) { -// throw IllegalStateException("GET Request on '" + get.getURI().toString().toString() + "' resulted in " + statusCode) -// } else { -// response.getEntity() -// } -// } catch (e: SocketTimeoutException) { -// // connection timed out...let's try again -// } -// } -//} \ No newline at end of file diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/Model/Tablas.kt b/app/src/main/java/com/focasoftware/deboinventariov20/Model/Tablas.kt index 71758ea..4f38d60 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/Model/Tablas.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/Model/Tablas.kt @@ -36,6 +36,16 @@ data class Productos(@SerializedName("CODSEC") var sector: String?, @SerializedName( "UNIVEN") var balanza: Int?, @SerializedName("DEPSN") var depSn: Boolean?, @SerializedName("FOTO") var imagen: String?) + +data class InvToSend ( var fechaInicio: String?, + var fechaFinal: String?, + var lugar: Int?, + var sector: String?, + var codigo: String?, + var descripcion: String?, + var cantTomada: String?, + var fechaInicioArt: String?, + var fechaFinArt: String?) //@Entity(tableName = TABLA_ART) //data class Articles(@ColumnInfo(name = "SEC") var sector: String?, // @ColumnInfo(name = "COD") var codigo: String?, diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebService.kt b/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebService.kt new file mode 100644 index 0000000..f637754 --- /dev/null +++ b/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebService.kt @@ -0,0 +1,71 @@ +package com.focasoftware.deboinventariov20.Model + +import com.focasoftware.deboinventariov20.UI.actualizacionMaestros.BASE_URL +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit + +object WebService { + private var instance: WebService? = null + private var retrofit:Retrofit? =null + private val TIME_OUT: Long + get() { + return 15 + } + private val interceptor = run { + val httpLoggingInterceptor = HttpLoggingInterceptor() + httpLoggingInterceptor.apply { + httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + } + } + private val okHttpClient = OkHttpClient.Builder() + .addNetworkInterceptor(interceptor) + .connectTimeout(TIME_OUT, TimeUnit.SECONDS) + .writeTimeout(TIME_OUT, TimeUnit.SECONDS) + .readTimeout(TIME_OUT, TimeUnit.SECONDS) + .build() + + private fun WebService() { + retrofit = Retrofit.Builder() + .client(okHttpClient) + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + @Synchronized + fun getInstance(): WebService? { + if (instance == null) { + instance = WebService + } + return instance + } + + fun createService(serviceClass: Class): S { + return retrofit!!.create(serviceClass) + } + +// fun createService(serviceClass: Class): S { +// return retrofit!!.create(serviceClass) +// } + +// fun getProductosService(): EndPoints { +// return Retrofit.Builder() +// .client(okHttpClient) +// .baseUrl(BASE_URL) +// .addConverterFactory(GsonConverterFactory.create()) +// .build() +// .create(EndPoints::class.java) +// } + +// fun getProductosService(): ProductosApi { +// return Retrofit.Builder() +// .client(okHttpClient) +// .baseUrl(BASE_URL) +// .addConverterFactory(GsonConverterFactory.create()) +// .build() +// .create(ProductosApi::class.java) +// } +} diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebServiceApi.kt b/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebServiceApi.kt new file mode 100644 index 0000000..c0d5c04 --- /dev/null +++ b/app/src/main/java/com/focasoftware/deboinventariov20/Model/WebServiceApi.kt @@ -0,0 +1,18 @@ +package com.focasoftware.deboinventariov20.Model + +import retrofit2.Call +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST + + +interface WebServiceApi { + + @GET("articulos/articulosCodBarra") + fun getProductos(): Call> + + + @POST("articulos/articulosCodBarra") + fun inventarioToSend(@Body invToSend: List?): Call? +} \ No newline at end of file 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 ab7f7fa..4d46324 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(3000) + Thread.sleep(3) val intent = Intent(baseContext, MainActivity:: class.java) startActivity(intent) finish() diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/UI/Utils/Utils.kt b/app/src/main/java/com/focasoftware/deboinventariov20/UI/Utils/Utils.kt index 5142523..0b504bf 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/UI/Utils/Utils.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/UI/Utils/Utils.kt @@ -11,6 +11,8 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import java.io.IOException import java.net.UnknownHostException +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter fun modificarCantidadEnCabecera(inventarioActual: Int, b: Boolean, context: Context) { GlobalScope.async(Dispatchers.IO) { @@ -138,4 +140,11 @@ class serverNoConf : DialogFragment() { return builder.create() } ?: throw IllegalStateException("Activity cannot be null") } -} \ No newline at end of file +} +fun ObtenerFechaActual(): String { + //TODO OBTENGO FECHA Y HORA ACTUAL PARA LA CABECERA DEL INVENTARIO Y PARA CADA ITEM QUE SE INSERTA EN LA BD + val current = LocalDateTime.now() + val formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss") + val dFechaHora = current.format(formatter) + return dFechaHora.toString() + } \ No newline at end of file diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/UI/actualizacionMaestros/ActuaMaestrosFragment.kt b/app/src/main/java/com/focasoftware/deboinventariov20/UI/actualizacionMaestros/ActuaMaestrosFragment.kt index 4aecafc..5e5e2ec 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/UI/actualizacionMaestros/ActuaMaestrosFragment.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/UI/actualizacionMaestros/ActuaMaestrosFragment.kt @@ -5,25 +5,30 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button -import android.widget.Toast import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import com.focasoftware.deboinventariov20.DB.DataBase.AppDb import com.focasoftware.deboinventariov20.Model.Articles -import com.focasoftware.deboinventariov20.Model.ProductosService +import com.focasoftware.deboinventariov20.Model.Productos import com.focasoftware.deboinventariov20.Model.ServeInv +import com.focasoftware.deboinventariov20.Model.WebService.getInstance +import com.focasoftware.deboinventariov20.Model.WebServiceApi import com.focasoftware.deboinventariov20.R import com.focasoftware.deboinventariov20.UI.Utils.noServerConf import com.focasoftware.deboinventariov20.UI.Utils.serverNoConf -import com.focasoftware.deboinventariov20.UI.Utils.serverValido import kotlinx.android.synthetic.main.fragment_actua_maestros.* import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response import java.net.SocketTimeoutException var BASE_URL = "" -var serverPre:ServeInv?=null +var serverPre: ServeInv? = null + class ActuaMaestrosFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { @@ -31,9 +36,9 @@ class ActuaMaestrosFragment : Fragment() { GlobalScope.launch(Main) { - serverPre = fetchServerPreOne() - if (serverPre!=null) { - btnConfirmarAct.isEnabled=true + serverPre = fetchServerPreOne() + if (serverPre != null) { + btnConfirmarAct.isEnabled = true if (serverPre!!.direccion.isNullOrEmpty()) { val modalDialog = noServerConf() modalDialog.show(requireActivity().supportFragmentManager, "confirmDialog") @@ -41,11 +46,11 @@ class ActuaMaestrosFragment : Fragment() { BASE_URL = serverPre!!.direccion.toString() + ":" + serverPre!!.puerto.toString() + "/" tvServerConectado.text = "Conectado al servidor: ${serverPre!!.descripcion}" } - }else{ + } else { val modalDialog = serverNoConf() modalDialog.show(requireActivity().supportFragmentManager, "confirmDialog") - btnConfirmarAct.isEnabled=false + btnConfirmarAct.isEnabled = false } } @@ -67,25 +72,20 @@ class ActuaMaestrosFragment : Fragment() { bConfirmarAct.setOnClickListener { loading_view.visibility = View.VISIBLE countriesList.text = "Obteniendo artículos del servidor, aguarde por favor." - GlobalScope.launch(Main) { - obtenerArticulos() - } + obtenerArticulos() } return v } - private suspend fun obtenerArticulos() { - - val productosService = ProductosService.getProductosService() + private fun obtenerArticulos() { + val call = getInstance() + ?.createService(WebServiceApi::class.java) + ?.getProductos() var index: Long = 1 - withContext(IO) { - val job = CoroutineScope(IO).launch { - // TODO: BORRO TODO LOS ARTICULOS DE LA BASE PARA CARGARLOS DE NUEVO - AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.deleteAllArticulos() - try { - val response = productosService.getProductos() - if (response.isSuccessful) { - + call!!.enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + if (response.code() == 200) { + try { for (pro in response.body()!!) { val artiAcargar = Articles( pro.sector, @@ -103,36 +103,76 @@ class ActuaMaestrosFragment : Fragment() { pro.imagen ) index += index - AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(artiAcargar) + insertarProducto(artiAcargar) } - withContext(Main) { - countriesList.visibility = View.VISIBLE - countriesList.text = "¡Datos Importados Correctamente!" - loading_view.visibility = View.GONE - } - } else if (!response.isSuccessful) { - withContext(Main) { - countriesList.visibility = View.VISIBLE - countriesList.text = "¡Sin servicio. No se puede conectar a la api o al servidor configurado en el BackEnd!" - loading_view.visibility = View.GONE - } - } - } catch (e: SocketTimeoutException) { - withContext(Main) { + countriesList.visibility = View.VISIBLE + countriesList.text = "¡Datos Importados Correctamente!" + loading_view.visibility = View.GONE + } catch (e: SocketTimeoutException) { countriesList.visibility = View.VISIBLE countriesList.text = "¡Sin conexión al Servidor!" loading_view.visibility = View.GONE } } } -// if (job == null) { -// withContext(Main) { -// countriesList.visibility = View.VISIBLE -// countriesList.text = "No se puedo realizar la conexión al Servidor" -// loading_view.visibility = View.GONE + + override fun onFailure(call: Call>, t: Throwable) { + countriesList.visibility = View.VISIBLE + countriesList.text = (t.message + "." + t.cause) + loading_view.visibility = View.GONE + } + }) + + +// var index: Long = 1 +// withContext(IO) { +// val job = CoroutineScope(IO).launch { +// // TODO: BORRO TODO LOS ARTICULOS DE LA BASE PARA CARGARLOS DE NUEVO +// AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.deleteAllArticulos() +// try { +// val response = productosService.getProductos() +// if (response.isSuccessful) { +// +// for (pro in response.body()!!) { +// val artiAcargar = Articles( +// pro.sector, +// pro.codigo, +// pro.descripcion, +// pro.codBar, +// pro.codOrigen, +// pro.precio, +// pro.costo, +// pro.exiVenta, +// pro.exiDeposito, +// pro.de, +// pro.balanza, +// pro.depSn, +// pro.imagen +// ) +// index += index +// AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(artiAcargar) +// } +// withContext(Main) { +// countriesList.visibility = View.VISIBLE +// countriesList.text = "¡Datos Importados Correctamente!" +// loading_view.visibility = View.GONE +// } +// } else if (!response.isSuccessful) { +// withContext(Main) { +// countriesList.visibility = View.VISIBLE +// countriesList.text = "¡Sin servicio. No se puede conectar a la api o al servidor configurado en el BackEnd!" +// loading_view.visibility = View.GONE +// } +// } +// } catch (e: SocketTimeoutException) { +// withContext(Main) { +// countriesList.visibility = View.VISIBLE +// countriesList.text = "¡Sin conexión al Servidor!" +// loading_view.visibility = View.GONE +// } // } // } - } +// } // withContext(Dispatchers.Main) { @@ -166,6 +206,14 @@ class ActuaMaestrosFragment : Fragment() { // }) } + fun insertarProducto(aCargar: Articles) { + lifecycleScope.launch { + withContext(IO) { + AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(aCargar) + } + } + } + fun mostrarArticulos() { val Job = GlobalScope.launch { var listArticulos: List? = null @@ -181,9 +229,8 @@ class ActuaMaestrosFragment : Fragment() { countriesList?.text = temp } } -// for (professor in listArticulos!!) { -// editT.text= professor.id.toString() -// } } } + + diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/UI/descripCorigenFragment/CodigoOriFragment.kt b/app/src/main/java/com/focasoftware/deboinventariov20/UI/descripCorigenFragment/CodigoOriFragment.kt index a73c389..82a4210 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/UI/descripCorigenFragment/CodigoOriFragment.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/UI/descripCorigenFragment/CodigoOriFragment.kt @@ -27,8 +27,8 @@ import com.focasoftware.deboinventariov20.DB.DataBase.AppDb import com.focasoftware.deboinventariov20.Model.Articles import com.focasoftware.deboinventariov20.Model.InvBody import com.focasoftware.deboinventariov20.R +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera -import com.focasoftware.deboinventariov20.UI.inventario.InventarioFragment import kotlinx.android.synthetic.main.ingresar_cantidad.view.* import kotlinx.android.synthetic.main.ingresar_cantidad.view.btnAceptar import kotlinx.android.synthetic.main.login_dialog.view.* @@ -138,8 +138,8 @@ class CodigoOriFragment : Fragment() { (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.precio, (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.balanza, (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.depSn, - InventarioFragment().ObtenerFechaActual(), - InventarioFragment().ObtenerFechaActual()) + ObtenerFechaActual(), + ObtenerFechaActual()) InsertarArtEnDB(body)// TODO: MANDO A CARGAR A LA BASE DE DATOS modificarCantidadEnCabecera(numeroInventario, true, requireActivity()) // VolverAinventario() @@ -250,7 +250,7 @@ class CodigoOriFragment : Fragment() { //TODO BUSQUEDA POR CODIGO DE BARRAS var busqueda: InvBody? = null return GlobalScope.async(Dispatchers.IO) { - busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchArtInInvBody(sector.toLong(), codigo.toLong(), numInventario.toLong()) + busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchArtInInvBody(sector.toLong(), codigo.toLong(), numInventario.toInt()) return@async busqueda }.await() } @@ -260,7 +260,7 @@ class CodigoOriFragment : Fragment() { withContext(Dispatchers.IO) { val activity: FragmentActivity? = activity if (activity != null && isAdded) { - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong()) + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(), ObtenerFechaActual()) } } } 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 28f2550..b827a4b 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 @@ -27,8 +27,8 @@ import com.focasoftware.deboinventariov20.DB.DataBase.AppDb import com.focasoftware.deboinventariov20.Model.Articles import com.focasoftware.deboinventariov20.Model.InvBody import com.focasoftware.deboinventariov20.R +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera -import com.focasoftware.deboinventariov20.UI.inventario.InventarioFragment import kotlinx.android.synthetic.main.ingresar_cantidad.view.* import kotlinx.android.synthetic.main.login_dialog.view.* import kotlinx.android.synthetic.main.login_dialog.view.btnAceptar @@ -138,8 +138,8 @@ class DescripcionFragment : Fragment() { (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.precio, (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.balanza, (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.depSn, - InventarioFragment().ObtenerFechaActual(), - InventarioFragment().ObtenerFechaActual() + ObtenerFechaActual(), + ObtenerFechaActual() ) InsertarArtEnDB(body)// TODO: MANDO A CARGAR A LA BASE DE DATOS modificarCantidadEnCabecera(numeroInventario, true, requireActivity()) @@ -264,7 +264,7 @@ class DescripcionFragment : Fragment() { withContext(Dispatchers.IO) { val activity: FragmentActivity? = activity if (activity != null && isAdded) { - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong()) + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(),ObtenerFechaActual()) } } } 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 fcbdd13..c0c4437 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 @@ -2,7 +2,6 @@ package com.focasoftware.deboinventariov20.UI.inventario import android.annotation.SuppressLint import android.app.AlertDialog -import android.app.Dialog import android.content.Context import android.content.Context.INPUT_METHOD_SERVICE import android.content.DialogInterface @@ -23,7 +22,6 @@ import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController @@ -32,11 +30,10 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.focasoftware.deboinventariov20.DB.DataBase.AppDb -import com.focasoftware.deboinventariov20.Model.Articles -import com.focasoftware.deboinventariov20.Model.InvBody -import com.focasoftware.deboinventariov20.Model.InvHead +import com.focasoftware.deboinventariov20.Model.* import com.focasoftware.deboinventariov20.R import com.focasoftware.deboinventariov20.UI.Utils.NoEncontradoSimple +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera import com.focasoftware.deboinventariov20.UI.inventario.viewModel.InventarioViewModel import kotlinx.android.synthetic.main.fragment_inventario.* @@ -45,8 +42,9 @@ import kotlinx.android.synthetic.main.login_dialog.view.* import kotlinx.android.synthetic.main.login_dialog.view.btnAceptar import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response import java.util.* class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickListener { @@ -99,20 +97,32 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList val tCodigoBarras = v.findViewById(R.id.etCodigoBarras) rcInventarios = v.findViewById(R.id.rcInventarios) val tvTitulo = v.findViewById(R.id.tvTitulo) + val descArea: String = if (!SerchArea()) "Ventas" else "Deposito" if ((inventarioViewModel as InventarioViewModel).InventarioNuevo == 0) {// TODO: SI INVETNARIO NUEVO GlobalScope.launch(Dispatchers.Main) { //TODO: BUSCO EL ULTIMO INVENTARIO EN LA BD PARA PODER CREAR EL PROXIMO (inventarioViewModel as InventarioViewModel).InventarioNuevo = AppDb.getAppDb(requireActivity())?.InvHeadDAO()?.findLastInv()?.plus(1) ?: 1 //TODO: CREAMOS EL INVENTARIO EN LA CABECERA DEL INVENTARIO - invHead = InvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo, if (!SerchArea()) "Ventas" else "Deposito", 1, ObtenerFechaActual(), ObtenerFechaActual(), 0L, SerchArea(), AjusteProductos(), ProdNoCont()) + invHead = InvHead( + (inventarioViewModel as InventarioViewModel).InventarioNuevo, + if (!SerchArea()) "Ventas" else "Deposito", + 1, + ObtenerFechaActual(), + ObtenerFechaActual(), + 0L, + SerchArea(), + AjusteProductos(), + ProdNoCont() + ) AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.insertInvHead(invHead) - tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo}" + + tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo} "+descArea } } else {// TODO (SI VENGO DE FRAGMENT DESCRIPCION) listArticulos.clear() - CargarDeBdInventario((inventarioViewModel as InventarioViewModel).InventarioNuevo) - tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo}" + cargarDeBdInventario((inventarioViewModel as InventarioViewModel).InventarioNuevo) + tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo} "+ descArea } tCodigoBarras.setOnKeyListener { _, keyCode, keyEvent -> @@ -147,9 +157,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList // fCant = listArticulos[indiceDelArtEncontrado].cantTomada // fCant += 1F //TODO ACTUALIZO LA CANTIDAD EN LA BD - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), + updateCantidad( + listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), - listArticulos[indiceDelArtEncontrado].cantTomada + 1) + listArticulos[indiceDelArtEncontrado].cantTomada + 1 + ) //TODO ACTUALIZO LA CANTIDAD EN EL RV listArticulos[indiceDelArtEncontrado].cantTomada = listArticulos[indiceDelArtEncontrado].cantTomada + 1 viewAdapter.notifyDataSetChanged() @@ -160,7 +172,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList } else if (indiceDelArtEncontrado == -1) {// TODO: no lo encontro en el RV, lo va a buscar en al BD //TODO BUSCO EN BASE DE DATOS val artEncontrado = buscarCBEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) - ContinuarCargaCB(artEncontrado)//TODO SE MANDA CERO POR QUE ES UN ARTICULO ESCANEADO NUEVO PARA QUE SEA COMPATIBLE + continuarCargaCB(artEncontrado)//TODO SE MANDA CERO POR QUE ES UN ARTICULO ESCANEADO NUEVO PARA QUE SEA COMPATIBLE } tCodigoBarras.focusable = View.FOCUSABLE tCodigoBarras.setText("") @@ -204,7 +216,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList // (indiceDelArtEncontrado == -1) {// TODO: no lo encontro en el RV, lo va a buscar en al BD GlobalScope.launch(Dispatchers.Main) { val artEncontrado = buscarDescEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) - ContinuarCargaDesc(artEncontrado as ArrayList) + continuarCargaDesc(artEncontrado as ArrayList) } iBusquedaPor = 0 @@ -290,14 +302,14 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList // }.cancelOnTouchOutside(false).cornerRadius(10F) // } // } else if (indiceDelArtEncontrado == -1) { - // no lo encontro en el RV, lo va a buscar en al BD + // no lo encontro en el RV, lo va a buscar en al BD - GlobalScope.launch(Dispatchers.Main) { - //TODO BUSCO EN BASE DE DATOS - val artEncontrado = buscarCodiogoOriEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) - ContinuarCargaCodigoOri(artEncontrado ) - } - iBusquedaPor = 0 + GlobalScope.launch(Dispatchers.Main) { + //TODO BUSCO EN BASE DE DATOS + val artEncontrado = buscarCodiogoOriEnBD(sChangeUpper.toUpperCase(Locale.ROOT)) + continuarCargaCodigoOri(artEncontrado) + } + iBusquedaPor = 0 // } // } return@setOnKeyListener true @@ -320,7 +332,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList btnBorrarInv.setOnClickListener { AlertDialog.Builder(requireContext()).setTitle("Eliminación de Inventarios").setMessage("¿Confirma que desea eliminar el inventario?") .setPositiveButton(R.string.btnOk, DialogInterface.OnClickListener { dialog, which -> - BorrarInvActual() + borrarInvActual() Toast.makeText(requireContext(), "El inventario $(inventarioViewModel as InventarioViewModel).InventarioNuevo fue Borrado", Toast.LENGTH_LONG).show() navController.navigate(R.id.action_inventarioFragment_to_mainFragment2) (inventarioViewModel as InventarioViewModel).InventarioNuevo = 0 @@ -333,7 +345,8 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList btnExportarInv.setOnClickListener { AlertDialog.Builder(requireContext()).setTitle(R.string.sTituloExportar).setMessage(R.string.sMensajeExportar) .setPositiveButton(R.string.btnOk, DialogInterface.OnClickListener { dialog, which -> - BorrarInvActual() + exportarInventario(InventarioNuevo) + borrarInvActual() Toast.makeText(requireContext(), "El inventario $(inventarioViewModel as InventarioViewModel).InventarioNuevo fue Exportado al Servidor", Toast.LENGTH_LONG).show() navController.navigate(R.id.action_inventarioFragment_to_mainFragment2) (inventarioViewModel as InventarioViewModel).InventarioNuevo = 0 @@ -372,20 +385,81 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList } } - private fun BorrarInvActual() { + private fun exportarInventario(inventario: Int) { + GlobalScope.launch(Dispatchers.Main) { + val aEnviar: MutableList?=null + val datosCabecera = foundInvHeadDB(inventario) + val datosCuerpo=foundInvBodyBD(inventario) + + for (cuerpo in datosCuerpo){ + val temp=InvToSend( + datosCabecera.fechaInicio, + datosCabecera.fechaFinal, + if (datosCabecera.lugar!!) 1 else 0, + cuerpo.sector, + cuerpo.codigo, + cuerpo.descripcion, + cuerpo.cantTomada, + cuerpo.fechaInicio, + cuerpo.fechaFinal) + aEnviar!!.add (temp) + } + exportarInventario(aEnviar!!) + } + + + } + private fun exportarInventario(aEnviar:List ){ + + val call: Call? = WebService + .getInstance() + ?.createService(WebServiceApi::class.java) + ?.inventarioToSend(aEnviar) + + call!!.enqueue(object : Callback { + override fun onResponse(call: Call?, response: Response) { + if (response.code() == 201) { + } + if (response.code() == 409) { + } + } + + override fun onFailure(call: Call?, t: Throwable?) {} + }) + + } + + private suspend fun foundInvHeadDB(inv: Int): InvHead { + var busqueda: InvHead + return GlobalScope.async(IO) { + busqueda = AppDb.getAppDb(requireContext())!!.InvHeadDAO()!!.foundInvHead(inv) + return@async busqueda + }.await() + } + + private suspend fun foundInvBodyBD(inv: Int): List { + var busqueda: List + return GlobalScope.async(IO) { + busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchAllInvBody(inv) + return@async busqueda + }.await() + } + + private fun borrarInvActual() { lifecycleScope.launch { withContext(Dispatchers.IO) { - AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.deleteinvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong()) - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.deleteInvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong()) + AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.deleteinvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo) + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.deleteInvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo) } } } - private fun CargarDeBdInventario(ultimoInv: Int) { + private fun cargarDeBdInventario(ultimoInv: Int) { GlobalScope.launch(Dispatchers.Main) { val invbody = cargarInventario(ultimoInv) for ((i, _) in invbody!!.withIndex()) { - val art = Articles(invbody[i].sector, + val art = Articles( + invbody[i].sector, invbody[i].codigo, invbody[i].descripcion, invbody[i].codBar, @@ -403,7 +477,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList } } - private fun ContinuarCargaCodigoOri(artAcargar:List) { + private fun continuarCargaCodigoOri(artAcargar: List) { if (artAcargar.isNotEmpty() || !artAcargar.isNullOrEmpty()) {// TODO: Si lo encuentra en la BD // TODO: ESCONDE EL TECLADO VIRTUAL AL PRESIONAR ENTER @@ -424,7 +498,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList etCodigoBarras.selectAll() } - private fun ContinuarCargaDesc(artAcargar: ArrayList) { + private fun continuarCargaDesc(artAcargar: ArrayList) { //TODO DESPUES DE INGRESAR LA DESCRIPCION Y DE BUSCAR LOS CAINCIDENCIAS EN LA BASE SE VA A MOSTRAR LAS MISMAS //TODO SI LA CANTIDAD ENCONTRADA ES UNO, LO CARGO DIRECTAMENTE EN EL RV @@ -505,7 +579,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList etCodigoBarras.selectAll() } - private fun ContinuarCargaCB(artAcargar: Articles?) { + private fun continuarCargaCB(artAcargar: Articles?) { if (artAcargar != null) {// TODO: Si lo encuentra en la BD if (swSumaUno!!.isChecked) {//TODO: SI ESTA +1, PONE CANTIDAD 1 @@ -515,7 +589,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList cargarRecicler(artAcargar, fCant) } else {//TODO: SI NO ESTA +1 PREGUNTA CANTIDAD - DialogingresarCantidad(requireContext(), artAcargar) + dialogingresarCantidad(requireContext(), artAcargar) } } else {// TODO si no lo encuentra en la BD @@ -527,7 +601,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList etCodigoBarras.selectAll() } - fun DialogingresarCantidad(cnxt: Context, artAcargar: Articles?): Float { + fun dialogingresarCantidad(cnxt: Context, artAcargar: Articles?): Float { var cantidad = 0F val mDialogView = LayoutInflater.from(cnxt).inflate(R.layout.ingresar_cantidad, null) val mBuilder = AlertDialog.Builder(cnxt).setView(mDialogView).setCancelable(false) @@ -603,9 +677,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList if (mDialogView.tvResultado.text.isNotEmpty() || !mDialogView.tvResultado.text.isBlank()) { mAlertDialog.dismiss() listArticulos[indiceDelArtEncontrado].cantTomada = String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat() - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(), + updateCantidad( + listArticulos[indiceDelArtEncontrado].sector.toString(), listArticulos[indiceDelArtEncontrado].codigo.toString(), - String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat()) + String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat() + ) viewAdapter.notifyDataSetChanged() } else if (mDialogView.tvNuevaCantidad.text.isNotEmpty() || mDialogView.tvNuevaCantidad.text.isBlank()) { @@ -627,7 +703,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList suspend fun buscarCodiogoOriEnBD(CodOri: String): List { //TODO BUSQUEDA POR CODIGO DE BARRAS var busqueda: List - return GlobalScope.async(Dispatchers.IO) { + return GlobalScope.async(IO) { busqueda = AppDb.getAppDb(requireContext())!!.ArticulosDAO()!!.findArticuloByCodOri(CodOri, SerchAreaInventario()) return@async busqueda }.await() @@ -645,7 +721,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList suspend fun buscarDescEnBD(descripcion: String): List? { //TODO BUSQUEDA POR DESCRIPCION var busqueda: List? = null - return GlobalScope.async(Dispatchers.IO) { + return GlobalScope.async(IO) { busqueda = AppDb.getAppDb(requireContext())!!.ArticulosDAO()!!.findArticuloByDesc(descripcion, SerchAreaInventario()) return@async busqueda }.await() @@ -655,7 +731,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList //TODO BUSQUEDA POR DESCRIPCION var result: Int return GlobalScope.async(IO) { - result = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.deleteItemFromInvBody(sector.toLong(), codigo.toLong(), inventario.toLong()) + result = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.deleteItemFromInvBody(sector.toLong(), codigo.toLong(), inventario.toInt()) return@async result }.await() } @@ -708,7 +784,8 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList } private fun cargarArtEnBd(articulos: Articles, cant: String) { - val body = InvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo,// TODO PREPARO PARA MANDAR A CARGAR EN LA BD + val body = InvBody( + (inventarioViewModel as InventarioViewModel).InventarioNuevo,// TODO PREPARO PARA MANDAR A CARGAR EN LA BD articulos.sector, articulos.codigo, articulos.descripcion, @@ -720,14 +797,23 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList articulos.balanza, articulos.depSn, ObtenerFechaActual(), - ObtenerFechaActual()) + ObtenerFechaActual() + ) InsertarArtEnDB(body)// TODO MANDO A CARGAR A LA BASE DE DATOS } fun cargarRecicler(articulos: Articles, cant: Float) { //TODO CARGO EN LE RV - val item = ItemsRecycler(if (articulos.sector.toString().toInt()<9) "0${articulos.sector.toString()}" else articulos.sector.toString() - , articulos.codigo, articulos.descripcion, cant, articulos.codBar, articulos.codOrigen, articulos.balanza.toString(), articulos.de.toString()) + val item = ItemsRecycler( + if (articulos.sector.toString().toInt() < 9) "0${articulos.sector.toString()}" else articulos.sector.toString(), + articulos.codigo, + articulos.descripcion, + cant, + articulos.codBar, + articulos.codOrigen, + articulos.balanza.toString(), + articulos.de.toString() + ) listArticulos.add(item) viewAdapter = ProductosListAdapter(requireContext(), listArticulos, this) @@ -745,7 +831,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { GlobalScope.launch(Dispatchers.Main) { - borrarArticulo(listArticulos[viewHolder.adapterPosition].sector.toString(), listArticulos[viewHolder.adapterPosition].codigo.toString(), (inventarioViewModel as InventarioViewModel).InventarioNuevo.toString()) + borrarArticulo( + listArticulos[viewHolder.adapterPosition].sector.toString(), + listArticulos[viewHolder.adapterPosition].codigo.toString(), + (inventarioViewModel as InventarioViewModel).InventarioNuevo.toString() + ) (viewAdapter as ProductosListAdapter).removeItem(viewHolder) viewAdapter.notifyDataSetChanged() modificarCantidadEnCabecera((inventarioViewModel as InventarioViewModel).InventarioNuevo, false, requireContext()) @@ -796,19 +886,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList suspend fun SerchAreaInventario(): Boolean { return GlobalScope.async(IO) { - return@async AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.fetchAreaInvH((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong()) + return@async AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.fetchAreaInvH((inventarioViewModel as InventarioViewModel).InventarioNuevo) }.await() } - fun ObtenerFechaActual(): String? { - //TODO OBTENGO FECHA Y HORA ACTUAL PARA LA CABECERA DEL INVENTARIO Y PARA CADA ITEM QUE SE INSERTA EN LA BD - val current = LocalDateTime.now() - val formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss") - val dFechaHora = current.format(formatter) - return dFechaHora.toString() - } - fun InsertarArtEnDB(cuarpoInventario: InvBody) { lifecycleScope.launch { withContext(Dispatchers.IO) { @@ -819,14 +901,14 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList fun updateCantidad(sector: String, codigo: String, cantidad: Float) { lifecycleScope.launch { - withContext(Dispatchers.IO) { - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong()) + withContext(IO) { + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(), ObtenerFechaActual()) } } } suspend fun cargarInventario(inventario: Int): List? { - return GlobalScope.async(Dispatchers.IO) { + return GlobalScope.async(IO) { return@async AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.fetchAllInvBody(inventario) }.await() } @@ -844,16 +926,13 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList } private val textWatcher = object : TextWatcher { - override fun afterTextChanged(s: Editable?) { - } - - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } + override fun afterTextChanged(s: Editable?) {} + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if(mDialogView.rbSumar.isChecked){ // mDialogView.tvNuevaCantidad.isEnabled=false - mDialogView.tvResultado.text=String.format("%.2f", mDialogView.tvNuevaCantidad.text.toString().toFloat()+ mDialogView.tvCantInicial.text.toString().toFloat()) + mDialogView.tvResultado.text=String.format("%.2f", mDialogView.tvNuevaCantidad.text.toString().toFloat() + mDialogView.tvCantInicial.text.toString().toFloat()) } if(mDialogView.rbRestar.isChecked) { if (!mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) { diff --git a/app/src/main/java/com/focasoftware/deboinventariov20/UI/inventario/ProductosListAdapter.kt b/app/src/main/java/com/focasoftware/deboinventariov20/UI/inventario/ProductosListAdapter.kt index 5b177f2..8c8cd6c 100644 --- a/app/src/main/java/com/focasoftware/deboinventariov20/UI/inventario/ProductosListAdapter.kt +++ b/app/src/main/java/com/focasoftware/deboinventariov20/UI/inventario/ProductosListAdapter.kt @@ -21,7 +21,8 @@ class ProductosListAdapter(private val context: Context,private val productos: A interface OnImageDotsClickListener { fun onImageDotsClick(sector: String?,codigo: String?) fun onImagePenClick(sector: String?, codigo: String?, cantidad: String?, position: String) -} + + } override fun onCreateViewHolder(parent: ViewGroup, p1: Int) = ItemsViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false)) diff --git a/app/src/main/res/layout-xlarge/item_codigo_origen.xml b/app/src/main/res/layout-xlarge/item_codigo_origen.xml index c16ee47..b10c4a0 100644 --- a/app/src/main/res/layout-xlarge/item_codigo_origen.xml +++ b/app/src/main/res/layout-xlarge/item_codigo_origen.xml @@ -45,14 +45,13 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginStart="5dp" - android:layout_marginTop="10dp" android:text="9999" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:textColorHint="@android:color/black" android:textSize="@dimen/SubTitulos10" android:textStyle="bold" - app:layout_constraintStart_toEndOf="@+id/textView2" - app:layout_constraintTop_toBottomOf="@+id/tvDescripcion" /> + app:layout_constraintBaseline_toBaselineOf="@+id/textView2" + app:layout_constraintStart_toEndOf="@+id/textView2" />