- Commit inicial

This commit is contained in:
2024-04-19 04:00:57 -06:00
parent fc31da9c95
commit 4aa7b60f6a
36 changed files with 7227 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
**/Objects
**/AutoBackups

306
B4XMainPage.bas Normal file
View File

@@ -0,0 +1,306 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=9.85
@EndOfDesignText@
#Region Shared Files
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
'###########################################################################################################
'###################### PULL #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull
'###########################################################################################################
'###################### PUSH #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\
'###########################################################################################################
'###################### PUSH TORTOISE GIT #########################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2
'###########################################################################################################
#End Region
'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Public login As B4XMainPage
Public principal As C_Principal
Private i_logo As ImageView
Private p_configuracion As Panel
Private p_login As Panel
Private b_regresar As Button
Private b_entrar As Button
Private b_envioBD As Button
Private b_server As Button
Private ImageView4 As ImageView
Private ImageView2 As ImageView
Private Panel3 As Panel
Private Label1 As Label
Private i_conf As ImageView
Private b_cargaProductos As Button
Private ListView1 As ListView
Private E_SERVER As EditText
Dim reqManager As DBRequestManager
Private l_version As Label
Private p_botones As Panel
Private Label3 As Label
Private p_server As Panel
Dim atrasPresionado As Boolean = False
Private cb_impresionActiva As CheckBox
Private CheckBox1 As CheckBox
Private b_leyendaDescuento As Button
Private p_leyendaDescuento As Panel
Public Provider As FileProvider
End Sub
Public Sub Initialize
' B4XPages.GetManager.LogEvents = True
End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Subs.revisaBD
Root = Root1
Root.LoadLayout("login")
login.Initialize
B4XPages.AddPage("Login", login)
principal.Initialize
B4XPages.AddPage("Principal", principal)
p_login.Width = Root.Width
p_login.Height = Root.Height
Subs.agregaColumna("cat_gunaprod", "CAT_PT_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_PS_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_PS_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_GP_FECHA", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_GP_FECHA_MOD", "TEXT")
Starter.skmt.ExecNonQuery("delete from cuentaa")
Starter.skmt.ExecNonQuery("insert into cuentaa (cuenta) values ('123456')")
Starter.skmt.ExecNonQuery("delete from cat_almacen")
Starter.skmt.ExecNonQuery("insert into cat_almacen (id_almacen) values ('1')")
l_version.Text = Application.VersionName
p_configuracion.Height = Root.Height : p_configuracion.width = Root.width
reqManager.Initialize(Me, Starter.DBReqServer)
Subs.centraEtiqueta(Label3, p_configuracion.Width)
Subs.centraPanel(p_server, p_configuracion.Width)
Subs.centraPanel(p_botones, p_configuracion.Width)
i_logo.Left = (Root.Width / 2) - (i_logo.Width / 2)
Subs.centraPanel(Panel3, p_configuracion.Width)
' subs.panelVisible(p_configuracion, 0, 0)
Private x As Cursor = Starter.skmt.ExecQuery($"select * from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'DESCUENTO X EFECTIVO'"$)
If x.RowCount = 0 Then 'Insertamos el descuento para efectivo por default.
' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("DESCUENTO X EFECTIVO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("DESCUENTO X EFECTIVO","10"))
End If
End Sub
Sub B4XPage_Appear
Private z As ResultSet = Starter.skmt.ExecQuery2("select * from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As String ("IMPRESION_ACTIVA"))
Do While z.NextRow
Private ia As Boolean = False
If z.GetString("CAT_VA_VALOR") = 1 Then ia = True
Loop
cb_impresionActiva.Checked = ia
Starter.imprimirTicket = ia
End Sub
Private Sub B4XPage_CloseRequest As ResumableSub
' BACK key pressed
'Return True to close, False to cancel
Log("BACK")
If p_configuracion.Visible Then
p_configuracion.Visible = False
Return False
Else
If atrasPresionado Then ExitApplication 'Solo salimos de la aplicación si se presiona 'Atras' 2 veces seguidas.
ToastMessageShow("Presiona 'Atras' nuevamente para salir de la aplicación.", False)
atrasPresionado = True
End If
Return False
End Sub
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
Private Sub i_logo_Click
End Sub
Private Sub b_regresar_Click
p_configuracion.Visible = False
Subs.panelVisible(p_login, 0, 0)
End Sub
Private Sub b_entrar_Click
B4XPages.ShowPage("principal")
End Sub
Private Sub b_server_Click
If E_SERVER.Text <> "" Then
Starter.DBReqServer = E_SERVER.text
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER", Starter.DBReqServer))
p_configuracion.Visible = False
reqManager.Initialize(Me, Starter.DBReqServer)
Starter.reqManager.Initialize(Me, Starter.DBReqServer)
' Log(E_SERVER.text)
Else
ToastMessageShow("Por favor ingrese la direccion del servidor", True)
End If
End Sub
'Enviamos la base de datos por correo o Whatsapp.
Private Sub b_envioBD_Click
'Hay que agregar las siguientes lineas al manifiesto:
'AddApplicationText(<Provider android:name="android.support.v4.content.FileProvider"
' android:authorities="$PACKAGE$.provider" android:exported="false"
' android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
' </Provider>)
'CreateResource(xml, provider_paths,
' <paths><external-files-path name="name" path="" /><files-path name="name" path="" /><files-path name="name" path="shared" /></paths>
')
Dim Provider As FileProvider
Provider.Initialize
Dim FileName As String = "kmt.db"
'copy the shared file to the shared folder
Log("xxxxxx:"&Provider.SharedFolder)
Sleep(1000)
File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName)
Dim email As Email
email.To.Add("soporte@keymonsoft.com")
email.Subject = "Envio Base de datos Mariana Censos"
email.Attachments.Add(Provider.GetFileUri(FileName))
' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment
Dim in As Intent = email.GetIntent
in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION
StartActivity(in)
End Sub
Private Sub i_conf_Click
ListView1.Clear
Dim Label1 As Label
Label1 = ListView1.SingleLineLayout.Label
Label1.TextSize = 20
Label1.TextColor = Colors.Black
' If user.Text = "KMTS1" Then ListView1.AddSingleLine("http://10.0.0.205:1781")
ListView1.AddSingleLine("http://keymon.lat:1782")
p_configuracion.Width = Root.Width
p_configuracion.Height = Root.Height
p_configuracion.BringToFront
Subs.panelVisible(p_configuracion, 0, 0)
End Sub
Private Sub b_cargaProductos_Click
Log(Starter.DBReqServer)
' Dim cmd As DBCommand
' cmd.Initialize
' cmd.Name = "select_cat_gunaprod_GV2"
' cmd.Parameters = Array As Object(1)
' B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "gunaprod")
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "selectProds_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectProds")
cmd.Initialize
cmd.Name = "selectMesas_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectMesas")
cmd.Initialize
cmd.Name = "selectMeseros_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectMeseros")
End Sub
Private Sub ListView1_ItemClick (Position As Int, Value As Object)
Starter.DBReqServer = Value
E_SERVER.Text = Value
' Log(Starter.DBReqServer)
End Sub
Sub JobDone(Job As HttpJob)
Log("JOBDONE MAINPAGE")
If Job.Tag.As(String).StartsWith("_KMS_") Then Job.tag = Job.Tag.As(String).SubString(16)
If Job.Success = False Then
ToastMessageShow("Error: " & Job.ErrorMessage, True)
Else
If Starter.Logger Then LogColor("JobDone: '" & Starter.reqManager.HandleJob(Job).tag & "' - Registros: " & Starter.reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
If Job.JobName = "DBRequest" Then
Dim result As DBResult = Starter.reqManager.HandleJob(Job)
If result.Tag = "selectProds" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from cat_gunaprod")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("CAT_GP_ID"))}, NOM: ${records(result.Columns.Get("CAT_GP_NOMBRE"))}"$)
Dim CAT_GP_ID As String = records(result.Columns.Get("CAT_GP_ID"))
Dim CAT_GP_NOMBRE As String = records(result.Columns.Get("CAT_GP_NOMBRE"))
Dim CAT_GP_PRECIO As String = records(result.Columns.Get("CAT_GP_PRECIO"))
Dim CAT_GP_ALMACEN As String = 10000 'records(result.Columns.Get("CAT_GP_ALMACEN"))
Dim CAT_GP_IMG() As Byte = records(result.Columns.Get("CAT_GP_IMG"))
Dim CAT_GP_FECHA As String = records(result.Columns.Get("CAT_GP_FECHA"))
Dim CAT_GP_FECHA_MOD As String = records(result.Columns.Get("CAT_GP_FECHA_MOD"))
Dim CAT_GP_CLASIF As String = records(result.Columns.Get("CAT_GP_CLASIF"))
Dim CAT_GP_TIPO As String = records(result.Columns.Get("CAT_GP_TIPO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD,CAT_GP_CLASIF,CAT_GP_TIPO))
Next
For v = 1 To 20 'Agregamos productos varios (editables)
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object ($"AVAR${NumberFormat2(v, 2, 0, 0, False)}"$,$"Alimentos Varios ${NumberFormat2(v, 2, 0, 0, False)}"$,"1","10000",Null,"2024-02-04 17:00:00","2024-02-04 17:00:00","VARIOS","ALIMENTOS"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object ($"VVAR${NumberFormat2(v, 2, 0, 0, False)}"$,$"Bebidas Varias ${NumberFormat2(v, 2, 0, 0, False)}"$,"1","10000",Null,"2024-02-04 17:00:00","2024-02-04 17:00:00","VARIOS","VINOS Y LICORES"))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
End If
If result.Tag = "selectMesas" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from CAT_MESAS")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("M_ID"))}, NOM: ${records(result.Columns.Get("M_NOMBRE"))}"$)
Dim M_ID As String = records(result.Columns.Get("M_ID"))
Dim M_NOMBRE As String = records(result.Columns.Get("M_NOMBRE"))
Dim M_NUMERO As String = records(result.Columns.Get("M_NUMERO"))
Dim M_ZONA As String = records(result.Columns.Get("M_ZONA"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_MESAS(M_ID, M_NUMERO, M_NOMBRE, M_ZONA) VALUES (?,?,?,?)", Array As Object (M_ID, M_NUMERO, M_NOMBRE, M_ZONA))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
End If
If result.Tag = "selectMeseros" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from CAT_MESEROS")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("MS_ID"))}, NOM: ${records(result.Columns.Get("MS_NOMBRE"))}"$)
Dim MS_ID As String = records(result.Columns.Get("MS_ID"))
Dim MS_NOMBRE As String = records(result.Columns.Get("MS_NOMBRE"))
Dim MS_MESAS_ASIGNADAS As String = records(result.Columns.Get("MS_MESAS_ASIGNADAS"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_MESEROS(MS_ID, MS_NOMBRE, MS_MESAS_ASIGNADAS) VALUES (?,?,?)", Array As Object (MS_ID, MS_NOMBRE, MS_MESAS_ASIGNADAS))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
If B4XPages.MainPage.principal.cb_mesero.IsInitialized Then B4XPages.MainPage.principal.cb_mesero.SetItems(Subs.traeMeserosLista)
End If
End If
End If
ToastMessageShow("¡Información cargada!", False)
Job.Release
End Sub
Private Sub b_entrar_LongClick
' Dim a As Int = "a"
' Subs.alineaDerecha(NumberFormat2(1450, 1, 2, 2, True), 30, ".")
End Sub
Private Sub user_TextChanged (Old As String, New As String)
If New.Trim = "KMTS1" Then i_conf.Visible = True Else i_conf.Visible = False
End Sub
Private Sub cb_impresionActiva_CheckedChange(Checked As Boolean)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("IMPRESION_ACTIVA"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("IMPRESION_ACTIVA", Checked))
End Sub
Private Sub b_leyendaDescuento_Click
End Sub

344
DBRequestManager.bas Normal file
View File

@@ -0,0 +1,344 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=6.8
@EndOfDesignText@
''Class module
Sub Class_Globals
Private mTarget As Object
Type DBResult (Tag As Object, Columns As Map, Rows As List)
Type DBCommand (Name As String, Parameters() As Object)
Private link As String
Private bc As ByteConverter
Private T_NULL = 0, T_STRING = 1, T_SHORT = 2, T_INT = 3, T_LONG = 4, T_FLOAT = 5 _
,T_DOUBLE = 6, T_BOOLEAN = 7, T_BLOB = 8 As Byte
Private VERSION As Float = 0.9
Private tempArray(1) As Object
Dim jobTagAnterior As String = "" 'Mod por CHV - 211109
Dim reqsList, timesList, errorList As List
Dim inicioRequest As Long 'ignore
Dim inicioJobDone As Long 'ignore
Dim inicioRequestMap, inicioJobDoneMap As Map
End Sub
'Target - The module that handles JobDone (usually Me).
'ConnectorLink - URL of the Java server.
Public Sub Initialize (Target As Object, ConnectorLink As String)
mTarget = Target
link = ConnectorLink
End Sub
'Sends a query request.
'Command - Query name and parameters.
'Limit - Maximum rows to return or 0 for no limit.
'Tag - An object that will be returned in the result.
Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object)
Dim j As HttpJob
Dim ms As OutputStream
Dim out2 As OutputStream = StartJob(j, ms, Tag)
' If reqsList.IsInitialized Then reqsList.Add(Tag)
' If timesList.IsInitialized Then timesList.Add(DateTime.now)
WriteObject(Command.Name, out2)
WriteInt(Limit, out2)
WriteList(Command.Parameters, out2)
out2.Close
j.PostBytes(link & "?method=query", ms.ToBytesArray)
End Sub
'Executes a batch of (non-select) commands.
'ListOfCommands - List of the commands that will be executes.
'Tag - An object that will be returned in the result.
Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object)
Dim j As HttpJob
Dim ms As OutputStream
Dim out2 As OutputStream = StartJob(j, ms, Tag)
WriteInt(ListOfCommands.Size, out2)
For Each Command As DBCommand In ListOfCommands
WriteObject(Command.Name, out2)
WriteList(Command.Parameters, out2)
Next
out2.Close
j.PostBytes(link & "?method=batch", ms.ToBytesArray)
End Sub
'Similar to ExecuteBatch. Sends a single command.
Public Sub ExecuteCommand(Command As DBCommand, Tag As Object)
' If reqsList.IsInitialized Then reqsList.Add(Tag)
' If timesList.IsInitialized Then timesList.Add(DateTime.now)
ExecuteBatch(Array As DBCommand(Command), Tag)
End Sub
Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream
' inicioRequest = DateTime.now
If reqsList.IsInitialized Then reqsList.Add(Tag)
If timesList.IsInitialized Then timesList.Add(DateTime.now)
j.Initialize("DBRequest", mTarget)
j.Tag = Tag
MemoryStream.InitializeToBytesArray(0)
Dim compress As CompressedStreams
Dim out As OutputStream = compress.WrapOutputStream(MemoryStream, "gzip")
WriteObject(VERSION, out)
Return out
End Sub
Private Sub WriteList(Parameters As List, out As OutputStream)
Dim data() As Byte
If Parameters = Null Or Parameters.IsInitialized = False Then
Dim Parameters As List
Parameters.Initialize
End If
data = bc.IntsToBytes(Array As Int(Parameters.Size))
out.WriteBytes(data, 0, data.Length)
For Each o As Object In Parameters
WriteObject(o, out)
Next
End Sub
Private Sub WriteObject(o As Object, out As OutputStream)
Dim data() As Byte
tempArray(0) = o
If tempArray(0) = Null Then
out.WriteBytes(Array As Byte(T_NULL), 0, 1)
Else If tempArray(0) Is Short Then
out.WriteBytes(Array As Byte(T_SHORT), 0, 1)
data = bc.ShortsToBytes(Array As Short(o))
Else If tempArray(0) Is Int Then
out.WriteBytes(Array As Byte(T_INT), 0, 1)
data = bc.IntsToBytes(Array As Int(o))
Else If tempArray(0) Is Float Then
out.WriteBytes(Array As Byte(T_FLOAT), 0, 1)
data = bc.FloatsToBytes(Array As Float(o))
Else If tempArray(0) Is Double Then
out.WriteBytes(Array As Byte(T_DOUBLE), 0, 1)
data = bc.DoublesToBytes(Array As Double(o))
Else If tempArray(0) Is Long Then
out.WriteBytes(Array As Byte(T_LONG), 0, 1)
data = bc.LongsToBytes(Array As Long(o))
Else If tempArray(0) Is Boolean Then
out.WriteBytes(Array As Byte(T_BOOLEAN), 0, 1)
Dim b As Boolean = 0
Dim data(1) As Byte
If b Then data(0) = 1 Else data(0) = 0
Else If GetType(tempArray(0)) = "[B" Then
data = o
out.WriteBytes(Array As Byte(T_BLOB), 0, 1)
WriteInt(data.Length, out)
Else 'If o Is String Then (treat all other values as string)
out.WriteBytes(Array As Byte(T_STRING), 0, 1)
data = bc.StringToBytes(o, "UTF8")
WriteInt(data.Length, out)
End If
If data.Length > 0 Then out.WriteBytes(data, 0, data.Length)
End Sub
Private Sub ReadObject(In As InputStream) As Object
Dim data(1) As Byte
In.ReadBytes(data, 0, 1)
Select data(0)
Case T_NULL
Return Null
Case T_SHORT
Dim data(2) As Byte
Return bc.ShortsFromBytes(ReadBytesFully(In, data, data.Length))(0)
Case T_INT
Dim data(4) As Byte
Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0)
Case T_LONG
Dim data(8) As Byte
Return bc.LongsFromBytes(ReadBytesFully(In, data, data.Length))(0)
Case T_FLOAT
Dim data(4) As Byte
Return bc.FloatsFromBytes(ReadBytesFully(In, data, data.Length))(0)
Case T_DOUBLE
Dim data(8) As Byte
Return bc.DoublesFromBytes(ReadBytesFully(In, data, data.Length))(0)
Case T_BOOLEAN
Dim b As Byte = ReadByte(In)
Return b = 1
Case T_BLOB
Dim len As Int = ReadInt(In)
Dim data(len) As Byte
Return ReadBytesFully(In, data, data.Length)
Case Else
Dim len As Int = ReadInt(In)
Dim data(len) As Byte
ReadBytesFully(In, data, data.Length)
Return BytesToString(data, 0, data.Length, "UTF8")
End Select
End Sub
Private Sub ReadBytesFully(In As InputStream, Data() As Byte, Len As Int) As Byte()
Dim count = 0, read As Int
Do While count < Len And read > -1
read = In.ReadBytes(Data, count, Len - count)
count = count + read
Loop
Return Data
End Sub
Private Sub WriteInt(i As Int, out As OutputStream)
Dim data() As Byte
data = bc.IntsToBytes(Array As Int(i))
out.WriteBytes(data, 0, data.Length)
End Sub
Private Sub ReadInt(In As InputStream) As Int
Dim data(4) As Byte
Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0)
End Sub
Private Sub ReadByte(In As InputStream) As Byte
Dim data(1) As Byte
In.ReadBytes(data, 0, 1)
Return data(0)
End Sub
'Handles the Job result and returns a DBResult.
Public Sub HandleJob(Job As HttpJob) As DBResult
If jobTagAnterior <> Job.Tag Then
' inicioJobDone = DateTime.Now 'ignore
If inicioJobDoneMap.IsInitialized Then inicioJobDoneMap.Put(Job.Tag, DateTime.Now)
' tiempos.Put(Job.taskId, CreateMap("inicioJobDone":inicioJobDone))
' Log(tiempos)
' Log("############# " & Job.taskId)
End If
Dim In As InputStream = Job.GetInputStream
Dim cs As CompressedStreams
In = cs.WrapInputStream(In, "gzip")
Dim serverVersion As Float = ReadObject(In) 'ignore
Dim method As String = ReadObject(In)
Dim table As DBResult
table.Initialize
table.Columns.Initialize
table.rows.Initialize
table.Tag = Job.Tag
If method = "query" Then
Dim numberOfColumns As Int = ReadInt(In)
For i = 0 To numberOfColumns - 1
table.Columns.Put(ReadObject(In), i)
Next
Do While ReadByte(In) = 1
Dim rowObjects(numberOfColumns) As Object
table.rows.Add(rowObjects)
For col = 0 To numberOfColumns - 1
Dim o As Object = ReadObject(In)
rowObjects(col) = o
Next
Loop
Else If method = "batch" Then
table.Columns.Put("AffectedRows", 0)
Dim rows As Int = ReadInt(In)
For i = 0 To rows - 1
table.rows.Add(Array As Object(ReadInt(In)))
Next
End If
In.Close
' Log("HandleJob: " & (DateTime.Now - start))'Comentado por CHV - 211112
If jobTagAnterior <> table.Tag Then
LogColor("HandleJob: '"&table.Tag&"'" & " - Registros: " & table.Rows.Size, Colors.RGB(115, 0, 140)) 'Mod por CHV - 211109
End If
jobTagAnterior = table.Tag 'Mod por CHV - 211109
Return table
End Sub
'Reads a file and returns the file as a bytes array.
Public Sub FileToBytes(Dir As String, FileName As String) As Byte()
Dim out As OutputStream
out.InitializeToBytesArray(0)
Dim In As InputStream = File.OpenInput(Dir, FileName)
File.Copy2(In, out)
out.Close
Return out.ToBytesArray
End Sub
'Converts an image to a bytes array (for BLOB fields).
Public Sub ImageToBytes(Image As Bitmap) As Byte()
Dim out As OutputStream
out.InitializeToBytesArray(0)
Image.WriteToStream(out, 100, "JPEG")
out.Close
Return out.ToBytesArray
End Sub
'Converts a bytes array to an image (for BLOB fields).
Public Sub BytesToImage(bytes() As Byte) As Bitmap
Dim In As InputStream
In.InitializeFromBytesArray(bytes, 0, bytes.Length)
Dim bmp As Bitmap
bmp.Initialize2(In)
Return bmp
End Sub
'Prints the table to the logs.
Public Sub PrintTable(Table As DBResult)
Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size)
Dim sb As StringBuilder
sb.Initialize
For Each col In Table.Columns.Keys
sb.Append(col).Append(TAB)
Next
Log(sb.ToString)
For Each row() As Object In Table.Rows
Dim sb As StringBuilder
sb.Initialize
For Each record As Object In row
sb.Append(record).Append(TAB)
Next
Log(sb.ToString)
Next
End Sub
Sub requestTimes(tag As String) As Map 'ignore
Private times As Map
times.Initialize
' Log("###### " & tag)
' Log(reqsList.IsInitialized)
If reqsList.IsInitialized Then
' Log(reqsList)
' Private pos As Int = reqsList.IndexOf(tag)
If inicioRequestMap.ContainsKey(tag) Then
inicioRequest = inicioRequestMap.Get(tag)
' Log(">>>>>>> From inicioRequestMap")
End If
If inicioJobDoneMap.ContainsKey(tag) Then
inicioJobDone = inicioJobDoneMap.Get(tag)
' Log(">>>>>>> From inicioJobDoneMap")
End If
End If
' Log($"${inicioJobDone} - ${inicioRequest}"$)
Private requestTime As String = NumberFormat2(((inicioJobDone - inicioRequest) / 1000),1,5,0,False)
Private JobDoneTime As String = NumberFormat2(((DateTime.Now - inicioJobDone) / 1000),1,5,0,False)
times.Put("requestTime", requestTime)
times.Put("jobDoneTime", JobDoneTime)
times.Put("totalTime", NumberFormat2((JobDoneTime + requestTime),1,5,0,False))
Return times
End Sub
'Initializes request tracking
Sub trackInit 'ignore
Log(">>>>>>>>> TRACKINIT ")
reqsList.Initialize
timesList.Initialize
errorList.Initialize
inicioRequestMap.Initialize
inicioJobDoneMap.Initialize
End Sub
Sub trackNext(job As HttpJob)
If reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos.
Private quitamos As String = ""
If reqsList.IndexOf(job.tag) <> -1 Then
Private pos As Int = reqsList.IndexOf(job.tag)
If pos <> -1 Then
inicioRequestMap.Put(job.Tag, timesList.Get(pos))
reqsList.RemoveAt(pos)
timesList.RemoveAt(pos)
End If
quitamos = $"Quitamos ${job.tag} - "$
End If
LogColor(">>>>>> Requests: " & reqsList.Size & " - " & quitamos & reqsList, Colors.Blue)
LogColor(">>>>>> inicioRequestMap:" & inicioRequestMap.Size & " - " & inicioRequestMap, Colors.Magenta)
End If
End Sub

1148
EscPosPrinter.bas Normal file

File diff suppressed because it is too large Load Diff

BIN
Files/candado.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
Files/durakelo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
Files/engrane.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
Files/engranes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
Files/errormanager.bal Normal file

Binary file not shown.

BIN
Files/formapago.bal Normal file

Binary file not shown.

BIN
Files/kmt.db Normal file

Binary file not shown.

BIN
Files/layout.bal Normal file

Binary file not shown.

BIN
Files/login.bal Normal file

Binary file not shown.

BIN
Files/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
Files/logolanter.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
Files/logolanter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
Files/logolanter2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
Files/logolanternegro.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
Files/logolanternegro.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
Files/logolanternegro2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
Files/mainpage.bal Normal file

Binary file not shown.

BIN
Files/mesasitem.bal Normal file

Binary file not shown.

BIN
Files/principal.bal Normal file

Binary file not shown.

BIN
Files/proditem.bal Normal file

Binary file not shown.

BIN
Files/proditemcarrito.bal Normal file

Binary file not shown.

BIN
Files/resumencont.bal Normal file

Binary file not shown.

BIN
Files/usuario.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

354
Lanterna2.b4a Normal file
View File

@@ -0,0 +1,354 @@
Build1=Default,lanterna2.keymon.lat,HU2_PUBLIC
File1=candado.png
File10=logoLanter2.bmp
File11=logoLanterNegro.bmp
File12=logoLanterNegro.png
File13=logoLanterNegro2.bmp
File14=principal.bal
File15=proditem.bal
File16=usuario.png
File2=durakelo.png
File3=engrane.png
File4=engranes.png
File5=Layout.bal
File6=login.bal
File7=logo.png
File8=logoLanter.png
File9=logoLanter_192x192.png
FileGroup1=Default Group
FileGroup10=Default Group
FileGroup11=Default Group
FileGroup12=Default Group
FileGroup13=Default Group
FileGroup14=Default Group
FileGroup15=Default Group
FileGroup16=Default Group
FileGroup2=Default Group
FileGroup3=Default Group
FileGroup4=Default Group
FileGroup5=Default Group
FileGroup6=Default Group
FileGroup7=Default Group
FileGroup8=Default Group
FileGroup9=Default Group
Group=Default Group
Library1=appupdating
Library10=randomaccessfile
Library11=runtimepermissions
Library12=scrollview2d
Library13=serial
Library14=sql
Library15=stringutils
Library16=wobblemenu
Library17=xui
Library18=b4xtable
Library2=byteconverter
Library3=compressstrings
Library4=core
Library5=fileprovider
Library6=javaobject
Library7=json
Library8=okhttputils2
Library9=preoptimizedclv
ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33"/>~\n~<supports-screens android:largeScreens="true" ~\n~ android:normalScreens="true" ~\n~ android:smallScreens="true" ~\n~ android:anyDensity="true"/>)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'End of default text.~\n~~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddPermission(android.permission.BLUETOOTH_ADVERTISE)~\n~AddPermission(android.permission.BLUETOOTH_CONNECT)~\n~AddPermission(android.permission.BLUETOOTH_SCAN)~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~SetApplicationAttribute(android:exported, "true")~\n~~\n~AddApplicationText(<provider android:name="android.support.v4.content.FileProvider"~\n~ android:authorities="$PACKAGE$.provider" android:exported="false"~\n~ android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>~\n~ </provider>)~\n~CreateResource(xml, provider_paths,~\n~ <paths><external-files-path name="name" path="" /><files-path name="name" path="" /><files-path name="name" path="shared" /></paths>~\n~)
Module1=DBRequestManager
Module2=errorManager
Module3=EscPosPrinter
Module4=numeroATexto
Module5=Principal
Module6=Starter
Module7=Subs
NumberOfFiles=16
NumberOfLibraries=18
NumberOfModules=7
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Lanterna
#VersionCode: 1
#VersionName: 4.04.18
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: landscape
#CanInstallToExternalStorage: False
'###########################################################################################################
'###################### PULL #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull
'###########################################################################################################
'###################### PUSH #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\
'###########################################################################################################
'###################### PUSH TORTOISE GIT #########################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../"&Args=/closeonend:2
'###########################################################################################################
#End Region
#Region Activity Attributes
#FullScreen: False
#IncludeTitle: False
#End Region
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Private xui As XUI
Private xui As XUI
Public Provider As FileProvider
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
Private i_logo As ImageView
Private p_configuracion As Panel
Private p_login As Panel
Private b_regresar As Button
Private b_entrar As Button
Private b_envioBD As Button
Private b_server As Button
Private ImageView4 As ImageView
Private ImageView2 As ImageView
Private Panel3 As Panel
Private Label1 As Label
Private i_conf As ImageView
Private b_cargaProductos As Button
Private ListView1 As ListView
Private E_SERVER As EditText
Dim reqManager As DBRequestManager
Private l_version As Label
Private p_botones As Panel
Private Label3 As Label
Private p_server As Panel
Private cb_impresionActiva As CheckBox
Private CheckBox1 As CheckBox
Private b_leyendaDescuento As Button
Private p_leyendaDescuento As Panel
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("login")
Subs.revisaBD
p_login.Width = Activity.Width
p_login.Height = Activity.Height
Subs.agregaColumna("cat_gunaprod", "CAT_PT_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_PS_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_PS_DESC", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_GP_FECHA", "TEXT")
Subs.agregaColumna("cat_gunaprod", "CAT_GP_FECHA_MOD", "TEXT")
Starter.skmt.ExecNonQuery("delete from cuentaa")
Starter.skmt.ExecNonQuery("insert into cuentaa (cuenta) values ('123456')")
Starter.skmt.ExecNonQuery("delete from cat_almacen")
Starter.skmt.ExecNonQuery("insert into cat_almacen (id_almacen) values ('1')")
l_version.Text = Application.VersionName
p_configuracion.Height = Activity.Height : p_configuracion.width = Activity.width
reqManager.Initialize(Me, Starter.DBReqServer)
Subs.centraEtiqueta(Label3, p_configuracion.Width)
Subs.centraPanel(p_server, p_configuracion.Width)
Subs.centraPanel(p_botones, p_configuracion.Width)
i_logo.Left = (Activity.Width / 2) - (i_logo.Width / 2)
Subs.centraPanel(Panel3, p_configuracion.Width)
' subs.panelVisible(p_configuracion, 0, 0)
Private x As Cursor = Starter.skmt.ExecQuery($"select * from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'DESCUENTO X EFECTIVO'"$)
If x.RowCount = 0 Then 'Insertamos el descuento para efectivo por default.
' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("DESCUENTO X EFECTIVO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("DESCUENTO X EFECTIVO","10"))
End If
End Sub
Sub Activity_Resume
Private z As ResultSet = Starter.skmt.ExecQuery2("select * from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As String ("IMPRESION_ACTIVA"))
Do While z.NextRow
Private ia As Boolean = False
If z.GetString("CAT_VA_VALOR") = 1 Then ia = True
Loop
cb_impresionActiva.Checked = ia
Starter.imprimirTicket = ia
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Private Sub i_logo_Click
End Sub
Private Sub b_regresar_Click
p_configuracion.Visible = False
Subs.panelVisible(p_login, 0, 0)
End Sub
Private Sub b_entrar_Click
StartActivity(Principal)
End Sub
Private Sub b_server_Click
If E_SERVER.Text <> "" Then
Starter.DBReqServer = E_SERVER.text
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER", Starter.DBReqServer))
p_configuracion.Visible = False
reqManager.Initialize(Me, Starter.DBReqServer)
Starter.reqManager.Initialize(Me, Starter.DBReqServer)
' Log(E_SERVER.text)
Else
ToastMessageShow("Por favor ingrese la direccion del servidor", True)
End If
End Sub
'Enviamos la base de datos por correo o Whatsapp.
Private Sub b_envioBD_Click
'Hay que agregar las siguientes lineas al manifiesto:
'AddApplicationText(<Provider android:name="android.support.v4.content.FileProvider"
' android:authorities="$PACKAGE$.provider" android:exported="false"
' android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
' </Provider>)
'CreateResource(xml, provider_paths,
' <paths><external-files-path name="name" path="" /><files-path name="name" path="" /><files-path name="name" path="shared" /></paths>
')
Dim Provider As FileProvider
Provider.Initialize
Dim FileName As String = "kmt.db"
'copy the shared file to the shared folder
Log("xxxxxx:"&Provider.SharedFolder)
Sleep(1000)
File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName)
Dim email As Email
email.To.Add("soporte@keymonsoft.com")
email.Subject = "Envio Base de datos Mariana Censos"
email.Attachments.Add(Provider.GetFileUri(FileName))
' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment
Dim in As Intent = email.GetIntent
in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION
StartActivity(in)
End Sub
Private Sub i_conf_Click
ListView1.Clear
Dim Label1 As Label
Label1 = ListView1.SingleLineLayout.Label
Label1.TextSize = 20
Label1.TextColor = Colors.Black
' If user.Text = "KMTS1" Then ListView1.AddSingleLine("http://10.0.0.205:1781")
ListView1.AddSingleLine("http://keymon.lat:1782")
p_configuracion.Width = Activity.Width
p_configuracion.Height = Activity.Height
p_configuracion.BringToFront
Subs.panelVisible(p_configuracion, 0, 0)
End Sub
Private Sub b_cargaProductos_Click
Log(Starter.DBReqServer)
' Dim cmd As DBCommand
' cmd.Initialize
' cmd.Name = "select_cat_gunaprod_GV2"
' cmd.Parameters = Array As Object(1)
' B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "gunaprod")
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "selectProds_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectProds")
cmd.Initialize
cmd.Name = "selectMesas_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectMesas")
cmd.Initialize
cmd.Name = "selectMeseros_Lanter"
reqManager.ExecuteQuery(cmd , 0, "selectMeseros")
End Sub
Private Sub ListView1_ItemClick (Position As Int, Value As Object)
Starter.DBReqServer = Value
E_SERVER.Text = Value
' Log(Starter.DBReqServer)
End Sub
Sub JobDone(Job As HttpJob)
Log("JOBDONE MAINPAGE")
If Job.Tag.As(String).StartsWith("_KMS_") Then Job.tag = Job.Tag.As(String).SubString(16)
If Job.Success = False Then
ToastMessageShow("Error: " & Job.ErrorMessage, True)
Else
If Starter.Logger Then LogColor("JobDone: '" & Starter.reqManager.HandleJob(Job).tag & "' - Registros: " & Starter.reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
If Job.JobName = "DBRequest" Then
Dim result As DBResult = Starter.reqManager.HandleJob(Job)
If result.Tag = "selectProds" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from cat_gunaprod")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("CAT_GP_ID"))}, NOM: ${records(result.Columns.Get("CAT_GP_NOMBRE"))}"$)
Dim CAT_GP_ID As String = records(result.Columns.Get("CAT_GP_ID"))
Dim CAT_GP_NOMBRE As String = records(result.Columns.Get("CAT_GP_NOMBRE"))
Dim CAT_GP_PRECIO As String = records(result.Columns.Get("CAT_GP_PRECIO"))
Dim CAT_GP_ALMACEN As String = 10000 'records(result.Columns.Get("CAT_GP_ALMACEN"))
Dim CAT_GP_IMG() As Byte = records(result.Columns.Get("CAT_GP_IMG"))
Dim CAT_GP_FECHA As String = records(result.Columns.Get("CAT_GP_FECHA"))
Dim CAT_GP_FECHA_MOD As String = records(result.Columns.Get("CAT_GP_FECHA_MOD"))
Dim CAT_GP_CLASIF As String = records(result.Columns.Get("CAT_GP_CLASIF"))
Dim CAT_GP_TIPO As String = records(result.Columns.Get("CAT_GP_TIPO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD,CAT_GP_CLASIF,CAT_GP_TIPO))
Next
For v = 1 To 20 'Agregamos productos varios (editables)
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object ($"AVAR${NumberFormat2(v, 2, 0, 0, False)}"$,$"Alimentos Varios ${NumberFormat2(v, 2, 0, 0, False)}"$,"1","10000",Null,"2024-02-04 17:00:00","2024-02-04 17:00:00","VARIOS","ALIMENTOS"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_PRECIO,CAT_GP_ALMACEN,CAT_GP_IMG,CAT_GP_FECHA,CAT_GP_FECHA_MOD, CAT_GP_CLASIF, CAT_GP_TIPO) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object ($"VVAR${NumberFormat2(v, 2, 0, 0, False)}"$,$"Bebidas Varias ${NumberFormat2(v, 2, 0, 0, False)}"$,"1","10000",Null,"2024-02-04 17:00:00","2024-02-04 17:00:00","VARIOS","VINOS Y LICORES"))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
End If
If result.Tag = "selectMesas" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from CAT_MESAS")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("M_ID"))}, NOM: ${records(result.Columns.Get("M_NOMBRE"))}"$)
Dim M_ID As String = records(result.Columns.Get("M_ID"))
Dim M_NOMBRE As String = records(result.Columns.Get("M_NOMBRE"))
Dim M_NUMERO As String = records(result.Columns.Get("M_NUMERO"))
Dim M_ZONA As String = records(result.Columns.Get("M_ZONA"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_MESAS(M_ID, M_NUMERO, M_NOMBRE, M_ZONA) VALUES (?,?,?,?)", Array As Object (M_ID, M_NUMERO, M_NOMBRE, M_ZONA))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
End If
If result.Tag = "selectMeseros" Then 'query tag
' If Starter.Logger Then Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery("delete from CAT_MESEROS")
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
' Log($"ID: ${records(result.Columns.Get("MS_ID"))}, NOM: ${records(result.Columns.Get("MS_NOMBRE"))}"$)
Dim MS_ID As String = records(result.Columns.Get("MS_ID"))
Dim MS_NOMBRE As String = records(result.Columns.Get("MS_NOMBRE"))
Dim MS_MESAS_ASIGNADAS As String = records(result.Columns.Get("MS_MESAS_ASIGNADAS"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_MESEROS(MS_ID, MS_NOMBRE, MS_MESAS_ASIGNADAS) VALUES (?,?,?)", Array As Object (MS_ID, MS_NOMBRE, MS_MESAS_ASIGNADAS))
Next
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
' If Principal.cb_mesero.IsInitialized Then Principal.cb_mesero.SetItems(Subs.traeMeserosLista)
Starter.cargaMeseros = true
End If
End If
End If
ToastMessageShow("¡Información cargada!", False)
Job.Release
End Sub
Private Sub b_entrar_LongClick
' Dim a As Int = "a"
' Subs.alineaDerecha(NumberFormat2(1450, 1, 2, 2, True), 30, ".")
End Sub
Private Sub user_TextChanged (Old As String, New As String)
If New.Trim = "KMTS1" Then i_conf.Visible = True Else i_conf.Visible = False
End Sub
Private Sub cb_impresionActiva_CheckedChange(Checked As Boolean)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("IMPRESION_ACTIVA"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("IMPRESION_ACTIVA", Checked))
End Sub
Private Sub b_leyendaDescuento_Click
End Sub

27
Lanterna2.b4a.meta Normal file
View File

@@ -0,0 +1,27 @@
ModuleBookmarks0=
ModuleBookmarks1=
ModuleBookmarks2=
ModuleBookmarks3=
ModuleBookmarks4=
ModuleBookmarks5=
ModuleBookmarks6=
ModuleBookmarks7=
ModuleBreakpoints0=
ModuleBreakpoints1=
ModuleBreakpoints2=
ModuleBreakpoints3=
ModuleBreakpoints4=
ModuleBreakpoints5=
ModuleBreakpoints6=
ModuleBreakpoints7=
ModuleClosedNodes0=
ModuleClosedNodes1=
ModuleClosedNodes2=
ModuleClosedNodes3=
ModuleClosedNodes4=
ModuleClosedNodes5=2
ModuleClosedNodes6=
ModuleClosedNodes7=
NavigationStack=Main,Globals,49,0,Principal,b_mesaCerrar_Click,1195,0,Principal,l_prodX_Click,2803,0,Principal,LlenaProdsLL,627,0,Principal,clv_prods_ll_VisibleRangeChanged,660,0,Principal,clv_orden_VisibleRangeChanged,2831,6,Principal,LlenaOrden,2871,0,Principal,l_selAlimentos_Click,2969,0,Principal,actualizaProductos,2912,6,Principal,l_prods_Click,281,1
SelectedBuild=0
VisibleModules=6,7,5

3038
Principal.bas Normal file

File diff suppressed because it is too large Load Diff

129
Starter.bas Normal file
View File

@@ -0,0 +1,129 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=9.9
@EndOfDesignText@
#Region Service Attributes
#StartAtBoot: False
#ExcludeFromLibrary: True
#End Region
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Public rp As RuntimePermissions
Dim reqManager As DBRequestManager
Dim skmt As SQL
Dim Logger As Boolean = False
Dim DBReqServer As String = "http://keymon.lat:1782"
Dim server, ruta As String
'Para los Logs
Dim logs As StringBuilder
Private logcat As LogCat
Dim Logger As Boolean
Dim rutav As String = ""
Dim tipov As String = "VENTA"
Dim ticketActual, mesaActual, meseroActual, comensalesActuales, totalActual, mac_impresora As String
Dim formasDePago As Int = 1
Dim imprimirTicket As Boolean = False
Dim nivelActual As String
Dim catActual, subcatActual As String
Dim atrasPresionado As Boolean = False
dim cargaMeseros as Boolean = False
End Sub
Sub Service_Create
'This is the program entry point.
'This is a good place to load resources that are not specific to a single activity.
If Logger Then LogColor("'/////////////////////////////////////////////////////////////////////////////////////////////", Colors.Green)
If Logger Then LogColor("'///////////////////////////////////// Iniciamos Starter /////////////////////////////////", Colors.Green)
If Logger Then LogColor("'/////////////////////////////////////////////////////////////////////////////////////////////", Colors.Green)
ruta = File.DirInternal
If File.Exists(ruta, "kmt.db") = False Then
File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db")
End If
skmt.Initialize(ruta,"kmt.db", True)
'Para los Logs
#if RELEASE
logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat")
#end if
logs.Initialize
DBReqServer = "http://keymon.lat:1782"
If Logger Then Log($"Starter reqManager server: ${DBReqServer}"$)
Logger = False
End Sub
Sub Service_Start (StartingIntent As Intent)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
Subs.revisaBD
#if DEBUG
Logger = True
#else
Logger = False
#End If
Private c As Cursor = skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("SERVER"))
' Log(c.RowCount)
If c.RowCount > 0 Then
c.Position = 0
DBReqServer = c.GetString("CAT_VA_VALOR")
Log("De base de datos -> " & DBReqServer)
End If
reqManager.Initialize(Me, DBReqServer)
End Sub
Sub Service_TaskRemoved
'This event will be raised when the user removes the app from the recent apps list.
End Sub
'Return true to allow the OS default exceptions handler to handle the uncaught exception. 'Para los Logs
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
'wait for 500ms to allow the logs to be updated.
Log(">>>>>>>>> ERROR")
Dim jo As JavaObject
Dim l As Long = 500: jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l)) 'Sleep 500ms
logcat.LogCatStop
logs.Initialize
logs.Append(Application.LabelName & " Ver " & Application.VersionName & CRLF)
logs.Append(StackTrace)
Subs.revisaBD
Subs.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (Subs.fechaKMT(DateTime.now), logs))
StartActivity(errorManager)
Return True
End Sub
Sub Service_Destroy
' Timer1.Enabled=False
If Logger Then LogColor("starter destroyed", Colors.red)
End Sub
Sub JobDone(Job As HttpJob)
LogColor("Starter - JobDone", Colors.Magenta)
If Job.Success = False Then
' ToastMessageShow("Error: " & Job.ErrorMessage, True)
Else
If Logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
If Job.JobName = "DBRequest" Then
Dim result As DBResult = reqManager.HandleJob(Job)
If result.Tag = "updateKell_UTR" Then 'query tag
If Logger Then Subs.logJobDoneResultados(result)
End If
End If
End If
Job.Release
End Sub
'Para los Logs
Private Sub logcat_LogCatData (Buffer() As Byte, Length As Int)
logs.Append(BytesToString(Buffer, 0, Length, "utf8"))
If logs.Length > 4000 Then
logs.Remove(0, logs.Length - 2000) 'Obtenemos log de 2000 ~ 4000 chars
End If
End Sub
'Revisa que la conexion a la base de datos este bien.
Sub revisaBD 'ignore
If Logger Then Log("revisaBD")
If Not(File.Exists(ruta, "kmt.db")) Then File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db")
If Not(skmt.IsInitialized) Then skmt.Initialize(ruta, "kmt.db", True)
End Sub

1577
Subs.bas Normal file

File diff suppressed because it is too large Load Diff

167
errorManager.bas Normal file
View File

@@ -0,0 +1,167 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Activity
Version=10.2
@EndOfDesignText@
#Region Activity Attributes
#FullScreen: False
#IncludeTitle: True
#End Region
'******************************************************************************
'Este modulo intercepta los errores de la aplicación mediante "Starter.Application_Error" y muestra una pantalla
'con el log del error y lo manda al servidor con un query de DBRequestManager, se necesita que exista el query
'en el "config.properties" llamado "guardaErrores" y que tenga el siguiente texto:
'
'sql.guardaErrores=INSERT INTO KELLOGGS.PUSH_INFO (ID, RUTA, FECHA, DATOS) VALUES((?),(?),(?),(?))
'
'Agregar estas lineas a "Starter.Process_Globals"
' 'Para los Logs
' Dim logs As StringBuilder
' Private logcat As LogCat
'
'Agregar estas lineas a "Starter.Service_Create"
' 'Para los Logs
' #if RELEASE
' logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat")
' #end if
' logs.Initialize
'
'Agregar este Sub a "Starter"
'
'Return true to allow the OS default exceptions handler to handle the uncaught exception. 'Para los Logs
'Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
' 'wait for 500ms to allow the logs to be updated.
' Dim jo As JavaObject
' Dim l As Long = 500: jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l)) 'Sleep 500ms
' logcat.LogCatStop
' logs.Append(StackTrace)
' Subs.revisaBD
' Subs.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (Subs.fechaKMT(DateTime.now), logs))
' StartActivity(errorManager)
' Return True
'End Sub
'******************************************************************************
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
' Dim errorLog As SQL
Dim c As Cursor
Private p_principal As Panel
Private l_titulo As Label
Private svScroll As ScrollView
Private etText As EditText
Private c_continuar As Button
Private p_botones As Panel
Private b_salir As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
'Do not forget to load the layout file created with the visual designer. For example:
Activity.LoadLayout("errorManager")
End Sub
Sub Activity_Resume
Dim elError As String = ""
Dim laFecha As String = ""
' svScroll.Initialize(500dip)
' Activity.AddView(svScroll, 0, 300, 100%x, 80%y)
p_principal.Height = Activity.Height
p_principal.Width = Activity.Width
svScroll.Width = Round(p_principal.Width * 0.9)
svScroll.Left = Round(p_principal.Width/2)-Round(svScroll.Width/2)
p_botones.Left = Round(p_principal.Width/2)-Round(p_botones.Width/2)
p_botones.Top = Activity.Height - (p_botones.Height + 80)
etText.Initialize("")
svScroll.Panel.AddView(etText, 0, 0, 90%x, 80%y)
etText.InputType = etText.INPUT_TYPE_NONE
etText.Gravity = Gravity.TOP
etText.SingleLine = False
etText.Wrap = False
' Dim lblText, edtText As StringBuilder
Dim lbl As Label
lbl.Initialize("")
Activity.AddView(lbl, 0, 300, 100%x, 100%y) 'ignore
etText.Text = ""
Subs.revisaBD
c = Subs.errorLog.ExecQuery("select * from errores order by fecha desc limit 1")
If c.RowCount > 0 Then
c.Position = 0
elError = c.GetString("error")
laFecha = c.GetString("fecha")
etText.Text = elError
End If
c.Close
Dim usuario As String = ""
c = Starter.skmt.ExecQuery("select usuario from usuarioa")
If c.RowCount > 0 Then
c.Position = 0
usuario = c.GetString("USUARIO")
End If
' Log("++++++" & Starter.logsStr)
' etText.Text = etText.Text & Starter.logsStr
' lbl.TextSize = etText.TextSize
' lbl.Text = etText.Text
' Dim su As StringUtils
' Dim edheight As Int = su.MeasureMultilineTextHeight(lbl, lbl.Text)
' lbl.RemoveView
' etText.Height = edheight
' svScroll.Panel.Height = edheight
svScroll.Height = Round(Activity.Height * 0.9)
' Log(edheight)
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "guardaErrores"
cmd.Parameters = Array As Object(laFecha, usuario&"|"&Starter.rutaV, laFecha, elError)
Log($"Mandamos: ${Subs.fechaKMT(DateTime.Now)}, |${usuario}|, ${Subs.fechaKMT(DateTime.Now)}"$)
Starter.reqManager.ExecuteCommand(cmd,"guardaErrores")
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub JobDone(Job As HttpJob)
Log("errorManager - JobDone")
If Job.Success = False Then
ToastMessageShow("Error: " & Job.ErrorMessage, True)
Else
LogColor("JobDone: '" & Starter.reqManager.HandleJob(Job).tag & "' - Registros: " & Starter.reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
If Job.JobName = "DBRequest" Then
Dim result As DBResult = Starter.reqManager.HandleJob(Job)
If result.Tag = "guardaErrores" Then 'query tag
For Each records() As Object In result.Rows
For Each k As String In result.Columns.Keys
Log("GuardaErrores: " & k & ": " & records(result.Columns.Get(k)))
Next
Next
End If
End If
End If
Job.Release
End Sub
Private Sub c_continuar_Click
' Subs.iniciaActividad("Principal")
' B4XPages.ShowPage("Principal")
End Sub
Private Sub b_salir_Click
cierraActividades
End Sub
Sub cierraActividades
Log("closing activities")
Dim jo As JavaObject
jo.InitializeContext
jo.RunMethod("finishAffinity", Null)
End Sub

135
numeroATexto.bas Normal file
View File

@@ -0,0 +1,135 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.8
@EndOfDesignText@
Sub Class_Globals
Dim UnitWords() As String = Array As String( _
"", "un", "dos", "tres", "cuatro", _
"cinco", "seis", "siete", "ocho", "nueve", _
"diez", "once", "doce", "trece", "catorce", _
"quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve" _
)
Dim TenWords() As String = Array As String( _
"", "diez", "veinte", "treinta", "cuarenta", _
"cincuenta", "sesenta", "setenta", "ochenta", "noventa" _
)
'only need to go up to Pentillions to handle largest Long integer, but while we're here...
Dim ThousandWords() As String = Array As String( _
"", "mil", "millon", "billon", "trillon", _
"Cuadrillon", "Pentillion", "Sexillion", "Septillion", "Octillion" _
)
Dim moneda As String = "pesos"
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
Return Me
End Sub
Sub NumberToWords(N As Double) As String
If N < 0 Then
Return "Minus " & NumberToWordsPositive(-N)
Else
Return NumberToWordsPositive(N) 'including zero
End If
End Sub
Sub NumberToWordsPositive(N0 As Double) As String
Private N As Long
Private temp1() As String = Regex.Split("\.", NumberFormat2(N0, 1, 2, 2, False))
Private conDecimales As Boolean = False
Private losCents As String = 0
' Log(N0)
' Log(temp1.Length)
' Log(temp1(0))
If temp1.Length > 1 Then
conDecimales = True
N = temp1(0)
losCents = temp1(1)
' Log($"Con Decimales: ${losCents}"$)
Else
N = N0
End If
' Log(">> " & N)
If N = 0 Then
Return "Cero" 'that gets rid of that pesky special case
End If
Dim GroupsOfThree(10) As Int
Dim NumGroupsOfThree As Int = 0
Do While N <> 0
GroupsOfThree(NumGroupsOfThree) = N Mod 1000
NumGroupsOfThree = NumGroupsOfThree + 1
N = N / 1000
Loop
Dim Temp As String = ""
For GroupOfThree = NumGroupsOfThree - 1 To 0 Step -1
Dim ThisGroup As Int = GroupsOfThree(GroupOfThree)
If ThisGroup <> 0 Then
If Temp.Length <> 0 Then
' If GroupOfThree = 0 And ThisGroup < 100 Then
' Temp = Temp & " y "
'' If Temp.Contains("mil y ") Then Temp = "mil "
' Else
' Temp = Temp & " "
' End If
Temp = Temp & " "
End If
Temp = Temp & NumberToWords1000(ThisGroup)
If GroupOfThree <> 0 Then
' Log($"${Temp} - ${ThousandWords(GroupOfThree)}"$)
Temp = Temp & " " & ThousandWords(GroupOfThree)
If Temp = "un mil" Then
' Log(9)
Temp = "mil"
End If
End If
End If
Next
Temp = Temp.Substring2(0,1).ToUppercase & Temp.SubString(1)
Return Temp & $" ${moneda} ${NumberFormat2(losCents, 2, 0, 0, False)}/100 M.N."$
End Sub
Sub NumberToWords1000(N As Int) As String
If N < 100 Then
' Log(1)
Return NumberToWords100(N)
End If
Dim Hundreds As String = UnitWords(N / 100) & "cientos" 'Hundreds always non-blank since N < 100 already done
If UnitWords(N/100) = "nueve" Then Hundreds = "novecientos"
If UnitWords(N/100) = "cinco" Then Hundreds = "quinientos"
If UnitWords(N/100) = "siete" Then Hundreds = "setecientos"
' Log($"${N/100} - ${UnitWords(N / 100)}"$)
If UnitWords(N / 100) = "un" Then Hundreds = "ciento"
Dim TensUnits As String = NumberToWords100(N Mod 100) 'TensUnits could be blank if digits are 00
If TensUnits.Length = 0 Then
' Log(2)
If UnitWords(N / 100) = "un" Then Hundreds = "cien"
Return Hundreds
Else
' Log(3)
Return Hundreds & " " & TensUnits
End If
End Sub
Sub NumberToWords100(N As Int) As String
If N < 20 Then
Return UnitWords(N)
End If
Dim Tens As String = TenWords(N / 10) 'Tens always non-blank since N < 20 already done
Dim Units As String = UnitWords(N Mod 10) 'Units could be blank if digit is 0
If Units.Length = 0 Then
Return Tens
Else
' Log($"${Tens} - ${Units}"$)
If Tens = "veinte" Then
Return "veinti" & Units
Else
Return Tens & " y " & Units
End If
End If
End Sub