Portafolios
Puede ver los trabajos que hemos realizado y los que estamos realizando. No están todos, ya que no todos nos permiten publicarlo.
Como ves ,hay de todo, desarrollo, diseño, tecnico .. alguno de ahora, otros de hace mucho tiempo, pero siempre con la misma filosofia aunque nos pague millones :-):
- Open source : No hacemos código privativo.
- No hacemos nunca nada dañíno y poco etico.
- Siempre vemos los intereses del cliente primero antes de ver los nuestros.
- En todo momento enseñamos al cliente lo que hacemos.
Los trabajos presentado son todos aquellos que nos permite el cliente que lo hagamos, como hacemos colaboraciones con terceros: diseñadores,programadores y otras empresas de desarrollo, no podemos publicar todos.
Cuando vamos empezar un proyecto intentamos tener definido antes:
- Establecer objetivos como punto de partida, aunque probablemente cambien con el tiempo.
- Definir Target : Sería definir el objetivo a quien va dirigido.
- Estrategia como realizar eso objetivos.
Anotaciones para crear una entrada o categoria dentro la sección de portafolios..
- Créditos: Si aparte de nosotros, participa mas empresas o profesionales de la programación, también lo indicamos aquí.
- Tiempo empleado: Tanto tiempo efectivo , como tiempo estudio. El total horas empleadas.
- Los objetivos, tarjet y estrategia : Tanto los iniciales , como los conseguidos y los nos quedan pendientes.
Si se hace muy grande, generaremos un nueva categoría dentro portafolios.
Subcategorías
De momento la unica forma eliminar varios productos de una familia, lo puedes hacer desde la familia en la opcion de productos, ahí tiene que seleccionar el producto y luego pulsar el boton de eliminar
Funciones y objetivo de TPVFOX
Es una aplicación para gestionar medianas y pequeñas empresas. En la que puedes:
- Gestionar productos: Altas, modificaciones, gestión stock y control de precios.
- Gestionar Proveedores: Altas y modificaciones.
- Gestionar Clientes: Altas y modificaciones.
- Gestión de compras: Pedidos a proveedores, albaranes de entrada , Facturas de proveedores.
- Gestión de ventas: Tickets-POS, pedidos de clientes, albaranes y facturación-
También se puede conectar con una tienda e-comerce (Joomla + Virtuemart ), tiene la posibilidad conectarse otros e-comerce como :
- Prestashop
- woocommerce
- ...
Estas aun no esta creada la API, te apetece hacerla.
Licencia y código
Esta publico en GITHUB y con licencia GNU General Public License v2.0
Puede utilizarlo, modificarlo y incluso venderlo, lo que no puedes cambiar la licencia, el código debe ser abierto siempre.( leer licencia )
Aunque el proyecto aun esta su fase beta , ya hay varias empresas que la utilizan, si estas interesado en utilizarlo para ti o tu empresa, estaríamos encantados en ayudar.
Hay en creada una advertencia en albaranes de compras, que puede generar un error, que me imagino que puede suceder en pedidos en el modulo compras e incluso en pedido y albaranes en modulo de ventas..
La advertencia es está:
Esto realmente controla que el estado del albarán sea "Sin Guardar" igual que el de temporal. Si aparece es que hay un error, fijo.
Esto aparece cuando , pulsamos lapiz (2) para editar un albarán y este tiene un albarán temporal, pero el estado del albarán no es Sin Guardar.
Al aparecer, la advertencia lo que hace es cárganos el albarán, pero no nos permite editarlo, nos aparecería algo asi:
En este caso , al ser un albarán Guardado, tiene fácil solución , pulsando en el albarán temporal, ya nos deja editarlo y guardarlo.
La cuestión es cuando el albarán en vez de estar Guardado, está facturado o procesado, entonces el albarán temporal, ya nos permite guardarlo, nuevamente.
Algo que es correcto.
Esto sucede porque el albarán seguramente lo añadimos a una factura , pero lo dejamos abierta, pero la tenemos eliminada.
En tpvfox se puede relacionar productos entre tiendas, es decir tenemos una tabla que nos indica la relación entre ids de la tienda principal con las tiendas secundarías.
Esta relación se crea automáticamente al crear un producto en la tienda web ,por ejemplo.
El problema surge cuando un producto en la tienda principal, queremos que este relacionado con un producto que ya existe en la tienda web, pues no tenemos ninguna forma a nivel usuario para hacerlo.
Si podemos hacerlo desde la propia base de datos :
- Si ya existe una relación al id de la tienda web, simplemente debemos cambiar idArticulo por el nuevo, queremos.
- Si no existes ninguna relación, pero existe el producto en la web, entonces tenemos que obtener el id de la tienda web y crear un nuevo registro en la tabla articulosTiendas
Ejemplos consulta:
Modificar un indice relacion de un producto:
UPDATE `articulosTiendas` SET `idArticulo`=100 WHERE `idVirtuemart=XXXX and idTienda=2
Con esa instruccion en MariadB , cambiamos la relacion idVirtuemart (XXXX) y del registro de la tienda 2, que normalmente es la tienda web, y lo relacionamos con el producto 100
El mejor lugar para poner un formulario ( pop-up ) para que nos permita poner el id queremos relacionar, es la ficha del producto en el apartado de
En nuestro proyecto TPVFOX versionamos X.Y.Z
Método de crear versiones (tag)
Esto quiere decir que:
X: Fin de una etapa, ya se terminó de implantar de nuevas funcionalidades.
Y: Añadimos alguna funcionalidad o cambios bastante grandes.
Z: Pequeños cambios y pequeñas mejoras. Este número indicar cuantos commit esta por encima de la última versión (pequeños parches), si eres desarrollador y quieres saber que numero de version ver la respuesta a el punto siguiente , donde te explica como obtener cuando commits esta por encima.
¿Cómo sabemos en versión estamos?
De momento saber cuál es la única forma de saber cuál es la versión en la que estamos es a través de un repositorio de Git y desde la terminal poniendo la siguiente instrucción:
git describe
La respuesta es algo así
▶ git describe
v0.3.0-29-g3266211c
v0.3.0 es el tag, la versión que estamos. 29 indica que la rama actual esta 29 commit por encima de ese tag.
En la rama STABLE no debería indicar ningun numero, ya que no es habitual que estemos encima sin tener versionado. En otras ramas, como MASTER si puede estar por encima, ya que son ramas que estan en constante desarrollo.
Versiones de nuestra Base de Datos
Todos sabemos que los cambios en la estructura de la Base datos implica siempre posibles problemas con el código
Como versionamos nuestra Base de datos
En nuestro proyecto TPVFOX cuando realizamos un cambio en la estructura de la base de datos, lo que hacemos es un fichero con los cambios indicando la versión, este fichero se guarda en el directorio BD/Update con el nombre y sufijo de la versión, como indicamos a continuación:
install_update_vX.Y.[Z]
[Z] Estos al igual que al anterior, nos indica cuantos commits estamos por encima de la rama actual. No tiene por qué existir esa versión con esa terminación, pero sí son correlativas.
En estos ficheros puede encontrar las instrucciones SQL para ejecutar y así actualizar tu Base de Datos.
Siempre que hagamos un cambio en la base datos, generamos un fichero install_update_vX.Y.Z que es realmente el commit que vamos a hacer justo después de crearlo.
Cuando vayamos a actualizar un repositorio, simplemente debemos saber en versión estamos y luego actualizar el repositorio, luego solo tenemos que ejecutar los ficheros superiores a la versión que estábamos.
Por ejemplo, si estamos en la versión v0.2.22 del código, si actualizamos hasta la versión v.0.3.30, debemos ejecutar todos los ficheros que hay con las versiones superiores v0.2.22 en el directorio BD/Update, hasta la versión que vamos a actualizar.
Posibles problemas con Base Datos de backup
Nos podemos encontrar con el problema que cuando tenemos un backup de base de datos, ya que no sabemos en qué versión está esa copia. Y tampoco podemos comprobarlo con el código, puesto que realmente no está en funcionamiento y no tenemos repositorio instalado para ese backup.
Por este motivo, creamos este issue en el proyecto, para poder registrar el número de versión en una tabla de configuración, así de esa forma podemos guardar en esa tabla el número versión de la base de datos y luego simplemente tendríamos que actualizar desde esa versión.
El objetivo es hacer un proceso sencillo para poder controlar eventos de teclado y raton en input o cjas que necesitemos. Una idea similar como Shortcut.js.
Nosotros creamos lib teclado.js, que utilizamos en nuestro proyecto tpvfox, donde pretendemos controlar eventos de teclado y raton de un forma mas sencilla, creo que lo hemos conseguido :-)
¿Como empezar?
Lo primero añadir nuestra librería al proyecto, por ejemplo:
<script src="/lib/js/teclado.js" type="text/javascript"></script>
Luego añadir JS los Objetos queremos controlar, variables globales en JS en el head
var idInput = {
id_input : 'idInput', // Este se añade ante construir ya que el id input es Unidad_Fila_1
acciones : {
13 : 'accion_realizar_pulsar_intro', // Pulso intro
40 : 'accion_realizar_pulsar_abajo', // Pulso abajo.
38 : 'accion_realizar_pulsar_arriba', // Pulso arriba pero va para abajo.
},
parametros : {
dedonde : 'nombre_pantalla'
// Los parametros que podemos necesitar
}
}
Esto nosotros en tpvfox, no los añadimos directamente, lo generamos con el fichero parametros.xml, pero eso es otra historia a contar en otro momento.
Luego en nuestro html , en nuestro input debemos porne el atributo data-obj="Nombre_objeto_global". También tenemos que llamar a la funcion controlEventos(event) en el atributo html del evento queramos controlar.
En esta parte tienes que tener en cuenta que las funciones que necesita y utiliza son:
- function controladorAcciones(caja,accion)
- function after_constructor(padre_caja,event)
- function before_constructor(caja)
¿Que hace la funcion controladorAcciones ?
Esta funcion puede ser un switch o simple if donde comprobamos si existe la accion que le tenemos objeto global.
Llegamos a la funcion cuando pulso una tecla o un evento que tengamos definido en el objeto global, realizar la accion que le indiquemos
¿Que hace la funcion after_constructor(padre_caja,event)?
Antes de montar el objecto con la tecla y realizar accion, se ejecuta.
¿Que hace la funcion before_constructor(caja)?
Despues de montar la caja y antes de hacer la funcion que asignamos, se ejecuta.
Nota:
La definicion de esta dos ultimas funciones, debería se al contrario, pero como ya teníamos proyectos con ella, de momento no la cambiamos.
Aquí intentaremos explicar los posibles estado que pueda tener el campo estado en las distintas tablas del proyecto TPVFOX.
Este campo hasta ahora era varchar, sabemos que no es lo correcto, crearemos una tabla de estados para relacionarlas con un id :-)
Ahora definimos los posibles estados que vamos utilizando en las distintas tablas.
Explicacion general de permisos en tpvfox
La gestión de los permisos es independiente para cada usuario.
En la tabla usuarios tenemos un campo grupo_id que si le ponemos al usuario el valor 9 es como si fuera administrador y tiene todos los permisos.
Aunque los permisos son independiente y se podría quitar o poner permisos distintos a casa usuario.
Lo permisos pueden ser:
- 1 -> tiene acceso
- 0-> no tiene acceso
Los permisos de modulos , vistas o acciones los indicamos en el fichero access.xml de cada modulo pero siempre con jeraquia modulo->vista->accion. Por ejemplo:
- mod_clientes -> tiene permiso
- vista listado clientes -> tiene un permiso
- acciones dentro listado clientes -> tiene otro permiso.
No podemos crear un permiso una accion fuera de una vista.
¿Donde guardamos los permisos de cada usuario ?
Los permisos de cada usuario los guardamos en tabla permisos
¿ Que son lo permisos del con usuario 0 ?
Son los permisos que tenemos por defecto en los ficheros access.xml de todos los modulos y plugins.
Se utilizan para limpiar permisos y añadir los que faltan a cada usuario, reorganizar permisos.
¿ Donde añado un permiso a un modulo ?
Cuando se crea un modulo , en el fichero acces.xml se indica los permisos por defecto del modulo , de sus vistas y sus acciones.
Cuando en produccion añadimos una accion, entonces los permisos tienes que reorganizar permisos, tambien podermo resetear los permisos.
A la hora eliminar una familia solo te lo permite si desrelacionas productos y no tiene familias hijas.