Sistema web para cotizaciones y presupuestos

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
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
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.

40 comentarios en “Presentando un sistema web para hacer cotizaciones y presupuestos, gratuito y open source”

  1. 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 🙂

  2. 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

  3. 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

  4. 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 🙂 !

    1. 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 🙂

  5. 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!

    1. 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 🙂

  6. 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

  7. 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

    1. 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.

    1. 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 🙂

  8. Hola! soy nuevo en esto de programación y estoy tratando de montar su sistema pero me sale el siguiente error:”Fatal error: Uncaught Exception: No existe la clave (BASE_URL) en el archivo de configuración in C:\xampp\htdocs\cotizaciones\Comun.php:27 Stack trace: #0 C:\xampp\htdocs\cotizaciones\index.php(17): Comun::env(‘BASE_URL’) #1 {main} thrown in C:\xampp\htdocs\cotizaciones\Comun.php on line 27″, como se podria solucionar, de antemano te lo agradezco?

    1. 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

  9. hola, ayuda ya subi la base de datos ya realize los cambios pertinentes en env.php pero aun asi no generar error.
    ********************************
    ¡Objeto no localizado!

    No se ha localizado la URL solicitada en este servidor. Si usted ha introducido la URL manualmente, por favor revise su ortografía e inténtelo de nuevo.

    Si usted cree que esto es un error del servidor, por favor comuníqueselo al administrador del portal.
    Error 404
    localhost
    Apache/2.4.39 (Win64) OpenSSL/1.0.2s PHP/7.1.30

  10. hola, al intentar probarlo desde mi wamp me tira este error:
    ( ! ) Fatal error: Uncaught Exception: El archivo de configuración (C:\wamp64\www\cotizar/env.php) no existe in C:\wamp64\www\cotizar\Comun.php on line 19
    ( ! ) Exception: El archivo de configuración (C:\wamp64\www\cotizar/env.php) no existe in C:\wamp64\www\cotizar\Comun.php on line 19

    y note que en el zip que baje no esta el archivo env.php.

    Muchas gracias por tu colaboración!

    1. Hola. Ese comportamiento es intencional, pues el archivo env.php guarda las contraseñas y no debe sincronizarse.
      Lo que tienes que hacer es crear ese archivo, tomando como referencia el env.ejemplo.php, copia y pega, coloca tus credenciales de acceso y listo.
      No olvides seguirme en mis redes sociales y suscribirte

  11. Rafael Corona Herrera

    Buenas tardes, me parece un sistema genial. Crees posible que me pudieras ayudar a realizar una modificación para la cotización de productos tomando en cuenta variables de peso, distancia de entrega, etc. Saludos

  12. Pingback: Crear documentos de Word con PHP y PHPWord - Parzibyte's blog

    1. Hola. He revisado la base de datos y tu correo (br***.aaa**@gmail.com) ya estaba registrado así que lo eliminé. Intenta registrarte de nuevo, saludos 🙂

    2. saludos buen trabajo la verdad, quisiera saber porque la BD no se instala subo el esquema.sql , en phpadmin pero da error porque ?

    3. No lo sé, pero si pones el mensaje de error tal vez podamos averiguarlo. También asegúrate de que la base de datos exista con ese nombre, y que tienes permiso para manipularla

  13. Pingback: Plantilla inicial de Bootstrap 4 (starter template) - Parzibyte's blog

  14. Pingback: Login con base de datos de MySQL en PHP - Parzibyte's blog

  15. Pingback: PHP y PDO parte 2: iterar con cursor y comprobar si elemento existe - Parzibyte's blog

  16. Pingback: Unir o combinar archivos PDF con PHP y libmergepdf - Parzibyte's blog

Dejar un comentario