diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas index b88f5d1..635c6cb 100644 --- a/B4A/B4XMainPage.bas +++ b/B4A/B4XMainPage.bas @@ -179,7 +179,8 @@ Private Sub B4XPage_Created (Root1 As B4XView) skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_PRO3054(H_IDCLIENTE TEXT)") skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_PRO3055(H_IDCLIENTE TEXT)") skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_SUPLENCIA(RS_RUTA TEXT)") - skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_GUNAPROD2 (CAT_GP_INICIATIVA TEXT, CAT_GP_TIPOPROD TEXT, CAT_GP_DEV TEXT, CAT_GP_ALMACEN NUMERIC, CAT_GP_ID TEXT, CAT_GP_NOMBRE TEXT, CAT_GP_IMP1 TEXT, CAT_GP_IMP2 TEXT, CAT_GP_PRECIO TEXT, CAT_GP_CLASIF TEXT, CAT_GP_STS TEXT, CAT_GP_TIPO TEXT, CAT_GP_SUBTIPO TEXT, CAT_GP_IMG BLOB, CAT_GP_CODPROMO TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_SUPLENCIA(RS_RUTA TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TICKET_IMPRESO (idCliente TEXT)") ' skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_VARIABLES (CAT_VA_DESCRIPCION TEXT, CAT_VA_VALOR TEXT)") Subs.agregaColumna("HIST_ENCUESTA", "HE_LAT", "TEXT") Subs.agregaColumna("HIST_ENCUESTA", "HE_FOTO", "BLOB") diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas index de9fc91..e1f6049 100644 --- a/B4A/C_Cliente.bas +++ b/B4A/C_Cliente.bas @@ -431,6 +431,13 @@ Sub Class_Globals Private b_preventa As Button Dim bitacora As C_Bitacora + Dim p_transparenteTicketImpreso As Panel + Private et_codigoAutorizacion As EditText + Private b_codigoAutorizacion As Button + Private b_cancelarCodigoAutorizacion As Button + Private p_ticketImpreso As Panel + Private b_enviarTicket As Button + Dim archivoTicketPDF As String End Sub 'You can add more parameters here. @@ -473,6 +480,7 @@ Private Sub B4XPage_Created (Root1 As B4XView) End If c.Close s.Close + File.Copy(File.DirAssets,"guna-fondo.jpg",xui.DefaultFolder,"guna-fondo.jpg") TOMAR_FOTO = 0 btAdmin.Initialize("BlueTeeth") cmp20.Initialize("Printer") @@ -480,6 +488,9 @@ Private Sub B4XPage_Created (Root1 As B4XView) SV_ENCUESTA.Width = Root.Height p_pregunta1.Height = Root.Height p_pregunta1.Width = Root.Height + p_transparenteTicketImpreso.Left = 0 : p_transparenteTicketImpreso.top = 0 + p_transparenteTicketImpreso.Width = Root.Width : p_transparenteTicketImpreso.Height = Root.Height + Subs.centraPanel(p_ticketImpreso, p_transparenteTicketImpreso.Width) Tels.Visible = False gest.Visible = False l_version.Left = Root.Width - (l_version.Width + 10) @@ -498,14 +509,14 @@ Sub B4XPage_Appear indicePregunta = 0 If TOMAR_FOTO <> 0 Then Cuestionario Starter.idCliente = Subs.traeCliente - Log(Subs.traeCliente) +' Log(Subs.traeCliente) If Subs.traeCliente = "0" Then tipo_venta = "ABORDO" Log(1) Log("ABORDO") Else tipo_venta = Subs.traeTipoVentaDeBD - Log(2) +' Log(2) Log(Subs.traeTipoVentaDeBD) End If B4XPages.MainPage.tipo_venta = tipo_venta @@ -979,7 +990,7 @@ Sub GPS_LocationChanged (Location1 As Location) gest.Visible = False Tels.Visible = False ' p_transparenteInicioFin.Visible = False - Log(999) +' Log(999) ' b_Inicio_Fin_venta.Visible = False End If End If @@ -1230,8 +1241,45 @@ Sub JobDone(Job As HttpJob) End If Next End If + + If result1.Tag = "codigoAutorizacion" Then + If result1.Rows.Size > 0 Then + Log("Si hay codigo de autorizaion") + For Each records() As Object In result1.Rows + For Each k As String In result1.Columns.Keys + Log(k & ": " & records(result1.Columns.Get(k))) + Next + Next + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "delete_codigoAutorizacion" + cmd.Parameters = Array As Object(et_codigoAutorizacion.Text.Trim, Subs.traeRuta, Subs.traeAlmacen) + reqManager.ExecuteCommand(cmd , "deleteCodigoAutorizacion") + DateTime.DateFormat = "YYYY/MM/dd HH:mm:ss" + cmd.Initialize + cmd.Name = "update_codigoAutorizacion" +' Log($"(${DateTime.Date(DateTime.Now)}, ${Subs.traeUsuarioDeBD}, ${et_codigoAutorizacion.Text.Trim}, ${Subs.traeRuta}, ${Subs.traeAlmacen}"$) + cmd.Parameters = Array As Object(DateTime.Date(DateTime.Now), Subs.traeUsuarioDeBD, et_codigoAutorizacion.Text.Trim, Subs.traeRuta, Subs.traeAlmacen) + reqManager.ExecuteCommand(cmd , "updateCodigoAutorizacion") + Starter.skmt.ExecNonQuery("delete from ticket_impreso where idCliente in (select cuenta from cuentaa)") + p_transparenteTicketImpreso.Visible = False + et_codigoAutorizacion.Text = "" + teclado.HideKeyboard + ToastMessageShow("Listo, ya se puede modificar la venta.", True) + Else + ToastMessageShow("El codigo es incorrecto, por favor revise y vuelva a intentar!!", True) + End If + End If + If result1.Tag = "delete_codigoAutorizacion" Then + Log("Codigo Borrado!!") + End If + If result1.Tag = "updateCodigoAutorizacion" Then + Log("Codigo Actualizado") + End If End If + + ' If Job.JobName = "DBRequest" Then ' Dim result1 As DBResult = reqManager.HandleJob(Job) ' If result1.Tag = "CHECAENCUESTA" Then 'query tag @@ -1260,52 +1308,40 @@ Sub ListView1_ItemLongClick (Position As Int, Value As Object) End Sub Sub gest_Click - - c=B4XPages.MainPage.skmt.ExecQuery("select IFNULL(encuesta,0) AS encuesta from kmt_info2 where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") - c.Position = 0 - If c.GetString("encuesta") = "0" Then - Dim Intent1 As Intent - Dim enviorutas As String = "guna://tienda360/config?clienteId="&la_cuenta.Text&"&almacen="&ALMACEN&"&ruta="&Subs.traeRuta - Log(enviorutas) - Intent1.Initialize(Intent1.ACTION_VIEW, enviorutas) - Try - Starter.encuesta = 1 - - Dim cmd As DBCommand - - - - - - - skmt.ExecNonQuery2("UPDATE kmt_info2 SET encuesta = (?) WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)",Array As Object(1)) - StartActivity(Intent1) + If Not(Subs.revisaImpreso) Then + c=B4XPages.MainPage.skmt.ExecQuery("select IFNULL(encuesta,0) AS encuesta from kmt_info2 where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + If c.GetString("encuesta") = "0" Then + Dim Intent1 As Intent + Dim enviorutas As String = "guna://tienda360/config?clienteId="&la_cuenta.Text&"&almacen="&ALMACEN&"&ruta="&Subs.traeRuta + Log(enviorutas) + Intent1.Initialize(Intent1.ACTION_VIEW, enviorutas) + Try + Starter.encuesta = 1 + Dim cmd As DBCommand + skmt.ExecNonQuery2("UPDATE kmt_info2 SET encuesta = (?) WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)",Array As Object(1)) + StartActivity(Intent1) + compra + Catch + Starter.encuesta = 0 + Dim cmd As DBCommand + skmt.ExecNonQuery2("UPDATE kmt_info2 SET encuesta = (?) WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)",Array As Object(2)) + ToastMessageShow("La aplicación Tienda 360 no está instalada o no puede manejar la URL.", True) + compra + End Try + cmd.Initialize + cmd.Name = "SELECT_TMP_DROP_ENCUESTA_GUNA" + cmd.Parameters = Array As Object(usuario, B4XPages.MainPage.principal.e_ruta.text, ALMACEN, "ENCUESTA") + B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "CHECAENCUESTA") + Else compra - Catch - - - Starter.encuesta = 0 - Dim cmd As DBCommand - - - - skmt.ExecNonQuery2("UPDATE kmt_info2 SET encuesta = (?) WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)",Array As Object(2)) - ToastMessageShow("La aplicación Tienda 360 no está instalada o no puede manejar la URL.", True) - compra - End Try - cmd.Initialize - cmd.Name = "SELECT_TMP_DROP_ENCUESTA_GUNA" - cmd.Parameters = Array As Object(usuario, B4XPages.MainPage.principal.e_ruta.text, ALMACEN, "ENCUESTA") - B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "CHECAENCUESTA") - + End If Else - compra + p_transparenteTicketImpreso.Visible = True End If - End Sub Sub compra - ' If ALMACEN = "4" Or ALMACEN = "36" Then ' Log(Subs.traeAlmacen) @@ -1320,7 +1356,6 @@ Sub compra ' IZTAPALAPA- 43-- ' CEDA- 54-- ' PACHUCA- 15-- - Private rutasEncuesta As List rutasEncuesta.Initialize2(Array As Int(702, 703, 707, 718, 730, 732, 733, 734)) Private alamcenesEncuesta As List @@ -2076,7 +2111,7 @@ Sub Guardar_Click 'AQUI CAMBIAR Private s3 As Cursor=B4XPages.MainPage.skmt.ExecQuery2("select * FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_RECALCULO <> ? AND PE_RECALCULO <> ? AND PE_RECALCULO <> ?",Array As String("","null",Null)) - LogColor(s3.RowCount,Colors.Yellow) +' LogColor(s3.RowCount,Colors.Yellow) If s3.RowCount > 0 Then Private s As Cursor=B4XPages.MainPage.skmt.ExecQuery2("select iFNULL(sum(pe_costo_tot),0) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_RECALCULO = ? AND PE_RECALCULO = ? AND PE_RECALCULO = ?",Array As String("","null",Null)) s.Position = 0 @@ -2096,6 +2131,8 @@ Sub Guardar_Click B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),NumberFormat2(suma,0,2,2,False), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("delete from TICKET_IMPRESO where idCliente In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery($"insert into TICKET_IMPRESO (idCliente) values ('${Subs.traeCliente}')"$) End If c.Close DateTime.TimeFormat = "HHmmss" @@ -4885,4 +4922,258 @@ End Sub Private Sub b_preventa_Click +End Sub + +Private Sub p_transparenteTicketImpreso_Click + +End Sub + +Private Sub b_codigoAutorizacion_Click + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_codigoAutorizacion" + cmd.Parameters = Array As Object(et_codigoAutorizacion.Text.Trim, Subs.traeRuta, Subs.traeAlmacen) + reqManager.ExecuteQuery(cmd , 0, "codigoAutorizacion") +' p_transparenteTicketImpreso.Visible = False +End Sub + +Private Sub b_cancelarCodigoAutorizacion_Click + p_transparenteTicketImpreso.Visible = False +End Sub + +Private Sub PDFGENERAR + ESPACIO = 0 + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim PDF As cPDF + 'initialize with mm unit + PDF.Initialize("mm") + 'set properties + PDF.sProperty(PDF.PropertyAuthor,"Keymonsoft"). _ + sProperty(PDF.PropertyTitle,"Ticket"). _ + sProperty(PDF.PropertyKeywords,"B4X,PDF,Cross platform") + 'add a page + + Dim s56 As Cursor=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) < 4 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PROID", Array As String("PREVENTA")) + Dim s57 As Cursor = skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) > 3 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + + Dim pagina As Double = ((18 + (s56.RowCount*2) + (s57.RowCount*2)) * (6)) + 18 +' Dim pagina As Double = ((18 + s56.RowCount + s57.RowCount +2) * (6)) + 18 + Dim multiplicador As Int = 0 + PDF.pageAdd(-300,pagina) +' pdf.pageAdd(-350,-1900) + + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + + PDF.outImage(xui.DefaultFolder,"guna-fondo.jpg",1,pagina-45,45,0) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"GUNA") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,sDate& " " & sTime) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Vendedor:" & Subs.traeUsuarioDeBD) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Tienda: " & La_nombre.Text) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"ID.Cliente: " & la_cuenta.Text) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Calle: " & la_Calle.Text) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Colonia: " & la_col.Text) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("PREVENTA")) + If c.RowCount > 0 Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"------------------------------------PREVENTA-----------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + s=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) < 4 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PROID", Array As String("PREVENTA")) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + Else + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) +' LogColor(s.GetLong("L_CANT"),Colors.Magenta) +' LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) +' LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) +' pdf.outtext(1,108-9*6,s.GETSTRING("PE_COSTOU")) + +' pdf.outtext(1,108-9*6,s.GETSTRING("PE_COSTO_TOT") ) + End If + Next + End If + s.Close + PDF.outtext(1,108-9*6," " ) + s=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) > 3 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + If S.RowCount>0 Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------PROMOS PREVENTA-------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + Else + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) + End If + Next + End If + s.Close +' multiplicador = multiplicador +1 +' pdf.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + s=skmt.ExecQuery2("select SUM(PE_COSTO_TOT) AS TOTAL FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As String("PREVENTA")) + s.Position =0 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total preventa: $" & s.GetString("TOTAL") ) + s.Close + c= skmt.ExecQuery2("select sum(PE_CANT) as PC_NOART from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) AND PE_FOLIO = ?", Array As String("PREVENTA")) + C.Position=0 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total articulos preventa: " & c.GetString("PC_NOART") ) + c.Close + End If +' multiplicador = multiplicador +1 +' pdf.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------ESTE TICKET NO ES UN ---------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-------------------COMPROBANTE FISCAL, SOLO ES--------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"---------------------------------INFORMATIVO-----------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) +' 'all combinations of font normal, bold,italic,underline and strikethrough +' For i=0 To 15 +' 'select a font +' pdf.sFont(pdf.fontHelvetica,s,30,pdf.colorBlack) +' 'draw a text at position 20 (from left) and 277 (from bottom) +' pdf.outtext(20,277-i*15,"Hello world!") +' Next + DateTime.DateFormat = "ddmmyyyy" + DateTime.TimeFormat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + archivoTicketPDF = sDate&sTime&".pdf" + 'save to file with compression if data compressed are smaller + savePDF(PDF, archivoTicketPDF, PDF.CompressAlways) + 'open with default viewer +' openPDF(sDate&sTime&".pdf") +End Sub + +private Sub savePDF(apdf As cPDF,afile As String,acompress As Int) + Dim folder As String + #if B4J + folder=xui.DefaultFolder + #End If + #if B4A + folder = Starter.fFileProvider.SharedFolder + #End If + #if B4I + '...... + #End If +' Log("aaa:" & folder) +' Log("bbb:" & B4XPages.MainPage.Provider.SharedFolder) + apdf.saveToFile(folder, afile, acompress) +End Sub + +private Sub openPDF(afile As String) + #if B4J + fx.ShowExternalDocument(File.GetUri(xui.DefaultFolder,afile)) + #end if + #if B4A + Dim in As Intent + in.Initialize(in.ACTION_VIEW, "") + Starter.ffileProvider.SetFileUriAsIntentData(in, afile) + in.SetComponent("android/com.android.internal.app.ResolverActivity") + in.SetType("application/pdf") + StartActivity(in) + #end if + #if B4I + '...... + #End If +End Sub + +Private Sub b_enviarTicket_Click + ProgressDialogShow("Enviando ticket, un momento por favor.") + Log("Progress 1") + PDFGENERAR + enviaTicket + Sleep(1500) + Guardar_Click + ProgressDialogHide + Log("Progress 2") +End Sub + +Private Sub b_enviarTicket_LongClick +' deleteFolder(Starter.fFileProvider.SharedFolder) +End Sub + +Sub enviaTicket + 'copy the shared file to the shared folder +' Log("xxxxxx:"&Starter.fFileProvider) + Sleep(1000) + Dim email As Email + email.To.Add("cheveguerra@gmail.com") + email.Subject = "subject" + email.Attachments.Add(Starter.fFileProvider.GetFileUri(archivoTicketPDF)) + Dim in As Intent = email.GetIntent + in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION + StartActivity(in) End Sub \ No newline at end of file diff --git a/B4A/C_Nota.bas b/B4A/C_Nota.bas index 7e358b6..f1942f8 100644 --- a/B4A/C_Nota.bas +++ b/B4A/C_Nota.bas @@ -159,101 +159,113 @@ Private Sub B4XPage_CloseRequest As ResumableSub End Sub Sub borra_Click - If folio <> "" Then - result = Msgbox2("Seguro que desa borrar el pedido?","Cancelar pedido", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore - If result = DialogResponse.POSITIVE Then - c=B4XPages.MainPage.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - B4XPages.MainPage.skmt.ExecNonQuery2($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) - B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) - Next + If Not(Subs.revisaImpreso) Then + If folio <> "" Then + result = Msgbox2("Seguro que desa borrar el pedido?","Cancelar pedido", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + c=B4XPages.MainPage.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) + Next + End If + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPage_Appear End If - B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") - B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") - B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - B4XPage_Appear + Else + Msgbox("CLIENTE YA SE TRANSMITIO, FAVOR DE LLAMAR A SOPORTE PARA ASISTENCIA","AVISO") 'ignore End If Else - Msgbox("CLIENTE YA SE TRANSMITIO, FAVOR DE LLAMAR A SOPORTE PARA ASISTENCIA","AVISO") 'ignore + ToastMessageShow("La venta ya esta impresa, no se puede modificar!!", True) + B4XPages.MainPage.cliente.p_transparenteTicketImpreso.Visible = True + B4XPages.ShowPage("cliente") End If End Sub Sub ListView1_ItemLongClick (Position As Int, Value As Object) - result = Msgbox2("Seguro que desea borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore - If result = DialogResponse.POSITIVE Then - Private X() As String = Regex.Split(" ", Value) - Log(X) - Log(X.Length) - Private nom As String = "" - For i = 0 To X.Length -1 + If Not(Subs.revisaImpreso) Then + result = Msgbox2("Seguro que desea borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + Private X() As String = Regex.Split(" ", Value) + Log(X) + Log(X.Length) + Private nom As String = "" + For i = 0 To X.Length -1 ' Log(X(i)) - If X(i).Contains(CRLF) Then + If X(i).Contains(CRLF) Then ' Log("Retorno") - End If - If Not(X(i).Contains(CRLF)) Then - nom = nom & " " & X(i) - Else - Exit - End If + End If + If Not(X(i).Contains(CRLF)) Then + nom = nom & " " & X(i) + Else + Exit + End If ' Log(nom) - Next + Next ' Log(nom) - nom = nom.Trim - Private cedis As String = X(X.Length-1) - c=B4XPages.MainPage.skmt.ExecQuery($"select PE_PROID,PE_CANT, PE_FOLIO, PE_CEDIS, PE_PRONOMBRE FROM PEDIDO where pe_pronombre = '${nom}' AND PE_CEDIS = '${cedis}' and pe_cliente in (Select CUENTA from cuentaa)"$) - Log($"select PE_PROID,PE_CANT, PE_FOLIO, PE_CEDIS FROM PEDIDO where pe_pronombre = '${nom}' AND PE_CEDIS = '${cedis}' and pe_cliente in (Select CUENTA from cuentaa)"$) - Log(c.RowCount) - c.Position=0 + nom = nom.Trim + Private cedis As String = X(X.Length-1) + c=B4XPages.MainPage.skmt.ExecQuery($"select PE_PROID,PE_CANT, PE_FOLIO, PE_CEDIS, PE_PRONOMBRE FROM PEDIDO where pe_pronombre = '${nom}' AND PE_CEDIS = '${cedis}' and pe_cliente in (Select CUENTA from cuentaa)"$) + Log($"select PE_PROID,PE_CANT, PE_FOLIO, PE_CEDIS FROM PEDIDO where pe_pronombre = '${nom}' AND PE_CEDIS = '${cedis}' and pe_cliente in (Select CUENTA from cuentaa)"$) + Log(c.RowCount) + c.Position=0 ' If c.RowCount > 0 Then ' B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) - B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) ' c2=B4XPages.MainPage.skmt.ExecQuery($"select count(*) AS CUANTOS from CAT_GUNAPROD where CAT_GP_ID in (select pe_cedis from pedido where pe_pronombre = '${nom}' and pe_cliente in (Select CUENTA from cuentaa)) and CAT_GP_CLASIF = 'PROMOS' AND CAT_GP_TIPO = 'PROMOS' AND CAT_GP_SUBTIPO = 'PROMOS'"$)'Con esto revisamos si el nombre es de una promo ' c2=B4XPages.MainPage.skmt.ExecQuery($"select ISNUMERIC(pe_cedis) AS noEsPromo from pedido where pe_pronombre = '${nom}' and pe_cliente in (Select CUENTA from cuentaa) and pe_cedis = '${cedis}'"$)'Con esto revisamos si el nombre es de una promo ' Log($"select count(*) AS CUANTOS from CAT_GUNAPROD where CAT_GP_ID in (select pe_cedis from pedido where pe_pronombre = '${nom}' and pe_cliente in (Select CUENTA from cuentaa)) and CAT_GP_CLASIF = 'PROMOS' AND CAT_GP_TIPO = 'PROMOS' AND CAT_GP_SUBTIPO = 'PROMOS'"$) ' Log($"select ISNUMERIC(pe_cedis) AS noEsPromo from pedido where pe_pronombre = '${nom}' and pe_cliente in (Select CUENTA from cuentaa) and pe_cedis = '${cedis}'"$) ' c2.Position=0 ' Log("Algo "&c2.GetString("noEsPromo")) - If Not(IsNumber(cedis)) Then + If Not(IsNumber(cedis)) Then ' j3 = B4XPages.MainPage.skmt.ExecQuery2("SELECT PE_CEDIS, PE_CANT,PE_PROID, PE_PRONOMBRE FROM PEDIDO WHERE PE_CEDIS IN (SELECT PE_CEDIS FROM PEDIDO WHERE PE_PRONOMBRE = ?)",Array As String(nom)) ' Log(j3.RowCount) ' If j3.RowCount > 0 Then Log("Soy promo") ' For j = 0 To c.RowCount -1 ' Log("aqui tronare?") -'' c.Position = j - B4XPages.MainPage.skmt.ExecNonQuery($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.GetString("PE_PROID")}'"$) - B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_cedis= ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(cedis, c.GetString("PE_FOLIO"))) + '' c.Position = j + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.GetString("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_cedis= ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(cedis, c.GetString("PE_FOLIO"))) ' Next ' End If ' j3.Close - Else - B4XPages.MainPage.skmt.ExecNonQuery($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.Getstring("PE_PROID")}'"$) - B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cedis = ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(nom, cedis, c.GetString("PE_FOLIO"))) - End If - c.Close + Else + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Subs.traeTablaProds(tipo_venta)} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.Getstring("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cedis = ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(nom, cedis, c.GetString("PE_FOLIO"))) + End If + c.Close ' c2.Close - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - usuario = c.GetString("USUARIO") - c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - If c.GetString("CUANTOS") > 0 Then - B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) - B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - Else - B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Else + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + End If + B4XPage_Appear End If - B4XPage_Appear + Else + B4XPages.MainPage.cliente.p_transparenteTicketImpreso.Visible = True + B4XPages.ShowPage("cliente") + ToastMessageShow("La venta ya esta impresa, no se puede modificar!!", True) End If End Sub diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas index f05bf12..24a5d55 100644 --- a/B4A/C_Principal.bas +++ b/B4A/C_Principal.bas @@ -2231,6 +2231,7 @@ Sub t2_tick B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM ENCUESTA_MODULO5") B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM BITACORAGPS") B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM RUTA_SUPLENCIA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM TICKET_IMPRESO") B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?",Array As String("CARGA_DIA")) B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?",Array As String("pasword")) B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?",Array As String("LATITUD")) @@ -2239,6 +2240,7 @@ Sub t2_tick ' B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?",Array As String("FORZAR_ACTUALIZACION")) ' B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?",Array As String("VERSION_NUEVA")) B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE GPS SET HABILITADO = (?)",Array As Object(0)) + Subs.deleteFolder(Starter.fFileProvider.SharedFolder) ' B4XPage_Appear E_RUTA2.Visible = False E_RUTA2.Text = "" diff --git a/B4A/Files/cliente.bal b/B4A/Files/cliente.bal index a66cfc0..1683681 100644 Binary files a/B4A/Files/cliente.bal and b/B4A/Files/cliente.bal differ diff --git a/B4A/Files/guna-fondo.jpg b/B4A/Files/guna-fondo.jpg new file mode 100644 index 0000000..d7c1cd6 Binary files /dev/null and b/B4A/Files/guna-fondo.jpg differ diff --git a/B4A/Files/guna_192x192.jpg b/B4A/Files/guna_192x192.jpg new file mode 100644 index 0000000..4c14d2f Binary files /dev/null and b/B4A/Files/guna_192x192.jpg differ diff --git a/B4A/Guna Vistas V3.1.b4a b/B4A/Guna Vistas V3.1.b4a index 0657757..8c1b015 100644 --- a/B4A/Guna Vistas V3.1.b4a +++ b/B4A/Guna Vistas V3.1.b4a @@ -189,37 +189,37 @@ FileGroup93=Default Group FileGroup94=Default Group Group=Default Group Library1=appupdating -Library10=firebaseanalytics -Library11=firebasenotifications -Library12=fusedlocationprovider -Library13=googlemaps -Library14=googlemapsextras -Library15=gps -Library16=ime -Library17=javaobject -Library18=jhsicezxing1 -Library19=json +Library10=fileprovider +Library11=firebaseanalytics +Library12=firebasenotifications +Library13=fusedlocationprovider +Library14=googlemaps +Library15=googlemapsextras +Library16=gps +Library17=ime +Library18=javaobject +Library19=jhsicezxing1 Library2=b4xpages -Library20=okhttputils2 -Library21=phone -Library22=preoptimizedclv -Library23=randomaccessfile -Library24=rspopupmenu -Library25=runtimepermissions -Library26=serial -Library27=sql -Library28=togglelibrary -Library29=xcustomlistview +Library20=json +Library21=okhttputils2 +Library22=phone +Library23=preoptimizedclv +Library24=randomaccessfile +Library25=rspopupmenu +Library26=runtimepermissions +Library27=serial +Library28=sql +Library29=togglelibrary Library3=baqrcode -Library30=xui -Library31=xui views -Library32=compressstrings +Library30=xcustomlistview +Library31=xui +Library32=xui views Library4=batteryprogressview Library5=bitmapcreator Library6=byteconverter Library7=camera -Library8=core -Library9=fileprovider +Library8=compressstrings +Library9=core 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.LightTheme)~\n~AddApplicationText(~\n~)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~ ''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~ AddManifestText(~\n~~\n~)~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~) 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~~\n~'///////////////////////// FLP Y PUSH /////////////~\n~ CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~ CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics)~\n~ CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~ SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~'//////////////////////////////////////////////////////~\n~~\n~'/////////////////////// App Updating ////////////////~\n~ AddManifestText(~\n~ )~\n~ AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ )~\n~ CreateResource(xml, provider_paths,~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~ )~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~CreateResourceFromFile(Macro, JhsIceZxing1.CaturePortrait)~\n~ ~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddPermission(android.permission.BLUETOOTH_ADVERTISE)~\n~AddPermission(android.permission.BLUETOOTH_CONNECT)~\n~AddPermission(android.permission.BLUETOOTH_SCAN)~\n~AddManifestText(~\n~ ~\n~ )~\n~AddManifestText()~\n~~\n~AddManifestText(~\n~ ~\n~ )~\n~ AddPermission(android.permission.MANAGE_EXTERNAL_STORAGE)~\n~ SetApplicationAttribute(android:allowBackup, "false")~\n~ ~\n~ ~\n~ AddManifestText(~\n~ )~\n~ AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~~\n~ 'Para que se registre para abrir bases de datos~\n~' AddActivityText(main,~\n~'~\n~'~\n~'~\n~'~\n~')~\n~~\n~ 'Para que se registre para abrir bases de datos~\n~ AddActivityText(main,~\n~~\n~~\n~~\n~~\n~~\n~)~\n~~\n~ Module1=appUpdater Module10=C_Nota @@ -233,13 +233,14 @@ Module17=C_TicketsDia Module18=C_UpdateAvailable Module19=CameraExClass Module2=B4XMainPage -Module20=DBRequestManager -Module21=EscPosPrinter -Module22=FirebaseMessaging -Module23=MAPA_RUTAS -Module24=Starter -Module25=Subs -Module26=Tracker +Module20=cPDF +Module21=DBRequestManager +Module22=EscPosPrinter +Module23=FirebaseMessaging +Module24=MAPA_RUTAS +Module25=Starter +Module26=Subs +Module27=Tracker Module3=BatteryUtilities Module4=|relative|..\C_Bitacora Module5=C_Cliente @@ -249,13 +250,13 @@ Module8=C_Historico Module9=C_Mapas NumberOfFiles=94 NumberOfLibraries=32 -NumberOfModules=26 +NumberOfModules=27 Version=12.8 @EndOfDesignText@ #Region Project Attributes #ApplicationLabel: Guna Preventa #VersionCode: 1 - #VersionName: 5.01.30 + #VersionName: 5.02.05 'SupportedOrientations possible values: unspecified, landscape or portrait. #SupportedOrientations: portrait #CanInstallToExternalStorage: False diff --git a/B4A/Guna Vistas V3.1.b4a.meta b/B4A/Guna Vistas V3.1.b4a.meta index 10f645e..2cadfef 100644 --- a/B4A/Guna Vistas V3.1.b4a.meta +++ b/B4A/Guna Vistas V3.1.b4a.meta @@ -18,6 +18,7 @@ ModuleBookmarks23= ModuleBookmarks24= ModuleBookmarks25= ModuleBookmarks26= +ModuleBookmarks27= ModuleBookmarks3= ModuleBookmarks4= ModuleBookmarks5= @@ -45,6 +46,7 @@ ModuleBreakpoints23= ModuleBreakpoints24= ModuleBreakpoints25= ModuleBreakpoints26= +ModuleBreakpoints27= ModuleBreakpoints3= ModuleBreakpoints4= ModuleBreakpoints5= @@ -68,17 +70,18 @@ ModuleClosedNodes2= ModuleClosedNodes20= ModuleClosedNodes21= ModuleClosedNodes22= -ModuleClosedNodes23=3,4 -ModuleClosedNodes24=4,6,7,8,9 -ModuleClosedNodes25= +ModuleClosedNodes23= +ModuleClosedNodes24=3,4 +ModuleClosedNodes25=4,6,7,8,9 ModuleClosedNodes26= +ModuleClosedNodes27= ModuleClosedNodes3= -ModuleClosedNodes4=5,6,7,8,9,10,11,12,13 -ModuleClosedNodes5=1,3 +ModuleClosedNodes4=5,8,9,10,11,12,13 +ModuleClosedNodes5= ModuleClosedNodes6= ModuleClosedNodes7=5,6,8,9,10,11 ModuleClosedNodes8= ModuleClosedNodes9= -NavigationStack=DBRequestManager,HandleJob,250,0,C_Principal,JobDone,1230,0,C_Principal,Class_Globals,44,0,C_Principal,B4XPage_Created,273,0,B4XMainPage,B4XPage_Created,100,2,B4XMainPage,JobDone,525,4,Starter,Process_Globals,34,0,C_Cliente,JobDone,1236,6,Starter,ENVIA_ULTIMA_GPS,107,0,C_Cliente,gest_Click,1261,6 +NavigationStack=C_Cliente,enviaTicket,5164,6,C_Cliente,savePDF,5124,5,C_Cliente,openPDF,5141,0,C_Cliente,b_enviarTicket_LongClick,5156,1,C_Cliente,Guardar_Click,2107,0,C_Cliente,B4XPage_Appear,512,0,C_Cliente,GPS_LocationChanged,989,0,C_Cliente,b_enviarTicket_Click,5146,6,C_Cliente,PDFGENERAR,4965,1,B4XMainPage,JobDone,484,0,Main,Process_Globals,21,0 SelectedBuild=0 -VisibleModules=24,2,14,25,4,5,7,6,15,12,20 +VisibleModules=25,2,14,26,5,10,15,20,4 diff --git a/B4A/Starter.bas b/B4A/Starter.bas index e5e24a2..43834e5 100644 --- a/B4A/Starter.bas +++ b/B4A/Starter.bas @@ -39,6 +39,7 @@ Sub Process_Globals Dim nuevoLink As String Dim idCliente As String = "" Dim encuesta As String = 0 + Public fFileProvider As FileProvider End Sub Sub Service_Create @@ -54,6 +55,7 @@ Sub Service_Create logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat") #end if logs.Initialize + fFileProvider.Initialize CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") 'Para Push FirebaseMessaging ubicacionActual.Initialize If File.Exists(File.DirInternal, "kmt.db") = False Then diff --git a/B4A/Subs.bas b/B4A/Subs.bas index e449290..6f7a4e4 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -674,17 +674,17 @@ Sub traeRuta As String 'ignore idCliente = elCc.GetString("CUENTA") Log("|"&elCc.GetString("CUENTA")&"|") End If - Log($"#########################${CRLF}HAY USUARIO EN CUENTAA: ${elCc.RowCount}${CRLF}#########################"$) +' Log($"#########################${CRLF}HAY USUARIO EN CUENTAA: ${elCc.RowCount}${CRLF}#########################"$) If idCliente <> "" Then - Log(1) +' Log(1) c = B4XPages.MainPage.skmt.ExecQuery($"select distinct CAT_CL_RUTA from kmt_info2 where CAT_CL_CODIGO = '${idCliente}'"$) Else - Log(2) +' Log(2) c = B4XPages.MainPage.skmt.ExecQuery("select distinct CAT_CL_RUTA from kmt_info2 where CAT_CL_RUTA not in (select * from ruta_suplencia)") End If - Log($"#########################${CRLF}ENCONTRAMOS RUTA EN KMT_INFO2: ${c.RowCount}${CRLF}#########################"$) +' Log($"#########################${CRLF}ENCONTRAMOS RUTA EN KMT_INFO2: ${c.RowCount}${CRLF}#########################"$) If c.RowCount > 0 Then - Log(3) +' Log(3) c.Position=0 r = c.GetString("CAT_CL_RUTA") End If @@ -692,7 +692,7 @@ Sub traeRuta As String 'ignore Catch Log(LastException) End Try - Log($"#########################${CRLF}RUTA ENCONTRADA: |${r}|${CRLF}#########################"$) +' Log($"#########################${CRLF}RUTA ENCONTRADA: |${r}|${CRLF}#########################"$) Return r End Sub @@ -1739,4 +1739,23 @@ Sub traeVariable(nombre As String) As String valor = laVc.GetString("CAT_VA_VALOR") End If Return valor +End Sub + +Sub revisaImpreso As Boolean 'ignore + Private impreso As Boolean = False + Private c As Cursor = Starter.skmt.ExecQuery("select idCliente from ticket_impreso where idCliente in (select cuenta from cuentaa)") + If c.RowCount > 0 Then impreso = True + Return impreso +End Sub + +Sub deleteFolder(folder As String) + Log("Borrando " & folder) + For Each f As String In File.ListFiles(folder) + Log(f) + If File.IsDirectory(folder, f) Then + deleteFolder(File.Combine(folder, f)) + Log($"Borramos ${File.Combine(folder, f)}"$) + End If + File.Delete(folder, f) + Next End Sub \ No newline at end of file diff --git a/B4A/cPDF.bas b/B4A/cPDF.bas new file mode 100644 index 0000000..85bb6d2 --- /dev/null +++ b/B4A/cPDF.bas @@ -0,0 +1,1004 @@ +B4J=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.8 +@EndOfDesignText@ +'releases +'0.1 : first version +'0.2 : add support fo image PNG with colorspace Indexed (palette) +'0.3 : add raw command to enter PDF command directly +'0.4 : add strikeThrough style for font +' add constants for font style +' add constants for colors +' add methods gMultilineTextSize and outTextFlow +' add setter/getter sX, sY, sY and gY to get/set the current position +'0.5 : add suport for all images type. image is convert to PNG before inserted. a temp file is created, insert into the pdf and deleted +'0.6 : add justify align +Sub Class_Globals + Type TPDFContext(fX As Double,fY As Double, _ + fFontFamily As String,fFontSize As Double,fFontStyle As Int,fFontColor(3) As Double, _ + fDrawWidth As Double,fDrawColor(3) As Double,fFillColor(3) As Double) + Type TPDFPage(fWidth As Double,fHeight As Double,fBuffer As String) + Type TPDFImageInfo(fError As Int,fWidth As Int,fHeight As Int,fBPP As Int,fColorSpace As Int,fCompression As Int,fFilter As Int,fInterlacing As Int,fData() As Byte,fPalette() As Byte) + Type TPDFFontInfo(fCharsWidths(256) As Int,fYUnderline As Int,fHUnderline As Int,fYStrikeThrough As Int,fHStrikeThrough As Int,fYBottom As Int,fYTop As Int) + Type TPDFTextSize(fWidth As Double,fTop As Double,fBottom As Double,fHeight As Double) + Type TPDFMultilineTextSize(fWidth As Double,fHeight As Double,fParagraphs As List) + + 'use to convert image to png + Private fXUI As XUI + + 'encoding file + Private const fTextEncoding As String="cp1252" + 'versions + Private fLibVersion As String + Private fPDFVersion As String + 'factor between user unit and pt + Private fUnitFactor As Double + 'current context + Private fContext As TPDFContext + 'properties of PDF document + Private fProperties As Map + 'list of objects in the PDF + Private fObjs As List + 'current page + Private fPage As Int + 'liste of pages (TPDFPage) + Private fPages As List + 'list of used images in the document, each item in a map (path,imageinfo) + Private fUsedImages As List + 'list of used fonts in the document + Private fUsedFonts As List + 'font info for all the stadards fonts (TPDFFontInfo) + Private fFontsInfos As Map + + 'constants for page size + Public const pageSizeA3PortraitWidth As Double=-841.89 + Public const pageSizeA3PortraitHeight As Double=-1190.55 +' Public const pageSizeA4PortraitWidth As Double=-595.28 +' Public const pageSizeA4PortraitHeight As Double=-841.89 + Public const pageSizeA4PortraitWidth As Double=-370 + Public const pageSizeA4PortraitHeight As Double=-72 + Public const pageSizeA5PortraitWidth As Double=-420.94 + Public const pageSizeA5PortraitHeight As Double=-595.28 + Public const pageSizeLetterPortraitWidth As Double=-612 + Public const pageSizeLetterPortraitHeight As Double=-792 + Public const pageSizeLegalPortraitWidth As Double=-612 + Public const pageSizeLegalPortraitHeight As Double=-1008 + Public const pageSizeA3LandscapeWidth As Double=-1190.55 + Public const pageSizeA3LandscapeHeight As Double=-841.89 + Public const pageSizeA4LandscapeWidth As Double=-841.89 + Public const pageSizeA4LandscapeHeight As Double=-595.28 + Public const pageSizeA5LandscapeWidth As Double=-595.28 + Public const pageSizeA5LandscapeHeight As Double=-420.94 + Public const pageSizeLetterLandscapeWidth As Double=-792 + Public const pageSizeLetterLandscapeHeight As Double=-612 + Public const pageSizeLegalLandscapeWidth As Double=-1008 + Public const pageSizeLegalLandscapeHeight As Double=-612 + + 'constants for standards fonts + Public const fontCourier As String="Courier" + Public const fontHelvetica As String="Helvetica" + Public const fontTimes As String="Times" + Public const fontSymbol As String="Symbol" + Public const fontZapfdingbats As String="zapfdingbats" + + 'constants for fonts styles + Public const fontNormal As Int=0 + Public const fontBold As Int=1 + Public const fontItalic As Int=2 + Public const fontUnderline As Int=4 + Public const fontStrikeThrough As Int=8 + + 'constants for properties + Public const PropertyAuthor As String="Author" + Public const PropertyCreator As String="Creator" + Public const PropertyProducer As String="Producer" + Public const PropertyTitle As String="Title" + Public const PropertySubject As String="Subject" + Public const PropertyKeywords As String="Keywords" + + 'constants for rectangle style + Public const RectangleBorderOnly As String="S" + Public const RectangleFillOnly As String="f" + Public const RectangleBorderAndFill As String="B" + + 'constants for text align + Public const AlignLeft As String="L" + Public const AlignCenter As String="C" + Public const AlignRight As String="R" + Public const AlignJusify As String="J" + + 'constants for compression + Public const CompressAlways As Int=0 + Public const CompressIfSmaller As Int=1 + Public const CompressNever As Int=2 + + Public const colorBlack(3) As Double=Array As Double(0,0,0) + Public const colorWhite(3) As Double=Array As Double(1,1,1) + Public const colorGray(3) As Double=Array As Double(0.5,0.5,0.5) + Public const colorRed(3) As Double=Array As Double(1,0,0) + Public const colorGreen(3) As Double=Array As Double(0,1,0) + Public const colorBlue(3) As Double=Array As Double(0,0,1) + +End Sub + +'initialize and set unit to use : mm, cm, pt, in +Public Sub Initialize(aunit As String) As cPDF + fLibVersion="0.6" + fPDFVersion="1.3" + sUnit(aunit) + fProperties=CreateMap("Producer":"B4XPDF","CreationDate":gCreationDate,"ModDate":gCreationDate) + fContext.Initialize + fObjs.Initialize + fPages.Initialize + fPage=0 + fUsedImages.Initialize + fUsedFonts.Initialize + initFontsInfos + Return Me +End Sub + +private Sub createFontInfo(acharsWidths() As Int,ayunderline As Int,ahunderline As Int,aystrikethrough As Int,ahstrikethrough As Int,aytop As Int,aybottom As Int) As TPDFFontInfo + Dim fi As TPDFFontInfo + fi.Initialize + 'width of each 256 chars + fi.fCharsWidths=acharsWidths + 'bottom of underline rectangle + fi.fYUnderline=ayunderline + 'height of underine rectangle + fi.fHUnderline=ahunderline + 'bottom of strikethrough rectangle + fi.fYStrikeThrough=aystrikethrough + 'height of strikethrough rectangle + fi.fHStrikeThrough=ahstrikethrough + 'distance between baseline and top + fi.fYTop=aytop + 'distance between baseline and bottom + fi.fybottom=aybottom + Return fi +End Sub + +private Sub initFontsInfos + fFontsInfos.Initialize + fFontsInfos.Put(calcFontKey("Courier",fontNormal),createFontInfo(Array As Int(600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Courier",fontBold),createFontInfo(Array As Int(600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Courier",fontItalic),createFontInfo(Array As Int(600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Courier",fontBold+fontItalic),createFontInfo(Array As Int(600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Helvetica",fontNormal),createFontInfo(Array As Int(278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,350,556,350,222,556,333,1000,556,556,333,1000,667,333,1000,350,611,350,350,222,222,333,333,350,556,1000,333,1000,500,333,944,350,500,667,278,333,556,556,556,556,260,556,333,737,370,556,584,333,737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500,556,500),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Helvetica",fontBold),createFontInfo(Array As Int(278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,350,556,350,278,556,500,1000,556,556,333,1000,667,333,1000,350,611,350,350,278,278,500,500,350,556,1000,333,1000,556,333,944,350,500,667,278,333,556,556,556,556,280,556,333,737,370,556,584,333,737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556,611,556),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Helvetica",fontItalic),createFontInfo(Array As Int(278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,350,556,350,222,556,333,1000,556,556,333,1000,667,333,1000,350,611,350,350,222,222,333,333,350,556,1000,333,1000,500,333,944,350,500,667,278,333,556,556,556,556,260,556,333,737,370,556,584,333,737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500,556,500),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Helvetica",fontBold+fontItalic),createFontInfo(Array As Int(278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,350,556,350,278,556,500,1000,556,556,333,1000,667,333,1000,350,611,350,350,278,278,500,500,350,556,1000,333,1000,556,333,944,350,500,667,278,333,556,556,556,556,280,556,333,737,370,556,584,333,737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556,611,556),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Times",fontNormal),createFontInfo(Array As Int(250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,333,408,500,500,833,778,180,333,333,500,564,250,333,250,278,500,500,500,500,500,500,500,500,500,500,278,278,564,564,564,444,921,722,667,667,722,611,556,722,722,333,389,722,611,889,722,722,556,722,667,556,611,722,722,944,722,722,611,333,278,333,469,500,333,444,500,444,500,444,333,500,500,278,278,500,278,778,500,500,500,500,333,389,278,500,500,722,500,500,444,480,200,480,541,350,500,350,333,500,444,1000,500,500,333,1000,556,333,889,350,611,350,350,333,333,444,444,350,500,1000,333,980,389,333,722,350,444,722,250,333,500,500,500,500,200,500,333,760,276,500,564,333,760,333,400,564,300,300,333,500,453,250,333,300,310,500,750,750,750,444,722,722,722,722,722,722,889,667,611,611,611,611,333,333,333,333,722,722,722,722,722,722,722,564,722,722,722,722,722,722,556,500,444,444,444,444,444,444,667,444,444,444,444,444,278,278,278,278,500,500,500,500,500,500,500,564,500,500,500,500,500,500,500,500),-60,40,2200,40,800,-230)) + fFontsInfos.Put(calcFontKey("Times",fontBold),createFontInfo(Array As Int(250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,333,555,500,500,1000,833,278,333,333,500,570,250,333,250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570,570,500,930,722,667,722,722,667,611,778,778,389,500,778,667,944,722,778,611,778,722,556,667,722,722,1000,722,722,667,333,278,333,581,500,333,500,556,444,556,444,333,500,556,278,333,556,278,833,556,500,556,556,444,389,333,556,500,722,500,500,444,394,220,394,520,350,500,350,333,500,500,1000,500,500,333,1000,556,333,1000,350,667,350,350,333,333,500,500,350,500,1000,333,1000,389,333,722,350,444,722,250,333,500,500,500,500,220,500,333,747,300,500,570,333,747,333,400,570,300,300,333,556,540,250,333,300,330,500,750,750,750,500,722,722,722,722,722,722,1000,722,667,667,667,667,389,389,389,389,722,722,778,778,778,778,778,570,778,722,722,722,722,722,611,556,500,500,500,500,500,500,722,444,444,444,444,444,278,278,278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,500,556,500),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Times",fontItalic),createFontInfo(Array As Int(250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,333,420,500,500,833,778,214,333,333,500,675,250,333,250,278,500,500,500,500,500,500,500,500,500,500,333,333,675,675,675,500,920,611,611,667,722,611,611,722,722,333,444,667,556,833,667,722,611,722,611,500,556,722,611,833,611,556,556,389,278,389,422,500,333,500,500,444,500,444,278,500,500,278,278,444,278,722,500,500,500,500,389,389,278,500,444,667,444,444,389,400,275,400,541,350,500,350,333,500,556,889,500,500,333,1000,500,333,944,350,556,350,350,333,333,556,556,350,500,889,333,980,389,333,667,350,389,556,250,389,500,500,500,500,275,500,333,760,276,500,675,333,760,333,400,675,300,300,333,500,523,250,333,300,310,500,750,750,750,500,611,611,611,611,611,611,889,667,611,611,611,611,333,333,333,333,722,667,722,722,722,722,722,675,722,722,722,722,722,556,611,500,500,500,500,500,500,500,667,444,444,444,444,444,278,278,278,278,500,500,500,500,500,500,500,675,500,500,500,500,500,444,500,444),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Times",fontBold+fontItalic),createFontInfo(Array As Int(250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,389,555,500,500,833,778,278,333,333,500,570,250,333,250,278,500,500,500,500,500,500,500,500,500,500,333,333,570,570,570,500,832,667,667,667,722,667,667,722,778,389,500,667,611,889,722,722,611,722,667,556,611,722,667,889,667,611,611,333,278,333,570,500,333,500,500,444,500,444,333,500,556,278,278,500,278,778,556,500,500,500,389,389,278,556,444,667,500,444,389,348,220,348,570,350,500,350,333,500,500,1000,500,500,333,1000,556,333,944,350,611,350,350,333,333,500,500,350,500,1000,333,1000,389,333,722,350,389,611,250,389,500,500,500,500,220,500,333,747,266,500,606,333,747,333,400,570,300,300,333,576,500,250,333,300,300,500,750,750,750,500,667,667,667,667,667,667,944,667,667,667,667,667,389,389,389,389,722,722,722,722,722,722,722,570,722,722,722,722,722,611,611,500,500,500,500,500,500,500,722,444,444,444,444,444,278,278,278,278,500,556,500,500,500,500,500,570,500,556,556,556,556,444,500,444),-60,40,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("Symbol",fontNormal),createFontInfo(Array As Int(250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,333,713,500,549,833,778,439,333,333,500,549,250,549,250,278,500,500,500,500,500,500,500,500,500,500,278,278,549,549,549,444,549,722,667,722,612,611,763,603,722,333,631,722,686,889,722,722,768,741,556,592,611,690,439,768,645,795,611,333,863,333,658,500,500,631,549,549,494,439,521,411,603,329,603,549,549,576,521,549,549,521,549,603,439,576,713,686,493,686,494,480,200,480,549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,750,620,247,549,167,713,500,753,753,753,753,1042,987,603,987,603,400,549,411,549,549,713,494,460,549,549,549,549,1000,603,1000,658,823,686,795,987,768,768,823,768,768,713,713,713,713,713,713,713,768,713,790,790,890,823,549,250,713,603,603,1042,987,603,987,603,494,329,790,790,786,713,384,384,384,384,384,384,494,494,494,494,0,329,274,686,686,686,384,384,384,384,384,384,494,494,494,0),-60,10,220,40,800,-230)) + fFontsInfos.Put(calcFontKey("zapfdingbats",fontNormal),createFontInfo(Array As Int(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278,974,961,974,980,719,789,790,791,690,960,939,549,855,911,933,911,945,974,755,846,762,761,571,677,763,760,759,754,494,552,537,577,692,786,788,788,790,793,794,816,823,789,841,823,833,816,831,923,744,723,749,790,792,695,776,768,792,759,707,708,682,701,826,815,789,789,707,687,696,689,786,787,713,791,785,791,873,761,762,762,759,759,892,892,788,784,438,138,277,415,392,392,668,668,0,390,390,317,317,276,276,509,509,410,410,234,234,334,334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,732,544,544,910,667,760,760,776,595,694,626,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,894,838,1016,458,748,924,748,918,927,928,928,834,873,828,924,924,917,930,931,463,883,836,836,867,867,696,696,874,0,874,760,946,771,865,771,888,967,888,831,873,927,970,918,0),-60,40,220,40,800,-230)) +End Sub + +'set factor to convert user unit to pt +private Sub sUnit(aunit As String) As cPDF + Select aunit.ToLowerCase + Case "pt" + fUnitFactor=1.0 + Case "mm" + fUnitFactor=72.0/25.4 + Case "cm" + fUnitFactor=72.0/2.54 + Case "in" + fUnitFactor=72.0 + Case Else + fUnitFactor=1.0 + End Select + Return Me +End Sub + +'return current date and time in format D:YYYYMMDDHHMMSS±hh'mm' +private Sub gCreationDate As String + DateTime.DateFormat="yyyyMMdd" + DateTime.TimeFormat="hhmmss" + Dim z As String=NumberFormat2(DateTime.TimeZoneOffset,2,2,2,False) + z=IIf(z.SubString2(0,1)<>"-","+","") & z + z=z.SubString2(0,3) & "'" & z.SubString(4) & "'" + Return "D:" & DateTime.Date(DateTime.Now) & DateTime.Time(DateTime.Now) & z +End Sub + +'all the ....write methods write a part of the pdf +private Sub headerWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"%PDF-${NumberFormat2(fPDFVersion,1,1,1,False)}${Chr(10)}"$.getBytes(fTextEncoding)) + Return bb.toarray +End Sub + +private Sub catalogWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${fObjs.Size+1} 0 obj <> endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.toarray +End Sub + +private Sub kidsWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${fObjs.Size+1} 0 obj <> endobj${Chr(10)}"$.getbytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub pagesWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim r As Int=fObjs.Size+1+fPages.Size*2 + For i=0 To fPages.Size-1 + bb.append(pageWrite(i,r)) + Next + Return bb.ToArray +End Sub + +private Sub pageWrite(apage As Int,aresource As Int) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim p As TPDFPage=fPages.Get(apage) + bb.Append($"${fObjs.Size+1} 0 obj <> endobj${Chr(10)}"$.getbytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub contentsWrite(acompress As Int) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + For i=0 To fPages.Size-1 + bb.append(contentWrite(acompress,i)) + Next + Return bb.toarray +End Sub + +private Sub contentWrite(acompress As Int,apage As Int) As Byte() + Dim const compress As String="/Filter/FlateDecode" + Dim bb As B4XBytesBuilder + bb.Initialize + + Dim c() As Byte=fPages.Get(apage).As(TPDFPage).fBuffer.GetBytes(fTextEncoding) + Dim filter As String="" + + If acompress<>CompressNever Then + Dim cs As CompressedStreams + Dim b() As Byte=cs.CompressBytes(c,"zlib") + If acompress=CompressAlways Or b.Length+compress.length>${Chr(10)}stream${Chr(10)}"$.getbytes(fTextEncoding)) + bb.Append(c) + bb.Append($"${Chr(10)}endstream${Chr(10)}endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub resourcesWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${fObjs.size+1} 0 obj << "$.getBytes(fTextEncoding)) + + bb.Append($"/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] ${Chr(10)}"$.getBytes(fTextEncoding)) + + bb.append($"/Font << ${Chr(10)}"$.getBytes(fTextEncoding)) + For i=0 To fUsedFonts.Size-1 + bb.Append($"/F${i} ${fObjs.Size+1+i+1} 0 R "$.getBytes(fTextEncoding)) + Next + bb.append($" >> ${Chr(10)}"$.getBytes(fTextEncoding)) + + bb.append($"/XObject << ${Chr(10)}"$.getBytes(fTextEncoding)) + For i=0 To fUsedImages.Size-1 + bb.Append($"/I${i} ${fObjs.Size+1+i+1+fUsedFonts.size} 0 R "$.getBytes(fTextEncoding)) + Next + bb.append($" >> ${Chr(10)}"$.getBytes(fTextEncoding)) + + bb.Append($" >> endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub fontsWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + For i=0 To fUsedFonts.Size-1 + bb.append(fontWrite(i)) + Next + Return bb.ToArray +End Sub + +private Sub fontWrite(afont As Int) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim c As String=fUsedFonts.Get(afont) + bb.Append($"${fObjs.Size+1} 0 obj << /Type /Font /Subtype /Type1 /BaseFont /${c} /Encoding /WinAnsiEncoding>> endobj${Chr(10)}"$.getbytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub imagesWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + For i=0 To fUsedImages.Size-1 + bb.append(imageWrite(i)) + Next + Return bb.toarray +End Sub + +private Sub imageWrite(aimage As Int) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim ii As TPDFImageInfo=fUsedImages.Get(aimage).As(Map).Get("info") + bb.Append($"${fObjs.Size+1} 0 obj${Chr(10)}<>${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"/Length ${ii.fData.length}>>${Chr(10)}stream${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append(ii.fdata) + bb.Append($"${Chr(10)}endstream${Chr(10)}endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + If cs="Indexed" Then + bb.Append(paletteWrite(ii.fPalette)) + End If + Return bb.ToArray +End Sub + +private Sub paletteWrite(apalette() As Byte) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${fObjs.Size+1} 0 obj${Chr(10)}<>${Chr(10)}stream${Chr(10)}"$.getbytes(fTextEncoding)) + bb.Append(apalette) + bb.Append($"${Chr(10)}endstream${Chr(10)}endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub propertiesWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${fObjs.Size+1} 0 obj <<${Chr(10)}"$.getBytes(fTextEncoding)) + For Each k As String In fProperties.keys + bb.Append($"/${k}(${escapeText(fProperties.Get(k))})${Chr(10)}"$.getBytes(fTextEncoding)) + Next + bb.Append($" >> endobj${Chr(10)}"$.getBytes(fTextEncoding)) + fObjs.Add(bb.Length) + Return bb.ToArray +End Sub + +private Sub refWrite(astart As Long,ageneration As Int,astatus As String) As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + bb.Append($"${NumberFormat2(astart,10,0,0,False)} ${NumberFormat2(ageneration,5,0,0,False)} ${astatus}${Chr(10)}"$.getBytes(fTextEncoding)) + Return bb.ToArray +End Sub + +private Sub xrefWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim s As Long=headerWrite.length + bb.Append($"xref${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"0 ${fObjs.Size+1}${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append(refWrite(0,65535,"f")) + For i=0 To fObjs.Size-1 + Dim l As Int=fObjs.Get(i) + bb.Append(refWrite(s,0,"n")) + s=s+l + Next + Return bb.ToArray +End Sub + +private Sub trailerWrite As Byte() + Dim bb As B4XBytesBuilder + bb.Initialize + Dim s As Long=headerWrite.length + For i=0 To fObjs.Size-1 + Dim l As Int=fObjs.Get(i) + s=s+l + Next + bb.Append($"trailer <<${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"/Size ${fObjs.Size+1}${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"/Info ${fObjs.Size} 0 R${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"/Root 1 0 R${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($">>${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"startxref${Chr(10)}"$.getBytes(fTextEncoding)) + bb.Append($"${s}${Chr(10)}"$.getBytes(fTextEncoding)) + Return bb.ToArray +End Sub + +private Sub footerWrite As Byte() + Return "%%EOF".GetBytes(fTextEncoding) +End Sub + +'calc a unique key for a specific font (family ans style (bold, italic)) +private Sub calcFontKey(afamily As String,astyle As Int) As String + If afamily="zapfdingbats" Or afamily="Symbol" Then + astyle=Bit.And(astyle,Bit.Not(Bit.Or(fontBold,fontItalic))) + End If + If Bit.And(astyle,fontBold)<>0 And Bit.And(astyle,fontItalic)<>0 Then + Return afamily & "-BoldOblique" + End If + If Bit.And(astyle,fontBold)<>0 Then + Return afamily & "-Bold" + End If + If Bit.And(astyle,fontItalic)<>0 Then + Return afamily & "-Oblique" + End If + If afamily="Times" Then + Return "Times-Roman" + End If + Return afamily +End Sub + +'add content to a page +private Sub contentAdd(apage As Int,acontent As String) + Dim sb As StringBuilder + sb.Initialize + sb.Append(fPages.Get(apage).As(TPDFPage).fbuffer) + sb.Append(acontent) + fPages.Get(apage).As(TPDFPage).fbuffer=sb.ToString +End Sub + +'escape characters ( ) \ +private Sub escapeText(atext As String) As String + Return atext.Replace("\","\\").Replace("(","\(").Replace(")","\)") +End Sub + +'initialize, set properties and return a TPDFPage +private Sub createPage(awidth As Double,aheight As Double,abuffer As String) As TPDFPage + Dim p As TPDFPage + p.Initialize + p.fWidth=awidth + p.fHeight=aheight + p.fBuffer=abuffer + Return p +End Sub + +private Sub rafReadString(araf As RandomAccessFile,astart As Long,acount As Long) As String + Dim s As String + For i=0 To acount-1 + s=s & Chr(araf.ReadUnsignedByte(astart+i)) + Next + Return s +End Sub + +'calc a unique key for a specific image (adir & afile) +private Sub imageKey(adir As String,afile As String) As String + Return adir & afile +End Sub + +'parse png file +private Sub imageInfo(adir As String,afile As String) As TPDFImageInfo + Dim ii As TPDFImageInfo + Dim raf As RandomAccessFile + Dim rafpos As Long + Dim bbData As B4XBytesBuilder + Dim bbPalette As B4XBytesBuilder + + bbData.Initialize + bbPalette.Initialize + ii.Initialize + ii.fError=0 + raf.Initialize(adir,afile,True) + rafpos=0 + + + 'signture PNG + If rafReadString(raf,rafpos,8)<>Chr(137) & "PNG" & Chr(13) & Chr(10) & Chr(26) & Chr(10) Then + ii.fError=1 + End If + rafpos=rafpos+8 + + 'chunks (length, type, data, CRC) + Dim chunkLength As Int + Dim chunkType As String + Do While (ii.fError=0) And (chunkType<>"IEND") + chunkLength=raf.ReadInt(rafpos) + rafpos=rafpos+4 + chunkType=rafReadString(raf,rafpos,4) + rafpos=rafpos+4 + Select chunkType + 'header + Case "IHDR" + ii.fWidth=raf.ReadInt(rafpos) + rafpos=rafpos+4 + + ii.fHeight=raf.ReadInt(rafpos) + rafpos=rafpos+4 + + ii.fBPP=raf.ReadUnsignedByte(rafpos) + If ii.fBPP>8 Then + ii.fError=2 + End If + rafpos=rafpos+1 + + ii.fColorSpace=raf.ReadUnsignedByte(rafpos) + If ii.fColorSpace<>0 And ii.fColorSpace<>2 And ii.fColorSpace<>3 And ii.fColorSpace<>4 Then + ii.FError=3 + End If + rafpos=rafpos+1 + + ii.FCompression=raf.ReadUnsignedByte(rafpos) + If ii.FCompression<>0 Then + ii.FError=4 + End If + rafpos=rafpos+1 + + ii.FFilter=raf.ReadUnsignedByte(rafpos) + If ii.FFilter<>0 Then + ii.FError=5 + End If + rafpos=rafpos+1 + + ii.FInterlacing=raf.ReadUnsignedByte(rafpos) + If ii.FInterlacing<>0 Then + ii.FError=6 + End If + rafpos=rafpos+1 + 'data + Case "IDAT" + Dim b(chunkLength) As Byte + raf.ReadBytes(b,0,chunkLength,rafpos) + bbData.Append(b) + rafpos=rafpos+chunkLength + 'palette + Case "PLTE" + Dim b(chunkLength) As Byte + raf.ReadBytes(b,0,chunkLength,rafpos) + bbPalette.Append(b) + rafpos=rafpos+chunkLength + 'ignore other chunktype + Case Else + 'skip Data + rafpos=rafpos+chunkLength + End Select + 'skip CRC + rafpos=rafpos+4 + Loop + + raf.close + ii.fData=bbData.ToArray + ii.fPalette=bbPalette.ToArray + + Return ii +End Sub + + + +'save to stream +public Sub saveToStream(aoutputstream As OutputStream,acompress As Int) As cPDF + Dim b() As Byte=headerWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=catalogWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=kidsWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=pagesWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=contentsWrite(acompress) + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=resourcesWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=fontsWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=imagesWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=propertiesWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=xrefWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=trailerWrite + aoutputstream.WriteBytes(b,0,b.length) + Dim b() As Byte=footerWrite + aoutputstream.WriteBytes(b,0,b.length) + Return Me +End Sub + +'save pdf to a file +public Sub saveToFile(adir As String, afile As String, acompress As Int) As cPDF + Log(afile) + File.Delete(adir,afile) + Dim outputstream As OutputStream=File.OpenOutput(adir,afile,False) + saveToStream(outputstream,acompress) + outputstream.Close + Return Me +End Sub + + +'return the index of the image with path=akey in fUSedImages +'return -1 if not found +private Sub findImageKey(akey As String) As Int + For i=0 To fUsedImages.Size-1 + If fUsedImages.Get(i).As(Map).Get("path")=akey Then + Return i + End If + Next + Return -1 +End Sub + + +'get the number of pages in the pdf +public Sub gPagesCount As Int + Return fPages.size +End Sub + +'get the width of the page +'apage : 1 to n +public Sub gPageWidth(apage As Int) As Double + Return fPages.Get(apage-1).As(TPDFPage).fWidth/fUnitFactor +End Sub + +'get the height of the page +'apage : 1 to n +public Sub gPageHeight(apage As Int) As Double + Return fPages.Get(apage-1).As(TPDFPage).fHeight/fUnitFactor +End Sub + +'add a new page with width and height +'use predefined constants pageSize... +'or enter custom size (unit is unit defined in intialize method) +'the new page becomes the current page +public Sub pageAdd(awidth As Double,aheight As Double) As cPDF + fPages.Add(createPage(IIf(awidth<0,-awidth,awidth*fUnitFactor),IIf(aheight<0,-aheight,aheight*fUnitFactor),"")) + fPage=fPages.Size-1 + sFont(fContext.fFontFamily,fContext.fFontStyle,fContext.fFontSize,fContext.fFontColor) + sDrawColor(fContext.fDrawColor) + sDrawWidth(fContext.fDrawWidth) + sFillColor(fContext.fFillColor) + Return Me +End Sub + +'get current page +public Sub gPage As Int + Return fPage+1 +End Sub + +'set current page +'apage : 1 to n +public Sub sPage(apage As Int) As cPDF + fPage=apage-1 + Return Me +End Sub + +'set draw color for line +'argb : Red Green Blue +'values from 0.000 to 1.000 +public Sub sDrawColor(argb() As Double) As cPDF + fContext.fDrawColor=argb + contentAdd(fPage,$"${NumberFormat2(argb(0),1,3,3,False)} ${NumberFormat2(argb(1),1,3,3,False)} ${NumberFormat2(argb(2),1,3,3,False)} RG${Chr(10)}"$) + Return Me +End Sub + +'set draw width for line +public Sub sDrawWidth(awidth As Double) As cPDF + fContext.fDrawWidth=awidth + contentAdd(fPage,$"${NumberFormat2(awidth*fUnitFactor,1,3,3,False)} w${Chr(10)}"$) + Return Me +End Sub + +'set fill color +'argb : Red Green Blue +'values from 0.000 to 1.000 +public Sub sFillColor(argb() As Double) As cPDF + fContext.fFillColor=argb + Return Me +End Sub + +'set font +'family : Helvetica,Times,Courier,Symbol,zapfdingbats (use predefined constants font...) +'size in pts +'font uses cp-1252 windows encoding +public Sub sFont(afamily As String,astyle As Int,asize As Double,acolor() As Double) As cPDF + Dim k As String=calcFontKey(afamily,astyle) + Dim i As Int=fUsedFonts.IndexOf(k) + If i=-1 Then + fUsedFonts.Add(k) + i=fUsedFonts.Size-1 + End If + contentAdd(fPage,$"BT /F${i} ${NumberFormat2(asize,1,3,3,False)} Tf ET${Chr(10)}"$) + fContext.fFontFamily=afamily + fContext.fFontStyle=astyle + fContext.fFontSize=asize + fContext.fFontColor=acolor + Return Me +End Sub + +'draw text on current page at position ax,ay with current font and current text color +'(0,0) is bottom left of the page +'(w,h) if top right of the page +public Sub outText(ax As Double,ay As Double,atext As String) As cPDF + contentAdd(fPage,$"${NumberFormat2(fContext.fFontColor(0),1,3,3,False)} ${NumberFormat2(fContext.fFontColor(1),1,3,3,False)} ${NumberFormat2(fContext.fFontColor(2),1,3,3,False)} rg${Chr(10)}"$) + contentAdd(fPage,$"BT ${NumberFormat2(ax*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay*fUnitFactor,1,3,3,False)} Td (${escapeText(atext)})Tj ET${Chr(10)}"$) + If Bit.And(fContext.fFontstyle,fontUnderline+fontStrikeThrough)<>0 Then + Dim fi As TPDFFontInfo=fFontsInfos.Get(calcFontKey(fContext.fFontFamily,fContext.fFontStyle)).As(TPDFFontInfo) + Dim ts As TPDFTextSize=gTextSize(atext) + End If + If Bit.And(fContext.fFontstyle,fontUnderline)<>0 Then + contentAdd(fPage,$"${NumberFormat2(ax*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay*fUnitFactor+fi.fYUnderline*fContext.fFontSize/1000,1,3,3,False)} ${NumberFormat2(ts.fWidth*fUnitFactor,1,3,3,False)} ${NumberFormat2((fi.fHUnderline)*fContext.fFontSize/1000,1,3,3,False)} re f ${Chr(10)}"$) + End If + If Bit.And(fContext.fFontstyle,fontStrikeThrough)<>0 Then + contentAdd(fPage,$"${NumberFormat2(ax*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay*fUnitFactor+fi.fYStrikeThrough*fContext.fFontSize/1000,1,3,3,False)} ${NumberFormat2(ts.fWidth*fUnitFactor,1,3,3,False)} ${NumberFormat2((fi.fHStrikeThrough)*fContext.fFontSize/1000,1,3,3,False)} re f ${Chr(10)}"$) + End If + Return Me +End Sub + +'draw text on current page at position ax,ay with current font and current text color +'explicit CRLF in atext +'automatic CRLF when awidth is reached +'(0,0) is bottom left of the page +'(w,h) if top right of the page +public Sub outTextFlow(aleftMargin As Double,arightMargin As Double,aalign As String,atext As String) As cPDF + Dim mts As TPDFMultilineTextSize=gMultilineTextSize(arightMargin-aleftMargin,atext) + Dim ts As TPDFTextSize + For p=0 To mts.fParagraphs.Size-1 + Dim lines As List=mts.fParagraphs.Get(p).As(List) + For i=0 To lines.Size-1 + Dim l As String=lines.Get(i) + ts=gTextSize(l) + Select Case aalign + Case "L" + outText(aleftMargin,fContext.fy,l) + Case "C" + outText(aleftMargin+(arightMargin-aleftMargin-ts.fWidth)/2,fContext.fy,l) + Case "R" + outText(arightMargin-ts.fWidth,fContext.fy,l) + Case "J" + If i=lines.Size-1 Then + 'last line if left aligned + outText(aleftMargin,fContext.fy,l) + Else + 'other lines are justified + Dim w() As String=Regex.split(" ",l) + Dim x As Double=aleftMargin + 'calc space between each word + Dim s As Double=((arightMargin-aleftMargin)-ts.fWidth+(gTextSize(" ").fWidth*(w.Length-1)))/(w.Length-1) + For j=0 To w.Length-1 + Dim ww As TPDFTextSize=gTextSize(w(j)) + outText(x,fContext.fy,w(j)) + x=x+s+ww.fWidth + Next + End If + End Select + fContext.fX=aleftMargin + fContext.fy=fContext.fy+ts.fHeight + Next + Next + Return Me +End Sub + +'draw a line on current page from ax1,ay1 to ax2,ay2 with current width and color +'(0,0) is bottom left of the page +'(w,h) if top right of the page +public Sub outLine(ax1 As Double,ay1 As Double,ax2 As Double,ay2 As Double) As cPDF + contentAdd(fPage,$"${NumberFormat2(ax1*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay1*fUnitFactor,1,3,3,False)} m ${NumberFormat2(ax2*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay2*fUnitFactor,1,3,3,False)} l h S${Chr(10)}"$) + Return Me +End Sub + +'draw a rectangle on current page starting at ax,ay with dimension aw,ah,current width, color and textAndFillColor are used +'(0,0) is bottom left of the page +'(w,h) if top right of the page +'astyle : use predefined constants RectangleBorderOnly,RectangleFillOnly,RectangleBorderAndFill +public Sub outRectangle(ax As Double,ay As Double,aw As Double,ah As Double,astyle As String) As cPDF + If astyle=RectangleBorderAndFill Or astyle=RectangleFillOnly Then + contentAdd(fPage,$"${NumberFormat2(fContext.fFillColor(0),1,3,3,False)} ${NumberFormat2(fContext.fFillColor(1),1,3,3,False)} ${NumberFormat2(fContext.fFillColor(2),1,3,3,False)} rg${Chr(10)}"$) + End If + contentAdd(fPage,$"${NumberFormat2(ax*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay*fUnitFactor,1,3,3,False)} ${NumberFormat2(aw*fUnitFactor,1,3,3,False)} ${NumberFormat2(ah*fUnitFactor,1,3,3,False)} re ${astyle} ${Chr(10)}"$) + Return Me +End Sub + +private Sub convertImage(adir As String,afile As String) As String + 'convert to JPG + Dim img As B4XBitmap + img=fXUI.LoadBitmap(adir,afile) + Dim out As OutputStream=File.OpenOutput(adir,afile & ".jpg",False) + img.WriteToStream(out,100,"JPEG") + out.close + + 'then convert to PNG + Dim img As B4XBitmap + img=fXUI.LoadBitmap(adir,afile & ".jpg") + Dim out As OutputStream=File.OpenOutput(adir,afile & ".png",False) + img.WriteToStream(out,100,"PNG") + out.close + + File.Delete(adir,afile & ".jpg") + Return afile & ".png" +End Sub + +'draw an image +'only PNG +public Sub outImage(adir As String,afile As String,ax As Double,ay As Double,aw As Double,ah As Double) As cPDF + Dim ii As TPDFImageInfo + afile=convertImage(adir,afile) + 'check if this image is already used + Dim k As String=imageKey(adir,afile) + Dim i As Int=findImageKey(k) + 'if not add it to the list + If i=-1 Then + 'get informations about the image + ii=imageInfo(adir,afile) + 'store it in the list + fUsedImages.add(CreateMap("path":k,"info":ii)) + i=fUsedImages.Size-1 + Else + ii=fUsedImages.Get(i).As(Map).Get("info") + End If + + File.Delete(adir,afile) + + If ii.fError=0 Then + 'originals width and height + If aw=0 And ah=0 Then + aw=-96 + ah=-96 + End If + + '-aw is horizontal resolution in dpi + If aw<0 Then + aw=-ii.fWidth*72/aw/fUnitFactor + End If + '-ah is vertical resolution in dpi + If ah<0 Then + ah=-ii.fHeight*72/ah/fUnitFactor + End If + + 'calc aw proportionnaly to ah + If aw=0 Then + aw=ah*ii.fWidth/ii.fHeight + End If + 'calc ah proportionnaly to aw + If ah=0 Then + ah=aw*ii.fHeight/ii.fWidth + End If + + contentAdd(fPage,$"q ${NumberFormat2(aw*fUnitFactor,1,3,3,False)} 0 0 ${NumberFormat2(ah*fUnitFactor,1,3,3,False)} ${NumberFormat2(ax*fUnitFactor,1,3,3,False)} ${NumberFormat2(ay*fUnitFactor,1,3,3,False)} cm /I${i} Do Q${Chr(10)}"$) + End If + Return Me +End Sub + +'add raw content to the current page +'all the positions and dimensions are in user unit +'LF is added at the end of text +public Sub outRaw(atext As String) As cPDF + If fUnitFactor<>1 Then + 'convert user unit in atext to pt + Dim shift As Int=0 + atext=atext & Chr(10) + Dim m As Matcher = Regex.Matcher("([+-]?[0-9]{1,}[\.]{0,1}[0-9]{0,})",atext) + Do While m.Find + For g=1 To m.GroupCount + Dim v As String=NumberFormat2(fUnitFactor*m.Group(g),1,3,3,False) + atext=atext.SubString2(0,m.getstart(g)+shift) & v & atext.SubString(m.GetEnd(g)+shift) + shift=shift+v.Length-m.Group(g).Length + Next + Loop + End If + contentAdd(fPage,atext) + Return Me +End Sub + +'set a document's property +'use predefined constants propertyAuthor.... +public Sub sProperty(aproperty As String,avalue As String) As cPDF + fProperties.Put(aproperty,avalue) + Return Me +End Sub + +'convert signed byte to unsigned +private Sub ToUnsigned(b As Byte) As Int + Return Bit.And(0xFF, b) +End Sub + +'get the text size with the current font and size +'fwidth : width of the text +'fTop : distance between baseline and top of the text +'fBottom : distance between baseline and bottom of the text +'fHeight : total height of the text +public Sub gTextSize(atext As String) As TPDFTextSize + Dim bb As B4XBytesBuilder + Dim ts As TPDFTextSize + bb.Initialize + bb.Append(atext.GetBytes(fTextEncoding)) + ts.Initialize + Dim fi As TPDFFontInfo=fFontsInfos.Get(calcFontKey(fContext.fFontFamily,fContext.fFontStyle)).As(TPDFFontInfo) + Dim w As Double + For i=0 To bb.Length-1 + w=w+fi.fCharsWidths(ToUnsigned(bb.InternalBuffer(i))) + Next + ts.fWidth=w*fContext.fFontSize/1000/fUnitFactor + ts.fTop=fi.fYTop*fContext.fFontSize/1000/fUnitFactor + ts.fBottom=fi.fYBottom*fContext.fFontSize/1000/fUnitFactor + ts.fHeight=ts.fBottom-ts.fTop + Return ts +End Sub + + + +'add line to TPDFMultilineTextSize and return rest of line +private Sub MultilineTextSizeAddLine(amts As TPDFMultilineTextSize,ats As TPDFTextSize,atext As String,awidth As Double) As String + Dim s As String + If ats.fWidth>awidth Then + Dim p As Int=atext.LastIndexOf(" ") + If p=-1 Then + p=atext.Length-1 + End If + s=atext.SubString(p+1) + atext=atext.SubString2(0,p) + Else + s="" + End If + amts.fparagraphs.Get(amts.fParagraphs.Size-1).As(List).Add(atext) + amts.fHeight=amts.fHeight+ats.fHeight + Return s +End Sub + +'get the size of multiline text with the current font and size +public Sub gMultilineTextSize(awidth As Double,atext As String) As TPDFMultilineTextSize + Dim mts As TPDFMultilineTextSize + Dim ts As TPDFTextSize + Dim c As Char + Dim l As String="" + mts.Initialize + mts.fParagraphs.Initialize + mts.fWidth=awidth + 'split text with CRLF + Dim paragraphs() As String=Regex.Split(CRLF,atext) + Dim p As String + For j=0 To paragraphs.Length-1 + Dim lines As List + lines.Initialize + mts.fParagraphs.Add(lines) + p=paragraphs(j) + l="" + For i=0 To p.Length-1 + c=p.CharAt(i) + If Asc(c)>31 Then + l=l & c + ts=gTextSize(l) + If ts.fWidth>awidth Then + l=MultilineTextSizeAddLine(mts,ts,l,awidth) + End If + End If + Next + ts=gTextSize(l) + l=MultilineTextSizeAddLine(mts,ts,l,awidth) + Next + + Return mts +End Sub + +public Sub sX(avalue As Double) As cPDF + fContext.fX=avalue + Return Me +End Sub + +public Sub sY(avalue As Double) As cPDF + fContext.fy=avalue + Return Me +End Sub + +public Sub gX As Double + Return fContext.fX +End Sub + +public Sub gy As Double + Return fContext.fy +End Sub + +'get the lib version +public Sub glibversion As String + Return fLibVersion +End Sub \ No newline at end of file diff --git a/C_Bitacora.bas b/C_Bitacora.bas index c67c73f..0b4ae55 100644 --- a/C_Bitacora.bas +++ b/C_Bitacora.bas @@ -24,7 +24,7 @@ Public Sub Initialize (vCallback As Object, vEventName As String, vRoot As B4XVi Root2 = vRoot reqManager = DBReq db.ExecNonQuery("CREATE TABLE IF NOT EXISTS BITACORAGPS(fechab TEXT, usuariob TEXT, almacenb TEXT, rutab TEXT, eventob TEXT, clienteb TEXT, iniciob TEXT, finb TEXT, latitudb TEXT, longitudb TEXT, precision TEXT, motivonoventa TEXT, motivonovisita TEXT, BAN_GEOB TEXT)") -' agregaColumna("BITACORAGPS", "BAN_GEOB", "TEXT") + agregaColumna("BITACORAGPS", "BAN_GEOB", "TEXT") contadorIniciarVenta = 0 cargamosPanel Return Me