Software y sistemas

Presentando un sistema web para hacer cotizaciones y presupuestos, gratuito y open source

Hoy vengo a presentar un software para realizar cotizaciones o presupuestos, el cual es totalmente gratuito de usar en la nube; así como open source. Es decir, aparte de que puedes usarlo en mi sitio, puedes descargarlo y modificarlo.

Sistema web para cotizaciones y presupuestos

Características del software

No es la gran cosa, pero entre sus principales características encontramos las siguientes:

  • Realizar cotizaciones o presupuestos
  • Estimar el costo requerido, el cual se configura por cada servicio
  • Calcular tiempo requerido por cada servicio
  • Describir características y/o condiciones del trabajo
  • Agregar clientes para ligarlos a las cotizaciones
  • Imprimir la cotización o guardarla como PDF (esto depende del navegador la mayoría de veces)
  • Multiusuario: cualquier usuario puede registrarse y usarlo, así de simple. Eso sí, las cotizaciones, servicios y características son separadas por usuario
  • Totalmente open source
  • Escrito con PHP, utiliza PDO para interactuar con la base de datos
  • Base de datos MySQL
  • Lado del cliente con Vue.JS y Bootstrap
  • Mensaje de agradecimiento, presentación y pie totalmente configurables

Se me ocurre que puede servir tanto como para estudiantes que tienen que entregar un proyecto con PHP simple, así como para personas que necesitan un software como estos.

Voy a explicar cómo fue creado, en dónde se puede probar y también dónde se puede leer el código fuente.

Una introducción técnica

Este sistema está creado con PHP utilizando PDO para conectar con MySQL. Usé lo mismo que explico en Introducción a PHP con PDO y MySQL, o en la creación de un pequeño sistema de ventas.

En el lado del cliente utiliza a Bootstrap 4 y Vue.Js en su versión 2. Para convertir los minutos a un tiempo legible por los humanos, utilizo lo que se vio aquí. Por otro lado, para formatear el dinero utilizo la función que convierte números a dinero que publiqué anteriormente (lo puse rápidamente como filtro gracias a la simplicidad de Vue).

La sesión de PHP es manejada por un, valga la redundancia, manejador o handler propio de sesiones, el cual utiliza MySQL para la persistencia y que publiqué hace algún tiempo.

Ah, olvido decir que no se utiliza ningún framework para PHP; es el lenguaje en su simplicidad absoluta.

Hablando de las contraseñas, las cifro con bcrypt (mira este tutorial para hashear en PHP) pero antes de ello las convierto en una cadena de longitud fija con md5 (para evitar poner un límite en la longitud de las mismas). Así, aunque MD5 es rompible por un ataque de diccionario, bcrypt no, porque usa sal.

Sobre la seguridad puedo decir que utilizo un token CSRF para evitar ataques CSRF, y para comprobar el token utilizo hash_equals en lugar de una simple comparación; todo esto para mitigar ataques de temporización.

Demostración y pruebas del software

Puedes probar la aplicación web haciendo click aquí o entrando en bit.ly/cotizaciones_online. Funciona perfectamente; regístrate con tu correo electrónico y luego inicia sesión.

El software es web, y por lo tanto multiplataforma. Puedes acceder a él desde una tableta, teléfono o computadora desde cualquier parte del mundo. Aparte de eso, gracias al diseño responsivo se adapta a cualquier pantalla.

La siguiente captura es de mi teléfono:

App web para cotizaciones, presupuestos y costos en un teléfono Android

Un PDF que fue generado (la impresión sale casi idéntica) es el que se puede ver aquí.

Hablar es de mal gusto, muéstrame el código

Bueno, ya hablé mucho. El código fuente está en GitHub bajo la licencia MIT. En resumen puedes hacer lo que quieras con el software, incluso venderlo. Eso sí, no te doy garantía de nada; pero bueno, si quieres ver la licencia puedes leerla en el repositorio.

Motivación

Lo que me motivó a hacerlo es que ya estaba harto de usar Microsoft Word; porque aunque hay plantillas excelentes ninguna es una herramienta ad-hoc (o como se les diga, no sé si es el término correcto).

Aparte de ello, no podía acceder a la plantilla si no tenía mi computadora presente, y sobre todo, no calculaba cosas automáticamente.

Instalación

He creado un vídeo para que sepas cómo instalar el software en tu entorno local o servidor:

El futuro

Conforme pase el tiempo, lo iré puliendo un poco más (me ayudarías si lo compartes y usas).

Eres libre de dejar comentarios para mejorarlo, o reportar errores. Encontrarás más información en la página Acerca de del sistema.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

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

  • excelente proyecto estoy intentando modificarlo agregando otras tablas y todo bien el detalle es que al querer modificar navegacion.php y agregarle mas opciones me sale este error [ warning cannot modify header information - headers already sent by (output started at ] podira decirme el porque se produce y como lo puedo solucionar de antemano muchas gracias :)

  • Hola que tal,
    Me parece genial este sistema y muy fácil de entenderlo, lo he probado y le he realizado algunas modificaciones como por ejemplo en vez de colocar servicios voy a cotizar productos, para esto he creado una nueva tabla y un nuevo controlador, sin embargo al seleccionar el producto quiero que el valor del mismo lo pinte en un campo texto de valor pero no puedo hacerlo, tienes una función o un metodo que realice este paso?

    Gracias de antemano y te felicito por esta pagina

  • que tal,
    me marca este error al dar login veo q es cuestion de redireccionamiento porque si guarda la sesion y si me voy manual en el url me funciona sin problemas, que podra ser?
    Cannot modify header information - headers already sent by (output started at /srv/disk3/3047164/.../encabezado.php:1) in /srv/disk3/3047164/.../Utiles.php on line 7

    • Hola. Le invito a ver el vídeo de instalación, puede que le haya faltado crear una tabla o algo así.
      Saludos :)

  • Hola Luis, gracias por tu respuesta. Te respondo por acá porque no puedo responder a tu comentario.
    Yo lo estoy instalando en un servidor externo.
    [url]
    Ahí te dejo la dirección donde podes probar el error que te comento. El problema del envío de formulario ocurre cuando ya con un usuario registrado intento ingresar a la presupuestadora en sí. La pantalla queda en blanco y no se carga lo que sería la parte principal. Tengo que actualizar para que cargue. Ocurre lo mismo al cerrar sesión.
    Muchas gracias por tu respuesta nuevamente
    Saludos :) !

    • Hola. Tal vez se saltó un paso en la instalación del sistema; por favor asegúrese de que ha seguido todos los pasos de la instalación. Entiendo que es el mismo software, pero como puede ver, en mi servidor funciona perfectamente.
      Igualmente si quiere una ayuda personalizada puede contactarme en https://parzibyte.me
      Saludos :)

  • Buenas! Un trabajo excelente y muy útil! ya lo instalé y lo estoy intentando probar pero tengo un problema y es con el envío de formulario. Cuando quiero ingresar en la sección principal o cuando quiero desloguearme, me queda la página en blanco y por consola me aparece el mensaje
    "Confirmar reenvío del formulario. Esta página web necesita los datos introducidos anteriormente para mostrarse correctamente. Puedes volver a enviar los datos, pero se repetirán las acciones que haya realizado la página.
    Pulsa el botón de actualización de página para que se vuelvan a enviar los datos necesarios para cargar la página.
    ERR_CACHE_MISS"
    Al actualizar la página se muestra el contenido, pero quería saber si me podías guiar en donde está el error o donde puedo solucionarlo.
    Un saludo y gracias de antemano!

  • Me lanza ese error, no encuentro ese archivo autoload.php

    Fatal error: require(): Failed opening required 'C:\xampp\htdocs\sistema_pagos_php/vendor/autoload.php'

    • Hola. Me estás mencionando el error del sistema de pagos, pero este sistema es de cotizaciones. Por favor publica tu comentario en el post correspondiente.
      Saludos :)

  • perdona se dice buen día que mal educado soy, gracias por la ayuda y muchas gracias por compartir tus conocimientos, gracias nuevamente y este comentario debería ser mi inicio, perdón.
    ahora si viene la pregunta que te realice arriba

  • el contenido de mi env.php es:

    ;
    ; URL base del proyecto, algo como https://sitio.com
    BASE_URL = "http://127.0.0.1/coTatiana/"
    ;BASE_URL = "localhost/coTatiana"

    USUARIO_MYSQL = "root"
    PASS_MYSQL = ""
    NOMBRE_BD_MYSQL = "cotizaciones"
    HOST_MYSQL = "127.0.0.1"

    USUARIO_MYSQL_SESION = "root"
    PASS_MYSQL_SESION = ""
    NOMBRE_BD_MYSQL_SESION = "cotizaciones"
    HOST_MYSQL_SESION = "127.0.0.1"

    ; De Google Analytics
    ;ID_SEGUIMIENTO = ""
    ; Publicidad
    AD_CLIENT = ""
    AD_SLOT = ""

    y de acuerdo a una de tus respuestas:

    Hola amigo, el error te lo está diciendo todo: no existe la clave BASE_URL en el archivo de configuración. Debes crear un archivo llamado env.php que se parezca a env.ejemplo.php y después llenarlo con los datos correctos, incluyendo BASE_URL que sería la URL en donde estará tu proyecto.
    Saludos.

    entonces que tengo mal?, porque el archivo env.php lo puse tal cual con mi configuracion y a mi me sale este error (te comento que le quite espacion en blanco a los archivos y lo tabule)

    escribo variables
    array(11) { ["BASE_URL"]=> string(27) "http://127.0.0.1/coTatiana/" ["USUARIO_MYSQL"]=> string(4) "root" ["PASS_MYSQL"]=> string(12) ",2020,hidra," ["NOMBRE_BD_MYSQL"]=> string(12) "cotizaciones" ["HOST_MYSQL"]=> string(9) "127.0.0.1" ["USUARIO_MYSQL_SESION"]=> string(4) "root" ["PASS_MYSQL_SESION"]=> string(12) ",2020,hidra," ["NOMBRE_BD_MYSQL_SESION"]=> string(12) "cotizaciones" ["HOST_MYSQL_SESION"]=> string(9) "127.0.0.1" ["AD_CLIENT"]=> string(0) "" ["AD_SLOT"]=> string(0) "" } localhost
    array(11) { ["BASE_URL"]=> string(27) "http://127.0.0.1/coTatiana/" ["USUARIO_MYSQL"]=> string(4) "root" ["PASS_MYSQL"]=> string(12) ",2020,hidra," ["NOMBRE_BD_MYSQL"]=> string(12) "cotizaciones" ["HOST_MYSQL"]=> string(9) "127.0.0.1" ["USUARIO_MYSQL_SESION"]=> string(4) "root" ["PASS_MYSQL_SESION"]=> string(12) ",2020,hidra," ["NOMBRE_BD_MYSQL_SESION"]=> string(12) "cotizaciones" ["HOST_MYSQL_SESION"]=> string(9) "127.0.0.1" ["AD_CLIENT"]=> string(0) "" ["AD_SLOT"]=> string(0) "" }

    inicia error
    Warning: Uncaught Exception: No existe la clave (localhost) en el archivo de configuración in D:\VServ\www\coTatiana\Comun.php:25 Stack trace: #0 D:\VServ\www\coTatiana\BD.php(17): Comun::env('localhost') #1 D:\VServ\www\coTatiana\Sesion.php(24): BD::obtenerParaSesion() #2 [internal function]: Sesion->open('', 'PHPSESSID') #3 D:\VServ\www\coTatiana\SesionService.php(22): session_start() #4 D:\VServ\www\coTatiana\SesionService.php(33): SesionService::init() #5 D:\VServ\www\coTatiana\index.php(49): SesionService::obtenerIdUsuarioLogueado() #6 {main} thrown in D:\VServ\www\coTatiana\Comun.php on line 25

    Fatal error: session_start(): Failed to initialize storage module: user (path: ) in D:\VServ\www\coTatiana\SesionService.php on line 22

    • No veo la necesidad de modificar la estructura del archivo de entorno; recomiendo dejarlo como está. En el post dejé un vídeo de instalación.

  • hola buenas tardes pude ver el buen trabajo que hizo pero al subir mi cotizador en linea me sale este error [url] me puede ayudar, por favor

    • Hola, claro que sí. Dice que no existe la clave ID_SEGUIMIENTO en el archivo Comun.php, esto quiere decir que en el archivo de configuración Env debe poner la clave de seguimiento, o simplemente remover en el index la parte que inserta el script de Google Analytics.
      Saludos :)

Entradas recientes

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

4 días hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

4 días hace

Imprimir PDF generado con HTML

Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…

5 días hace

JavaScript: llenar select con arreglo

En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…

2 semanas hace

Imprimir PDF a partir de URL

En este artículo se presenta una guía para imprimir un PDF a partir de una…

2 semanas hace

Imprimir PDF a partir de base64

En este post voy a enseñarte cómo imprimir un PDF a partir de su representación…

2 semanas hace

Esta web usa cookies.