Sublime POS 3

Código fuente de Sublime POS 3

Como bien sabes, hace algún tiempo liberé mi sistema de ventas para que sea gratuito para Windows. Si bien liberé el programa, no liberé el código. En este post te mostraré cómo obtener el código fuente y lo que te envío al comprarlo, así como los lenguajes con los que está hecho y todo ello.

Desde ahora te aclaro que te daré exactamente el mismo código fuente que uso para la versión que ya he publicado anteriormente.

Comprar código fuente

Código fuente de sistema gratuito para Windows – Sublime POS 3

El costo del código fuente es de 2000 MXN (pesos mexicanos). Para obtenerlo:

  1. Lee el contenido del post para conocer la estructura, lenguajes y todos los detalles del código. Asegúrate de que el código es lo que necesitas, pues no hago ningún tipo de rembolso por ninguna razón una vez enviado el código.
  2. Realiza el pago con los métodos listados aquí
  3. Avísame que has hecho el pago en mi página de contacto
  4. Yo confirmaré el pago y te responderé con el código fuente en un archivo zip en el plazo de hasta 36 horas.

Todo lo que necesitas saber está en este post. Eso es lo que te entrego al comprarlo, así que te invito a leer todo esto minuciosamente.

Lenguajes de programación y tecnologías usadas

Se utiliza la arquitectura cliente servidor. En el lado del servidor se usa a Go. Para el lado del cliente he usado el framework Vuetify que es conjunto de componentes para Vue.Js, así que obviamente también he usado Vue.js y JavaScript que es el lenguaje en sí.

La base de datos es SQLite, se puede portar a MySQL cambiando algunas funciones (y antes de que me preguntes, está en el readme, si quieres leerlo puedes leerlo sin problemas y hacerlo).

Nota importante: en ocasiones te vas a encontrar código que ya no sirve pero que no he removido. Por ejemplo, los ajustes de la impresora o del ticket ya no se usan, en su lugar se imprime desde el navegador web.

Versiones de Node.js, Go y GCC

Conforme pasa el tiempo, los programas se actualizan y algunos dejan de ser compatibles con código que no fue escrito con esa versión. Para que no tengas problemas, te recomiendo que uses:

  1. Node 14.17.0
  2. Golang 1.17
  3. GCC 13.2.0

El código sigue funcionando al día de hoy, 20 de febrero de 2024. Para el caso de las versiones de Node, yo utilizo nvm para Windows.

Compilando en teléfono o tableta Android

Ya puedes usar este mismo código para compilar el punto de venta en Android, así que puedes usarlo en un teléfono o una tableta. Mira cómo se hace aquí.

Compilación en Raspberry Pi

Con este mismo código puedes tener un sistema de ventas gratis para la RPI:

Listado de archivos

Yo te enviaré un zip, mismo que contiene todo lo que ves, exceptuando las dependencias de Node, pues el archivo sería muy grande.

Listado de rutas de carpetas
El número de serie del volumen es
C:\USERS\PARZIBYTE\DESKTOP\TIENDAS-MASTER
└───tiendas-master
    │   .babelrc
    │   .editorconfig
    │   .gitattributes
    │   .gitignore
    │   .postcssrc.js
    │   compilar.py
    │   index.html
    │   package-lock.json
    │   package.json
    │   postcss.config.js
    │   README.md
    │
    ├───.idea
    │   │   misc.xml
    │   │   modules.xml
    │   │   tiendas.iml
    │   │   vcs.xml
    │   │   workspace.xml
    │   │
    │   └───inspectionProfiles
    │           Project_Default.xml
    │
    ├───api
    │   │   AjustesController.go
    │   │   ApartadosController.go
    │   │   AyudanteBaseDeDatos.go
    │   │   BaseDeDatosNegocios.go
    │   │   CajaController.go
    │   │   Clases.go
    │   │   ClientesController.go
    │   │   Constantes.go
    │   │   Correo.go
    │   │   DatosGraficasController.go
    │   │   Desarrollo.go
    │   │   desarrollo.py
    │   │   esquema_negocios.sql
    │   │   esquema_negocios_sqlite.sql
    │   │   esquema_spos.sql
    │   │   esquema_spos_sqlite.sql
    │   │   Full.go
    │   │   Funciones.go
    │   │   go.mod
    │   │   go.sum
    │   │   init.sql
    │   │   main.go
    │   │   makefile
    │   │   NegociosController.go
    │   │   PermisosController.go
    │   │   Produccion.go
    │   │   ProductosController.go
    │   │   PruebaGratuita.go
    │   │   rutas_admin.go
    │   │   rutas_ajustes.go
    │   │   rutas_apartados_abonos.go
    │   │   rutas_caja.go
    │   │   rutas_clientes.go
    │   │   rutas_graficas.go
    │   │   rutas_http.go
    │   │   rutas_login.go
    │   │   rutas_misc.go
    │   │   rutas_negocios.go
    │   │   rutas_permisos.go
    │   │   rutas_productos.go
    │   │   rutas_usuarios.go
    │   │   rutas_utiles.go
    │   │   rutas_ventas_contado.go
    │   │   Sesion.go
    │   │   sesiones.sqlite
    │   │   UsuariosController.go
    │   │   VentasContadoController.go
    │   │
    │   └───plantillas_correos
    │           recordatorio_uso_sistema.html
    │           verificar_cuenta.html
    │
    ├───build
    │       build.js
    │       check-versions.js
    │       logo.png
    │       utils.js
    │       vue-loader.conf.js
    │       webpack.base.conf.js
    │       webpack.dev.conf.js
    │       webpack.prod.conf.js
    │
    ├───config
    │       dev.env.js
    │       index.js
    │       prod.env.js
    │
    ├───src
    │   │   .gitrepo
    │   │   App.vue
    │   │   constantes.js
    │   │   funciones.js
    │   │   http-common.js
    │   │   main.js
    │   │
    │   ├───assets
    │   │   │   logo.png
    │   │   │
    │   │   └───inicio
    │   │           ajustes.png
    │   │           bolsa-de-la-compra.png
    │   │           codigo-de-barras.png
    │   │           dinero.png
    │   │           escudo.png
    │   │           estadistica.png
    │   │           logo.png
    │   │           monedas.png
    │   │           que-hacer.png
    │   │           red.png
    │   │           salpicadero.png
    │   │           tareas.png
    │   │
    │   ├───components
    │   │   │   AcercaDe.vue
    │   │   │   DialogoPermisoDenegado.vue
    │   │   │   EliminarNegocio.vue
    │   │   │   Escritorio.vue
    │   │   │   Inicio.vue
    │   │   │   Login.vue
    │   │   │   Logout.vue
    │   │   │   Publicidad.vue
    │   │   │   VerificarNegocio.vue
    │   │   │
    │   │   ├───Ajustes
    │   │   │       Ajustes.vue
    │   │   │       DatosNegocio.vue
    │   │   │       Impresora.vue
    │   │   │       Otros.vue
    │   │   │
    │   │   ├───Caja
    │   │   │   │   Caja.vue
    │   │   │   │   Egresos.vue
    │   │   │   │   Ingresos.vue
    │   │   │   │
    │   │   │   └───Dialogos
    │   │   │           Egreso.vue
    │   │   │           Ingreso.vue
    │   │   │
    │   │   ├───Clientes
    │   │   │       Clientes.vue
    │   │   │       DialogoConfirmarEliminacion.vue
    │   │   │       FormularioEditarCliente.vue
    │   │   │       FormularioNuevoCliente.vue
    │   │   │       Historial.vue
    │   │   │       ListaDeClientes.vue
    │   │   │
    │   │   ├───Graficas
    │   │   │       Graficas.vue
    │   │   │       VentasAnio.vue
    │   │   │       VentasMes.vue
    │   │   │
    │   │   ├───Inventario
    │   │   │       DialogoAumentarExistencia.vue
    │   │   │       DialogoConfirmarEliminacion.vue
    │   │   │       DialogoRestarExistencia.vue
    │   │   │       ExportarImportar.vue
    │   │   │       FormularioEditarProducto.vue
    │   │   │       FormularioNuevoProducto.vue
    │   │   │       ListaDeProductos.vue
    │   │   │       Productos.vue
    │   │   │
    │   │   ├───Otros
    │   │   │       CodigosBarra.vue
    │   │   │       DialogoCambiarProducto.vue
    │   │   │       HacerInventario.vue
    │   │   │
    │   │   ├───Registro
    │   │   │       DialogoNegocioExistente.vue
    │   │   │       DialogoNegocioNoRegistrado.vue
    │   │   │       DialogoNegocioRegistrado.vue
    │   │   │       Registro.vue
    │   │   │
    │   │   ├───Reportes
    │   │   │   │   Inventario.vue
    │   │   │   │   ProductosMasVendidos.vue
    │   │   │   │   ProductosMenosVendidos.vue
    │   │   │   │   ProductosNuncaVendidos.vue
    │   │   │   │   SeleccionadorFechas.vue
    │   │   │   │   Stock.vue
    │   │   │   │
    │   │   │   ├───Caja
    │   │   │   │       Caja.vue
    │   │   │   │
    │   │   │   └───Ventas
    │   │   │       │   Abonos.vue
    │   │   │       │   Apartado.vue
    │   │   │       │   Contado.vue
    │   │   │       │   ProductosApartados.vue
    │   │   │       │
    │   │   │       └───Apartados
    │   │   │               CambiarFechaVencimiento.vue
    │   │   │
    │   │   ├───Tickets
    │   │   │       Caja.vue
    │   │   │       Encabezado.vue
    │   │   │       Pie.vue
    │   │   │       TicketAbono.vue
    │   │   │       TicketApartado.vue
    │   │   │       TicketVentaContado.vue
    │   │   │
    │   │   ├───Usuarios
    │   │   │       DialogoNuevo.vue
    │   │   │       Lista.vue
    │   │   │       Permisos.vue
    │   │   │       Usuarios.vue
    │   │   │
    │   │   └───Vender
    │   │           AutocompletadoClientes.vue
    │   │           AutocompletadoProductos.vue
    │   │           DetallesClienteSeleccionado.vue
    │   │           DialogoApartado.vue
    │   │           DialogoBusquedaProducto.vue
    │   │           DialogoCambiarPrecioVenta.vue
    │   │           DialogoConfirmacionVaciarLista.vue
    │   │           DialogoVentaContado.vue
    │   │           ListaDeProductos.vue
    │   │           SpeedDial.vue
    │   │           Vender.vue
    │   │
    │   ├───fonts
    │   │       material-icons.woff2
    │   │       roboto-v18-latin-300.woff
    │   │       roboto-v18-latin-300.woff2
    │   │       roboto-v18-latin-500.woff
    │   │       roboto-v18-latin-500.woff2
    │   │       roboto-v18-latin-700.woff
    │   │       roboto-v18-latin-700.woff2
    │   │       roboto-v18-latin-regular.woff
    │   │       roboto-v18-latin-regular.woff2
    │   │       roboto-v18-latin.zip
    │   │
    │   └───router
    │           index.js
    │
    └───static
            .gitkeep

A continuación colocaré el contenido del archivo README.md que yo mismo escribí y con el que me guío cada vez que olvido cómo configurar el entorno. Ese archivo está en el código fuente pero igualmente lo adjunto aquí, pues ese es el único manual

Vídeo de apoyo

En este vídeo te enseño a modificar el código fuente en general:

Aquí puedes aprender a modificar el símbolo monetario (signo de moneda):

En este vídeo te enseño a agregar un nuevo módulo al sistema de ventas:

En el siguiente vídeo puedes ver cómo subir este sistema a un VPS para usarlo en internet:

Verificación de archivos

En la última actualización se hace una verificación de los archivos del lado del cliente para comprobar que no se han modificado. Si se quiere desactivar, hay que ir a las líneas 61 a 63 de main.go y removerlas.

Por otro lado, si esto se quiere usar hay que compilar el lado del cliente, calcular el sha512 de cada archivo, ir a checksum_archivos.go, y ajustar nombres de archivo junto con el checksum

Preparando entorno de desarrollo

Se necesita contar con NPM y Go, además de GCC si se usa SQLite3 pues el mismo debe ser compilado. Por otro lado, si quieres que el makefile funcione, debes contar con make

Una vez que tengas el proyecto, abre una terminal en el mismo. Instala las dependencias de Node con:

npm install

Después de eso ya puedes iniciar el servidor de desarrollo con: npm run start

Ahora vamos al lado del servidor así que abre otra terminal y navega a este directorio pero entra a la carpeta api.

Si tienes make ejecuta:

make

Y él se encargará de todo.

O en caso de que no tengas make instala las dependencias de Go con: go mod tidy

Luego formatea el código (no es necesario, pero se ve bonito): gofmt -w .

Finalmente compila con: go build -o tiendas.exe -tags desarrollo

Y luego ejecuta tiendas.exe

Compilando para producción

Lado del servidor

Recuerda que debes estar dentro de api. Compila para producción con: make prod

O si no cuentas con make, compila así: go build -o tiendas_prod_64.exe -tags produccion -ldflags "-H windowsgui"

Ahora copia los siguientes archivos a una carpeta limpia:

  • tiendas_prod_64.exe
  • esquema_negocios_sqlite.sql
  • esquema_spos_sqlite.sql
  • init.sql

Y dentro de esa misma carpeta crea otra carpeta vacía llamada dist

Hasta el momento el árbol debe verse así:

λ tree /F
Listado de rutas de carpetas
El número de serie del volumen es 
C:.
│   esquema_negocios_sqlite.sql
│   esquema_spos_sqlite.sql
│   init.sql
│   tiendas_prod_64.exe
│
└───dist

Lado del cliente

Recuerda que NO debes estar dentro de api.

Compila los archivos con: npm run build

Dentro de dist (carpeta recién creada por el script, no te confundas con la que creaste anteriormente) mover la carpeta fonts a css de manera que su ruta ahora sea css/fonts

Entra a las carpetas js y css, busca los archivos que terminen en map y elimínalos

Copia todo lo de dist (TODO LO DE dist, no la carpeta en sí, sino su contenido) a la carpeta dist que creaste anteriormente.

Verificando

Ahora el directorio se debería ver así:

λ tree /F
Listado de rutas de carpetas
El número de serie del volumen es 
C:.
│   esquema_negocios_sqlite.sql
│   esquema_spos_sqlite.sql
│   init.sql
│   tiendas_prod_64.exe
│
└───dist
    │   index.html
    │
    ├───css
    │   │   app.9afe257e7d77a264e0675dacea965a46.css
    │   │
    │   └───fonts
    │           material-icons.ac188f9.woff2
    │           roboto-v18-latin-300.55536c8.woff2
    │           roboto-v18-latin-300.a1471d1.woff
    │           roboto-v18-latin-500.2854671.woff2
    │           roboto-v18-latin-500.de8b743.woff
    │           roboto-v18-latin-700.037d830.woff2
    │           roboto-v18-latin-700.cf6613d.woff
    │           roboto-v18-latin-regular.5d4aeb4.woff2
    │           roboto-v18-latin-regular.bafb105.woff
    │
    ├───img
    │       ajustes.06556a3.png
    │       bolsa-de-la-compra.8aefc13.png
    │       dinero.280fff4.png
    │       escudo.2db8426.png
    │       estadistica.d676772.png
    │       monedas.cc6526e.png
    │       que-hacer.c1d47a0.png
    │       red.524a30a.png
    │       salpicadero.f66d1ab.png
    │       tareas.ecd565c.png
    │
    └───js
            app.6a416a79713a4b7ab346.js
            manifest.5ebdb86dbeef19313db4.js
            vendor.01fdaafe859388bfc024.js

Ahora solo resta distribuir la app. Cuando lo hagas, solo hay que ejecutar: tiendas_prod_64.exe

Y luego visitar http://localhost:2106/static/

Usar MySQL en lugar de SQLite3

Este sistema es compatible con MySQL, pero por ahora solo se usa pensando en SQLite3. Si quieres cambiar a MySQL aquí están los apuntes

Funciones de fecha

Si se usa SQLite3 se debe usar la función STRFTIME en lugar de DATE_FORMAT usada en MySQL. Recuerda que hay diferencias, por ejemplo, para extraer el mes con SQLite3 es:

strftime("%m", fecha)

Mientras que con MySQL es:

date_format(fecha, "%m")

Por ahora se ha encontrado el uso de la función en:

  • DatosGraficasController.go

Archivos

En lugar de usar los archivos que terminan en sqlite.sql deberían usarse solo los de .sql, haciendo los cambios también en Constantes.go

CREATE DATABASE

Con SQLite3 no es necesario el create database... pero con MySQL sí. Si vas a usar MySQL, además de los cambios de arriba, debes cambiar el if en NegociosController.go:380

Condiciones que acepta al comprar el código fuente

  1. Una vez enviado el código fuente no puedo hacer reembolsos pues al ser un producto digital el mismo no puede devolverse.
  2. Una vez enviado el código fuente usted cuenta con 24 horas para reportar posibles errores. Estos errores solo serán tomados en cuenta si usted está usando el código fuente sin modificar y si ya ha leído la guía. Es importante que revise la guía y los vídeos pues ahí se detallan todos los posibles errores, versiones de programas e incluso algunos tutoriales para hacer cambios. Pasadas las 24 horas desde que yo lo envío y si usted no me reporta nada, supondré que el código funcionó perfectamente.
  3. La compra del código fuente no incluye soporte técnico, modificaciones, resolución de dudas ni ayuda. Tampoco incluye la subida a ningún servidor. Se le puede brindar el soporte necesario pero por un costo adicional, pues el código ya ha sido extensamente probado siguiendo la guía aquí presente.
  4. El código fuente por el que usted está pagando es por Sublime POS 3 sin gestión de negocios. Para obtener el código fuente que incluye gestión de negocios mire este post.
  5. La compilación del código fuente está garantizada en un entorno Windows 10 y 11. Debería funcionar en cualquier otro entorno en donde se pueda instalar gcc y go (lo he compilado correctamente en Elementary OS y Raspbian), pero no está garantizado.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

7 min hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

6 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

6 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

6 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

6 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

6 días hace

Esta web usa cookies.