Commit 2b4f7165e7cb403443dd04e7a4ba918288115691

Authored by Mauricio Sanchez
1 parent 62463245e4
Exists in master

24092020 1900

... ... @@ -28,6 +28,7 @@ android {
28 28 }
29 29 }
30 30 compileOptions {
  31 + coreLibraryDesugaringEnabled true
31 32 sourceCompatibility JavaVersion.VERSION_1_8
32 33 targetCompatibility JavaVersion.VERSION_1_8
33 34  
... ... @@ -54,7 +55,7 @@ dependencies {
54 55 testImplementation 'junit:junit:4.13'
55 56 androidTestImplementation 'androidx.test.ext:junit:1.1.2'
56 57 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
57   -
  58 + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
58 59  
59 60 //Room
60 61 implementation 'androidx.room:room-ktx:2.2.5'
app/src/main/java/com/focasoftware/deboinventariov20/DB/DAO/ArticulosDAO.kt
... ... @@ -51,19 +51,22 @@ interface InvHeadDAO {
51 51 suspend fun deleteAllArticulos()
52 52  
53 53 @Query("DELETE FROM $TABLA_INV_H WHERE INV_NUM=:inven")
54   - suspend fun deleteinvHead(inven: Long)
  54 + suspend fun deleteinvHead(inven: Int)
55 55  
56 56 @Query("SELECT * FROM $TABLA_INV_H ORDER BY INV_FEI")
57 57 suspend fun fetchAllInvHead(): List<InvHead>
58 58  
59 59 @Query("SELECT INV_LUG FROM $TABLA_INV_H WHERE INV_NUM=:inven")
60   - suspend fun fetchAreaInvH (inven: Long): Boolean
  60 + suspend fun fetchAreaInvH (inven: Int): Boolean
61 61  
62 62 @Query("SELECT INV_PRODCONT FROM $TABLA_INV_H WHERE INV_NUM=:inven")
63   - suspend fun consultaCantidadInvH (inven: Long): Int
  63 + suspend fun consultaCantidadInvH (inven: Int): Int
64 64  
65 65 @Query("UPDATE $TABLA_INV_H SET INV_PRODCONT=:cant WHERE INV_NUM=:inven")
66   - suspend fun updateInvBody(inven: Long,cant: Int)
  66 + suspend fun updateInvBody(inven: Int,cant: Int)
  67 +
  68 + @Query("SELECT INV_PRODCONT FROM $TABLA_INV_H WHERE INV_NUM=:inven")
  69 + suspend fun foundInvHead (inven: Int): InvHead
67 70 }
68 71  
69 72 @Dao
... ... @@ -75,19 +78,19 @@ interface InvBodyDAO {
75 78 suspend fun deleteAllInvBody()
76 79  
77 80 @Query("DELETE FROM $TABLA_INV_B WHERE INV_NUM =:inven")
78   - suspend fun deleteInvBody(inven: Long)
  81 + suspend fun deleteInvBody(inven: Int)
79 82  
80   - @Query("UPDATE $TABLA_INV_B SET CANT=:cant WHERE SEC=:sec AND COD=:cod")
81   - suspend fun UpdateInvBody(cant: Float, sec: Long, cod: Long)
  83 + @Query("UPDATE $TABLA_INV_B SET CANT=:cant , INV_FEF=:actFechaHora WHERE SEC=:sec AND COD=:cod")
  84 + suspend fun updateInvBody(cant: Float, sec: Long, cod: Long, actFechaHora:String)
82 85  
83 86 @Query("SELECT * FROM $TABLA_INV_B WHERE INV_NUM =:inven ORDER BY INV_FEI DESC")
84 87 suspend fun fetchAllInvBody(inven: Int): List<InvBody>
85 88  
86 89 @Query("SELECT * FROM $TABLA_INV_B WHERE INV_NUM =:numInventario AND SEC=:sector AND COD=:codigo")
87   - suspend fun fetchArtInInvBody(sector: Long, codigo: Long, numInventario: Long): InvBody
  90 + suspend fun fetchArtInInvBody(sector: Long, codigo: Long, numInventario: Int): InvBody
88 91  
89 92 @Query("DELETE FROM $TABLA_INV_B WHERE INV_NUM =:numInventario AND SEC=:sector AND COD=:codigo")
90   - suspend fun deleteItemFromInvBody(sector: Long, codigo: Long, numInventario: Long): Int
  93 + suspend fun deleteItemFromInvBody(sector: Long, codigo: Long, numInventario: Int): Int
91 94 }
92 95  
93 96 @Dao
app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosApi.kt
... ... @@ -1,11 +0,0 @@
1   -package com.focasoftware.deboinventariov20.Model
2   -
3   -import retrofit2.Response
4   -import retrofit2.http.GET
5   -
6   -interface ProductosApi {
7   -
8   - @GET("articulos/articulosCodBarra")
9   - suspend fun getProductos(): Response<List<Productos>>
10   -
11   -}
12 0 \ No newline at end of file
app/src/main/java/com/focasoftware/deboinventariov20/Model/ProductosService.kt
... ... @@ -1,52 +0,0 @@
1   -package com.focasoftware.deboinventariov20.Model
2   -
3   -import com.focasoftware.deboinventariov20.UI.actualizacionMaestros.BASE_URL
4   -import okhttp3.OkHttpClient
5   -import okhttp3.logging.HttpLoggingInterceptor
6   -import retrofit2.Retrofit
7   -import retrofit2.converter.gson.GsonConverterFactory
8   -import java.net.SocketTimeoutException
9   -import java.util.concurrent.TimeUnit
10   -
11   -object ProductosService {
12   - private val TIME_OUT: Long
13   - get() {
14   - return 15
15   - }
16   - private val interceptor = run {
17   - val httpLoggingInterceptor = HttpLoggingInterceptor()
18   - httpLoggingInterceptor.apply {
19   - httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
20   - }
21   - }
22   - private val okHttpClient = OkHttpClient.Builder()
23   - .addNetworkInterceptor(interceptor) // same for .addInterceptor(...)
24   - .connectTimeout(TIME_OUT, TimeUnit.SECONDS) //Backend is really slow
25   - .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
26   - .readTimeout(TIME_OUT, TimeUnit.SECONDS)
27   - .build()
28   - fun getProductosService(): ProductosApi {
29   - return Retrofit.Builder()
30   - .client(okHttpClient)
31   - .baseUrl(BASE_URL)
32   - .addConverterFactory(GsonConverterFactory.create())
33   - .build()
34   - .create(ProductosApi::class.java)
35   - }
36   -}
37   -//fun prubaConexion(){
38   -// for (retries in 0..2) {
39   -// try {
40   -// val client: HttpClient = createHttpClientWithDefaultSocketFactory(null, null)
41   -// val response: HttpResponse = client.execute(get)
42   -// val statusCode: Int = response.getStatusLine().getStatusCode()
43   -// return if (statusCode != 200) {
44   -// throw IllegalStateException("GET Request on '" + get.getURI().toString().toString() + "' resulted in " + statusCode)
45   -// } else {
46   -// response.getEntity()
47   -// }
48   -// } catch (e: SocketTimeoutException) {
49   -// // connection timed out...let's try again
50   -// }
51   -// }
52   -//}
53 0 \ No newline at end of file
app/src/main/java/com/focasoftware/deboinventariov20/Model/Tablas.kt
... ... @@ -36,6 +36,16 @@ data class Productos(@SerializedName(&quot;CODSEC&quot;) var sector: String?,
36 36 @SerializedName( "UNIVEN") var balanza: Int?,
37 37 @SerializedName("DEPSN") var depSn: Boolean?,
38 38 @SerializedName("FOTO") var imagen: String?)
  39 +
  40 +data class InvToSend ( var fechaInicio: String?,
  41 + var fechaFinal: String?,
  42 + var lugar: Int?,
  43 + var sector: String?,
  44 + var codigo: String?,
  45 + var descripcion: String?,
  46 + var cantTomada: String?,
  47 + var fechaInicioArt: String?,
  48 + var fechaFinArt: String?)
39 49 //@Entity(tableName = TABLA_ART)
40 50 //data class Articles(@ColumnInfo(name = "SEC") var sector: String?,
41 51 // @ColumnInfo(name = "COD") var codigo: String?,
app/src/main/java/com/focasoftware/deboinventariov20/Model/WebService.kt
... ... @@ -0,0 +1,71 @@
  1 +package com.focasoftware.deboinventariov20.Model
  2 +
  3 +import com.focasoftware.deboinventariov20.UI.actualizacionMaestros.BASE_URL
  4 +import okhttp3.OkHttpClient
  5 +import okhttp3.logging.HttpLoggingInterceptor
  6 +import retrofit2.Retrofit
  7 +import retrofit2.converter.gson.GsonConverterFactory
  8 +import java.util.concurrent.TimeUnit
  9 +
  10 +object WebService {
  11 + private var instance: WebService? = null
  12 + private var retrofit:Retrofit? =null
  13 + private val TIME_OUT: Long
  14 + get() {
  15 + return 15
  16 + }
  17 + private val interceptor = run {
  18 + val httpLoggingInterceptor = HttpLoggingInterceptor()
  19 + httpLoggingInterceptor.apply {
  20 + httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
  21 + }
  22 + }
  23 + private val okHttpClient = OkHttpClient.Builder()
  24 + .addNetworkInterceptor(interceptor)
  25 + .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
  26 + .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
  27 + .readTimeout(TIME_OUT, TimeUnit.SECONDS)
  28 + .build()
  29 +
  30 + private fun WebService() {
  31 + retrofit = Retrofit.Builder()
  32 + .client(okHttpClient)
  33 + .baseUrl(BASE_URL)
  34 + .addConverterFactory(GsonConverterFactory.create())
  35 + .build()
  36 + }
  37 +
  38 + @Synchronized
  39 + fun getInstance(): WebService? {
  40 + if (instance == null) {
  41 + instance = WebService
  42 + }
  43 + return instance
  44 + }
  45 +
  46 + fun <S> createService(serviceClass: Class<S>): S {
  47 + return retrofit!!.create(serviceClass)
  48 + }
  49 +
  50 +// fun <S> createService(serviceClass: Class<S>): S {
  51 +// return retrofit!!.create(serviceClass)
  52 +// }
  53 +
  54 +// fun getProductosService(): EndPoints {
  55 +// return Retrofit.Builder()
  56 +// .client(okHttpClient)
  57 +// .baseUrl(BASE_URL)
  58 +// .addConverterFactory(GsonConverterFactory.create())
  59 +// .build()
  60 +// .create(EndPoints::class.java)
  61 +// }
  62 +
  63 +// fun getProductosService(): ProductosApi {
  64 +// return Retrofit.Builder()
  65 +// .client(okHttpClient)
  66 +// .baseUrl(BASE_URL)
  67 +// .addConverterFactory(GsonConverterFactory.create())
  68 +// .build()
  69 +// .create(ProductosApi::class.java)
  70 +// }
  71 +}
app/src/main/java/com/focasoftware/deboinventariov20/Model/WebServiceApi.kt
... ... @@ -0,0 +1,18 @@
  1 +package com.focasoftware.deboinventariov20.Model
  2 +
  3 +import retrofit2.Call
  4 +import retrofit2.Response
  5 +import retrofit2.http.Body
  6 +import retrofit2.http.GET
  7 +import retrofit2.http.POST
  8 +
  9 +
  10 +interface WebServiceApi {
  11 +
  12 + @GET("articulos/articulosCodBarra")
  13 + fun getProductos(): Call<List<Productos>>
  14 +
  15 +
  16 + @POST("articulos/articulosCodBarra")
  17 + fun inventarioToSend(@Body invToSend: List<InvToSend>?): Call<Void?>?
  18 +}
0 19 \ No newline at end of file
app/src/main/java/com/focasoftware/deboinventariov20/UI/SplashActivity.kt
... ... @@ -15,7 +15,7 @@ class SplashActivity : Activity() {
15 15 val bac = object : Thread(){
16 16 override fun run(){
17 17 try {
18   - Thread.sleep(3000)
  18 + Thread.sleep(3)
19 19 val intent = Intent(baseContext, MainActivity:: class.java)
20 20 startActivity(intent)
21 21 finish()
app/src/main/java/com/focasoftware/deboinventariov20/UI/Utils/Utils.kt
... ... @@ -11,6 +11,8 @@ import kotlinx.coroutines.GlobalScope
11 11 import kotlinx.coroutines.async
12 12 import java.io.IOException
13 13 import java.net.UnknownHostException
  14 +import java.time.LocalDateTime
  15 +import java.time.format.DateTimeFormatter
14 16  
15 17 fun modificarCantidadEnCabecera(inventarioActual: Int, b: Boolean, context: Context) {
16 18 GlobalScope.async(Dispatchers.IO) {
... ... @@ -138,4 +140,11 @@ class serverNoConf : DialogFragment() {
138 140 return builder.create()
139 141 } ?: throw IllegalStateException("Activity cannot be null")
140 142 }
141   -}
142 143 \ No newline at end of file
  144 +}
  145 +fun ObtenerFechaActual(): String {
  146 + //TODO OBTENGO FECHA Y HORA ACTUAL PARA LA CABECERA DEL INVENTARIO Y PARA CADA ITEM QUE SE INSERTA EN LA BD
  147 + val current = LocalDateTime.now()
  148 + val formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss")
  149 + val dFechaHora = current.format(formatter)
  150 + return dFechaHora.toString()
  151 + }
143 152 \ No newline at end of file
app/src/main/java/com/focasoftware/deboinventariov20/UI/actualizacionMaestros/ActuaMaestrosFragment.kt
... ... @@ -5,25 +5,30 @@ import android.view.LayoutInflater
5 5 import android.view.View
6 6 import android.view.ViewGroup
7 7 import android.widget.Button
8   -import android.widget.Toast
9 8 import androidx.fragment.app.Fragment
  9 +import androidx.lifecycle.lifecycleScope
10 10 import com.focasoftware.deboinventariov20.DB.DataBase.AppDb
11 11 import com.focasoftware.deboinventariov20.Model.Articles
12   -import com.focasoftware.deboinventariov20.Model.ProductosService
  12 +import com.focasoftware.deboinventariov20.Model.Productos
13 13 import com.focasoftware.deboinventariov20.Model.ServeInv
  14 +import com.focasoftware.deboinventariov20.Model.WebService.getInstance
  15 +import com.focasoftware.deboinventariov20.Model.WebServiceApi
14 16 import com.focasoftware.deboinventariov20.R
15 17 import com.focasoftware.deboinventariov20.UI.Utils.noServerConf
16 18 import com.focasoftware.deboinventariov20.UI.Utils.serverNoConf
17   -import com.focasoftware.deboinventariov20.UI.Utils.serverValido
18 19 import kotlinx.android.synthetic.main.fragment_actua_maestros.*
19 20 import kotlinx.coroutines.*
20 21 import kotlinx.coroutines.Dispatchers.IO
21 22 import kotlinx.coroutines.Dispatchers.Main
  23 +import retrofit2.Call
  24 +import retrofit2.Callback
  25 +import retrofit2.Response
22 26 import java.net.SocketTimeoutException
23 27  
24 28  
25 29 var BASE_URL = ""
26   -var serverPre:ServeInv?=null
  30 +var serverPre: ServeInv? = null
  31 +
27 32 class ActuaMaestrosFragment : Fragment() {
28 33  
29 34 override fun onCreate(savedInstanceState: Bundle?) {
... ... @@ -31,9 +36,9 @@ class ActuaMaestrosFragment : Fragment() {
31 36  
32 37 GlobalScope.launch(Main) {
33 38  
34   - serverPre = fetchServerPreOne()
35   - if (serverPre!=null) {
36   - btnConfirmarAct.isEnabled=true
  39 + serverPre = fetchServerPreOne()
  40 + if (serverPre != null) {
  41 + btnConfirmarAct.isEnabled = true
37 42 if (serverPre!!.direccion.isNullOrEmpty()) {
38 43 val modalDialog = noServerConf()
39 44 modalDialog.show(requireActivity().supportFragmentManager, "confirmDialog")
... ... @@ -41,11 +46,11 @@ class ActuaMaestrosFragment : Fragment() {
41 46 BASE_URL = serverPre!!.direccion.toString() + ":" + serverPre!!.puerto.toString() + "/"
42 47 tvServerConectado.text = "Conectado al servidor: ${serverPre!!.descripcion}"
43 48 }
44   - }else{
  49 + } else {
45 50 val modalDialog = serverNoConf()
46 51 modalDialog.show(requireActivity().supportFragmentManager, "confirmDialog")
47 52  
48   - btnConfirmarAct.isEnabled=false
  53 + btnConfirmarAct.isEnabled = false
49 54  
50 55 }
51 56 }
... ... @@ -67,25 +72,20 @@ class ActuaMaestrosFragment : Fragment() {
67 72 bConfirmarAct.setOnClickListener {
68 73 loading_view.visibility = View.VISIBLE
69 74 countriesList.text = "Obteniendo artรญculos del servidor, aguarde por favor."
70   - GlobalScope.launch(Main) {
71   - obtenerArticulos()
72   - }
  75 + obtenerArticulos()
73 76 }
74 77 return v
75 78 }
76 79  
77   - private suspend fun obtenerArticulos() {
78   -
79   - val productosService = ProductosService.getProductosService()
  80 + private fun obtenerArticulos() {
  81 + val call = getInstance()
  82 + ?.createService(WebServiceApi::class.java)
  83 + ?.getProductos()
80 84 var index: Long = 1
81   - withContext(IO) {
82   - val job = CoroutineScope(IO).launch {
83   - // TODO: BORRO TODO LOS ARTICULOS DE LA BASE PARA CARGARLOS DE NUEVO
84   - AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.deleteAllArticulos()
85   - try {
86   - val response = productosService.getProductos()
87   - if (response.isSuccessful) {
88   -
  85 + call!!.enqueue(object : Callback<List<Productos>> {
  86 + override fun onResponse(call: Call<List<Productos>>, response: Response<List<Productos>>) {
  87 + if (response.code() == 200) {
  88 + try {
89 89 for (pro in response.body()!!) {
90 90 val artiAcargar = Articles(
91 91 pro.sector,
... ... @@ -103,36 +103,76 @@ class ActuaMaestrosFragment : Fragment() {
103 103 pro.imagen
104 104 )
105 105 index += index
106   - AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(artiAcargar)
  106 + insertarProducto(artiAcargar)
107 107 }
108   - withContext(Main) {
109   - countriesList.visibility = View.VISIBLE
110   - countriesList.text = "ยกDatos Importados Correctamente!"
111   - loading_view.visibility = View.GONE
112   - }
113   - } else if (!response.isSuccessful) {
114   - withContext(Main) {
115   - countriesList.visibility = View.VISIBLE
116   - countriesList.text = "ยกSin servicio. No se puede conectar a la api o al servidor configurado en el BackEnd!"
117   - loading_view.visibility = View.GONE
118   - }
119   - }
120   - } catch (e: SocketTimeoutException) {
121   - withContext(Main) {
  108 + countriesList.visibility = View.VISIBLE
  109 + countriesList.text = "ยกDatos Importados Correctamente!"
  110 + loading_view.visibility = View.GONE
  111 + } catch (e: SocketTimeoutException) {
122 112 countriesList.visibility = View.VISIBLE
123 113 countriesList.text = "ยกSin conexiรณn al Servidor!"
124 114 loading_view.visibility = View.GONE
125 115 }
126 116 }
127 117 }
128   -// if (job == null) {
129   -// withContext(Main) {
130   -// countriesList.visibility = View.VISIBLE
131   -// countriesList.text = "No se puedo realizar la conexiรณn al Servidor"
132   -// loading_view.visibility = View.GONE
  118 +
  119 + override fun onFailure(call: Call<List<Productos>>, t: Throwable) {
  120 + countriesList.visibility = View.VISIBLE
  121 + countriesList.text = (t.message + "." + t.cause)
  122 + loading_view.visibility = View.GONE
  123 + }
  124 + })
  125 +
  126 +
  127 +// var index: Long = 1
  128 +// withContext(IO) {
  129 +// val job = CoroutineScope(IO).launch {
  130 +// // TODO: BORRO TODO LOS ARTICULOS DE LA BASE PARA CARGARLOS DE NUEVO
  131 +// AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.deleteAllArticulos()
  132 +// try {
  133 +// val response = productosService.getProductos()
  134 +// if (response.isSuccessful) {
  135 +//
  136 +// for (pro in response.body()!!) {
  137 +// val artiAcargar = Articles(
  138 +// pro.sector,
  139 +// pro.codigo,
  140 +// pro.descripcion,
  141 +// pro.codBar,
  142 +// pro.codOrigen,
  143 +// pro.precio,
  144 +// pro.costo,
  145 +// pro.exiVenta,
  146 +// pro.exiDeposito,
  147 +// pro.de,
  148 +// pro.balanza,
  149 +// pro.depSn,
  150 +// pro.imagen
  151 +// )
  152 +// index += index
  153 +// AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(artiAcargar)
  154 +// }
  155 +// withContext(Main) {
  156 +// countriesList.visibility = View.VISIBLE
  157 +// countriesList.text = "ยกDatos Importados Correctamente!"
  158 +// loading_view.visibility = View.GONE
  159 +// }
  160 +// } else if (!response.isSuccessful) {
  161 +// withContext(Main) {
  162 +// countriesList.visibility = View.VISIBLE
  163 +// countriesList.text = "ยกSin servicio. No se puede conectar a la api o al servidor configurado en el BackEnd!"
  164 +// loading_view.visibility = View.GONE
  165 +// }
  166 +// }
  167 +// } catch (e: SocketTimeoutException) {
  168 +// withContext(Main) {
  169 +// countriesList.visibility = View.VISIBLE
  170 +// countriesList.text = "ยกSin conexiรณn al Servidor!"
  171 +// loading_view.visibility = View.GONE
  172 +// }
133 173 // }
134 174 // }
135   - }
  175 +// }
136 176  
137 177  
138 178 // withContext(Dispatchers.Main) {
... ... @@ -166,6 +206,14 @@ class ActuaMaestrosFragment : Fragment() {
166 206 // })
167 207 }
168 208  
  209 + fun insertarProducto(aCargar: Articles) {
  210 + lifecycleScope.launch {
  211 + withContext(IO) {
  212 + AppDb.getAppDb(requireActivity())!!.ArticulosDAO()!!.insertArticulos(aCargar)
  213 + }
  214 + }
  215 + }
  216 +
169 217 fun mostrarArticulos() {
170 218 val Job = GlobalScope.launch {
171 219 var listArticulos: List<Articles>? = null
... ... @@ -181,9 +229,8 @@ class ActuaMaestrosFragment : Fragment() {
181 229 countriesList?.text = temp
182 230 }
183 231 }
184   -// for (professor in listArticulos!!) {
185   -// editT.text= professor.id.toString()
186   -// }
187 232 }
188 233 }
189 234  
  235 +
  236 +
app/src/main/java/com/focasoftware/deboinventariov20/UI/descripCorigenFragment/CodigoOriFragment.kt
... ... @@ -27,8 +27,8 @@ import com.focasoftware.deboinventariov20.DB.DataBase.AppDb
27 27 import com.focasoftware.deboinventariov20.Model.Articles
28 28 import com.focasoftware.deboinventariov20.Model.InvBody
29 29 import com.focasoftware.deboinventariov20.R
  30 +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual
30 31 import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera
31   -import com.focasoftware.deboinventariov20.UI.inventario.InventarioFragment
32 32 import kotlinx.android.synthetic.main.ingresar_cantidad.view.*
33 33 import kotlinx.android.synthetic.main.ingresar_cantidad.view.btnAceptar
34 34 import kotlinx.android.synthetic.main.login_dialog.view.*
... ... @@ -138,8 +138,8 @@ class CodigoOriFragment : Fragment() {
138 138 (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.precio,
139 139 (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.balanza,
140 140 (viewAdapter2 as CodigoOrigenAdapter).items2?.get(viewHolder.layoutPosition)!!.depSn,
141   - InventarioFragment().ObtenerFechaActual(),
142   - InventarioFragment().ObtenerFechaActual())
  141 + ObtenerFechaActual(),
  142 + ObtenerFechaActual())
143 143 InsertarArtEnDB(body)// TODO: MANDO A CARGAR A LA BASE DE DATOS
144 144 modificarCantidadEnCabecera(numeroInventario, true, requireActivity())
145 145 // VolverAinventario()
... ... @@ -250,7 +250,7 @@ class CodigoOriFragment : Fragment() {
250 250 //TODO BUSQUEDA POR CODIGO DE BARRAS
251 251 var busqueda: InvBody? = null
252 252 return GlobalScope.async(Dispatchers.IO) {
253   - busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchArtInInvBody(sector.toLong(), codigo.toLong(), numInventario.toLong())
  253 + busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchArtInInvBody(sector.toLong(), codigo.toLong(), numInventario.toInt())
254 254 return@async busqueda
255 255 }.await()
256 256 }
... ... @@ -260,7 +260,7 @@ class CodigoOriFragment : Fragment() {
260 260 withContext(Dispatchers.IO) {
261 261 val activity: FragmentActivity? = activity
262 262 if (activity != null && isAdded) {
263   - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong())
  263 + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(), ObtenerFechaActual())
264 264 }
265 265 }
266 266 }
app/src/main/java/com/focasoftware/deboinventariov20/UI/descripcionFragment/DescripcionFragment.kt
... ... @@ -27,8 +27,8 @@ import com.focasoftware.deboinventariov20.DB.DataBase.AppDb
27 27 import com.focasoftware.deboinventariov20.Model.Articles
28 28 import com.focasoftware.deboinventariov20.Model.InvBody
29 29 import com.focasoftware.deboinventariov20.R
  30 +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual
30 31 import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera
31   -import com.focasoftware.deboinventariov20.UI.inventario.InventarioFragment
32 32 import kotlinx.android.synthetic.main.ingresar_cantidad.view.*
33 33 import kotlinx.android.synthetic.main.login_dialog.view.*
34 34 import kotlinx.android.synthetic.main.login_dialog.view.btnAceptar
... ... @@ -138,8 +138,8 @@ class DescripcionFragment : Fragment() {
138 138 (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.precio,
139 139 (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.balanza,
140 140 (viewAdapter2 as DescripcionListAdapter).items2?.get(viewHolder.layoutPosition)!!.depSn,
141   - InventarioFragment().ObtenerFechaActual(),
142   - InventarioFragment().ObtenerFechaActual()
  141 + ObtenerFechaActual(),
  142 + ObtenerFechaActual()
143 143 )
144 144 InsertarArtEnDB(body)// TODO: MANDO A CARGAR A LA BASE DE DATOS
145 145 modificarCantidadEnCabecera(numeroInventario, true, requireActivity())
... ... @@ -264,7 +264,7 @@ class DescripcionFragment : Fragment() {
264 264 withContext(Dispatchers.IO) {
265 265 val activity: FragmentActivity? = activity
266 266 if (activity != null && isAdded) {
267   - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong())
  267 + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(),ObtenerFechaActual())
268 268 }
269 269 }
270 270 }
app/src/main/java/com/focasoftware/deboinventariov20/UI/inventario/InventarioFragment.kt
... ... @@ -2,7 +2,6 @@ package com.focasoftware.deboinventariov20.UI.inventario
2 2  
3 3 import android.annotation.SuppressLint
4 4 import android.app.AlertDialog
5   -import android.app.Dialog
6 5 import android.content.Context
7 6 import android.content.Context.INPUT_METHOD_SERVICE
8 7 import android.content.DialogInterface
... ... @@ -23,7 +22,6 @@ import androidx.core.content.ContextCompat
23 22 import androidx.core.os.bundleOf
24 23 import androidx.fragment.app.Fragment
25 24 import androidx.lifecycle.ViewModel
26   -import androidx.lifecycle.ViewModelProvider
27 25 import androidx.lifecycle.ViewModelProviders
28 26 import androidx.lifecycle.lifecycleScope
29 27 import androidx.navigation.NavController
... ... @@ -32,11 +30,10 @@ import androidx.recyclerview.widget.ItemTouchHelper
32 30 import androidx.recyclerview.widget.LinearLayoutManager
33 31 import androidx.recyclerview.widget.RecyclerView
34 32 import com.focasoftware.deboinventariov20.DB.DataBase.AppDb
35   -import com.focasoftware.deboinventariov20.Model.Articles
36   -import com.focasoftware.deboinventariov20.Model.InvBody
37   -import com.focasoftware.deboinventariov20.Model.InvHead
  33 +import com.focasoftware.deboinventariov20.Model.*
38 34 import com.focasoftware.deboinventariov20.R
39 35 import com.focasoftware.deboinventariov20.UI.Utils.NoEncontradoSimple
  36 +import com.focasoftware.deboinventariov20.UI.Utils.ObtenerFechaActual
40 37 import com.focasoftware.deboinventariov20.UI.Utils.modificarCantidadEnCabecera
41 38 import com.focasoftware.deboinventariov20.UI.inventario.viewModel.InventarioViewModel
42 39 import kotlinx.android.synthetic.main.fragment_inventario.*
... ... @@ -45,8 +42,9 @@ import kotlinx.android.synthetic.main.login_dialog.view.*
45 42 import kotlinx.android.synthetic.main.login_dialog.view.btnAceptar
46 43 import kotlinx.coroutines.*
47 44 import kotlinx.coroutines.Dispatchers.IO
48   -import java.time.LocalDateTime
49   -import java.time.format.DateTimeFormatter
  45 +import retrofit2.Call
  46 +import retrofit2.Callback
  47 +import retrofit2.Response
50 48 import java.util.*
51 49  
52 50 class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickListener {
... ... @@ -99,20 +97,32 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
99 97 val tCodigoBarras = v.findViewById<EditText>(R.id.etCodigoBarras)
100 98 rcInventarios = v.findViewById(R.id.rcInventarios)
101 99 val tvTitulo = v.findViewById<TextView>(R.id.tvTitulo)
  100 + val descArea: String = if (!SerchArea()) "Ventas" else "Deposito"
102 101  
103 102 if ((inventarioViewModel as InventarioViewModel).InventarioNuevo == 0) {// TODO: SI INVETNARIO NUEVO
104 103 GlobalScope.launch(Dispatchers.Main) {
105 104 //TODO: BUSCO EL ULTIMO INVENTARIO EN LA BD PARA PODER CREAR EL PROXIMO
106 105 (inventarioViewModel as InventarioViewModel).InventarioNuevo = AppDb.getAppDb(requireActivity())?.InvHeadDAO()?.findLastInv()?.plus(1) ?: 1
107 106 //TODO: CREAMOS EL INVENTARIO EN LA CABECERA DEL INVENTARIO
108   - invHead = InvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo, if (!SerchArea()) "Ventas" else "Deposito", 1, ObtenerFechaActual(), ObtenerFechaActual(), 0L, SerchArea(), AjusteProductos(), ProdNoCont())
  107 + invHead = InvHead(
  108 + (inventarioViewModel as InventarioViewModel).InventarioNuevo,
  109 + if (!SerchArea()) "Ventas" else "Deposito",
  110 + 1,
  111 + ObtenerFechaActual(),
  112 + ObtenerFechaActual(),
  113 + 0L,
  114 + SerchArea(),
  115 + AjusteProductos(),
  116 + ProdNoCont()
  117 + )
109 118 AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.insertInvHead(invHead)
110   - tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo}"
  119 +
  120 + tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo} "+descArea
111 121 }
112 122 } else {// TODO (SI VENGO DE FRAGMENT DESCRIPCION)
113 123 listArticulos.clear()
114   - CargarDeBdInventario((inventarioViewModel as InventarioViewModel).InventarioNuevo)
115   - tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo}"
  124 + cargarDeBdInventario((inventarioViewModel as InventarioViewModel).InventarioNuevo)
  125 + tvTitulo.text = "Inventario " + " # ${(inventarioViewModel as InventarioViewModel).InventarioNuevo} "+ descArea
116 126 }
117 127  
118 128 tCodigoBarras.setOnKeyListener { _, keyCode, keyEvent ->
... ... @@ -147,9 +157,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
147 157 // fCant = listArticulos[indiceDelArtEncontrado].cantTomada
148 158 // fCant += 1F
149 159 //TODO ACTUALIZO LA CANTIDAD EN LA BD
150   - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(),
  160 + updateCantidad(
  161 + listArticulos[indiceDelArtEncontrado].sector.toString(),
151 162 listArticulos[indiceDelArtEncontrado].codigo.toString(),
152   - listArticulos[indiceDelArtEncontrado].cantTomada + 1)
  163 + listArticulos[indiceDelArtEncontrado].cantTomada + 1
  164 + )
153 165 //TODO ACTUALIZO LA CANTIDAD EN EL RV
154 166 listArticulos[indiceDelArtEncontrado].cantTomada = listArticulos[indiceDelArtEncontrado].cantTomada + 1
155 167 viewAdapter.notifyDataSetChanged()
... ... @@ -160,7 +172,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
160 172 } else if (indiceDelArtEncontrado == -1) {// TODO: no lo encontro en el RV, lo va a buscar en al BD
161 173 //TODO BUSCO EN BASE DE DATOS
162 174 val artEncontrado = buscarCBEnBD(sChangeUpper.toUpperCase(Locale.ROOT))
163   - ContinuarCargaCB(artEncontrado)//TODO SE MANDA CERO POR QUE ES UN ARTICULO ESCANEADO NUEVO PARA QUE SEA COMPATIBLE
  175 + continuarCargaCB(artEncontrado)//TODO SE MANDA CERO POR QUE ES UN ARTICULO ESCANEADO NUEVO PARA QUE SEA COMPATIBLE
164 176 }
165 177 tCodigoBarras.focusable = View.FOCUSABLE
166 178 tCodigoBarras.setText("")
... ... @@ -204,7 +216,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
204 216 // (indiceDelArtEncontrado == -1) {// TODO: no lo encontro en el RV, lo va a buscar en al BD
205 217 GlobalScope.launch(Dispatchers.Main) {
206 218 val artEncontrado = buscarDescEnBD(sChangeUpper.toUpperCase(Locale.ROOT))
207   - ContinuarCargaDesc(artEncontrado as ArrayList<Articles>)
  219 + continuarCargaDesc(artEncontrado as ArrayList<Articles>)
208 220 }
209 221  
210 222 iBusquedaPor = 0
... ... @@ -290,14 +302,14 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
290 302 // }.cancelOnTouchOutside(false).cornerRadius(10F)
291 303 // }
292 304 // } else if (indiceDelArtEncontrado == -1) {
293   - // no lo encontro en el RV, lo va a buscar en al BD
  305 + // no lo encontro en el RV, lo va a buscar en al BD
294 306  
295   - GlobalScope.launch(Dispatchers.Main) {
296   - //TODO BUSCO EN BASE DE DATOS
297   - val artEncontrado = buscarCodiogoOriEnBD(sChangeUpper.toUpperCase(Locale.ROOT))
298   - ContinuarCargaCodigoOri(artEncontrado )
299   - }
300   - iBusquedaPor = 0
  307 + GlobalScope.launch(Dispatchers.Main) {
  308 + //TODO BUSCO EN BASE DE DATOS
  309 + val artEncontrado = buscarCodiogoOriEnBD(sChangeUpper.toUpperCase(Locale.ROOT))
  310 + continuarCargaCodigoOri(artEncontrado)
  311 + }
  312 + iBusquedaPor = 0
301 313 // }
302 314 // }
303 315 return@setOnKeyListener true
... ... @@ -320,7 +332,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
320 332 btnBorrarInv.setOnClickListener {
321 333 AlertDialog.Builder(requireContext()).setTitle("Eliminaciรณn de Inventarios").setMessage("ยฟConfirma que desea eliminar el inventario?")
322 334 .setPositiveButton(R.string.btnOk, DialogInterface.OnClickListener { dialog, which ->
323   - BorrarInvActual()
  335 + borrarInvActual()
324 336 Toast.makeText(requireContext(), "El inventario $(inventarioViewModel as InventarioViewModel).InventarioNuevo fue Borrado", Toast.LENGTH_LONG).show()
325 337 navController.navigate(R.id.action_inventarioFragment_to_mainFragment2)
326 338 (inventarioViewModel as InventarioViewModel).InventarioNuevo = 0
... ... @@ -333,7 +345,8 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
333 345 btnExportarInv.setOnClickListener {
334 346 AlertDialog.Builder(requireContext()).setTitle(R.string.sTituloExportar).setMessage(R.string.sMensajeExportar)
335 347 .setPositiveButton(R.string.btnOk, DialogInterface.OnClickListener { dialog, which ->
336   - BorrarInvActual()
  348 + exportarInventario(InventarioNuevo)
  349 + borrarInvActual()
337 350 Toast.makeText(requireContext(), "El inventario $(inventarioViewModel as InventarioViewModel).InventarioNuevo fue Exportado al Servidor", Toast.LENGTH_LONG).show()
338 351 navController.navigate(R.id.action_inventarioFragment_to_mainFragment2)
339 352 (inventarioViewModel as InventarioViewModel).InventarioNuevo = 0
... ... @@ -372,20 +385,81 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
372 385 }
373 386 }
374 387  
375   - private fun BorrarInvActual() {
  388 + private fun exportarInventario(inventario: Int) {
  389 + GlobalScope.launch(Dispatchers.Main) {
  390 + val aEnviar: MutableList<InvToSend>?=null
  391 + val datosCabecera = foundInvHeadDB(inventario)
  392 + val datosCuerpo=foundInvBodyBD(inventario)
  393 +
  394 + for (cuerpo in datosCuerpo){
  395 + val temp=InvToSend(
  396 + datosCabecera.fechaInicio,
  397 + datosCabecera.fechaFinal,
  398 + if (datosCabecera.lugar!!) 1 else 0,
  399 + cuerpo.sector,
  400 + cuerpo.codigo,
  401 + cuerpo.descripcion,
  402 + cuerpo.cantTomada,
  403 + cuerpo.fechaInicio,
  404 + cuerpo.fechaFinal)
  405 + aEnviar!!.add (temp)
  406 + }
  407 + exportarInventario(aEnviar!!)
  408 + }
  409 +
  410 +
  411 + }
  412 + private fun exportarInventario(aEnviar:List<InvToSend> ){
  413 +
  414 + val call: Call<Void?>? = WebService
  415 + .getInstance()
  416 + ?.createService(WebServiceApi::class.java)
  417 + ?.inventarioToSend(aEnviar)
  418 +
  419 + call!!.enqueue(object : Callback<Void?> {
  420 + override fun onResponse(call: Call<Void?>?, response: Response<Void?>) {
  421 + if (response.code() == 201) {
  422 + }
  423 + if (response.code() == 409) {
  424 + }
  425 + }
  426 +
  427 + override fun onFailure(call: Call<Void?>?, t: Throwable?) {}
  428 + })
  429 +
  430 + }
  431 +
  432 + private suspend fun foundInvHeadDB(inv: Int): InvHead {
  433 + var busqueda: InvHead
  434 + return GlobalScope.async(IO) {
  435 + busqueda = AppDb.getAppDb(requireContext())!!.InvHeadDAO()!!.foundInvHead(inv)
  436 + return@async busqueda
  437 + }.await()
  438 + }
  439 +
  440 + private suspend fun foundInvBodyBD(inv: Int): List<InvBody> {
  441 + var busqueda: List<InvBody>
  442 + return GlobalScope.async(IO) {
  443 + busqueda = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.fetchAllInvBody(inv)
  444 + return@async busqueda
  445 + }.await()
  446 + }
  447 +
  448 + private fun borrarInvActual() {
376 449 lifecycleScope.launch {
377 450 withContext(Dispatchers.IO) {
378   - AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.deleteinvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong())
379   - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.deleteInvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong())
  451 + AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.deleteinvHead((inventarioViewModel as InventarioViewModel).InventarioNuevo)
  452 + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.deleteInvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo)
380 453 }
381 454 }
382 455 }
383 456  
384   - private fun CargarDeBdInventario(ultimoInv: Int) {
  457 + private fun cargarDeBdInventario(ultimoInv: Int) {
385 458 GlobalScope.launch(Dispatchers.Main) {
386 459 val invbody = cargarInventario(ultimoInv)
387 460 for ((i, _) in invbody!!.withIndex()) {
388   - val art = Articles(invbody[i].sector,
  461 + val art = Articles(
  462 + invbody[i].sector,
389 463 invbody[i].codigo,
390 464 invbody[i].descripcion,
391 465 invbody[i].codBar,
... ... @@ -403,7 +477,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
403 477 }
404 478 }
405 479  
406   - private fun ContinuarCargaCodigoOri(artAcargar:List<Articles>) {
  480 + private fun continuarCargaCodigoOri(artAcargar: List<Articles>) {
407 481  
408 482 if (artAcargar.isNotEmpty() || !artAcargar.isNullOrEmpty()) {// TODO: Si lo encuentra en la BD
409 483 // TODO: ESCONDE EL TECLADO VIRTUAL AL PRESIONAR ENTER
... ... @@ -424,7 +498,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
424 498 etCodigoBarras.selectAll()
425 499 }
426 500  
427   - private fun ContinuarCargaDesc(artAcargar: ArrayList<Articles>) {
  501 + private fun continuarCargaDesc(artAcargar: ArrayList<Articles>) {
428 502 //TODO DESPUES DE INGRESAR LA DESCRIPCION Y DE BUSCAR LOS CAINCIDENCIAS EN LA BASE SE VA A MOSTRAR LAS MISMAS
429 503 //TODO SI LA CANTIDAD ENCONTRADA ES UNO, LO CARGO DIRECTAMENTE EN EL RV
430 504  
... ... @@ -505,7 +579,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
505 579 etCodigoBarras.selectAll()
506 580 }
507 581  
508   - private fun ContinuarCargaCB(artAcargar: Articles?) {
  582 + private fun continuarCargaCB(artAcargar: Articles?) {
509 583  
510 584 if (artAcargar != null) {// TODO: Si lo encuentra en la BD
511 585 if (swSumaUno!!.isChecked) {//TODO: SI ESTA +1, PONE CANTIDAD 1
... ... @@ -515,7 +589,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
515 589 cargarRecicler(artAcargar, fCant)
516 590 } else {//TODO: SI NO ESTA +1 PREGUNTA CANTIDAD
517 591  
518   - DialogingresarCantidad(requireContext(), artAcargar)
  592 + dialogingresarCantidad(requireContext(), artAcargar)
519 593  
520 594 }
521 595 } else {// TODO si no lo encuentra en la BD
... ... @@ -527,7 +601,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
527 601 etCodigoBarras.selectAll()
528 602 }
529 603  
530   - fun DialogingresarCantidad(cnxt: Context, artAcargar: Articles?): Float {
  604 + fun dialogingresarCantidad(cnxt: Context, artAcargar: Articles?): Float {
531 605 var cantidad = 0F
532 606 val mDialogView = LayoutInflater.from(cnxt).inflate(R.layout.ingresar_cantidad, null)
533 607 val mBuilder = AlertDialog.Builder(cnxt).setView(mDialogView).setCancelable(false)
... ... @@ -603,9 +677,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
603 677 if (mDialogView.tvResultado.text.isNotEmpty() || !mDialogView.tvResultado.text.isBlank()) {
604 678 mAlertDialog.dismiss()
605 679 listArticulos[indiceDelArtEncontrado].cantTomada = String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat()
606   - updateCantidad(listArticulos[indiceDelArtEncontrado].sector.toString(),
  680 + updateCantidad(
  681 + listArticulos[indiceDelArtEncontrado].sector.toString(),
607 682 listArticulos[indiceDelArtEncontrado].codigo.toString(),
608   - String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat())
  683 + String.format("%.2f", mDialogView.tvResultado.text.toString().toFloat()).toFloat()
  684 + )
609 685  
610 686 viewAdapter.notifyDataSetChanged()
611 687 } else if (mDialogView.tvNuevaCantidad.text.isNotEmpty() || mDialogView.tvNuevaCantidad.text.isBlank()) {
... ... @@ -627,7 +703,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
627 703 suspend fun buscarCodiogoOriEnBD(CodOri: String): List<Articles> {
628 704 //TODO BUSQUEDA POR CODIGO DE BARRAS
629 705 var busqueda: List<Articles>
630   - return GlobalScope.async(Dispatchers.IO) {
  706 + return GlobalScope.async(IO) {
631 707 busqueda = AppDb.getAppDb(requireContext())!!.ArticulosDAO()!!.findArticuloByCodOri(CodOri, SerchAreaInventario())
632 708 return@async busqueda
633 709 }.await()
... ... @@ -645,7 +721,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
645 721 suspend fun buscarDescEnBD(descripcion: String): List<Articles>? {
646 722 //TODO BUSQUEDA POR DESCRIPCION
647 723 var busqueda: List<Articles>? = null
648   - return GlobalScope.async(Dispatchers.IO) {
  724 + return GlobalScope.async(IO) {
649 725 busqueda = AppDb.getAppDb(requireContext())!!.ArticulosDAO()!!.findArticuloByDesc(descripcion, SerchAreaInventario())
650 726 return@async busqueda
651 727 }.await()
... ... @@ -655,7 +731,7 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
655 731 //TODO BUSQUEDA POR DESCRIPCION
656 732 var result: Int
657 733 return GlobalScope.async(IO) {
658   - result = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.deleteItemFromInvBody(sector.toLong(), codigo.toLong(), inventario.toLong())
  734 + result = AppDb.getAppDb(requireContext())!!.InvBodyDAO()!!.deleteItemFromInvBody(sector.toLong(), codigo.toLong(), inventario.toInt())
659 735 return@async result
660 736 }.await()
661 737 }
... ... @@ -708,7 +784,8 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
708 784 }
709 785  
710 786 private fun cargarArtEnBd(articulos: Articles, cant: String) {
711   - val body = InvBody((inventarioViewModel as InventarioViewModel).InventarioNuevo,// TODO PREPARO PARA MANDAR A CARGAR EN LA BD
  787 + val body = InvBody(
  788 + (inventarioViewModel as InventarioViewModel).InventarioNuevo,// TODO PREPARO PARA MANDAR A CARGAR EN LA BD
712 789 articulos.sector,
713 790 articulos.codigo,
714 791 articulos.descripcion,
... ... @@ -720,14 +797,23 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
720 797 articulos.balanza,
721 798 articulos.depSn,
722 799 ObtenerFechaActual(),
723   - ObtenerFechaActual())
  800 + ObtenerFechaActual()
  801 + )
724 802 InsertarArtEnDB(body)// TODO MANDO A CARGAR A LA BASE DE DATOS
725 803 }
726 804  
727 805 fun cargarRecicler(articulos: Articles, cant: Float) {
728 806 //TODO CARGO EN LE RV
729   - val item = ItemsRecycler(if (articulos.sector.toString().toInt()<9) "0${articulos.sector.toString()}" else articulos.sector.toString()
730   - , articulos.codigo, articulos.descripcion, cant, articulos.codBar, articulos.codOrigen, articulos.balanza.toString(), articulos.de.toString())
  807 + val item = ItemsRecycler(
  808 + if (articulos.sector.toString().toInt() < 9) "0${articulos.sector.toString()}" else articulos.sector.toString(),
  809 + articulos.codigo,
  810 + articulos.descripcion,
  811 + cant,
  812 + articulos.codBar,
  813 + articulos.codOrigen,
  814 + articulos.balanza.toString(),
  815 + articulos.de.toString()
  816 + )
731 817 listArticulos.add(item)
732 818  
733 819 viewAdapter = ProductosListAdapter(requireContext(), listArticulos, this)
... ... @@ -745,7 +831,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
745 831 override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
746 832  
747 833 GlobalScope.launch(Dispatchers.Main) {
748   - borrarArticulo(listArticulos[viewHolder.adapterPosition].sector.toString(), listArticulos[viewHolder.adapterPosition].codigo.toString(), (inventarioViewModel as InventarioViewModel).InventarioNuevo.toString())
  834 + borrarArticulo(
  835 + listArticulos[viewHolder.adapterPosition].sector.toString(),
  836 + listArticulos[viewHolder.adapterPosition].codigo.toString(),
  837 + (inventarioViewModel as InventarioViewModel).InventarioNuevo.toString()
  838 + )
749 839 (viewAdapter as ProductosListAdapter).removeItem(viewHolder)
750 840 viewAdapter.notifyDataSetChanged()
751 841 modificarCantidadEnCabecera((inventarioViewModel as InventarioViewModel).InventarioNuevo, false, requireContext())
... ... @@ -796,19 +886,11 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
796 886  
797 887 suspend fun SerchAreaInventario(): Boolean {
798 888 return GlobalScope.async(IO) {
799   - return@async AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.fetchAreaInvH((inventarioViewModel as InventarioViewModel).InventarioNuevo.toLong())
  889 + return@async AppDb.getAppDb(requireActivity())!!.InvHeadDAO()!!.fetchAreaInvH((inventarioViewModel as InventarioViewModel).InventarioNuevo)
800 890 }.await()
801 891  
802 892 }
803 893  
804   - fun ObtenerFechaActual(): String? {
805   - //TODO OBTENGO FECHA Y HORA ACTUAL PARA LA CABECERA DEL INVENTARIO Y PARA CADA ITEM QUE SE INSERTA EN LA BD
806   - val current = LocalDateTime.now()
807   - val formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss")
808   - val dFechaHora = current.format(formatter)
809   - return dFechaHora.toString()
810   - }
811   -
812 894 fun InsertarArtEnDB(cuarpoInventario: InvBody) {
813 895 lifecycleScope.launch {
814 896 withContext(Dispatchers.IO) {
... ... @@ -819,14 +901,14 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
819 901  
820 902 fun updateCantidad(sector: String, codigo: String, cantidad: Float) {
821 903 lifecycleScope.launch {
822   - withContext(Dispatchers.IO) {
823   - AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.UpdateInvBody(cantidad, sector.toLong(), codigo.toLong())
  904 + withContext(IO) {
  905 + AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.updateInvBody(cantidad, sector.toLong(), codigo.toLong(), ObtenerFechaActual())
824 906 }
825 907 }
826 908 }
827 909  
828 910 suspend fun cargarInventario(inventario: Int): List<InvBody>? {
829   - return GlobalScope.async(Dispatchers.IO) {
  911 + return GlobalScope.async(IO) {
830 912 return@async AppDb.getAppDb(requireActivity())!!.InvBodyDAO()!!.fetchAllInvBody(inventario)
831 913 }.await()
832 914 }
... ... @@ -844,16 +926,13 @@ class InventarioFragment : Fragment(), ProductosListAdapter.OnImageDotsClickList
844 926 }
845 927  
846 928 private val textWatcher = object : TextWatcher {
847   - override fun afterTextChanged(s: Editable?) {
848   - }
849   -
850   - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
851   - }
  929 + override fun afterTextChanged(s: Editable?) {}
  930 + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
852 931  
853 932 override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
854 933 if(mDialogView.rbSumar.isChecked){
855 934 // mDialogView.tvNuevaCantidad.isEnabled=false
856   - mDialogView.tvResultado.text=String.format("%.2f", mDialogView.tvNuevaCantidad.text.toString().toFloat()+ mDialogView.tvCantInicial.text.toString().toFloat())
  935 + mDialogView.tvResultado.text=String.format("%.2f", mDialogView.tvNuevaCantidad.text.toString().toFloat() + mDialogView.tvCantInicial.text.toString().toFloat())
857 936 }
858 937 if(mDialogView.rbRestar.isChecked) {
859 938 if (!mDialogView.tvNuevaCantidad.text.isNullOrEmpty()) {
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
21 21 interface OnImageDotsClickListener {
22 22 fun onImageDotsClick(sector: String?,codigo: String?)
23 23 fun onImagePenClick(sector: String?, codigo: String?, cantidad: String?, position: String)
24   -}
  24 +
  25 + }
25 26  
26 27 override fun onCreateViewHolder(parent: ViewGroup, p1: Int) = ItemsViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false))
27 28  
app/src/main/res/layout-xlarge/item_codigo_origen.xml
... ... @@ -45,14 +45,13 @@
45 45 android:layout_width="wrap_content"
46 46 android:layout_height="match_parent"
47 47 android:layout_marginStart="5dp"
48   - android:layout_marginTop="10dp"
49 48 android:text="9999"
50 49 android:textAppearance="@style/TextAppearance.AppCompat.Large"
51 50 android:textColorHint="@android:color/black"
52 51 android:textSize="@dimen/SubTitulos10"
53 52 android:textStyle="bold"
54   - app:layout_constraintStart_toEndOf="@+id/textView2"
55   - app:layout_constraintTop_toBottomOf="@+id/tvDescripcion" />
  53 + app:layout_constraintBaseline_toBaselineOf="@+id/textView2"
  54 + app:layout_constraintStart_toEndOf="@+id/textView2" />
56 55  
57 56 <TextView
58 57 android:id="@+id/tvCodigo"