Cotizador de Productos con PHP 5.6, MySQL y Bootstrap 3

 

cotizador_productos

En esta ocasión quiero compartir una actualización al código de Sistema Web de Cotizaciones PHP y MySQL, el cual publique hace algunos meses en éste blog, pero debido a que recibí muchos comentarios de mis lectores que en algunas versiones recientes de PHP el código les presentaba problemas de incompatibilidad con la conexión a la base de datos; decidí hacer unas pequeñas modificaciones al código para resolver dichos problemas que les presentaba la conexión con mysql.

Lo que necesitaremos:

  • PHP 5.5 o posterior
  • Extensión de MySQLi activa
  • Bootstrap 3
  • Directiva short_open_tag=On dentro del php.ini
  • Librería jQuery
  • Librería HTML2PDF para generar PDF

Lo que haremos:

  1. Crear la base de datos, para el ejemplo la he llamado cotizador_bs3.

     
  2. Configurar las variables de conexión a la base de datos. Para ello he creado una carpeta dentro del directorio raíz llamada config, y dentro de dicha carpeta se creará el archivo db.php con el código siguiente

     
  3. Realizar la conexión a la base de datos creando dentro de la carpeta config un archivo llamado conexion.php con el código siguiente.

     
  4. Preparar el archivo index.php, el cual contendrá parte del código html para nuestro cotizador. Ademas se incluirá las funciones JavaScript encargada de hacer consultas via AJAX a la base de datos. Empezemos.

    Lo que hace el código anterior es crear la estructura html para hacer funcional nuestro cotizador, en donde se ha agregado un formulario que captura los datos. También hemos creados dos funciones JavaScript, la primera se encarga de hacer consultas a la base de datos mysl para mostrar los productos registrados en la tabla productos, la segunda función agrega los productos al cotizador.
  5. Crear la carpeta Ajax y dentro de ello crear el archivo llamado productos_cotizacion.php, el cual se encargará hacer las consultas Ajax en la base de datos.
  6. Dentro de la carpeta Ajax se creará el archivo agregar cotizador.php, el cual también es llamado vía Ajax mediante función JavaScript y su función será ir agregando los productos al cotizador.

    7. Finalmente se creará el archivo pdf para visualizar la cotización para éste ejemplo se usará la estructura siguientes pdf/documentos y dentro de la carpeta documentos irá el archivo llamado cotizacion_pdf.php, veamos el código:

    el archivo anterios hace una llamada al archivo con la ruta siguiente: pdf/documentos/res/cotizacion_html.php.

    Mira la Demostración

Bien eso sería todo para tener nuestro cotizador de productos en linea, cualquier duda no dudes en comentar este post, estaré pendiente a tus comentarios.

Sistema de control de inventario

Para descargar los archivos, debes realizar cualquiera de las siguientes acciones sociales: 

  • Pingback: Sistema Web de Cotizaciones PHP y MySQL - Sistemas Web()

  • Pingback: Sistema web de cotizaciones | Sistemas Web()

  • Gonzalo Rojas

    Estimado Obed,

    Muy agradecido por tu video y explicación, la verdad me fue muy util. Quisiera consultarte como es posible recuperar o visualizar las cotizaciones ya generadas.

    Desde ya muchas gracias.
    Saludos
    Gonzalo Rojas

    • http://obedalvarado.pw/cotizador-web/ Obed

      Hola Gonzalo.

      Decirte que si es posible visualizador las cotizaciones generadas. A continuación presento la aplicación donde se administran las cotizaciones: http://obedalvarado.pw/cotizador-web/

      Espero tus comentarios!

      • Wilquis Rafael Barragán García

        Esta funcionalidad viene con este script o es de pago?

  • Vanesa Claros

    Estimado Obed

    Primero agradecerte por compartir tus conocimientos, mi consulta es la siguiente, estoy probando el codigo, pero al mismo tiempo agregandole mas campos, pero al momento de generar el doc pdf, me genera un error.

    Notice: Undefined offset: 0 in C:wampwwwcotizacionpdfhtml2pdf.class.php on line 5125

    Estare agradecida en que puedas ayudar con eso
    Gracias
    Atte. Vanesa Claros

    • Obed

      Hola Vanesa, al archivo que está en la ruta pdf/documentos/cotizacion_pdf.php, busca la siguiente linea de código: ob_start(); y la colocas al inicio del script.

      Luego que lo hayas hecho te imprimirá dentro del pdf los errores que impiden que se genere el PDF.

      Saludos!

  • Pingback: ¿Cómo crear una base de datos MySQL en cPanel? - Sistemas Web()

  • Cristian

    Hola Buenos días, pidiendo de tu apoyo para resolver un problema con el desarrollo web que hiciste, es acerca del cotizador web gratuito, no me carga los productos, y la base de datos ya esta configurada (en donde deberian aparecer los productos solo me aparece lo siguiente: <? echo $precio ). Tal vez tu me puedas guiar con alguna sugerencia. (Te anexo imagen).

    Quedo a la espera de tus comentarios.
    Saludos.
    Gracias.

    • Cristian

      Anexo imagen

      • Obed

        Hola buenos día para solucionar el error debes configurar tu archivo php.ini y buscar la directiva short_open_tag y establecerla asi: short_open_tag=On

        Tutorial para saber como hacerlo: https://www.youtube.com/watch?v=X9vijdPiARs

        Esta en ingles pero de seguro servirá.

        Saludos

  • Gerardo Roa

    Buen día hermano, excelente aporte, podrías subir también el formulario para el llenado de la tabla productos?

    • Obed

      Hola Gerardo, decirte que puedes agregar los datos relacionados a los productos directamente desde la base de datos MySQL!

  • Miguel Zhañay

    hola compañero asi es como me sale la pantalla .. ovbio se conecta a la base de datos o sino no corriera el programa pero no me aparece ningun dato

    • Obed

      Hola Miguel, decirte que si se conecta a la base de datos y el problema que tienes actualmente es que tienes la directiva short_open_tag desactivada. lo que tienes que hacer para activarla es lo siguiente:
      1- Abrir el panel de control de XAMPP en windows, en configuracion buscar la opcion que dice PHP (php.ini) y abrir el archivo
      2- Una vez dentro del archivo php.ini debes buscar la directiva short_open_tag, la cual deberia aparecer asi: short_open_tag=Off, debes reemplazar el Off a On
      3- Guardas los cambios y reinicias apache. Listo ahora deberia funcionar el script

  • veeme

    Hola me sale un error como en la imagen y sobre la fecha.

    • Obed

      Hola el error se debe a que la configuración de PHP no cumple con los requisitos para correr la aplicación, mi consejo es que uses XAMPP para correr el sistema
      https://www.apachefriends.org/es/index.html

      • raidens

        Yo tuve este mismo error y se soluciona agregando la zona en el php.ini. En mi caso no estaba configurado este archivo

        • Obed

          Gracias por comentar lo solución, y efecto así es como dices

  • Sebastiab Barbosa

    Hola Obed primero que todo agradecer por tan buen trabajo que haces

    lo que pasa es que quiero cambiar el formato para los precios de los productos quisiera saber si me puedes colaborar con este pequeño incomvniente ya que no encuentro la parte del codigo gracias por tu colaboracion

    • Obed

      Hola Sebastiab Barbosa, para cambiar el formato de la moneda ve a la ruta siguiente ajax/productos_cotizacion.php, luego editas el archivo productos_cotizacion.php y buscas la linea 69 (ver imagen) y le cambias el formato a los números con la función: number_format http://php.net/manual/es/function.number-format.php

      • Sebastiab Barbosa

        Muchas gracias Obed por tu colaboración Gracias por tu ayuda

        • Obed

          De nada :). Me cuentas como te va con el cambio!

          • Sebastiab Barbosa

            Gracias por tu aporte tu ayuda fue de gran importancia, quisiera saber como cambio también el formato del precio en el pdf específicamente en el código de cotizciones_pdf.php Gracias por tu colaboracion Obed buen dia

          • Sebastiab Barbosa

            Gracias por tu aporte Obed fue de gran ayuda para solucionar el problema

          • Nekonogamez Comunidad

            Hola, resulta que tengo el mismo problema yo cambien en
            ajax/productos_cotizacion.php
            $precio_venta=number_format($precio_venta,2); por
            $precio_venta=number_format($precio_venta,$number); pero resulta que
            cuando quiero agregar un producto por ejemplo me sale asi 2,000 (con la
            comilla) y me da erro me dice “esto no es un numero”, que puedo hacer
            para solucionar esto? y si borro la comilla me deja agregar el producto

          • Obed

            La función number_format acepta uno, dos, o cuatro parámetros (no tres). Para que la funcion no te coloque una coma(,) como separador de millares, debes hacer lo siguiente: $precio_venta=number_format($precio_venta,2,’.’,”);

          • Nekonogamez Comunidad

            muchas gracias, quiero saber si me podrias dar soporte de pago para adaptar el sistema a cotizador (cambiando los modulos para que no diga factura y algunos otros cambios, me seria de mucha utilidad, por favor dejame tu numero o un correo para llevarlo a cabo lo antes posible pagando un 50% del trabajo antes y el otro 50% despues)

          • Obed

            Puede contactarme mas rápido en el siguiente enlace: http://obedalvarado.pw/contacto/

  • Pingback: Sistema web de pedidos con PHP, MySQL y Bootstrap 3 - Sistemas Web()

  • Daniel Barron

    Saludos, me a servido muchisimo este ejemplo que tienes de cotizador, me puedes ayudar ya que al generar el pdf me manda el siguiente mensaje, segui tu consejo anterior de mover la linea ob_start(); al inicio del script, y sale este mensaje me puedes ayudar ya que no encuentro que puede ser
    anexo imagen

    • Obed

      Al parecer es un error de sintaxis, si moviste el código asegúrate que la instruccion que le antecede a: session_start esté correctamente escrita!

      • Daniel Barron

        Gracias por contestar amigo, pero que crees estoy probando tu ejemplo, lo acabo de descargar y estaba chocando eso, vi un comentario anterior donde comentas mover esa línea para que de mostrará el error, por eso lo hice, pero no e movido el código, ya que lo estoy chocando como ejemplo

  • Edgar Monroy

    Hola, muchas gracias por el script,
    lo he podido instalar, pero no me deja imprimir el pdf .. me aparece este error

    Warning: Cannot modify header information – headers already sent by (output started at /home/beandfa/public_html/cotizador/config/db.php:1) in /home/beandfa/public_html/cotizador/pdf/_tcpdf_5.0.002/tcpdf.php on line 6122

    TCPDF ERROR: Some data has already been output to browser, can’t send PDF file

    he visto tus comentarios y cambie la linea

    ob_start();
    al principio .. y ya me genera el PDF, pero con una hora en blanco al inicio que solo trae un: ?

    como lo puedo solucionar ???
    saludos !!!!!

    • Obed

      Hola Edgar. Ese error se debe a que existe en error en la sintaxis del código, hace unos meses tuve un problema similar con otro usuario, y es que cuando el script se subió al servidor con filezilla el programa le quita las tabulaciones, asegurate que el archivo de conexion a la base de datos este con las tabulaciones y saltos de linea correspondientes!

  • raidens

    Estimado .. Me funciona casi todo llego al momento de hacer la cotización pero no se guarda en la base de datos .. Se crea todo el Pdf de forma correcta (tuve que cambiar <? por <?php) pero no se ingresan los datos a la base de datos
    Utilizo Os X El captian
    PHP Version 5.5.34

    Alguna forma de verificar el funcionamiento de este :/

  • Nekonogamez Comunidad

    Hola, resulta que tengo el mismo problema yo cambien en
    ajax/productos_cotizacion.php
    $precio_venta=number_format($precio_venta,2); por
    $precio_venta=number_format($precio_venta,$number); pero resulta que
    cuando quiero agregar un producto por ejemplo me sale asi 2,000 (con la
    comilla) y me da erro me dice “esto no es un numero”, que puedo hacer
    para solucionar esto? y si borro la comilla me deja agregar el producto

    • Obed

      Es una validación simple con jquery para que solo te acepte numeros. Y si el código tiene inconveniente con los cantidades millares, lo que debes hacer es formatear el numero pero sin la coma(,) así: $precio_venta=number_format($precio_venta,2,’.’,”);

      • Nekonogamez Comunidad

        Muchas Gracias!!! una ultima cosa me podrias ayudar como agregar un boton de “Nuevo Producto” para insertar nuevos productos o editar lo que ya se encuentras en la DB porque en la actual solo se visualiza la lista que ya se encuentra en la DB pero no ahi forma de agregar nuevos productos o editar los que ya estan desde el mismo cotizador para realizar la cotizacion, desde ya darte las gracias por compartir este sistema con nosotros y felicitarte por el gran trabajo que haces!

        • Obed

          Con mucho gusto podría ayudarte pero antes me gustaría que le eches un vistazo al siguiente proyecto: http://obedalvarado.pw/simple-invoice/
          Es un sistema de facturación simple que cuenta con los siguientes módulos:
          1- Módulo de Facturación
          2- Módulo de Productos
          3- Módulo de Clientes
          4- Administración de usuarios

          Te invito a que lo veas y lo descargues, te aseguro que también podría ser de utilidad para tus proyectos!

          • Nekonogamez Comunidad

            Si lo vi pero es una factura y lo que me interesa es solo la cotizacion, por ende agregarle el IVA al costo de la cotizacion y el boton de agregar nuevo producto a la DB quedaria perfecto

          • Obed

            Entiendo, es por ello que mande el enlace al sistema de facturación, ya que ese sistema con unas pequeñas modificaciones estaría generando cotizaciones. Solo es de renombrar el modulo de facturación por cotizaciones y quedaría listo.

  • Diana Citlalli

    Hola Obed! oye que buenisimo aporte! solo que me marca el error de “Esto no es un numero ” al momento en que quiero almacenar un dato con millares , hice esto:
    precio_venta=$row[‘precio_tmp’];
    $precio_venta_f=number_format($precio_venta, 2, ‘,’, ‘ ‘);//Formateo variables
    $precio_venta_r=str_replace(“,”,”,”,””,$precio_venta_f);//Reemplazo las comas
    $precio_total=$precio_venta_r*$cantidad;
    $precio_total_f=number_format($precio_total,2, ‘,’, ‘ ‘);//Precio total formateado
    $precio_total_r=str_replace(“,”,”,”,””,$precio_total_f);//Reemplazo las comas
    $sumador_total+=$precio_total_r;//Sumador
    y tampoco :S ayuda porfavoor

    • Obed

      Aqui la respuesta: Es una validación simple con jquery para que solo te acepte numeros. Y si el código tiene inconveniente con los cantidades millares, lo que debes hacer es formatear el numero pero sin la coma(,) así: $precio_venta=number_format($precio_venta,2,’.’,”);

      • Diana Citlalli

        Garacias por la pronta respuesta Obed, pero que crees, ya lo cambie asi y aun me sigue marcando la alarma de que no es numero. :S
        y ya cambie la validación mira.

        • Obed

          Ve a la carpeta ajax y edita el archivo que se llama productos_cotizacion.php y en la linea 69 aprox. reemplaza esto: $precio_venta=number_format($precio_venta,2); por esto $precio_venta=number_format($precio_venta,2,’.’,”);

          Lo que hace es quitar la coma (,) como separador de millares, haciendo eso lo solucionas

          • Diana Citlalli

            Oye Obed muchisisisimmas gracias! ya quedo 😉 que tengas buen día n.n

          • Obed

            Es un placer ayudarte!! Buen día para ti

          • Diana Citlalli

            Obed otra molestia mas u.u al momento en que quiero sacar el pdf me casa este error mira:
            estuve investigando y tenia que cambiar en el archivo de php.ini (date.timezone =America/Mexico_City) asi lo puse pero e sigue marcado el mismo error :S

          • Obed

            Que error te lanza puedes colocar una captura de pantalla?

          • Diana Citlalli

            cuando mando a imprimir me sale este

          • Diana Citlalli

            ya me quedo obed! solo era cuestion de reiniciar el apachhe y ya :p

  • Diana Citlalli

    Obed otra molestia mas u.u al momento en que quiero sacar el pdf me casa este error mira:
    estuve investigando y tenia que cambiar en el archivo de php.ini (date.timezone =America/Mexico_City) asi lo puse pero e sigue marcado el mismo error :S

  • Dayi

    hola como estan buen video pero tengo un inconveniente , no me jala los datos

    • Obed

      Hola Dayi, veo que estas haciendo una factura en base al cotizador, mira este ejemplo a lo mejor te sirva mucho mas: http://obedalvarado.pw/simple-invoice/

      • Dayi

        Si estoy haciendo con ese ejemplo pero al ajax no me coje

      • Dayi

        me puedes ayudar porfa es para mi tesis este es mi código:
        productos_ cotizacion
        <?php
        include("conexion.php");
        $con=conectarse();

        $action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:'';
        if($action == 'ajax'){
        // escaping, additionally removing everything that could be (html/javascript-) code
        $q = mysqli_real_escape_string($con,(strip_tags($_REQUEST['q'], ENT_QUOTES)));
        $aColumns = array('idproductos', 'nombre');//Columnas de busqueda
        $sTable = "productos";
        $sWhere = "";
        if ( $_GET['q'] != "" )
        {
        $sWhere = "WHERE (";
        for ( $i=0 ; $i0){

        ?>

        Código
        Producto
        Marca
        Cant.
        Agregar Descuento
        Precio

        <input type="text" class="form-control" style="text-align:right" id="cantidad_” value=”1″ >

        <input type="text" class="form-control" style="text-align:right" id="descuento_” value=”0″ >

        <input type="text" class="form-control" style="text-align:right" id="precio_venta_” value=”” >

        <a href="#" onclick="agregar('’)”>

        Ajax:
        function agregar (id)
        {
        var precio_venta=document.getElementById(‘precio_venta_’+id).value;
        var cantidad=document.getElementById(‘cantidad_’+id).value;
        var descuento=document.getElementById(‘descuento_’+id).value;
        //Inicia validacion
        if (isNaN(cantidad))
        {
        alert(‘Esto no es un número’);
        document.getElementById(‘cantidad_’+id).focus();
        return false;
        }
        if (isNaN(descuento))
        {
        alert(‘Esto no es un número’);
        document.getElementById(‘descuento_’+id).focus();
        return false;
        }
        if (isNaN(precio_venta))
        {
        alert(‘Esto no es un número’);
        document.getElementById(‘precio_venta_’+id).focus();
        return false;
        }
        //Fin validacion

        $.ajax({
        type: “POST”,
        url: “agregarfactura.php”,
        data: “id=”+id+”&precio_venta=”+precio_venta+”&cantidad=”+cantidad+”&descuento=”+descuento,
        beforeSend: function(objeto){
        $(“#resultados”).html(“Mensaje: Cargando…”);
        },
        success: function(datos){
        $(“#resultados”).html(datos);
        }
        });
        }

        agregar

        CODIGO
        CANT.
        DESCRIPCION
        PRECIO UNIT.
        PRECIO TOTAL

        <a href="#" onclick="eliminar('’)”>

        SUBTOTAL $

        DESCUENTO $

        IVA ()% $

        TOTAL $

  • Elton

    mi estimado amigo tengo una pregunta :cuando genero el archivo pdf cada cotizacion tiene un numero de correlativo, en mi caso me aparece el mismo numero de correlativo, me deberia de ir sumando uno a uno, me puedes ayudar ?
    saludos

  • Jose Alarcon

    Hola buenas tardes, pido de tu apoyo para ver si me puedes ayudas a sacar el iva al momento de generar el pdf, otra cosa, hay forma de que al momento de agregar productos, hay forma de que el precio que se muestra no se pueda editar? Saludos.

    • Obed

      Hola Jose, gracias por tu consulta. Decirte que si es posible agregar el IVA al PDF, pero para ello deberás crear un nuevo campo en la tabla que almacena las cotizaciones para que guardes el monto del IVA . (pdf/documentos/res/cotizacion_html.php) es la ruta del archivo que debes modificar.

      Y con respecto al agregar productos que no sea editables mi sugerencia es que pongas en un campo oculto el campo y luego dentro de la celda imprimir al campo del precio para que este sea siempre visible al usuario!

  • pacomics

    Que tal,
    Excelente aporte, estoy probandolo:
    No identifico el siguiente error al realizar la busqueda de productos:

    Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/#####/domains/#######/public_html/######/ajax/productos_cotizacion.php on line 37

    ¿Podrías apoyarme?
    Saludos!

    • Obed

      Hola, gracias por tu comentario.
      Decirte que el sistema ha sido probado con XAMPP https://www.apachefriends.org/

      Mi consejo que descargues xampp y lo pruebes usando ese servidor local, luego de haberlo probado con xampp me dices si te funciona!

      • pacomics

        Gracias por tu respuesta, lo intentare desde servidor local. Saludos!

  • Ivan Arrua

    hola muy buen aporte! me ayudo muchisimo pero tengo una duda como hago para que los productos elegidos y guardados en la base de datos no se acumulen es decir cada vez que yo quiera elegir uno nuevo no se sume al total del anterior?

    • Obed

      Existe un variable que suma los productos cada vez que se agreguen, mi consejo que es que reinicies la variable que suma los datos!

      • Ivan Arrua

        Muchas gracias lo probare!

  • Dax

    hola que tal disculpa podrías ayudarme? me manda errores a la hora de agregar productos los cuales son:
    Notice: Undefined variable: con in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 15

    Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 15

    Notice: Undefined variable: con in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 36

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 36

    Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 37

    Notice: Undefined variable: con in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 43

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:xampphtdocscotizaajaxproductos_cotizacion.php on line 43

    gracias

    • Obed

      Hola, gracias por tu comentario.
      Decirte que el sistema ha sido probado con XAMPP https://www.apachefriends.org/es/index.html

      Mi consejo que descargues xampp y lo pruebes usando ese servidor local, luego de haberlo probado con xampp me dices si te funciona!

  • Reinaldo Lugo

    saludos una pregunta sera que se puede enlazar este programa con la data de la bd de tu programa de factura simple en la parte de productos

  • PedroX s10

    Gracias por el aporte, que tan recomendable es que se monte en un servidor con cPanel? me gustaria agregar 2 botones mas para agregar productos nuevos y editar los mismos, me podrias hechar la mano a que codigo modificar porfa?

  • Lenin Morales Rivera

    Hola obed, me ha gustado este mini cotizador, lo he modificado para que funcione en el DB del sistema de facturación que hicistes, Pero tengo una duda y creo que a alguien ya le ha pasado, ¿Como puedo Registar las cotizaciones para que se pueda generar como factura? o sea, que uno hace la cotización, que la guarde en la DB y que al consultar en la facturacion aparezca como factura No pagada, Solo necesito saber como guardarlo en esa sección nada mas.

  • Xarenmi Villanueva

    Tengo un problema al buscar los productos para cotizar. La base de datos ya está configurada y no cambié nada en el código. Revisé el php.ini y shot_open_tag está activado. Alguna sugerencia?

    https://uploads.disquscdn.com/images/f428ad357d87d9dc4ac395c3415d0d78837aad81f9ff7cf72a57f570b3dda1a0.png

    • Obed

      Hola Xarenmi, gracias por tu consulta. Con esa captura no tengo bastante información para determinar con exactitud la raíz del problema, pero podría casi asegurarte que el archivo que realiza la petición a la base de datos via AJAX, no se esta ejecutando.

      • Xarenmi Villanueva

        Gracias 🙂 revisé el archivo y si había un detalle a la hora de la conexión. Ahora mi problema es que el precio del producto puede ser modificado manualmente a la hora de cotizar, intenté cambiar el campo del precio a ‘readonly’ pero luego no agrega el producto. Si pudieras darme alguna sugerencia sería fabuloso 🙂