B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.2
@EndOfDesignText@
Sub Class_Globals
	Private Root As B4XView 'ignore
	Private xui As XUI 'ignore
	Dim skmt, rkmt As SQL
'	Dim rp As RuntimePermissions
	Dim safePath As String
	Dim fechaHoy As String
	Dim skmtAttached As Boolean = False
End Sub

'You can add more parameters here.
Public Sub Initialize As Object
'	Log("**************************   " & safePath)
	Dim Dirp As String = File.DirRootExternal
	Dim Dir As String
'	Dim Dir2 As String
	Try
		File.MakeDir(Dirp,"/kmts")
		Dir = "/kmts"
'		Log("creado en kmts " & Dirp & Dir)
	Catch
		Dir = ""
'		Log("creado en raiz")
	End Try
	safePath = Dirp & Dir
	rkmt.Initialize(safePath,"md.rkmt.km", True)
	skmt.Initialize(File.DirInternal,"kmt.db", False)
'	rkmt.ExecNonQuery($"create table if not exists pedidos (pe_folio NUMERIC, pe_desc NUMERIC, pe_costo_sin TEXT, pe_ruta TEXT, pe_cedis TEXT, pe_costo_tot NUMERIC, pe_costou NUMERIC, pe_cant NUMERIC, pe_pronombre TEXT, pe_proid TEXT, pe_cliente TEXT, pe_fecha TEXT, pe_usuario TEXT, pe_envio_ok TEXT)"$)
'	rkmt.ExecNonQuery($"create table if not exists inventarios (cat_gp_iniciativa TEXT, cat_gp_tipoprod TEXT, cat_gp_dev TEXT, cat_gp_almacen NUMERIC, cat_gp_id TEXT, cat_gp_nombre TEXT, cat_gp_imp1 TEXT, cat_gp_imp2 TEXT, cat_gp_precio TEXT, cat_gp_clasif TEXT, cat_gp_sts TEXT, cat_gp_tipo TEXT, cat_gp_subtipo TEXT, cat_gp_tipoprod2 TEXT, fecha TEXT)"$)
''	rkmt.ExecNonQuery($"create table if not exists inventarios2 (cat_gp_iniciativa TEXT, cat_gp_tipoprod TEXT, cat_gp_dev TEXT, cat_gp_almacen NUMERIC, cat_gp_id TEXT, cat_gp_nombre TEXT, cat_gp_imp1 TEXT, cat_gp_imp2 TEXT, cat_gp_precio TEXT, cat_gp_clasif TEXT, cat_gp_sts TEXT, cat_gp_tipo TEXT, cat_gp_subtipo TEXT, cat_gp_tipoprod2 TEXT, fecha TEXT)"$)
'	rkmt.ExecNonQuery($"create table if not exists paquetes (cat_dp_precio_simptos TEXT, cat_dp_precio TEXT, cat_dp_almacen TEXT, cat_dp_id TEXT, cat_dp_idprod TEXT, cat_dp_tipo TEXT, cat_dp_pzas TEXT, cat_dp_usuario TEXT, cat_dp_fecha TEXT, cat_dp_regalo TEXT, cat_dp_clasif TEXT, fecha TEXT)"$)
	If chkIfTableExists(skmt, "PEDIDO") Then rkmt.ExecNonQuery($"create table if not exists PEDIDO (${getTableColumnList(skmt, "PEDIDO")}, FECHA TEXT)"$)
	If chkIfTableExists(skmt, "CAT_DETALLES_PAQ") Then rkmt.ExecNonQuery($"create table if not exists CAT_DETALLES_PAQ (${getTableColumnList(skmt, "CAT_DETALLES_PAQ")}, FECHA TEXT)"$)
	If chkIfTableExists(skmt, "CAT_GUNAPROD") Then rkmt.ExecNonQuery($"create table if not exists CAT_GUNAPROD (${getTableColumnList(skmt, "CAT_GUNAPROD")}, FECHA TEXT)"$)
	If chkIfTableExists(skmt, "CAT_GUNAPROD2") Then rkmt.ExecNonQuery($"create table if not exists CAT_GUNAPROD2 (${getTableColumnList(skmt, "CAT_GUNAPROD2")}, FECHA TEXT)"$)
	DateTime.DateFormat = "MM/dd/yyyy"
	fechaHoy = DateTime.Date(DateTime.Now)
	revisaSkmtAttached
	Return Me
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
	Root = Root1
	'load the layout to Root
End Sub

'Revisa si esta montada "kmt.db" como "skmt1" y si no, la monta
'Para que "rkmt" vea a "skmt", es necesario montarla (attach). 
Sub revisaSkmtAttached
	skmtAttached = False
	Dim rs As ResultSet = rkmt.ExecQuery("SELECT * FROM pragma_database_list")
	Do While rs.NextRow 'Revisamos si esta montada "kmt.db" como "skmt1" y si no, la montamos.
		If rs.GetString("name") = "skmt1" Then skmtAttached = True
	Loop
	If Not(skmtAttached) Then
		rkmt.ExecNonQuery($"attach database '${File.Combine(File.DirInternal, "kmt.db")}' as skmt1;"$)
		skmtAttached = True
	End If
End Sub

'Copia la tabla PEDIDO a rkmt.db en la tarjeta del celular.
Sub respalda_pedido
	Private inicio As String = DateTime.Now
'	Log("Copiando PEDIDO ...")
	Private lasCols As String = getTableColumnListName(skmt, "PEDIDO")
	rkmt.BeginTransaction
	rkmt.ExecNonQuery($"delete from PEDIDO where FECHA = '${fechaHoy}'"$)
	rkmt.ExecNonQuery($"insert into PEDIDO (${lasCols}, FECHA) select ${lasCols}, '${fechaHoy}' as FECHA from skmt1.PEDIDO where substr(pe_fecha, 1, 10) = '${fechaHoy}'"$)
	rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
	rkmt.EndTransaction
	Log(((DateTime.Now - inicio)/1000) & " segs")
End Sub

'Copia la tabla CAT_GUNAPRODS a rkmt.db en la tarjeta del celular.
Sub respalda_cat_gunaprod
	Private inicio As String = DateTime.Now
'	Log("Copiando CAT_GUNAPROD ...")
	Private lasCols As String = getTableColumnListName(skmt, "CAT_GUNAPROD")
	lasCols = lasCols.Replace(", CAT_GP_IMG", "") 'Quitamos la imagen del respaldo.
	rkmt.BeginTransaction
	rkmt.ExecNonQuery($"delete from CAT_GUNAPROD where FECHA = '${fechaHoy}'"$)
	rkmt.ExecNonQuery($"insert into CAT_GUNAPROD (${lasCols}, FECHA) select ${lasCols}, '${fechaHoy}' as FECHA from skmt1.CAT_GUNAPROD"$)
	rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
	rkmt.EndTransaction
	Log(((DateTime.Now - inicio)/1000) & " segs")
End Sub

'Copia la tabla CAT_DETALLE_PAQ a rkmt.db en la tarjeta del celular.
Sub respalda_cat_detalle_paq
	Private inicio As String = DateTime.Now
'	Log("Copiando CAT_DETALLES_PAQ ...")
	Private lasCols As String = getTableColumnListName(skmt, "CAT_DETALLES_PAQ")
	rkmt.BeginTransaction
	rkmt.ExecNonQuery($"delete from CAT_DETALLES_PAQ where fecha = '${fechaHoy}'"$)
	rkmt.ExecNonQuery($"insert into CAT_DETALLES_PAQ (${lasCols}, FECHA) select ${lasCols}, '${fechaHoy}' as FECHA from skmt1.CAT_DETALLES_PAQ"$)
	rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
	rkmt.EndTransaction
	Log(((DateTime.Now - inicio)/1000) & " segs")
End Sub

'Realiza un "vacuum" de la base de datos "rkmt".
Sub vacuum
	Log("Vacuum")
	rkmt.ExecNonQuery("vacuum;")
End Sub

'Agrega una columna a la tabla especificada.
'Hay que indicar el "tipo"  de la columna (TEXT, INTEGER, ETC)
'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO")
Sub agregaColumna(db As SQL, tabla As String, columna As String, tipo As String) 'ignore
	Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla
		Private c As Cursor = db.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$)
		c.Position = 0
		If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos
			db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
			Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$)
		End If
	Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch
		Try
			db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
			Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$)
		Catch
			Log(LastException)
		End Try
	End Try
End Sub

'Regresa los nombres y tipos de las columnas de una tabla dada.
Sub getTableColumnList(db As SQL, table As String) As String 'ignore
	Private l As String = ""
	If chkIfTableExists(db, table) Then
		Private c As Cursor = db.ExecQuery($"pragma table_info(${table})"$)
		If c.RowCount > 0 Then
			For i = 0 To c.RowCount - 1
				c.Position = i
				If l.Length = 0 Then
					l = $"${c.GetString("name")} ${c.GetString("type")}"$
				Else
					l = $"${l}, ${c.GetString("name")} ${c.GetString("type")}"$
				End If
			Next
		End If
	Else
		Return "No existe la tabla."
	End If
	c.Close
	Return l
End Sub

'Regresa solo los nombres de las columnas de una tabla dada.
Sub getTableColumnListName(db As SQL, table As String) As String 'ignore
	Private l As String = ""
	If chkIfTableExists(db, table) Then
		Private c As Cursor = db.ExecQuery($"pragma table_info(${table})"$)
		If c.RowCount > 0 Then
			For i = 0 To c.RowCount - 1
				c.Position = i
				If l.Length = 0 Then
					l = $"${c.GetString("name")}"$
				Else
					l = $"${l}, ${c.GetString("name")}"$
				End If
			Next
		End If
	Else
		Return "No existe la tabla."
	End If
	c.Close
	Return l
End Sub

'Revisa si una tabla dada existe en una base de datos dada, regresa true o false.
Sub chkIfTableExists(db As SQL, table As String) As Boolean 'ignore
	Private t As Boolean = False 'ignore
	Private c As Cursor = db.ExecQuery($"SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'"$)
	If c.RowCount > 0 Then t = True
	c.Close
	Return t
End Sub