From d267efd961144d7c8655793bcbeaf4a00e69c338 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Sun, 3 Sep 2023 14:24:27 -0600 Subject: [PATCH] Commit inicial --- .gitignore | 3 + DBRequestManager.bas | 271 ++++++++ DBRequestManagerV2.bas | 149 +++++ Files/cat.gif | Bin 0 -> 2847 bytes Files/conf.ini | 1 + Files/ew.gif | Bin 0 -> 3451 bytes Files/kelloggs.bal | Bin 0 -> 13417 bytes Files/layout1.bal | Bin 0 -> 70765 bytes Files/logo_keymon.png | Bin 0 -> 13113 bytes Starter.bas | 50 ++ Subs.bas | 171 +++++ notis.bas | 37 ++ soporteKMS.b4a | 1425 ++++++++++++++++++++++++++++++++++++++++ 13 files changed, 2107 insertions(+) create mode 100644 .gitignore create mode 100644 DBRequestManager.bas create mode 100644 DBRequestManagerV2.bas create mode 100644 Files/cat.gif create mode 100644 Files/conf.ini create mode 100644 Files/ew.gif create mode 100644 Files/kelloggs.bal create mode 100644 Files/layout1.bal create mode 100644 Files/logo_keymon.png create mode 100644 Starter.bas create mode 100644 Subs.bas create mode 100644 notis.bas create mode 100644 soporteKMS.b4a diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..618d244 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/Objects +**/AutoBackups +*.meta \ No newline at end of file diff --git a/DBRequestManager.bas b/DBRequestManager.bas new file mode 100644 index 0000000..b10711a --- /dev/null +++ b/DBRequestManager.bas @@ -0,0 +1,271 @@ +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 - 211027 +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. +'Timeout - The http request timeout in ms, or 0 if default (30 secs) +Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) 'Mod por CHV, agregué el parametro Timeout - 211229 + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteObject(Command.Name, out2) + WriteInt(Limit, out2) + WriteList(Command.Parameters, out2) + out2.Close + j.PostBytes(link & "?method=query", ms.ToBytesArray) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout +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) + ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream + 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 +' Dim start As Long = DateTime.Now + 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 jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211023 + jobTagAnterior = Job.Tag 'Mod por CHV - 211023 + 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)) + 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 + ToastMessageShow(sb.ToString, True) + Next +End Sub + + \ No newline at end of file diff --git a/DBRequestManagerV2.bas b/DBRequestManagerV2.bas new file mode 100644 index 0000000..93bff84 --- /dev/null +++ b/DBRequestManagerV2.bas @@ -0,0 +1,149 @@ +B4J=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=5.45 +@EndOfDesignText@ +'Requires support for resumable subs +'Class module + +Sub Class_Globals + Private mTarget As Object + Private link As String + Private VERSION As Float = 2 + +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, Timeout As Int) As HttpJob + Dim ser As B4XSerializator + Dim data() As Byte = ser.ConvertObjectToBytes(CreateMap("command": Command, "limit": Limit, "version": VERSION)) + Return SendJob(CreateJob, data, Tag, "query2", Timeout) +End Sub + +Private Sub SendJob(j As HttpJob, Data() As Byte, Tag As Object, Method As String, Timeout As Int) As HttpJob + j.Tag = Tag + j.PostBytes(link & "?method=" & Method , Data) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout + Return j +End Sub + +Private Sub CreateJob As HttpJob + Dim j As HttpJob + j.Initialize("DBRequest", mTarget) + Return j +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) As HttpJob + Dim j As HttpJob = CreateJob + ExecuteBatchImpl(j, ListOfCommands, Tag) + Return j +End Sub + +Private Sub ExecuteBatchImpl(Job As HttpJob, ListOfCommands As List, Tag As Object) + Dim ser As B4XSerializator + ser.ConvertObjectToBytesAsync(CreateMap("commands": ListOfCommands, "version": VERSION), "ser") + Wait For (ser) ser_ObjectToBytes (Success As Boolean, Bytes() As Byte) + If Success = False Then + Log("Error building command: " & LastException) + Return + End If + Dim ser As B4XSerializator = Sender + SendJob(Job, Bytes, Tag, "batch2", 0) +End Sub + + +'Similar to ExecuteBatch. Sends a single command. +Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) As HttpJob + Return ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +'Handles the Job result and returns a DBResult. +'It is recommended to use HandleJobAsync instead. +Public Sub HandleJob(Job As HttpJob) As DBResult + Dim ser As B4XSerializator + Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) + Dim res As DBResult = ser.ConvertBytesToObject(data) + res.Tag = Job.Tag + Return res +End Sub +'Handles the Job result and raises the Result event when the data is ready. + +Public Sub HandleJobAsync(Job As HttpJob, EventName As String) + Dim ser As B4XSerializator + Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) + ser.ConvertBytesToObjectAsync(data, "ser") + Wait For (ser) ser_BytesToObject (Success As Boolean, NewObject As Object) + If Success = False Then + Log("Error reading response: " & LastException) + Return + End If + Dim res As DBResult = NewObject + res.Tag = Job.Tag + CallSubDelayed2(mTarget, EventName & "_result", res) +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 +#if Not(B4J) +'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 +#End If + +'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 + + diff --git a/Files/cat.gif b/Files/cat.gif new file mode 100644 index 0000000000000000000000000000000000000000..466aea621646e6219c0d5f446a4409c095588860 GIT binary patch literal 2847 zcmZ?wbhEHbRA5kG*vtR|`@wiWnA#8I?caakz=4K_hW|kE{|x`Z6p#k8fI#s-x1VcB zu(M-;tC5}oGvfzpL9nYNkzLgc_9n=?M0%B_4epEo3XBYi>^8|O=kj~461%;qK=u4f^JkCV zT;9`@Q~tX*WA>x-6;*4eS*RIthRQWNC6}Ji+|;LAV6pRay|06Hf4VED&Kx7n9pYCt#|A?e>)De8*wP{O?7yd#_FrI)+*g}m#yEz z>$%}kj%`O1iq==TxnF%)CSGkRADX0VbKb0ZacNC)PDyG;Zh1^~rE^G(t3+>4g=a%# zuf+_5*|Jp07)@};vn6m;s2EPWU9m{>^vbC_CVdVqHg*@{+PwTpGZ<;l0Q`Yq)oo9c;vYkI0ZJCw#>vL6OUR*QKcSqj5lmIN+izH&2BoC0oYh z^Tf)od(61WVe>+2(V{Jz?mBmW$h^Ocmsu?#_1SAt>z$XgpEDa}9^(J_(`Q*(u$UN2 zPU7n5$nY(_g2*jT-F+x8ujz|{56*)6|FAveD$ zRlzOD)m0%eFEcl>BsE3B-P5gDAw6HAB%hZnqokz3N?$)SuOzi7JuxRSxg;|$wL~vD zKUY7aBsWJNXw3VNjLc$?CWW-joK%JK#A1cS;^NfYq#U4G<(VZJU^(afyyB9gQlS3) zJcZ!Y5{0y){9G$uE?zFjoaBtu+)4%C%)FHH{G#k)1<$->JzlN=J%2p~r~C>9Qv(BD zE~nJglKea!1^>K~#G*`~%X|#n6$~ALGR}^EjxLTs4ZK`nmjK>g^B+$)esYS&gSLUZ-bvXmD z*#`8jv%gdI4(g-2Ri6M!k zlN&=4s*?+7Cof!*%P}~_KLBDT4^W05F2my(?BnVh05uXMCx|WwH4!8yj4p?yPZV7a T$tB`&IWEU=M{ifKOBk#H!hu8 zv{bEf*cyqb8`%nh<>n0#K@!ldi&(&-v=xDhV3As=W!s3Hx&xl0UR*m`ljW_qp z*xjZ`aNs#_I-3rPKeYn>45&EYyPgBxE*juk(V!twyx+zv{p0mn;nnxX^iysWGM>mF zZ;gp>>tJ&WnrUkczx!=63fKTT^V!|y(Tw20r>pC?{4*f7$L7Xx;Ww4_k9NG~HSX;= z?m#Lr&LHwPRzvGMje<_cC3ILgAa?|S9)aDaRdN6nH?W(9maZO@8!KIpH(lIwOEwF6 zx_}fIV-R@6q@jfXj`Pf52*ifTPmnx&DJKdL&up93s_$toIc zkXCgiplg&01n&Cp;9QAXW5z{%6=^prJd7wqUpk?iQa0~5_3u+E?#-sfFvwsFvCEX( z1fo+1p-^wbF4tu;%CwYl7tB&b-jQhUkXw~p5E+AfZN&@NSDSz|A> z*D;S?)`9E70-|>iq)6p2i>?G^seX&%s)G^|0n4BIAcd-`wYbO2OrEhPVV5y-yBO}? zOC%}*%Qpcrvzx^!nY5HHc+J>6IOW1ht;iI+&bw~&Go0#EA1 zJoDj$fhUtuI{g5jf@2ouhcD_r3kBj`kehu?u9N~E9n&M6`>*EjPcI89nLF=W4ZFp! z_3Fe`$lV86%C9Rhw3`KBZH+RQ0|lMLwHE8kdNmKi2BE@mt?J|sqgM@V-20EekWPak zg{7^mA>Y<_a>R0!ZDK^hQ2hmjp8MWn`lm~g2)s*4m6RG+*X~{>(_ypyNt`gNNG-GN zEehjIJXd!bi+CS4`|$*7^>bGU#?|^O6nbuv2M=>R8@WHd@YbIhy)ufmSc>q^%^i2b zGS59o$AXmU?DKhFdA$qmi>JQr6CaE{b6_h(Lo^h~gm${T_3LPX(3jufHb`VbyhT!i z-CFJD0=uF&CSE^n)8{Wpnc_Ee)-$)4F+U$U%gsCT;DnsjO>6wVL=g?l%m1okq`D&y1^hcu@M+6le@ z<(}fU4MUR$Xv_A=)H4|_Q%s6mK;W3!$?D`_+bQ_QQXF&dJDlSXnSaQWfh#U(nrOAP z0${5V8bMDY&-^0TEiRtMrIU8gaCm#UjR}}b3C&L;D2p_P07&!JtYJjAOhj#Uqr_xi zyvveM6t3yx6&dmynMcYTZO8PDqC(QiSV-@t6UQ{r#)BGozNV2?5Fy$yp0y!`3gW{6 zJu%9)F6?hy1fTF8$lcW3Q1UF82*jCDq{Uol+L*x|{ku*WV(YA;Dp0hBe+nXSnm#D5 zs?Pcj1mQn154y$`-SkPF4mjncY2*JA=RjSz!713yD9m;ho4x96rx4dV0JvTOI)}2) z7z--&Dj?7TrP-OV%<2;#XLP{dn#}J(ljcr{Upqo4pY2v#6Kwn zWK33m!T`hS*b){M$E)os2;973!_cr#UuUNH69>1+(O%P>Alnqw**t{;u>1;B1a6t& e$4VI#87m)|x^|voow(fS#J{~>=fzPo;P*c~F3Ru# literal 0 HcmV?d00001 diff --git a/Files/kelloggs.bal b/Files/kelloggs.bal new file mode 100644 index 0000000000000000000000000000000000000000..5773c92ef1ed655c877d7b51cbaea42800d76cf3 GIT binary patch literal 13417 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 PzsiISeoax0GK_x%cnSn$ literal 0 HcmV?d00001 diff --git a/Files/layout1.bal b/Files/layout1.bal new file mode 100644 index 0000000000000000000000000000000000000000..3d249629b996f61826183bcb4638ae2c45d535cc GIT binary patch literal 70765 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 B1+)MF literal 0 HcmV?d00001 diff --git a/Files/logo_keymon.png b/Files/logo_keymon.png new file mode 100644 index 0000000000000000000000000000000000000000..e7984161a07ba563e9562865ebde98d660fdc34f GIT binary patch literal 13113 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 Tvo7|200000NkvXXu0mjfMoV3% literal 0 HcmV?d00001 diff --git a/Starter.bas b/Starter.bas new file mode 100644 index 0000000..0afda6c --- /dev/null +++ b/Starter.bas @@ -0,0 +1,50 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Service +Version=8.8 +@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. + Dim citas As List + Dim confMap As Map + Dim mayusculasDesbloqueo As String = "0" + Dim ruta As String + Dim rp As RuntimePermissions +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. + LogColor("///////////////////////////////////////////////////////////////////////////////////", Colors.Green) + LogColor("////////////////////////////// Iniciamos Starter ///////////////////////////////", Colors.Green) + LogColor("///////////////////////////////////////////////////////////////////////////////////", Colors.Green) +End Sub + +Sub Service_Start (StartingIntent As Intent) + citas.Initialize + confMap.Initialize + ruta = File.DirInternal 'Ruta de la configuracion por defecto. + If File.ExternalWritable Then ruta = rp.GetSafeDirDefaultExternal("") 'Si podemos escribir a la tarjeta, cambiamos la ruta. + If Not(File.Exists(ruta, "conf.ini")) Then File.Copy(File.DirAssets, "conf.ini", ruta, "conf.ini") 'Copiamos el archivo de configuracion a la ruta especificada. + Subs.procesaConfiguracion +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. +Sub Application_Error (Error As Exception, StackTrace As String) As Boolean + Return True +End Sub + +Sub Service_Destroy + +End Sub diff --git a/Subs.bas b/Subs.bas new file mode 100644 index 0000000..820e3fb --- /dev/null +++ b/Subs.bas @@ -0,0 +1,171 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=StaticCode +Version=11.2 +@EndOfDesignText@ +'Code module +'Subs in this code module will be accessible from all modules. +Sub Process_Globals + 'These global variables will be declared once when the application starts. + 'These variables can be accessed from all modules. + +End Sub + +'Hace visible el panel con los parametros "Top" y "Left" dados +'y lo hace del ancho y alto de la pantalla +Sub panelVisible(panel As Panel, top As Int, left As Int, actividad As Activity) 'ignore +' panel.BringToFront + panel.Width=actividad.Width + panel.Height=actividad.Height '-(WobbleMenu1.GetHeight-20) + panel.Visible = True + panel.Top = top + panel.Left = left +End Sub + +'Oculta el panel especificado y lo manda al fondo +Sub panelOculto(panel As Panel) 'ignore + panel.SendToBack + panel.Visible = False +End Sub + +'Centra un boton horizontalmente en el panel superior +Sub centraBotonEnPanel(boton As Button, panel As Panel) + boton.left = (panel.Width/2)-(boton.Width/2) +End Sub + +'Centra una etiqueta horizontalmente en el panel superior +Sub centraEtiquetaEnPanel(etiqueta As Label, panel As Panel) + etiqueta.left = (panel.Width/2)-(etiqueta.Width/2) +End Sub + +'Centra un campo de texto horizontalmente en el panel superior +Sub centraETEnPanel(et As EditText, panel As Panel) + et.left = (panel.Width/2)-(et.Width/2) +End Sub + +'Centra un panel horizontalmente en el panel superior +Sub centraPanelEnPanel(p1 As Panel, panel As Panel) + p1.left = (panel.Width/2)-(p1.Width/2) +End Sub + +'Regresa una cita al azar, va borrando cada cita que regresa para que no se repitan, y cuando quedan pocas vuelve a llenar la lista. +Sub dameCita(citas As List) As String + If citas.Size < 2 Then + citas.Add("No les hagas a tus hijos la vida difícil, haciéndoles la vida fácil.") + citas.Add("Nunca subestimes el poder de la estupidez humana.") + citas.Add("Se vive y se aprende ... o no se vive mucho.") + citas.Add("La verdad de una afirmación no tiene nada que ver con su credibilidad ... y viceversa.") + citas.Add("Nunca apeles al ''buen corazón'' de un hombre, puede que no tenga, saldrás ganando si invocas su interés.") + citas.Add("La teología de uno es la carcajada de otro.") + citas.Add("¡Todo en exceso! Para saborear la vida hay que tomarla a grandes tragos, la moderación es para los monjes.") + citas.Add("La generación que ignora la historia no tiene pasado … ni futuro.") + citas.Add("Si no puede expresarse en cifras, no es ciencia, es opinión.") + citas.Add("Escucha siempre a los expertos, te dirán lo que no se puede hacer, y por qué ... entonces ve y hazlo!!") + citas.Add("El juego está arreglado, naturalmente, pero no te detengas por eso: si no apuestas, no puedes ganar.") + citas.Add("Conservarse joven exige el cultivar con tenacidad la capacidad de desaprender las viejas falsedades.") + citas.Add("El dinero es veraz, si un hombre habla de su honor, hazle pagar en efectivo.") + citas.Add("Cuando la tentación se cruce en tu camino, aprovéchala, puede que no vuelva a presentarse.") + citas.Add("La libertad empieza cuando uno manda a la gente a freír espárragos.") + citas.Add("Cuando la tentación se cruce en tu camino, aprovéchala, puede que no vuelva a presentarse.") + End If + Private citaNum As Int = Rnd(1, citas.Size) +' Log(citas.Size & "|" & (citaNum-1)) + Private laCita As String = citas.Get(citaNum-1) + citas.RemoveAt(citaNum-1) + Return laCita +End Sub + +'Compara dos versiones (string) con el formato "1.10.09", regresa 1 si la primera es mayor, 0 si es igual y -1 si es menor +Sub comparaVersiones(ver1 As String, ver2 As String) As Int +' Logcolor($"${ver1} - ${ver2}"$, Colors.Magenta) + Private m1(), m2() As String + Private pri1, pri2, sec1, sec2, ter1, ter2 As String + m1 = Regex.Split("\.", ver1) + m2 = Regex.Split("\.", ver2) + pri1 = m1(0) + pri2 = m2(0) +' Log(pri1 & "|" & pri2) + If pri1 > pri2 Then Return 1 'Si el primer numero es mayor, regresamos 1 + If pri1 < pri2 Then Return -1 'Si el primer numero es menor, regresamos -1 + + 'Si son iguales entones revisamos el segundo numero + If m1.Length > 1 And m2.Length > 1 Then + sec1 = "1." & m1(1) + sec2 = "1." & m2(1) + ' Log(sec1 & "|" & sec2) + If sec1 > sec2 Then Return 1 'Si el segundo numero es mayor, regresamos 1 + If sec1 < sec2 Then Return -1 'Si el segundo numero es menor, regresamos -1 + End If + + 'Si son iguales entones revisamos el tercer numero + If m1.Length > 2 And m2.Length > 2 Then + ter1 = "1." & m1(2) + ter2 = "1." & m2(2) + ' Log(ter1 & "|" & ter2) + If ter1 > ter2 Then Return 1 'Si el tercer numero es mayor, regresamos 1 + If ter1 < ter2 Then Return -1 'Si el tercer numero es menor, regresamos -1 + End If + Return 0 'Regersamos 0 porque son iguales +End Sub + +'Lee un arhchivo de texto y lo convierte en un mapa. +Sub procesaConfiguracion + Private t As String + Private c As List = File.ReadList(Starter.ruta, "conf.ini") + For i = 0 To c.Size - 1 + t = c.get(i) + Log(t.IndexOf("=")) + If t.IndexOf("=") > -1 Then + Starter.confMap.Put(t.SubString2(0, t.IndexOf("=")), t.SubString(t.IndexOf("=")+1)) + Log(Starter.confMap) + End If + Next + If Starter.confMap.ContainsKey("mayusculasDesbloqueo") Then Starter.mayusculasDesbloqueo = Starter.confMap.Get("mayusculasDesbloqueo") +End Sub + +'Guarda la configuracion (mapa) en un archivo de texto. +Sub escribreConf + Private l As List + l.Initialize + For Each k As Object In Starter.confMap.Keys + l.Add($"${k}=${Starter.confMap.Get(k)}"$) + Next + Log(l) + File.WriteList(Starter.ruta, "conf.ini", l) +End Sub + +'Centra horizontalmente una vista en otra vista. +Sub centraVistaEnVista(v As View, p As View) 'ignore + v.Left = (p.Width/2) - (v.Width/2) +End Sub + +'Sets the elevation of a view +Sub SetElevation(v As View, e As Float) + Dim jo As JavaObject + Dim p As Phone + If p.SdkVersion >= 21 Then + jo = v + jo.RunMethod("setElevation", Array As Object(e)) + End If +End Sub + +'Regresa buenos dias, tardes o noches dependiendo de la hora. +Sub generaSaludo As String + Private saludo As String = "" + If DateTime.GetHour(DateTime.Now) > 4 And DateTime.GetHour(DateTime.Now) < 12 Then saludo = "Buenos dias, " + If DateTime.GetHour(DateTime.Now) >= 12 And DateTime.GetHour(DateTime.Now) < 19 Then saludo = "Buenas tardes, " + If DateTime.GetHour(DateTime.Now) >= 19 Or DateTime.GetHour(DateTime.Now) < 4 Then saludo = "Buenas noches, " +' Log(DateTime.GetHour(DateTime.Now)&"|"&saludo&"|") + Return saludo +End Sub + +'Muestra en el Log los campos y valores que regresan en el JobDone. +Sub logJobDoneResultados(resultado As DBResult) + For Each records() As Object In resultado.Rows + LogColor($"====== ${resultado.Tag} - REGISTROS = ${resultado.Rows.Size}"$, Colors.RGB(215,37,0)) + For Each k As String In resultado.Columns.Keys + LogColor(k & " = " & records(resultado.Columns.Get(k)), Colors.RGB(215,37,0)) + Next + Next +End Sub \ No newline at end of file diff --git a/notis.bas b/notis.bas new file mode 100644 index 0000000..0a8d782 --- /dev/null +++ b/notis.bas @@ -0,0 +1,37 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Service +Version=11.5 +@EndOfDesignText@ +#Region Service Attributes + #StartAtBoot: 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. + +End Sub + +Sub Service_Create + +End Sub + +Sub Service_Start (StartingIntent As Intent) + Service.StopAutomaticForeground 'Call this when the background task completes (if there is one) + Service.StartForeground(12345, CreateNotification("...")) +End Sub + +Sub Service_Destroy + +End Sub + +Sub CreateNotification (Body As String) As Notification + Dim notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + notification.Icon = "icon" + notification.SetInfo("Soporte", Body, Main) + Return notification +End Sub diff --git a/soporteKMS.b4a b/soporteKMS.b4a new file mode 100644 index 0000000..364eea5 --- /dev/null +++ b/soporteKMS.b4a @@ -0,0 +1,1425 @@ +Build1=Default,soporte.keymon.lat +File1=cat.gif +File2=conf.ini +File3=ew.gif +File4=kelloggs.bal +File5=layout1.bal +File6=logo_Keymon.png +FileGroup1=Default Group +FileGroup2=Default Group +FileGroup3=Default Group +FileGroup4=Default Group +FileGroup5=Default Group +FileGroup6=Default Group +Group=Default Group +Library1=bitmapcreator +Library10=wobblemenu +Library11=b4xgifview +Library2=byteconverter +Library3=clipboard +Library4=core +Library5=ime +Library6=okhttputils2 +Library7=phone +Library8=randomaccessfile +Library9=runtimepermissions +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~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.DarkTheme)~\n~'End of default text.~\n~SetActivityAttribute(main, android:windowSoftInputMode, adjustPan|stateHidden) +Module1=DBRequestManager +Module2=Starter +Module3=Subs +NumberOfFiles=6 +NumberOfLibraries=11 +NumberOfModules=3 +Version=12.2 +@EndOfDesignText@ +#Region Project Attributes + #ApplicationLabel: Soporte Keymonsoft + #VersionName: 3.08.27 + 'SupportedOrientations possible values: unspecified, landscape or portrait. + #SupportedOrientations: portrait + #CanInstallToExternalStorage: False + #BridgeLogger: True +'Ctrl + click to sync files con Github Desktop ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\ +#End Region + +'Ver 3.01.23 - Se agregó el nombre del producto al query cuando se borra el producto de un ticket, para evitar que borre cambios y no cambios por igual. +'Ver 3.08.27 - Se implementó el borrar venta de todas las empresas desde una misma pantalla. + +#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. + Dim DBRSGuna1872 As String = "http://keymon.lat:1782" + Dim DBRSMards1873 As String = "http://keymon.lat:1782" +' Dim DBRSGuna1872 As String = "http://11.0.0.231:1783" 'Para pruebas locales +' Dim DBRSGuna1872 As String = "http://187.189.244.154:1782" 'Para pruebas locales + Dim conexionDBRS As String = "externa" + Dim DBRChecked As Boolean = False + Dim atrasPresionado As Boolean = False + Dim pruebaPaso As Int = 0 + Dim pass1, usrDesbloqueo As String + Dim versionOk As Boolean = False + Dim prodsList As List +' Dim buscarDonde As String = "Usuario" +' Dim buscarQue As String = "" +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 reqManager As DBRequestManager + Dim cmd As DBCommand + Dim kb As IME + Private WobbleMenu1 As WobbleMenu + Private Panel1 As Panel + Private PanelKelloggs As Panel + Private Panel3 As Panel + Private Panel4 As Panel + Private Panel5 As Panel + Private b_desbloquea As Button + Private l_almacen As Label + Private s_almacen1 As Spinner + Private et_ruta1 As EditText + Private s_almacen3 As Spinner + Private et_ruta3 As EditText + Private b_borrarVenta1 As Button + Private b_borrarVenta3 As Button + Private s_almacen4 As Spinner + Private et_ruta4 As EditText + Private b_borrarVenta4 As Button + Private b_forzarVenta1 As Button + Private b_forzarVenta3 As Button + Private b_forzarVenta4 As Button + Private s_almacen2 As Spinner + Private et_ruta2 As EditText + Private b_borrarVenta2 As Button + Private b_forzarVenta2 As Button + Private s_tipoVenta As Spinner + Private et_usuario As EditText + Dim empresasMap As Map + Dim spinnerGunaMap, spinnerKelloggsMap, spinnerKelloggs2Map, spinnerSalmaMap, spinnerDanvitMap, spinnerMardsMap, spinnerEmpresaMap As Map + Dim almacenGuna, almacenKelloggs, almacenKelloggs2, almacenSalma, almacenDanvit, almacenDeRuta, almacenMards, almacenEmpresa As String + Dim tipoVentaKelloggs As String = "VENTA" + Private l_version As Label + Private l_cita As Label + Private l_copyright As Label + Private l_copyright1 As Label + Private p_login As Panel + Private et_login As EditText + Private p_backLogin As Panel + Private l_toast As Label + Private p_toast As Panel + Private cb_usrMayusc As CheckBox + Private p_opcDesbloqueo As Panel + Private p_copyright As Panel + Private p_buscar As Panel + Private et_usr As EditText + Private et_almacen As EditText + Private et_ruta As EditText + Private b_buscarUsr As Button + Private lv_resultadosBusqueda As ListView + Private b_revisaVenta As Button + Private b_revisaVenta2 As Button + Private p_botones1 As Panel + Private p_botones2 As Panel + Private p_botones3 As Panel + Private p_botones4 As Panel + Private s_usrEmpresa As Spinner + Private usrEmpresa As String = "GUNA" + Private b_login As Button + Private s_almacen2_2 As Spinner + Private et_cliente As EditText + Private b_borrarTicket As Button + Private p_botones_k2 As Panel + Private b_revisaTicket As Button + Private lv_ticket As ListView + Private sv_kelloggs As ScrollView + Private et_referencia As EditText + Private et_folio As EditText + Private et_monto As EditText + Private b_borrarPagare As Button +' Private Panel2 As Panel + Private Panel16 As Panel + Private PanelFacturacion As Panel + Private b_libBanderaFactura As Button + Private b_libBanderaCargaForanea As Button + Private gv_gato As B4XGifView + Private gv_bicho As B4XGifView + Dim timerBicho As Timer + Private p_ticket As Panel + Private b_cerrarTicket As Button + Private Panel2 As Panel + Private l_SinProductos As Label + Dim liquidada As Boolean = False + Private p_Mards As Panel + Private b_forzarVentaMards As Button + Private b_borrarVentaMards As Button + Private b_revisaVentaMards As Button + Private p_botonesMards As Panel + Private s_almacenMards As Spinner + Private et_rutaMards As EditText + Private p_borrarVenta As Panel + Private s_empresaBV As Spinner + Private s_almacenBV As Spinner + Private et_rutaBV As EditText + Private s_tipoVentaBV As Spinner + Private b_revisarVentaBV As Button + Private b_borrarVentaBV As Button + Private b_forzarVentaBV As Button + Dim laEmpresa As String = "" + Private l_tipoVentaBV As Label + Private p_tipoVentaBV As Panel + dim elTipoDeVenta as string +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("Layout1") + If FirstTime Then + DateTime.DateFormat = "yyyy" + l_copyright1.Text = $"KeymonSoft ${DateTime.Date(DateTime.Now)}."$ + End If + prodsList.Initialize +' sv_kelloggs.Panel.LoadLayout("Kelloggs") + p_login.BringToFront + Subs.panelVisible(p_login, 0, 0, Activity) + Subs.centraETEnPanel(et_login, p_login) + Subs.centraPanelEnPanel(p_backLogin, p_login) + l_version.text = "Version " & Application.VersionName + ProgressDialogShow("Descargando información") + Log("DBServer: " & DBRSGuna1872) + reqManager.Initialize(Me, DBRSGuna1872) +' ToastMessageShow("Probando: " & DBRSGuna1872, False) + cmd.Initialize + cmd.Name = "select_soporte" 'Intentamos conectarnos al servido publico y si no responde cambiamos al interno. + reqManager.ExecuteQuery(cmd , 0, "pruebaConexion", 750) 'request con timeout corto en ms. + DBRChecked = False + Do While Not(DBRChecked) ' Esperamos a que termine la prueba de conexion. + Sleep(20) + Loop + et_usuario.InputType = Bit.Or(et_usuario.InputType, 4096) 'Esta linea es para que cuando se escriba en el campo, sea con mayusculas, para mas tipos vaya a: https://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_CAP_CHARACTERS + et_usr.InputType = Bit.Or(et_usuario.InputType, 4096) 'Esta linea es para que cuando se escriba en el campo, sea con mayusculas, para mas tipos vaya a: https://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_CAP_CHARACTERS + et_almacen.InputType = Bit.Or(et_usuario.InputType, 4096) 'Esta linea es para que cuando se escriba en el campo, sea con mayusculas, para mas tipos vaya a: https://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_CAP_CHARACTERS + et_ruta.InputType = Bit.Or(et_usuario.InputType, 4096) 'Esta linea es para que cuando se escriba en el campo, sea con mayusculas, para mas tipos vaya a: https://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_CAP_CHARACTERS + WobbleMenu1.SetTabTextIcon(1,"Guna", Chr(0xF0C0), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(2,"Kellogg's", Chr(0xF007), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(3,"Salma", Chr(0xF2BE), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(4,"Danvit", Chr(0xF21B), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(5,"Borrar Venta", Chr(0xF29D), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(6,"Facturacion", Chr(0xF2D9), Typeface.FONTAWESOME) + WobbleMenu1.SetTabTextIcon(7,"Otro", Chr(0xF2D9), Typeface.FONTAWESOME) +' WobbleMenu1.SetBadge(4,5,Colors.White,Colors.Blue) + Subs.panelVisible(Panel1, 0, 0, Activity) +' Subs.centraBotonEnPanel(b_borrarVenta1, Panel1) +' Subs.centraBotonEnPanel(b_forzarVenta1, Panel1) + + s_tipoVenta.AddAll(Array As String("VENTA", "ABORDO")) + s_usrEmpresa.AddAll(Array As String("GUNA", "KELLOGGS", "SALMA", "DANVIT")) +' s_buscarD.AddAll(Array As String("Usuario", "Nombre", "Almacen", "Ruta")) + empresasMap.Initialize + spinnerGunaMap.Initialize + spinnerKelloggsMap.Initialize + spinnerKelloggs2Map.Initialize + spinnerSalmaMap.Initialize + spinnerDanvitMap.Initialize + spinnerMardsMap.Initialize + spinnerEmpresaMap.Initialize + s_empresaBV.Clear + s_empresaBV.AddAll(Array As String("-= Seleccione =-", "Danvit", "Guna", "Kelloggs", "Mards", "Salma")) + s_tipoVentaBV.AddAll(Array As String("VENTA", "ABORDO")) + s_tipoVentaBV.SelectedIndex = 0 + 'Traemos los almacenes de Guna + cmd.Initialize + cmd.Name = "select_almacenes_GUNA" + reqManager.ExecuteQuery(cmd , 0, "almacenesGuna", 0) + 'Traemos los almacenes de Kelloggs +' cmd.Initialize + cmd.Name = "select_almacenes_KELL" + reqManager.ExecuteQuery(cmd , 0, "almacenesKelloggs", 0) + 'Traemos los almacenes de Salma +' cmd.Initialize + cmd.Name = "select_almacenes_SALMA" + reqManager.ExecuteQuery(cmd , 0, "almacenesSalma", 0) + 'Traemos los almacenes de Danvit +' cmd.Initialize + cmd.Name = "select_almacenes_DANVIT" + reqManager.ExecuteQuery(cmd , 0, "almacenesDanvit", 0) + 'Traemos los almacenes de Mards + reqManager.Initialize(Me, DBRSMards1873) + cmd.Name = "select_almacenes_Mards" + reqManager.ExecuteQuery(cmd , 0, "almacenesMards", 0) + kb.Initialize("kb") + gv_gato.SetGif(File.DirAssets, "cat.gif") + gv_bicho.SetGif(File.DirAssets, "ew.gif") + timerBicho.Initialize("timerBicho", 5000) + timerBicho.Enabled = True + reqManager.Initialize(Me, DBRSGuna1872) +End Sub + +Sub Activity_Resume +' reqManager.Initialize(Me, DBRSGuna1872) + If Starter.mayusculasDesbloqueo = "1" Then cb_usrMayusc.Checked = True + Dim label1 As Label = lv_resultadosBusqueda.TwoLinesLayout.Label + label1.TextSize = 13 + label1.TextColor = Colors.Black + Dim label2 As Label = lv_resultadosBusqueda.TwoLinesLayout.SecondLabel + label2.TextSize = 13 + label2.TextColor = Colors.Black + + Dim label12 As Label = lv_ticket.TwoLinesLayout.Label + label12.TextSize = 13 + label12.TextColor = Colors.Black +' label12.Height = 12dip + Dim label22 As Label = lv_ticket.TwoLinesLayout.SecondLabel + label22.TextSize = 13 + label22.TextColor = Colors.Black +' label22.Height = 12dip + lv_ticket.TwoLinesLayout.ItemHeight = 50dip + + b_login.Height = Activity.Height + b_login.Width = Activity.Width + b_login.Top = 0 : b_login.left = 0 + Subs.SetElevation(et_login, 10) +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + +End Sub + +Sub timerBicho_Tick + Private rand As Int = Rnd(1,3) + If rand = 1 Then gv_bicho.mBase.Visible = True Else gv_bicho.mBase.Visible = False +' Log("Bicho visible = " & rand) +End Sub + +Sub WobbleMenu1_Tab1Click + reqManager.Initialize(Me, DBRSGuna1872) +' Log("Tab 1") +' sv_kelloggs.Visible = False + WobbleMenu1.RemoveBadge(4) + Subs.panelVisible(Panel1, 0, 0, Activity) +' Subs.panelOculto(PanelKelloggs) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel2) + Subs.panelOculto(Panel3) + Subs.panelOculto(Panel4) + Subs.panelOculto(p_borrarVenta) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(Panel5) +' Subs.centraBotonEnPanel(b_borrarVenta1, Panel1) +' Subs.centraBotonEnPanel(b_forzarVenta1, Panel1) + Subs.centraPanelEnPanel(p_botones1, Panel1) +End Sub + +Sub WobbleMenu1_Tab2Click +' Log("Tab 2") + reqManager.Initialize(Me, DBRSGuna1872) + WobbleMenu1.RemoveBadge(4) +' sv_kelloggs.Top = 0 +' sv_kelloggs.Left = 0 +' sv_kelloggs.Width = Activity.Width +' sv_kelloggs.Height = Activity.Height - 50 +' sv_kelloggs.Visible = True + +' PanelKelloggs.Height = Activity.Height + lv_ticket.Width = Activity.Width * 0.9 + lv_ticket.Left = (Activity.Width/2) - (lv_ticket.Width/2) + +' Subs.panelVisible(PanelKelloggs, 0, 0, Activity) +' PanelKelloggs.Visible = True +' PanelKelloggs.Width = Activity.Width + Subs.panelVisible(Panel2, 0, 0, Activity) + Panel2.Width = Activity.Width + Subs.panelOculto(Panel1) + Subs.panelOculto(Panel3) + Subs.panelOculto(Panel4) + Subs.panelOculto(p_borrarVenta) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(Panel5) +' Subs.centraPanelEnPanel(p_botones2, PanelKelloggs) +' Subs.centraPanelEnPanel(p_botones_k2, PanelKelloggs) +' Subs.centraBotonEnPanel(b_borrarPagare, PanelKelloggs) +End Sub + +Sub WobbleMenu1_Tab3Click + reqManager.Initialize(Me, DBRSGuna1872) + WobbleMenu1.RemoveBadge(4) + Subs.panelVisible(Panel3, 0, 0, Activity) + Subs.panelOculto(Panel1) + Subs.panelOculto(Panel2) +' Subs.panelOculto(PanelKelloggs) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel4) + Subs.panelOculto(p_borrarVenta) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(Panel5) +' Log("Tab 3") +' Subs.centraBotonEnPanel(b_borrarVenta3, Panel3) +' Subs.centraBotonEnPanel(b_forzarVenta3, Panel3) + Subs.centraPanelEnPanel(p_botones3, Panel3) +End Sub + +Sub WobbleMenu1_Tab4Click + reqManager.Initialize(Me, DBRSGuna1872) + WobbleMenu1.RemoveBadge(4) + Subs.panelVisible(Panel4, 0, 0, Activity) + Subs.panelOculto(Panel1) +' Subs.panelOculto(PanelKelloggs) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel2) + Subs.panelOculto(Panel3) + Subs.panelOculto(p_borrarVenta) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(Panel5) +' Log("Tab 4") +' Subs.centraBotonEnPanel(b_borrarVenta4, Panel4) +' Subs.centraBotonEnPanel(b_forzarVenta4, Panel4) + Subs.centraPanelEnPanel(p_botones4, Panel4) +End Sub + +Sub WobbleMenu1_Tab5Click +' WobbleMenu1.RemoveBadge(4) +' reqManager.Initialize(Me, DBRSMards1873) + Subs.panelVisible(p_borrarVenta, 0, 0, Activity) + Subs.panelOculto(Panel1) + Subs.panelOculto(Panel2) +' Subs.panelOculto(PanelKelloggs) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel3) + Subs.panelOculto(Panel4) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(Panel5) +' Log("Tab 3") +' Subs.centraBotonEnPanel(b_borrarVenta3, Panel3) +' Subs.centraBotonEnPanel(b_forzarVenta3, Panel3) + Subs.centraPanelEnPanel(p_botonesMards, p_borrarVenta) + s_empresaBV.SelectedIndex = 0 + s_almacenBV.SelectedIndex = 0 +End Sub + +'Sub WobbleMenu1_Tab5Click '(Antes usuarios) +' Subs.panelVisible(p_buscar, 0, 0, Activity) +' gv_bicho.mBase.Visible = True +'' Subs.panelOculto(PanelKelloggs) +'' sv_kelloggs.Visible = False +' Subs.panelOculto(Panel1) +' Subs.panelOculto(Panel2) +' Subs.panelOculto(Panel3) +' Subs.panelOculto(Panel4) +' Subs.panelOculto(PanelFacturacion) +' Subs.panelOculto(Panel5) +' Subs.centraBotonEnPanel(b_buscarUsr, p_buscar) +' lv_resultadosBusqueda.Left = (p_buscar.Width/2)-(lv_resultadosBusqueda.Width/2) +' lv_resultadosBusqueda.Height = Activity.Height - lv_resultadosBusqueda.Top - 200 +'End Sub + +Sub WobbleMenu1_Tab6Click +' Log("Tab Facturacion") + reqManager.Initialize(Me, DBRSGuna1872) + l_cita.Text = Subs.dameCita(Starter.citas) + Subs.panelVisible(PanelFacturacion, 0, 0, Activity) +' Subs.panelOculto(PanelKelloggs) + Subs.panelOculto(Panel1) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel2) + Subs.panelOculto(Panel3) + Subs.panelOculto(Panel4) + Subs.panelOculto(Panel5) + Subs.panelOculto(p_borrarVenta) + Subs.centraBotonEnPanel(b_borrarPagare, PanelFacturacion) +' Subs.centraPanelEnPanel(Panel16, PanelFacturacion) + Subs.centraBotonEnPanel(b_libBanderaFactura, PanelFacturacion) + Subs.centraBotonEnPanel(b_libBanderaCargaForanea, PanelFacturacion) +End Sub + +Sub WobbleMenu1_Tab7Click +' Log("Tab Otro") + reqManager.Initialize(Me, DBRSGuna1872) +' WobbleMenu1.RemoveBadge(4) + l_cita.Text = Subs.dameCita(Starter.citas) + Subs.panelVisible(Panel5, 0, 0, Activity) + gv_bicho.mBase.Visible = False + Subs.panelOculto(Panel1) +' Subs.panelOculto(PanelKelloggs) +' sv_kelloggs.Visible = False + Subs.panelOculto(Panel2) + Subs.panelOculto(Panel3) + Subs.panelOculto(Panel4) + Subs.panelOculto(PanelFacturacion) + Subs.panelOculto(p_borrarVenta) + Subs.centraEtiquetaEnPanel(l_version, Panel5) + Subs.centraEtiquetaEnPanel(l_cita, Panel5) + Subs.centraPanelEnPanel (p_copyright, Panel5) +End Sub + +'Desbloquea el usuario de Guna especificado en "et_usuario". +Private Sub b_desbloquea_Click + If et_usuario.Text <> "" Then + cmd.Initialize + cmd.Name = "update_usuario_guna" + Dim tempUsr As String = et_usuario.Text + tempUsr = tempUsr.Trim 'Quitamos espacios de antes y despues. + If Starter.mayusculasDesbloqueo = "1" Then tempUsr = tempUsr.ToUpperCase 'Mandamos el usuario en mayusculas. + cmd.Parameters = Array As Object(tempUsr) + Log("Mandamos DBRequest desbloqueo: " & tempUsr) + usrDesbloqueo = tempUsr + reqManager.ExecuteCommand(cmd , "desbloqueaUsuario") + Else + Toast("Por favor ingrese el usuario a desbloquear. 🙄", 650) + End If + kb.HideKeyboard +End Sub + +Sub s_almacen1_ItemClick (Position As Int, Value As Object) + almacenGuna = spinnerGunaMap.Get(Value) + almacenDeRuta = Value + Log(Value) + Log($"Almacén ${almacenGuna} de Guna seleccionado"$ ) +End Sub + +Sub s_almacen2_ItemClick (Position As Int, Value As Object) + almacenKelloggs = spinnerKelloggsMap.Get(Value) + almacenDeRuta = Value + Log($"Almacén ${almacenKelloggs} de Kelloggs seleccionado"$ ) +End Sub + +Private Sub s_tipoVenta_ItemClick (Position As Int, Value As Object) + tipoVentaKelloggs = Value +End Sub + +Sub s_almacen3_ItemClick (Position As Int, Value As Object) + almacenSalma = spinnerSalmaMap.Get(Value) + almacenDeRuta = Value + Log($"Almacén ${almacenSalma} de Salma seleccionado"$ ) +End Sub + +Sub s_almacen4_ItemClick (Position As Int, Value As Object) + almacenDanvit = spinnerDanvitMap.Get(Value) + almacenDeRuta = Value + Log($"Almacén ${almacenDanvit} de Danvit seleccionado"$ ) +End Sub + +Private Sub s_almacenMards_ItemClick (Position As Int, Value As Object) + almacenMards = spinnerMardsMap.Get(Value) + almacenDeRuta = Value + Log($"Almacén ${almacenMards} de Mards seleccionado"$ ) +End Sub + +'Revisa si la venta de Guna se puede borrar, y si SI se puede, la borra. +Private Sub b_borrarVenta1_Click + kb.HideKeyboard + Log(et_ruta1.Text & "|" & almacenGuna) + If et_ruta1.Text.Trim <> "" And almacenGuna <> "" Then + cmd.Initialize + cmd.Name = "revisa_liquidada_Guna" 'Primero revisamos que no este liquidada o con descuento. + cmd.Parameters = Array As Object(almacenGuna, et_ruta1.Text.Trim) + Log($"Revisamos venta liquidada Guna: almacen: ${almacenGuna}, ruta: ${et_ruta1.Text} "$) + reqManager.ExecuteQuery(cmd , 0, "revisa_liquidada_Guna", 0) + Else + Toast("Por favor ingrese ruta y almacén 🤦🏽‍♂️", 600) + End If +End Sub + +'Forzamos borrar venta de Guna en clic +Private Sub b_forzarVenta1_Click + borrarVentaForzadaGuna +End Sub + +'Revisa si la venta de Kelloggs se puede borrar, y si SI se puede, la borra. +Private Sub b_borrarVenta2_Click + kb.HideKeyboard + If et_ruta2.Text.Trim <> "" And almacenKelloggs <> "" Then + cmd.Initialize + cmd.Name = "revisa_liquidada_Kell" 'Primero revisamos que no este liquidada o con descuento. + cmd.Parameters = Array As Object(almacenKelloggs, et_ruta2.Text.Trim, tipoVentaKelloggs) + Log($"Revisamos venta liquidada Kelloggs: almacen: ${almacenKelloggs}, ruta: ${et_ruta2.Text}"$) + reqManager.ExecuteQuery(cmd , 0, "revisa_liquidada_Kell", 0) + Else + Toast("Por favor ingrese ruta y almacén 🤦🏽‍♂️", 600) + End If +End Sub + +'Forzamos borrar venta de Kelloggs en clic +Private Sub b_forzarVenta2_Click + borrarVentaForzadaKelloggs +End Sub + +'Forzamos el borrado de la venta de Kelloggs +Sub borrarVentaForzadaKelloggs + Private rutaVenta As Int + If p_borrarVenta.Visible Then + rutaVenta = et_rutaBV.Text.trim + Else + rutaVenta = et_ruta2.Text.Trim + End If + Private usrSoporte As String = "appSoporte" +' Private tipoVenta As String = tipoVentaKelloggs + Private bandera As Int = 1 + cmd.Initialize 'Se borra la venta forzada + cmd.Name = "proc_QUITAR_VENTA_KELL" + cmd.Parameters = Array As Object(almacenKelloggs, rutaVenta, usrSoporte, tipoVentaKelloggs, bandera) + Log("Madamos borrar venta Kellogs: " & almacenKelloggs&"|"& rutaVenta&"|"&usrSoporte&"|"&tipoVentaKelloggs&"|"&bandera) + reqManager.ExecuteCommand(cmd , "borrarVentaKelloggs") +End Sub + +'Forzamos el borrado de la venta de Guna +Sub borrarVentaForzadaGuna + Private rutaVenta As Int + If p_borrarVenta.Visible Then + rutaVenta = et_rutaBV.Text.trim + Else + rutaVenta = et_ruta1.Text.Trim + End If + Private usrSoporte As String = "appSoporte" + Private bandera As Int = 1 + Log("Llamamos proc_QUITAR_VENTA_GUNA") + cmd.Initialize 'Se borra la venta forzada + cmd.Name = "proc_QUITAR_VENTA_GUNA" + cmd.Parameters = Array As Object(almacenGuna, rutaVenta, usrSoporte, bandera) + Log("Madamos borrar venta Guna: " & almacenGuna&"|"& rutaVenta&"|"&usrSoporte&"|"&bandera) + reqManager.ExecuteCommand(cmd , "borrarVentaGuna") +End Sub + +'Borramos la venta de Salma +Private Sub b_borrarVenta3_Click + If et_ruta3.text <> "" And almacenSalma <> "" Then + kb.HideKeyboard + Private rutaVenta As Int = et_ruta3.Text.Trim + Private usrSoporte As String = "appSoporte" + cmd.Initialize + cmd.Name = "proc_QUITAR_VENTA_SALMA" + cmd.Parameters = Array As Object(almacenSalma, rutaVenta, usrSoporte) + Log($"Mandamos borrar venta de Salma, almacen: ${almacenSalma}, ruta: ${rutaVenta}, usuario: '${usrSoporte}'"$) + reqManager.ExecuteCommand(cmd , "borrarVentaSalma") + Else + Toast("Por favor ingrese ruta y almacén 🙄", 600) + End If +End Sub + +'Borramos venta de Danvit +Private Sub b_borrarVenta4_Click + If et_ruta4.text <> "" And almacenDanvit <> "" Then + kb.HideKeyboard + Private rutaVenta As Int = et_ruta4.Text.Trim + Private usrSoporte As String = "appSoporte" + cmd.Initialize + cmd.Name = "proc_QUITAR_VENTA_DANVIT" + cmd.Parameters = Array As Object(almacenDanvit, rutaVenta, usrSoporte) + Log($"Madamos borrar venta Danvit, almacen: ${almacenDanvit}, ruta: ${rutaVenta}, usuario: '${usrSoporte}'"$) + reqManager.ExecuteCommand(cmd , "borrarVentaDanvit") + Else + Toast("Por favor ingrese ruta y almacén 🤦🏽‍♂️", 600) + End If +End Sub + +Private Sub et_ruta2_TextChanged (Old As String, New As String) + b_forzarVenta2.Visible = False +End Sub + +'Detectamos clics en actividad para poner en 'False' la variable 'atrasPresionado' y para ocultar el panel de opciones de desbloqueo. +Sub activity_Click + If atrasPresionado Then atrasPresionado = False + If p_opcDesbloqueo.Visible Then p_opcDesbloqueo.Visible = False +End Sub + +Sub Activity_KeyPress (key As Int) As Boolean + ' BACK key pressed + If key=KeyCodes.KEYCODE_BACK Then + 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.", True) + atrasPresionado = True +' Log("atrasPresionado: True") + ' I want to capture the key here so I return True + Return True + End If +' Returning 'False' signals the system to handle the key + Return False +End Sub + +Sub JobDone(Job As HttpJob) + LogColor("jobDone: " & Job.Tag, Colors.Magenta) + If Job.Success = False Then + LogColor("***** jobDone Error *****", Colors.Red) + If Job.Tag = "borrarVentaKelloggs" Then + Toast("Venta Eliminada.", 0) 'El request de eliminar venta (Stored Procedure) siempre regresa error, asi que asumimos que SI se borro la venta. + b_forzarVenta2.Visible = False + else If Job.Tag = "borrarVentaGuna" Then + Toast("Venta Eliminada.", 0) 'El request de eliminar venta (Stored Procedure) siempre regresa error, asi que asumimos que SI se borro la venta. + b_forzarVenta1.Visible = False +' else If Job.Tag = "borrarVentaSalma" Or Job.Tag = "borrarVentaDanvit" Then +' ToastMessageShow("Venta Eliminada.", False) 'El request de eliminar venta (Stored Procedure) siempre regresa error, asi que asumimos que SI se borro la venta. + '/////////////////// Si hay error de conexion con keymon.lat nos cambiamos a 10.0.0.205 /////////////////////// + else If Job.Tag = "pruebaConexion" And Job.ErrorMessage.IndexOf("Failed to connect to keymon.lat") = -1 Then + DBRSGuna1872 = "http://10.0.0.205:1782" + Dim DBRSMards1873 As String = "http://10.0.0.205:1782" +' DBRSGuna1872 = "http://11.0.0.231:1783" 'Para pruebas locales + reqManager.Initialize(Me, DBRSGuna1872) + conexionDBRS = "interna" + pruebaPaso = pruebaPaso + 1 + Toast("Cambiando a servidor interno. 🕵🏼", 0) +' ToastMessageShow("Cambiando a servidor interno. 🕵🏼", False) + LogColor("Cambiando a servidor interno.", Colors.RGB(255,123,0)) + If pruebaPaso < 2 Then + Log("Reintentamos conexión con servidor nuevo.") + cmd.Initialize + cmd.Name = "select_soporte" 'Reintentamos conexión. + reqManager.ExecuteQuery(cmd , 0, "pruebaConexion", 0) + End If + Else + LogColor("JobDone Error: " & Job.ErrorMessage, Colors.red) + Toast("Error: " & Job.ErrorMessage, 0) + End If + DBRChecked = True 'Prueba de conexión finalizada. + '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Else + DBRChecked = True 'Prueba de conexión finalizada. + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then 'Para desbloquear un usuario Guna. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "desbloqueaUsuario" Then 'query tag + For Each records() As Object In result.Rows + et_usuario.Text = "" + Private pp As BClipboard + pp.setText($"${Subs.generaSaludo}usuario *${usrDesbloqueo}* desbloqueado, por favor cerrar navegadores y reingresar."$) 'Copiamos el texto al portapapeles. +' ToastMessageShow("Mensaje copiado al portapapeles.", False) + Log("Usuario desbloqueado! 🔓") + Toast("Usuario desbloqueado 🔓", 0) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Traemos info de soporte. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "pruebaConexion" Then 'query tag + Log($"Conectado a ${DBRSGuna1872} - ${conexionDBRS}"$) + For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next + pass1 = records(result.Columns.Get("CONTRASENA")) + Next + 'Si la version de la aplicacion es menor que la autorizada, salimos de la aplicación. + If Subs.comparaVersiones(Application.VersionName, records(result.Columns.Get("VERSIONAUTORIZADA"))) = -1 Then + versionOk = False + Msgbox("Disculpe las molestias que estas obras le ocasionan, estamos trabajando para mejorar. 🤹🏽‍♂️", "VERSION EN MANTENIMIENTO") 'ignore + ExitApplication + End If + versionOk = True + p_backLogin.Visible = True + et_login.Visible = True + ProgressDialogHide + End If + End If +' If Job.JobName = "DBRequest" Then 'Para borrar venta de Guna. +' Dim result As DBResult = reqManager.HandleJob(Job) 'El procedimiento de borrar venta, aunque SI borra la venta, siempre regresa error, así que este IF en realidad no se usa!! +' If result.Tag = "borrarVentaGuna" Then 'query tag +' For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next +' Log("Rows - " & result.Rows.Size) +' Toast("Venta Eliminada.", 0) +' Next +' End If +' End If + If Job.JobName = "DBRequest" Then 'Traemos los almacenes de Guna. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "almacenesGuna" Then 'query tag + s_almacen1.Add("-= Selecciona =-") + For Each records() As Object In result.Rows + s_almacen1.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + spinnerGunaMap.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + empresasMap.Put("Guna", spinnerGunaMap) +' Log(spinnerGunaMap) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Traemos los almacenes de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "almacenesKelloggs" Then 'query tag + s_almacen2.Add("-= Selecciona =-") + s_almacen2_2.Add("-= Selecciona =-") + For Each records() As Object In result.Rows + s_almacen2.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + s_almacen2_2.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + spinnerKelloggsMap.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + spinnerKelloggs2Map.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + empresasMap.Put("Kelloggs", spinnerKelloggsMap) +' Log(spinnerKelloggsMap) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Traemos los almacenes de Salma. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "almacenesSalma" Then 'query tag + s_almacen3.Add("-= Selecciona =-") + For Each records() As Object In result.Rows + s_almacen3.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + spinnerSalmaMap.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + empresasMap.Put("Salma", spinnerSalmaMap) +' Log(spinnerSalmaMap) + Next + End If + If result.Tag = "almacenesMards" Then 'query tag + s_almacenMards.Add("-= Selecciona =-") + For Each records() As Object In result.Rows + s_almacenMards.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + spinnerMardsMap.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + empresasMap.Put("Mards", spinnerMardsMap) +' Log(spinnerMardsMap) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Traemos los almacenes de Danvit. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "almacenesDanvit" Then 'query tag + s_almacen4.Add("-= Selecciona =-") + For Each records() As Object In result.Rows + s_almacen4.Add(records(result.Columns.Get("CAT_AG_NOMBRE"))) + spinnerDanvitMap.Put(records(result.Columns.Get("CAT_AG_NOMBRE")), records(result.Columns.Get("CAT_AG_ID"))) + empresasMap.Put("Danvit", spinnerDanvitMap) +' Log(spinnerDanvitMap) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Regresamos validación de si la venta esta liquidada (Kellogg's). + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "revisa_liquidada_Kell" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + If records(result.Columns.Get("LIQUIDADA")) > 0 Then + Log("La venta ya esta impresa, forzar el borrado??") +' ToastMessageShow("La ruta ya esta impresa!", True) + Msgbox("La venta ya esta impresa, no es posible borrarla!", "VENTA IMPRESA") 'ignore + If p_borrarVenta.Visible Then + b_forzarVentaBV.Visible = True + Else + b_forzarVenta2.Visible = True + End If + Else + borrarVentaForzadaKelloggs + End If + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Regresamos validación de si la venta esta liquidada (Guna). + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "revisa_liquidada_Guna" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + If records(result.Columns.Get("LIQUIDADA")) > 0 Then + Log("La venta ya esta impresa, forzar el borrado??") +' ToastMessageShow("La ruta ya esta impresa!", True) + Msgbox("La venta ya esta impresa, no es posible borrarla!", "VENTA IMPRESA") 'ignore + b_forzarVenta1.Visible = True + Else + borrarVentaForzadaGuna + End If + Next + End If + End If +' If Job.JobName = "DBRequest" Then 'Borramos la venta de Salma o Danvit. +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "borrarVentaSalma" Or result.Tag = "borrarVentaDanvit" Then 'query tag +' For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next +' Toast("Venta Eliminada.", 0) +' Next +' End If +' End If + If Job.JobName = "DBRequest" Then 'Borramos la venta de Guna, Kelloggs, Danvit, Salma o Mards. + Dim result As DBResult = reqManager.HandleJob(Job) + Private rutaBorrada As String = "" + If result.Tag = "borrarVentaGuna" Or _ + result.Tag = "borrarVentaKelloggs" Or _ + result.Tag = "borrarVentaSalma" Or _ + result.Tag = "borrarVentaMards" Or _ + result.Tag = "borrarVentaDanvit" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("ProcSuccess - Rows: " & result.Rows.Size) + Toast("Venta Eliminada.", 0) + If result.Tag = "borrarVentaGuna" Then rutaBorrada = et_ruta1.Text + If result.Tag = "borrarVentaKelloggs" Then rutaBorrada = et_ruta2.Text + If result.Tag = "borrarVentaSalma" Then rutaBorrada = et_ruta3.Text + If result.Tag = "borrarVentaMards" Then rutaBorrada = et_rutaMards.Text + If result.Tag = "borrarVentaDanvit" Then rutaBorrada = et_ruta4.Text + Log(spinnerGunaMap.Keys) + Private pp As BClipboard + pp.setText($"${Subs.generaSaludo}venta de la ruta *${rutaBorrada}*, del almacén *${almacenDeRuta}* eliminada!"$) 'Copiamos el texto al portapapeles. + et_ruta1.Text = "" + et_ruta2.Text = "" + et_ruta3.Text = "" + et_ruta4.Text = "" + et_rutaMards.Text = "" + et_rutaBV.Text = "" + s_almacen1.SelectedIndex = 0 + s_almacen2.SelectedIndex = 0 + s_almacen3.SelectedIndex = 0 + s_almacen4.SelectedIndex = 0 + s_almacenMards.SelectedIndex = 0 + s_almacenBV.SelectedIndex = 0 + s_tipoVentaBV.SelectedIndex = 0 + b_forzarVenta1.Visible = False 'Escondemos el boton de forzar borrado de Guna. + b_forzarVenta2.Visible = False 'Escondemos el boton de forzar borrado de Kelloggs. + b_forzarVentaBV.Visible = False 'Escondemos el boton de forzar borrado de Global. + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Buscams datos de usuario. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_todos_soporte" Then 'query tag + Dim cs, cs2 As CSBuilder + lv_resultadosBusqueda.Clear + For Each records() As Object In result.Rows + cs.Initialize + cs2.Initialize + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + lv_resultadosBusqueda.AddTwoLines(cs.Color(Colors.RGB(255,0,0)).Append("U: ").Pop.Append(records(result.Columns.Get("CAT_LO_USUARIO"))).Color(Colors.RGB(255,0,0)).Append(" N: ").Pop.Append(records(result.Columns.Get("CAT_LO_NOMBRE"))).PopAll, _ + cs2.Color(Colors.RGB(255,0,0)).Append("A: ").Pop.Append(records(result.Columns.Get("CAT_AG_NOMBRE"))).Color(Colors.RGB(255,0,0)).Append(" R: ").Pop.Append(records(result.Columns.Get("CAT_RU_RUTA"))).Color(Colors.RGB(255,0,0)).Append(" E: ").Pop.Append(records(result.Columns.Get("CAT_LO_ESTATUS"))).Color(Colors.RGB(255,0,0)).Append(" C: ").Pop.Append(records(result.Columns.Get("CAT_LO_CONTRASENA"))).PopAll) + Next + If result.Rows.Size > 19 Then Toast("Solo se muestran los primeros 20 resultados.", 600) + End If + End If + If Job.JobName = "DBRequest" Then 'Buscamos si existe la venta. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_ventaXrutaGuna_soporte" Then 'query tag +' Log(reqManager.HandleJob(Job).Rows.Size) +' Log(result.Rows.Size) + For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next + Toast($"Ruta ${records(result.Columns.Get("HVD_RUTA"))}${CRLF}$$1.2{records(result.Columns.Get("MONTO"))}, ${records(result.Columns.Get("HVD_TIPOVENTA"))}"$, 0) + Next + Subs.logJobDoneResultados(result) + If result.Rows.Size = 0 Then Toast("NO HAY VENTA", 0) + End If + End If + If Job.JobName = "DBRequest" Then 'Buscamos si existe la venta. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_ventaXrutaKelloggs_soporte" Then 'query tag + Log(reqManager.HandleJob(Job).Rows.Size) + Log(result.Rows.Size) + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Toast($"Ruta ${records(result.Columns.Get("HVD_RUTA"))}${CRLF}$$1.2{records(result.Columns.Get("MONTO"))}, ${records(result.Columns.Get("HVD_TIPOVENTA"))}"$, 0) + Next + If result.Rows.Size = 0 Then Toast("NO HAY VENTA", 0) + End If + End If + If Job.JobName = "DBRequest" Then 'Buscamos si existe la venta. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_ventaXrutaSalma_soporte" Then 'query tag +' Log(reqManager.HandleJob(Job).Rows.Size) +' Log(result.Rows.Size) + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Toast($"Ruta ${records(result.Columns.Get("HVD_RUTA"))}${CRLF}$$1.2{records(result.Columns.Get("MONTO"))}"$, 0) + Next + If result.Rows.Size = 0 Then Toast("NO HAY VENTA", 0) + End If + If result.Tag = "select_ventaXrutaMards_soporte" Then 'query tag +' Log(reqManager.HandleJob(Job).Rows.Size) +' Log(result.Rows.Size) + Subs.logJobDoneResultados(result) + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Toast($"Ruta ${records(result.Columns.Get("HVD_RUTA"))}${CRLF}$$1.2{records(result.Columns.Get("MONTO"))}"$, 0) + Next + If result.Rows.Size = 0 Then Toast("NO HAY VENTA", 0) + End If + End If + If Job.JobName = "DBRequest" Then 'Buscamos si existe la venta. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_ventaXrutaDanvit_soporte" Then 'query tag +' Log(reqManager.HandleJob(Job).Rows.Size) +' Log(result.Rows.Size) + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Toast($"Ruta ${records(result.Columns.Get("HVD_RUTA"))}${CRLF}$$1.2{records(result.Columns.Get("MONTO"))}"$, 0) + Next + If result.Rows.Size = 0 Then Toast("NO HAY VENTA", 0) + End If + End If + If Job.JobName = "DBRequest" Then 'Borramos el ticket de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "revisaTicketLiquidadoKelloggs" Then 'query tag + For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next + If records(result.Columns.Get("ESTATUS")) = "Liquidado" Then + Toast("Ticket LIQUIDADO, no se puede borrar", 600) + Else + cmd.Name = "proc_QUITAR_TICKET_KELLOGGS" + cmd.Parameters = Array As Object(records(result.Columns.Get("HVD_CEDIS")), records(result.Columns.Get("CLIENTE")), "appSoporte") + Log($"Mandamos borrar: almacen=${records(result.Columns.Get("HVD_CEDIS"))}, cliente=${records(result.Columns.Get("CLIENTE"))}"$) + reqManager.ExecuteCommand(cmd, "borrarTicketKelloggs") + End If + Log("Success - Rows: " & result.Rows.Size) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Borramos el ticket de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "borrarTicketKelloggs" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("ProcSuccess - Rows: " & result.Rows.Size) + Toast("Ticket Eliminado.", 0) + et_cliente.Text = "" + s_almacen2_2.SelectedIndex = 0 + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Revisamos el ticket de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + Private costoTotal As Float = 0 + liquidada = False + If result.Tag = "revisaTicketKelloggs" Then 'query tag + Dim cs, cs2 As CSBuilder + lv_ticket.Clear + prodsList.Initialize + If result.Rows.Size > 0 Then p_ticket.Visible = True + For Each records() As Object In result.Rows + cs.Initialize + cs2.Initialize +' For Each k As String In result.Columns.Keys +' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next + Private esteStatus As String = records(result.Columns.Get("ESTATUS")) + If esteStatus = "Liquidado" Then liquidada = True + prodsList.Add(CreateMap("id":records(result.Columns.Get("PRODUCTO_ID")), "P":records(result.Columns.Get("NOMBRE_PRODUCTO")), "cant":records(result.Columns.Get("CANTIDAD")), "almacen":records(result.Columns.Get("HVD_CEDIS")), "tipo":records(result.Columns.Get("TIPOVENTA")))) + lv_ticket.AddTwoLines(cs.Color(Colors.RGB(255,0,0)).Append("ID:").Pop.Append(records(result.Columns.Get("PRODUCTO_ID"))).Color(Colors.RGB(255,0,0)).Append(" P: ").Pop.Append(records(result.Columns.Get("NOMBRE_PRODUCTO"))).PopAll, _ + cs2.Color(Colors.RGB(255,0,0)).Append("Cant: ").Pop.Append(records(result.Columns.Get("CANTIDAD"))).Color(Colors.RGB(255,0,0)).Append(" Costo Total: ").Pop.Append($"$$1.2{records(result.Columns.Get("COSTO_TOTAL"))}"$).Color(Colors.RGB(255,0,0)).Append(" Almacen: ").Pop.Append(records(result.Columns.Get("HVD_CEDIS"))).Color(Colors.RGB(255,0,0)).Append(" " & esteStatus.ToUpperCase ).PopAll) + If records(result.Columns.Get("COSTO_TOTAL")) <> "" Then costoTotal = costoTotal + records(result.Columns.Get("COSTO_TOTAL")) +' Log($"|${records(result.Columns.Get("COSTO_TOTAL"))}| - |${costoTotal}|"$) + Next +' For i=0 To 10 +' cs.Initialize +' cs2.Initialize +' prodsList.Add(CreateMap("id":i, "P":i, "cant":i, "almacen":i)) +'' lv_ticket. +' lv_ticket.AddTwoLines(cs.Color(Colors.RGB(255,0,0)).Append("ID:").Pop.Append(i).Color(Colors.RGB(255,0,0)).Append(" P: ").Pop.Append(i).PopAll, _ +' cs2.Color(Colors.RGB(255,0,0)).Append("Cant: ").Pop.Append(i).Color(Colors.RGB(255,0,0)).Append(" Costo Total: ").Pop.Append($"$$1.2{i}"$).Color(Colors.RGB(255,0,0)).Append(" Almacen: ").Pop.Append(i).Color(Colors.RGB(255,0,0)).Append(" " & esteStatus.ToUpperCase ).PopAll) +' Next + Toast("Productos: " & result.Rows.Size & " Total $" & $"$1.2{costoTotal}"$, 350) + If result.Rows.Size = 0 Then l_SinProductos.Visible = True Else l_SinProductos.Visible = False + If liquidada Then + MsgboxAsync("Ya no se pueden borrar productos de este ticket.", "Ticket Liquidado") + End If + End If + End If + If Job.JobName = "DBRequest" Then 'Borramos pago duplicado de pagare de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "borrarPagoPagareDuplicado" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("ProcSuccess - Rows: " & result.Rows.Size) + Toast("Pago duplicado Eliminado.", 0) + et_cliente.Text = "" + s_almacen2_2.SelectedIndex = 0 + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Liberamos la bandera de facturación de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "liberaBanderaFacturacion" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("ProcSuccess - Rows: " & result.Rows.Size) + Toast("Bandera de Facturacion LIBERADA.", 0) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Liberamos la bandera de carga foranea de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "liberaBanderaCargaForanea" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("ProcSuccess - Rows: " & result.Rows.Size) + Toast("Bandera de Carga Foranea LIBERADA.", 0) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Liberamos la bandera de carga foranea de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "borraProductoTicket" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next +' Log("ProcSuccess - Rows: " & result.Rows.Size) +' Toast("Bandera de Carga Foranea LIBERADA.", 0) + Next + End If + End If + If Job.JobName = "DBRequest" Then 'Liberamos la bandera de carga foranea de Kelloggs. + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "copiaProdHVD2" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + Log("Producto copiado a hist_ventas_detalle_2") +' Toast("Bandera de Carga Foranea LIBERADA.", 0) + Next + End If + If result.Tag = "borrarVentaGlobal" Then + Subs.logJobDoneResultados(result) + s_almacenBV.SelectedIndex = 0 + et_rutaBV.Text = "" + s_tipoVentaBV.SelectedIndex = 0 + Toast("Venta Eliminada.", 0) + End If + End If + Job.Release + End If +End Sub + +'Revisamos que la contraseña ingresada sea la correcta para el día y hora. +Private Sub et_login_TextChanged (Old As String, New As String) + Private contrasenaHoy As String = pass1 & DateTime.GetDayOfMonth(DateTime.Now) & DateTime.GetHour(DateTime.now) + If New = contrasenaHoy Then + p_login.Visible = False + Sleep(80) + et_usuario.Text = "" + If Not(versionOk) Then ExitApplication 'Si la version no es correcta, salimos de la aplicacion. + kb.HideKeyboard + End If +End Sub + +'Muestra un toast con texto y ancho dados, si el ancho es 0, entonces se queda el default. +Sub Toast(texto As String, ancho As Int) + p_toast.BringToFront + If ancho <> 0 Then p_toast.Width = ancho + p_toast.left = (Activity.Width/2)-(p_toast.Width/2) 'Centramos el panel en la actividad. + l_toast.Width = p_toast.Width + p_toast.top = (Activity.Height * 0.8) 'Ponemos el toast a 3/4 de la pantalla. + l_toast.Text = texto + p_toast.SetVisibleAnimated(1000, True) + Sleep(2000) + p_toast.SetVisibleAnimated(1000, False) +End Sub + +'Mostramos u ocultamos el panel de opciones de desbloqueo. +Sub b_desbloquea_longClick + If p_opcDesbloqueo.Visible Then + p_opcDesbloqueo.Visible = False + Else + p_opcDesbloqueo.Visible = True + End If +End Sub + +'Si se modifica el checkbox de "Forzar mayusculas" de las opciones de desbloqueo, guardamos la configuración. +Private Sub cb_usrMayusc_CheckedChange(Checked As Boolean) + p_opcDesbloqueo.Visible = False + Private cb As String = "0" + If cb_usrMayusc.Checked Then cb = "1" + Starter.mayusculasDesbloqueo = cb + Starter.confMap.Put("mayusculasDesbloqueo", cb) + Subs.escribreConf +End Sub + +Private Sub et_usr_TextChanged (Old As String, New As String) + If New.Length > 2 Then buscaUsuario +End Sub + +Private Sub et_almacen_TextChanged (Old As String, New As String) + If New.Length > 2 Then buscaUsuario +End Sub + +Private Sub et_ruta_TextChanged (Old As String, New As String) + If New.Length > 1 Then buscaUsuario +End Sub + +Private Sub b_buscarUsr_Click + buscaUsuario + kb.HideKeyboard +End Sub + +Sub buscaUsuario + Private usr As String = et_usr.text.Trim + Private alm As String = et_almacen.text.Trim + Private rut As String = et_ruta.text.Trim + cmd.Initialize + cmd.Name = $"select_todos${usrEmpresa}_soporte"$ + cmd.Parameters = Array As Object(usr, usr, alm, rut) + Log($"Buscar: ${usrEmpresa}, ${alm}, ${usr}, ${rut}"$) + reqManager.ExecuteQuery(cmd, 0 , $"select_todos_soporte"$, 0) +End Sub + +Private Sub b_revisaVenta_Click + kb.HideKeyboard + Private rut As String = et_ruta1.text.Trim + cmd.Name = "select_ventaXrutaGuna_soporte" + cmd.Parameters = Array As Object(rut, almacenGuna) + Log($"mandamos: ruta=${rut}, almacen=${almacenGuna}"$) + reqManager.ExecuteQuery(cmd, 0 , "select_ventaXrutaGuna_soporte", 0) +End Sub + +Private Sub b_revisaVenta2_Click + kb.HideKeyboard + Private rut As String = et_ruta2.text.Trim + cmd.Name = "select_ventaXrutaKelloggs_soporte" + cmd.Parameters = Array As Object(rut, almacenKelloggs, tipoVentaKelloggs) + Log($"mandamos: ruta=${rut}, almacen=${almacenKelloggs}"$) + reqManager.ExecuteQuery(cmd, 0 , "select_ventaXrutaKelloggs_soporte", 0) +End Sub + +Private Sub b_revisaVenta3_Click + kb.HideKeyboard + Private rut As String = et_ruta3.text.Trim + cmd.Name = "select_ventaXrutaSalma_soporte" + cmd.Parameters = Array As Object(rut, almacenSalma) + Log($"mandamos: ruta=${rut}, almacen=${almacenSalma}"$) + reqManager.ExecuteQuery(cmd, 0 , "select_ventaXrutaSalma_soporte", 0) +End Sub + +Private Sub b_revisaVenta4_Click + kb.HideKeyboard + Private rut As String = et_ruta4.text.Trim + cmd.Name = "select_ventaXrutaDanvit_soporte" + cmd.Parameters = Array As Object(rut, almacenDanvit) + Log($"mandamos: ruta=${rut}, almacen=${almacenDanvit}"$) + reqManager.ExecuteQuery(cmd, 0 , "select_ventaXrutaDanvit_soporte", 0) +End Sub + +Private Sub s_usrEmpresa_ItemClick (Position As Int, Value As Object) + usrEmpresa = Value +End Sub + +Private Sub s_almacen2_2_ItemClick (Position As Int, Value As Object) + almacenKelloggs2 = spinnerKelloggs2Map.Get(Value) + Log($"Almacén ${almacenKelloggs2} de Kelloggs 2 seleccionado"$ ) +End Sub + +Private Sub b_borrarTicket_Click + kb.HideKeyboard + cmd.Name = "select_prodsTicket_Kelloggs" + cmd.Parameters = Array As Object(almacenKelloggs2, et_cliente.Text.Trim) + Log($"Mandamos: almacen=${almacenKelloggs2}, cliente=${et_cliente.Text}"$) + reqManager.ExecuteQuery(cmd, 1, "revisaTicketLiquidadoKelloggs", 0) +End Sub + +Private Sub b_revisaTicket_Click + Log("revisando") + kb.HideKeyboard + p_ticket.Width = Activity.Width * 0.95 + p_ticket.Left = (Activity.Width/2) - (p_ticket.Width/2) + Subs.centraEtiquetaEnPanel(l_SinProductos, p_ticket) + Subs.centraBotonEnPanel(b_cerrarTicket, p_ticket) + p_ticket.BringToFront +' p_ticket.Visible = True + lv_ticket.Clear + cmd.Name = "select_prodsTicket_Kelloggs" + cmd.Parameters = Array As Object(almacenKelloggs2, et_cliente.Text.Trim) + Log($"Mandamos: almacen=${almacenKelloggs2}, cliente=${et_cliente.Text}"$) + reqManager.ExecuteQuery(cmd, 0, "revisaTicketKelloggs", 0) +End Sub + +Private Sub b_borrarPagare_Click + kb.HideKeyboard + cmd.Name = "proc_QUITAR_PAGOPAGARE_KELLOGGS" + cmd.Parameters = Array As Object(et_referencia.text.Trim, et_folio.Text.Trim, et_monto.Text.Trim) + Log($"Mandamos: ref:${et_referencia.text}, folio:${et_folio.Text}, monto:${et_monto.Text}"$) + reqManager.ExecuteCommand(cmd, "borrarPagoPagareDuplicado") +End Sub + +Private Sub b_libBanderaFactura_Click + kb.HideKeyboard + cmd.Name = "proc_LIBERA_BANDERA_FACTURACION_KELLOGGS" +' cmd.Parameters = Array As Object(et_referencia.text, et_folio.Text, et_monto.Text) +' Log($"Mandamos: ref:${et_referencia.text}, folio:${et_folio.Text}, monto:${et_monto.Text}"$) + Log("Llamamos procedimiento liberar bandera facturacion") + reqManager.ExecuteCommand(cmd, "liberaBanderaFacturacion") +End Sub + +Private Sub b_libBanderaCargaForanea_Click + kb.HideKeyboard + cmd.Name = "proc_LIBERA_BANDERA_CARGAFORANEA_KELLOGGS" + cmd.Parameters = Array As Object("101", "") + Log("Llamamos procedimiento liberar carga foranea") + reqManager.ExecuteCommand(cmd, "liberaBanderaCargaForanea") +End Sub + +Private Sub b_cerrarTicket_Click + p_ticket.Visible = False + l_SinProductos.Visible = False +End Sub + +Private Sub p_ticket_Click + +End Sub + +Private Sub lv_ticket_ItemClick (Position As Int, Value As Object) + Log(prodsList.get(Position)) ' SUR 9120761 + If Not(liquidada) And prodsList.Size > 1 Then + Msgbox2Async($"Deseas borrar el producto ${prodsList.Get(Position).As(Map).Get("id")}"$, "Borrar Producto", "Borrar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (Result As Int) + If Result = DialogResponse.POSITIVE Then + ' borrarProducto + Log("Borramos producto " & prodsList.Get(Position).As(Map).Get("id")) + Private m As Map = prodsList.get(Position) + Log(m) + lv_ticket.RemoveAt(Position) + prodsList.RemoveAt(Position) + + cmd.Name = "insertIntoHVD2" + cmd.Parameters = Array As Object(et_cliente.Text, m.Get("id"), m.Get("cant"), m.Get("tipo"), m.Get("almacen")) + Log($"Mandamos ${et_cliente.Text}, ${m.Get("id")}, ${m.Get("cant")}, ${m.Get("tipo")}, ${m.Get("almacen")}"$) + reqManager.ExecuteCommand(cmd, "copiaProdHVD2") + + cmd.Name = "delete_ProdTicket" + cmd.Parameters = Array As Object(et_cliente.Text, m.Get("id"), m.Get("cant"), m.Get("tipo"), m.Get("almacen"), m.Get("P")) + Log($"Mandamos ${et_cliente.Text}, ${m.Get("id")}, ${m.Get("cant")}, ${m.Get("tipo")}, ${m.Get("almacen")}, ${m.Get("P")}"$) + reqManager.ExecuteCommand(cmd, "borraProductoTicket") + End If + Log(prodsList) + End If +End Sub + +Private Sub b_revisaVentaMards_Click + kb.HideKeyboard + Private rut As String = et_rutaMards.text.Trim + cmd.Name = "select_ventaXrutaMards_soporte" + cmd.Parameters = Array As Object(rut, almacenMards) + Log($"mandamos: ruta=${rut}, almacen=${almacenMards}"$) + reqManager.ExecuteQuery(cmd, 0 , "select_ventaXrutaMards_soporte", 0) +End Sub + +Private Sub b_borrarVentaMards_Click + If et_rutaMards.text <> "" And almacenMards <> "" Then + kb.HideKeyboard + Private rutaVenta As Int = et_rutaMards.Text.Trim + Private usrSoporte As String = "appSoporte" + cmd.Initialize + cmd.Name = "proc_QUITAR_VENTA_MARDS" + cmd.Parameters = Array As Object(almacenMards, rutaVenta, usrSoporte) + Log($"Mandamos borrar venta de Mards, almacen: ${almacenMards}, ruta: ${rutaVenta}, usuario: '${usrSoporte}'"$) + reqManager.ExecuteCommand(cmd , "borrarVentaMards") + Else + Toast("Por favor ingrese ruta y almacén 🙄", 600) + End If +End Sub + +Private Sub b_forzarVentaBV_Click + +End Sub + +Private Sub b_borrarVentaBV_Click + If et_rutaBV.text <> "" And almacenEmpresa <> "" Then + kb.HideKeyboard + Private rutaVenta As Int = et_rutaBV.Text.Trim + Private usrSoporte As String = "appSoporte" + cmd.Initialize + Private laEmp As String = laEmpresa.ToUpperCase + + If laEmp = "KELLOGGS" Then + cmd.Name = "revisa_liquidada_Kell" 'Primero revisamos que no este liquidada o con descuento. + cmd.Parameters = Array As Object(almacenEmpresa, rutaVenta, elTipoDeVenta) + Log($"Revisamos venta liquidada Kelloggs: almacen: ${almacenEmpresa}, ruta: ${rutaVenta}, tipoVenta:${elTipoDeVenta}"$) + reqManager.ExecuteQuery(cmd , 0, "revisa_liquidada_Kell", 0) + else if laEmp = "GUNA" Then + cmd.Name = "revisa_liquidada_Guna" 'Primero revisamos que no este liquidada o con descuento. + cmd.Parameters = Array As Object(almacenEmpresa, rutaVenta) + Log($"Revisamos venta liquidada Guna: almacen: ${almacenEmpresa}, ruta: ${rutaVenta} "$) + reqManager.ExecuteQuery(cmd , 0, "revisa_liquidada_Guna", 0) + Else + If laEmpresa = "Kelloggs" Then laEmp = "KELL" + cmd.Name = $"proc_QUITAR_VENTA_${laEmp}"$ + Log($"proc_QUITAR_VENTA_${laEmp}"$) + cmd.Parameters = Array As Object(almacenEmpresa, rutaVenta, usrSoporte) + Log($"Mandamos borrar venta de Mards, almacen: ${almacenEmpresa}, ruta: ${rutaVenta}, usuario: '${usrSoporte}'"$) + reqManager.ExecuteCommand(cmd , "borrarVentaGlobal") + + End If + + + Else + Toast("Por favor ingrese ruta y almacén 🙄", 600) + End If +End Sub + +Private Sub b_revisarVentaBV_Click + kb.HideKeyboard + Private rut As String = et_rutaBV.text.Trim + cmd.Name = $"select_ventaXruta${laEmpresa}_soporte"$ + cmd.Parameters = Array As Object(rut, almacenEmpresa) + Log($"mandamos: ruta=${rut}, almacen=${almacenEmpresa}, select_ventaXruta${laEmpresa}_soporte"$) + reqManager.ExecuteQuery(cmd, 0 , $"select_ventaXruta${laEmpresa}_soporte"$, 0) +End Sub + +Private Sub s_tipoVentaBV_ItemClick (Position As Int, Value As Object) + elTipoDeVenta = value +End Sub + +Private Sub et_rutaBV_TextChanged (Old As String, New As String) + +End Sub + +Private Sub s_almacenBV_ItemClick (Position As Int, Value As Object) + almacenEmpresa = spinnerEmpresaMap.Get(Value) + almacenDeRuta = Value + Log(Value) + Log($"Almacén ${almacenEmpresa} de ${laEmpresa} seleccionado"$ ) +End Sub + +Private Sub s_empresaBV_ItemClick (Position As Int, Value As Object) + laEmpresa = Value + If laEmpresa = "Kelloggs" Then + l_tipoVentaBV.Visible = True + s_tipoVentaBV.Visible = True + p_tipoVentaBV.Visible = True + Else + l_tipoVentaBV.Visible = False + s_tipoVentaBV.Visible = False + p_tipoVentaBV.Visible = False + End If + If laEmpresa = "Mards" Then + reqManager.Initialize(Me, DBRSMards1873) + Else + reqManager.Initialize(Me, DBRSGuna1872) + End If + spinnerEmpresaMap = empresasMap.Get(Value) +' Log(empresasMap & "|" & Value) +' Log($"${spinnerEmpresaMap}"$) + s_almacenBV.Clear + s_almacenBV.Add("-= Seleccione =-") + For Each e In empresasMap.Get(Value).As(Map).Keys +' Log(e) + s_almacenBV.Add(e) + Next + s_almacenBV.SelectedIndex = 0 + Log($"Empresa seleccionada: ${Value}"$ ) +End Sub \ No newline at end of file