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:
- Crear la base de datos, para el ejemplo la he llamado cotizador_bs3.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385-- phpMyAdmin SQL Dump-- version 4.2.11-- http://www.phpmyadmin.net---- Servidor: 127.0.0.1-- Tiempo de generación: 21-07-2015 a las 03:07:42-- Versión del servidor: 5.6.21-- Versión de PHP: 5.6.3SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";SET time_zone = "+00:00";/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;---- Base de datos: `cotizador_bs3`---- ------------------------------------------------------------ Estructura de tabla para la tabla `cotizaciones_demo`--CREATE TABLE IF NOT EXISTS `cotizaciones_demo` (`id_cotizacion` int(11) NOT NULL,`numero_cotizacion` int(11) NOT NULL,`fecha_cotizacion` datetime NOT NULL,`atencion` varchar(50) NOT NULL,`tel1` varchar(9) NOT NULL,`empresa` varchar(75) NOT NULL,`tel2` varchar(9) NOT NULL,`email` varchar(30) NOT NULL,`condiciones` varchar(30) NOT NULL,`validez` varchar(20) NOT NULL,`entrega` varchar(20) NOT NULL) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;---- Volcado de datos para la tabla `cotizaciones_demo`--INSERT INTO `cotizaciones_demo` (`id_cotizacion`, `numero_cotizacion`, `fecha_cotizacion`, `atencion`, `tel1`, `empresa`, `tel2`, `email`, `condiciones`, `validez`, `entrega`) VALUES(1, 1, '2015-07-19 06:52:51', 'Pepe', '70555', '', '', '', 'Nota: Las Condicione', '', ''),(2, 2, '2015-07-19 06:53:38', 'Pepe', '70555', '', '', '', 'Nota: Las Condicione', '', ''),(3, 3, '2015-07-19 06:55:42', 'Pepe', '70555', '', '', '', 'Nota: Las Condicione', '', ''),(4, 4, '2015-07-19 06:59:01', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(5, 5, '2015-07-19 07:00:12', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(6, 6, '2015-07-19 07:03:09', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(7, 7, '2015-07-19 07:03:34', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(8, 8, '2015-07-19 07:08:59', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(9, 9, '2015-07-19 07:10:20', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(10, 10, '2015-07-19 07:11:09', 'Pepe', '70555', '', '', '', 'Nota: Las Condiciones de pago ', '', ''),(11, 11, '2015-07-19 07:11:47', 'Pepe', '70555', 'test', '700', 'joaquinobed@gmail.com', 'Nota: Las Condiciones de pago ', '', ''),(12, 12, '2015-07-19 07:15:03', 'Pepe', '70555', 'test', '700', 'joaquinobed@gmail.com', 'Nota: Las Condiciones de pago ', '', ''),(13, 13, '2015-07-19 07:16:34', 'Pepe', '70555', 'test', '700', 'joaquinobed@gmail.com', 'Nota: Las Condiciones de pago ', '', ''),(14, 14, '2015-07-19 07:16:51', 'Pepe', '70555', 'test', '700', 'joaquinobed@gmail.com', 'Nota: Las Condiciones de pago ', '', ''),(15, 15, '2015-07-19 07:20:34', 'Juan Diego', '222-2220', 'Invertir Mejor', '2222-0000', 'info@invertirmejor.com', 'Nota: Las Condiciones de pago ', '', ''),(16, 16, '2015-07-20 07:27:16', 'Juan Perez', '7070', '', '', '', '', '', ''),(17, 17, '2015-07-20 07:29:50', 'Juan Perez', '7070', '', '', '', '1', '', ''),(18, 18, '2015-07-20 07:32:30', 'Juan Perez', '7070', '', '', '', 'Contado', '', ''),(19, 19, '2015-07-20 07:34:38', 'Juan Perez', '7070', '', '', '', 'Contado', '', ''),(20, 20, '2015-07-20 07:35:01', 'Juan Perez', '7070', '', '', '', 'Contado', '', ''),(21, 21, '2015-07-20 07:38:07', 'Juan Perez', '7070', '', '', '', 'Contado', '15 dÃas', 'Inmediato'),(22, 22, '2015-07-21 03:06:14', 'Juan Diego', '70587677', 'Invertir Mejor', '2230-000', 'info@invertirmejor.com', 'Crédito 30 dÃas', '15 dÃas', 'Inmediato');-- ------------------------------------------------------------ Estructura de tabla para la tabla `detalle_cotizacion_demo`--CREATE TABLE IF NOT EXISTS `detalle_cotizacion_demo` (`id_detalle_cotizacion` int(11) NOT NULL,`numero_cotizacion` int(11) NOT NULL,`id_producto` int(11) NOT NULL,`cantidad` int(11) NOT NULL,`precio_venta` double NOT NULL) ENGINE=MyISAM AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;---- Volcado de datos para la tabla `detalle_cotizacion_demo`--INSERT INTO `detalle_cotizacion_demo` (`id_detalle_cotizacion`, `numero_cotizacion`, `id_producto`, `cantidad`, `precio_venta`) VALUES(1, 1, 3, 1, 25),(2, 2, 2, 1, 15),(3, 3, 1, 1, 10),(4, 4, 3, 1, 25),(5, 5, 4, 1, 40),(6, 6, 4, 1, 40),(7, 7, 1, 1, 10),(8, 8, 3, 1, 25),(9, 9, 4, 1, 40),(10, 10, 2, 1, 15),(11, 10, 2, 1, 15),(12, 10, 4, 21, 40),(13, 10, 2, 1, 15),(14, 10, 2, 1, 15),(15, 10, 2, 1, 15),(16, 10, 2, 1, 15),(17, 10, 2, 1, 15),(18, 10, 2, 1, 15),(19, 10, 1, 1, 10),(20, 11, 3, 1, 25),(21, 12, 3, 1, 25),(22, 13, 3, 1, 25),(23, 14, 4, 21, 40),(24, 15, 1, 1, 10),(25, 15, 5, 2, 25),(26, 16, 67, 1, 12),(27, 16, 67, 1, 12),(28, 16, 67, 1, 12),(29, 16, 1, 1, 10),(30, 17, 1, 1, 10),(31, 18, 1, 1, 10),(32, 19, 2, 1, 15),(33, 20, 3, 1, 25),(34, 21, 5, 1, 18),(35, 22, 1, 1, 10);-- ------------------------------------------------------------ Estructura de tabla para la tabla `marcas_demo`--CREATE TABLE IF NOT EXISTS `marcas_demo` (`id_marca` int(11) NOT NULL,`nombre_marca` char(40) NOT NULL) ENGINE=MyISAM AUTO_INCREMENT=89 DEFAULT CHARSET=utf8;---- Volcado de datos para la tabla `marcas_demo`--INSERT INTO `marcas_demo` (`id_marca`, `nombre_marca`) VALUES(1, 'Mega'),(2, 'HP'),(3, 'Black and decker'),(4, 'Honda'),(5, 'Pedrollo'),(6, 'Taifu'),(7, 'Porter cable'),(8, 'Milwaukee'),(9, 'Riggid'),(10, 'Karcher'),(11, 'Lincoln electric'),(12, 'Goni'),(13, 'Poulan'),(14, 'Bosch'),(15, 'Franklin electric'),(16, 'Shell Helix'),(17, 'QUINCIP'),(18, 'Briggs stratton'),(19, 'Champions'),(20, 'Parker'),(21, 'Norflex'),(22, 'Campbell Hausfeld'),(23, 'Koyo'),(24, 'Alkota'),(25, 'Amsterdam'),(26, 'Oster'),(27, 'Trupper'),(28, 'Truck Hose'),(29, 'Trapp'),(30, 'Ducar'),(31, 'Brahman'),(32, 'Ngk'),(33, 'Midwest Can'),(34, 'Maccolloch'),(35, 'Nuvo'),(36, 'Oregon'),(37, 'Swingfog'),(38, 'Irwin'),(39, 'Makita'),(40, 'Hilti'),(41, 'JOHN DEERE'),(42, 'Valdoch'),(43, 'JAZ'),(44, 'Stanley'),(45, 'Pressure wave'),(46, 'Delta'),(47, 'Urrea'),(48, 'Skil'),(49, 'Surtek'),(50, 'China'),(51, 'Foy'),(52, 'Amana tool'),(53, 'Norton'),(54, '3M'),(55, 'Square'),(56, 'Vanguard'),(57, 'Gbs'),(58, 'Quality'),(59, 'Miller'),(60, 'Mundial'),(61, 'Fini'),(62, 'Nova'),(63, 'Somar'),(64, 'Timberline'),(65, 'Forte'),(66, 'Aguila'),(67, 'Kimberly Clark'),(68, 'Diamond'),(69, 'Schulz'),(70, 'Genteq'),(71, 'Bellota'),(72, 'Ultra'),(73, 'Craftsman'),(74, 'Asein'),(75, 'Knova'),(76, 'Generica'),(77, 'Sagola'),(78, 'Arvek'),(79, 'Yale'),(80, 'Leeson'),(81, 'Siemen'),(82, 'Baldor'),(83, 'StaRite'),(84, 'Diablo'),(88, 'ARO'),(86, 'Booster'),(87, 'Dremel');-- ------------------------------------------------------------ Estructura de tabla para la tabla `productos_demo`--CREATE TABLE IF NOT EXISTS `productos_demo` (`id_producto` int(11) NOT NULL,`codigo_producto` char(20) NOT NULL,`nombre_producto` char(100) NOT NULL,`modelo_producto` varchar(30) NOT NULL,`id_departamento_producto` int(11) NOT NULL,`id_marca_producto` int(11) NOT NULL,`status_producto` tinyint(4) NOT NULL,`unidad_medida_producto` char(20) NOT NULL,`peso_producto` char(20) NOT NULL,`date_added` datetime NOT NULL,`precio_producto` double NOT NULL) ENGINE=MyISAM AUTO_INCREMENT=4301 DEFAULT CHARSET=utf8;---- Volcado de datos para la tabla `productos_demo`--INSERT INTO `productos_demo` (`id_producto`, `codigo_producto`, `nombre_producto`, `modelo_producto`, `id_departamento_producto`, `id_marca_producto`, `status_producto`, `unidad_medida_producto`, `peso_producto`, `date_added`, `precio_producto`) VALUES(1, 'MG01', 'Mouse inalambrico', '', 3, 1, 1, 'Cada una', 'sin peso', '2013-03-25 20:35:15', 10),(2, 'TCL01', 'Teclado multimedia', '', 3, 1, 1, '', '', '2013-03-25 20:35:15', 15),(3, 'ILK059', 'Nuevo mini 2.4g micro inalambrico de teclado', '', 3, 1, 1, '', '', '2013-03-25 20:35:15', 25),(4, '4520', 'TECLADO para HP 4520', 'MS250', 3, 2, 1, '', '', '2013-03-25 20:35:15', 40),(5, 'A081', 'Altavoz de la computadora', '', 3, 2, 1, '', '', '2013-03-25 20:35:15', 18),(64, 'MSD01', '2GB Tarjeta Micro SD', '', 2, 2, 1, '', '', '2013-03-25 20:35:15', 5),(65, 'AUR01', 'Adaptador usb para radio cd', '', 2, 2, 1, '', '', '2013-03-25 20:35:15', 5),(66, 'SA-205', '2.0 de canal de sonido multimedia sa-205', '', 2, 2, 1, '', '', '2013-03-25 20:35:15', 13),(67, 'KB-1830', 'Teclado multimedia de alta calidad', '', 2, 1, 1, '', '', '2013-03-25 20:35:15', 12);-- ------------------------------------------------------------ Estructura de tabla para la tabla `tmp_cotizacion`--CREATE TABLE IF NOT EXISTS `tmp_cotizacion` (`id_tmp` int(11) NOT NULL,`id_producto` int(11) NOT NULL,`cantidad_tmp` int(11) NOT NULL,`precio_tmp` double(8,2) DEFAULT NULL,`session_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;---- Volcado de datos para la tabla `tmp_cotizacion`--INSERT INTO `tmp_cotizacion` (`id_tmp`, `id_producto`, `cantidad_tmp`, `precio_tmp`, `session_id`) VALUES(55, 4, 1, 40.00, 'se7uf7ajc6unfc7npv6rgpum21');-- ------------------------------------------------------------ Estructura de tabla para la tabla `user_demo`--CREATE TABLE IF NOT EXISTS `user_demo` (`user_id` int(11) NOT NULL,`firstname` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`lastname` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`email` varchar(96) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`code` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`status` tinyint(1) NOT NULL,`date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00') ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;---- Volcado de datos para la tabla `user_demo`--INSERT INTO `user_demo` (`user_id`, `firstname`, `lastname`, `email`, `code`, `status`, `date_added`) VALUES(1, 'Obed', 'Alvarado', 'joaquinobed@gmail.com', '2555', 1, '2014-04-11 00:00:00');---- Índices para tablas volcadas------ Indices de la tabla `cotizaciones_demo`--ALTER TABLE `cotizaciones_demo`ADD PRIMARY KEY (`id_cotizacion`), ADD UNIQUE KEY `numero_cotizacion` (`numero_cotizacion`);---- Indices de la tabla `detalle_cotizacion_demo`--ALTER TABLE `detalle_cotizacion_demo`ADD PRIMARY KEY (`id_detalle_cotizacion`), ADD KEY `numero_cotizacion` (`numero_cotizacion`,`id_producto`);---- Indices de la tabla `marcas_demo`--ALTER TABLE `marcas_demo`ADD PRIMARY KEY (`id_marca`);---- Indices de la tabla `productos_demo`--ALTER TABLE `productos_demo`ADD PRIMARY KEY (`id_producto`), ADD UNIQUE KEY `codigo_producto` (`codigo_producto`), ADD KEY `id_departamento_producto` (`id_departamento_producto`), ADD KEY `id_marca_producto` (`id_marca_producto`);---- Indices de la tabla `tmp_cotizacion`--ALTER TABLE `tmp_cotizacion`ADD PRIMARY KEY (`id_tmp`);---- Indices de la tabla `user_demo`--ALTER TABLE `user_demo`ADD PRIMARY KEY (`user_id`);---- AUTO_INCREMENT de las tablas volcadas------ AUTO_INCREMENT de la tabla `cotizaciones_demo`--ALTER TABLE `cotizaciones_demo`MODIFY `id_cotizacion` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=23;---- AUTO_INCREMENT de la tabla `detalle_cotizacion_demo`--ALTER TABLE `detalle_cotizacion_demo`MODIFY `id_detalle_cotizacion` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=36;---- AUTO_INCREMENT de la tabla `marcas_demo`--ALTER TABLE `marcas_demo`MODIFY `id_marca` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=89;---- AUTO_INCREMENT de la tabla `productos_demo`--ALTER TABLE `productos_demo`MODIFY `id_producto` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4301;---- AUTO_INCREMENT de la tabla `tmp_cotizacion`--ALTER TABLE `tmp_cotizacion`MODIFY `id_tmp` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=77;---- AUTO_INCREMENT de la tabla `user_demo`--ALTER TABLE `user_demo`MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
- 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
12345678910<?php/*-------------------------Autor: Obed AlvaradoWeb: obedalvarado.pwMail: info@obedalvarado.pw---------------------------*/define("DB_HOST", "localhost");//DB_HOST: generalmente suele ser "127.0.0.1"define("DB_NAME", "cotizador_bs3");//Nombre de la base de datosdefine("DB_USER", "root");//Usuario de tu base de datosdefine("DB_PASS", "root");//Contraseña del usuario de la base de datos
- 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.
123456789101112131415<?php/*-------------------------Autor: Obed AlvaradoWeb: obedalvarado.pwMail: info@obedalvarado.pw---------------------------*/# conectare la base de datos$con=@mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);if(!$con){die("imposible conectarse: ".mysqli_error($con));}if (@mysqli_connect_errno()) {die("Conexión falló: ".mysqli_connect_errno()." : ". mysqli_connect_error());}?>
- 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --><title>Cotizador de Productos Online</title><!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"><!-- Optional theme --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"><!-- Latest compiled and minified JavaScript --><script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script><!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!-- WARNING: Respond.js doesn't work if you view the page via file:// --><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--></head><body><div class="container"><div class="row-fluid"><div class="col-md-12"><h2><span class="glyphicon glyphicon-edit"></span> Nueva Cotización</h2><hr><form class="form-horizontal" role="form" id="datos_cotizacion"><div class="form-group row"><label for="atencion" class="col-md-1 control-label">Atención:</label><div class="col-md-3"><input type="text" class="form-control" id="atencion" placeholder="Atención" required></div><label for="tel1" class="col-md-1 control-label">Teléfono:</label><div class="col-md-2"><input type="text" class="form-control" id="tel1" placeholder="Teléfono" required></div></div><div class="form-group row"><label for="empresa" class="col-md-1 control-label">Empresa:</label><div class="col-md-3"><input type="text" class="form-control" id="empresa" placeholder="Nombre de la empresa"></div><label for="tel2" class="col-md-1 control-label">Teléfono:</label><div class="col-md-2"><input type="text" class="form-control" id="tel2" placeholder="Teléfono empresa"></div><label for="email" class="col-md-1 control-label">Email:</label><div class="col-md-3"><input type="email" class="form-control" id="email" placeholder="Email"></div></div><div class="col-md-12"><div class="pull-right"><button type="button" class="btn btn-info" data-toggle="modal" data-target="#myModal"><span class="glyphicon glyphicon-plus"></span> Agregar productos</button><button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-print"></span> Imprimir</button></div></div></form><br><br><div id="resultados" class='col-md-12'></div><!-- Carga los datos ajax --><!-- Modal --><div class="modal fade bs-example-modal-lg" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog modal-lg" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">Buscar productos</h4></div><div class="modal-body"><form class="form-horizontal"><div class="form-group"><div class="col-sm-6"><input type="text" class="form-control" id="q" placeholder="Buscar productos" onkeyup="load(1)"></div><button type="button" class="btn btn-default" onclick="load(1)"><span class='glyphicon glyphicon-search'></span> Buscar</button></div></form><div id="loader" style="position: absolute; text-align: center; top: 55px; width: 100%;display:none;"></div><!-- Carga gif animado --><div class="outer_div" ></div><!-- Datos ajax Final --></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button></div></div></div></div></div></div></div><!-- jQuery (necessary for Bootstrap's JavaScript plugins) --><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script><!-- Include all compiled plugins (below), or include individual files as needed --><!-- Latest compiled and minified JavaScript --><script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script><script type="text/javascript" src="js/VentanaCentrada.js"></script><script>$(document).ready(function(){load(1);});function load(page){var q= $("#q").val();$("#loader").fadeIn('slow');$.ajax({url:'./ajax/productos_cotizacion.php?action=ajax&page='+page+'&q='+q,beforeSend: function(objeto){$('#loader').html('<img src="./img/ajax-loader.gif"> Cargando...');},success:function(data){$(".outer_div").html(data).fadeIn('slow');$('#loader').html('');}})}</script><script>function agregar (id){var precio_venta=document.getElementById('precio_venta_'+id).value;var cantidad=document.getElementById('cantidad_'+id).value;//Inicia validacionif (isNaN(cantidad)){alert('Esto no es un numero');document.getElementById('cantidad_'+id).focus();return false;}if (isNaN(precio_venta)){alert('Esto no es un numero');document.getElementById('precio_venta_'+id).focus();return false;}//Fin validacion$.ajax({type: "POST",url: "./ajax/agregar_cotizador.php",data: "id="+id+"&precio_venta="+precio_venta+"&cantidad="+cantidad,beforeSend: function(objeto){$("#resultados").html("Mensaje: Cargando...");},success: function(datos){$("#resultados").html(datos);}});}function eliminar (id){$.ajax({type: "GET",url: "./ajax/agregar_cotizador.php",data: "id="+id,beforeSend: function(objeto){$("#resultados").html("Mensaje: Cargando...");},success: function(datos){$("#resultados").html(datos);}});}$("#datos_cotizacion").submit(function(){var atencion = $("#atencion").val();var tel1 = $("#tel1").val();var empresa = $("#empresa").val();var tel2 = $("#tel2").val();var email = $("#email").val();var condiciones = $("#condiciones").val();var validez = $("#validez").val();var entrega = $("#entrega").val();VentanaCentrada('./pdf/documentos/cotizacion_pdf.php?atencion='+atencion+'&tel1='+tel1+'&empresa='+empresa+'&tel2='+tel2+'&email='+email+'&condiciones='+condiciones+'&validez='+validez+'&entrega='+entrega,'Cotizacion','','1024','768','true');});</script></body></html>
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. - 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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697<?php/*-------------------------Autor: Obed AlvaradoWeb: obedalvarado.pwMail: info@obedalvarado.pw---------------------------*//* Connect To Database*/require_once ("../config/db.php");//Contiene las variables de configuracion para conectar a la base de datosrequire_once ("../config/conexion.php");//Contiene funcion que conecta a la base de datos$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('codigo_producto', 'nombre_producto');//Columnas de busqueda$sTable = "productos_demo";$sWhere = "";if ( $_GET['q'] != "" ){$sWhere = "WHERE (";for ( $i=0 ; $i<count($aColumns) ; $i++ ){$sWhere .= $aColumns[$i]." LIKE '%".$q."%' OR ";}$sWhere = substr_replace( $sWhere, "", -3 );$sWhere .= ')';}include 'pagination.php'; //include pagination file//pagination variables$page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1;$per_page = 5; //how much records you want to show$adjacents = 4; //gap between pages after number of adjacents$offset = ($page - 1) * $per_page;//Count the total number of row in your table*/$count_query = mysqli_query($con, "SELECT count(*) AS numrows FROM $sTable $sWhere");$row= mysqli_fetch_array($count_query);$numrows = $row['numrows'];$total_pages = ceil($numrows/$per_page);$reload = './index.php';//main query to fetch the data$sql="SELECT * FROM $sTable $sWhere LIMIT $offset,$per_page";$query = mysqli_query($con, $sql);//loop through fetched dataif ($numrows>0){?><div class="table-responsive"><table class="table"><tr class="warning"><th>Código</th><th>Producto</th><th>Marca</th><th><span class="pull-right">Cant.</span></th><th><span class="pull-right">Precio</span></th><th style="width: 36px;"></th></tr><?phpwhile ($row=mysqli_fetch_array($query)){$id_producto=$row['id_producto'];$codigo_producto=$row['codigo_producto'];$nombre_producto=$row['nombre_producto'];$id_marca_producto=$row['id_marca_producto'];$codigo_producto=$row["codigo_producto"];$sql_marca=mysqli_query($con, "select nombre_marca from marcas_demo where id_marca='$id_marca_producto'");$rw_marca=mysqli_fetch_array($sql_marca);$nombre_marca=$rw_marca['nombre_marca'];$precio_venta=$row["precio_producto"];$precio_venta=number_format($precio_venta,2);?><tr><td><? echo $codigo_producto; ?></td><td><? echo $nombre_producto; ?></td><td ><? echo $nombre_marca; ?></td><td class='col-xs-1'><div class="pull-right"><input type="text" class="form-control" style="text-align:right" id="cantidad_<? echo $id_producto; ?>" value="1" ></div></td><td class='col-xs-2'><div class="pull-right"><input type="text" class="form-control" style="text-align:right" id="precio_venta_<? echo $id_producto; ?>" value="<? echo $precio_venta;?>" ></div></td><td ><span class="pull-right"><a href="#" onclick="agregar('<? echo $id_producto ?>')"><i class="glyphicon glyphicon-plus"></i></a></span></td></tr><?php}?><tr><td colspan=5><span class="pull-right"><?echo paginate($reload, $page, $total_pages, $adjacents);?></span></td></tr></table></div><?php}}?> - 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106<?php/*-------------------------Autor: Obed AlvaradoWeb: obedalvarado.pwMail: info@obedalvarado.pw---------------------------*/session_start();$session_id= session_id();if (isset($_POST['id'])){$id=$_POST['id'];}if (isset($_POST['cantidad'])){$cantidad=$_POST['cantidad'];}if (isset($_POST['precio_venta'])){$precio_venta=$_POST['precio_venta'];}/* Connect To Database*/require_once ("../config/db.php");//Contiene las variables de configuracion para conectar a la base de datosrequire_once ("../config/conexion.php");//Contiene funcion que conecta a la base de datosif (!empty($id) and !empty($cantidad) and !empty($precio_venta)){$insert_tmp=mysqli_query($con, "INSERT INTO tmp_cotizacion (id_producto,cantidad_tmp,precio_tmp,session_id) VALUES ('$id','$cantidad','$precio_venta','$session_id')");}if (isset($_GET['id']))//codigo elimina un elemento del array{$delete=mysqli_query($con, "DELETE FROM tmp_cotizacion WHERE id_tmp='".mysql_escape_string($_GET['id'])."'");}?><table class="table"><tr><th>CODIGO</th><th>CANT.</th><th>DESCRIPCION</th><th><span class="pull-right">PRECIO UNIT.</span></th><th><span class="pull-right">PRECIO TOTAL</span></th><th></th></tr><?php$sumador_total=0;$sql=mysqli_query($con, "select * from productos_demo, tmp_cotizacion where productos_demo.id_producto=tmp_cotizacion.id_producto and tmp_cotizacion.session_id='".$session_id."'");while ($row=mysqli_fetch_array($sql)){$id_tmp=$row["id_tmp"];$codigo_producto=$row['codigo_producto'];$cantidad=$row['cantidad_tmp'];$nombre_producto=$row['nombre_producto'];$id_marca_producto=$row['id_marca_producto'];if (!empty($id_marca_producto)){$sql_marca=mysqli_query($con, "select nombre_marca from marcas_demo where id_marca='$id_marca_producto'");$rw_marca=mysqli_fetch_array($sql_marca);$nombre_marca=$rw_marca['nombre_marca'];$marca_producto=" ".strtoupper($nombre_marca);}else {$marca_producto='';}$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?><tr><td><? echo $codigo_producto;?></td><td><? echo $cantidad;?></td><td><? echo $nombre_producto.$marca_producto;?></td><td><span class="pull-right"><? echo $precio_venta_f;?></span></td><td><span class="pull-right"><? echo $precio_total_f;?></span></td><td ><span class="pull-right"><a href="#" onclick="eliminar('<? echo $id_tmp ?>')"><i class="glyphicon glyphicon-trash"></i></a></span></td></tr><?php}?><tr><td colspan=4><span class="pull-right">TOTAL $</span></td><td><span class="pull-right"><? echo number_format($sumador_total,2);?></span></td><td></td></tr></table><div class="form-group row"><label for="condiciones" class="col-md-2 control-label">Condiciones de pago:</label><div class="col-md-3"><select class="form-control" id="condiciones"><option value='Contado'>Contado</option><option value='Crédito 30 días'>Crédito 30 días</option><option value='Crédito 45 días'>Crédito 45 días</option><option value='Crédito 60 días'>Crédito 60 días</option><option value='Crédito 90 días'>Crédito 90 días</option></select></div><label for="validez" class="col-md-2 control-label">Validez de la oferta:</label><div class="col-md-2"><select class="form-control" id="validez"><option value='5 días'>5 días</option><option value='10 días'>10 días</option><option value='15 días' selected>15 días</option><option value='30 días'>30 días</option><option value='60 días'>60 días</option></select></div><label for="entrega" class="col-md-1 control-label">Tiempo:</label><div class="col-md-2"><input type="text" class="form-control" id="entrega" placeholder="Tiempo de entrega" value="Inmediato"></div></div>
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:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455<?php/*-------------------------Autor: Obed AlvaradoWeb: obedalvarado.pwMail: info@obedalvarado.pw---------------------------*/session_start();/* Connect To Database*/include("../../config/db.php");include("../../config/conexion.php");$session_id= session_id();$sql_count=mysqli_query($con,"select * from tmp_cotizacion where session_id='".$session_id."'");$count=mysqli_num_rows($sql_count);if ($count==0){echo "<script>alert('No hay productos agregados a la cotizacion')</script>";echo "<script>window.close();</script>";exit;}require_once(dirname(__FILE__).'/../html2pdf.class.php');//Variables por GET$atencion=$_GET['atencion'];$tel1=$_GET['tel1'];$empresa=$_GET['empresa'];$tel2=$_GET['tel2'];$email=$_GET['email'];$condiciones=$_GET['condiciones'];$validez=$_GET['validez'];$entrega=$_GET['entrega'];//Fin de variables por GET$sql_cotizacion=mysqli_query($con, "select LAST_INSERT_ID(numero_cotizacion) as last from cotizaciones_demo order by id_cotizacion desc limit 0,1 ");$rwC=mysqli_fetch_array($sql_cotizacion);$numero_cotizacion=$rwC['last']+1;// get the HTMLob_start();include(dirname('__FILE__').'/res/cotizacion_html.php');$content = ob_get_clean();try{// init HTML2PDF$html2pdf = new HTML2PDF('P', 'LETTER', 'es', true, 'UTF-8', array(0, 0, 0, 0));// display the full page$html2pdf->pdf->SetDisplayMode('fullpage');// convert$html2pdf->writeHTML($content, isset($_GET['vuehtml']));// send the PDF$html2pdf->Output('Cotizacion.pdf');}catch(HTML2PDF_exception $e) {echo $e;exit;}
el archivo anterios hace una llamada al archivo con la ruta siguiente: pdf/documentos/res/cotizacion_html.php.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173<style type="text/css"><!--table { vertical-align: top; }tr { vertical-align: top; }td { vertical-align: top; }table.page_footer {width: 100%; border: none; background-color: white; padding: 2mm;border-collapse:collapse; border: none;}}--></style><page backtop="15mm" backbottom="15mm" backleft="15mm" backright="15mm" style="font-size: 12pt; font-family: arial" ><page_footer><table class="page_footer"><tr><td style="width: 50%; text-align: left">Página [[page_cu]]/[[page_nb]]</td><td style="width: 50%; text-align: right">© <? echo "obedalvarado.pw "; echo $anio=date('Y'); ?></td></tr></table></page_footer><table cellspacing="0" style="width: 100%;"><tr><td style="width: 25%; color: #444444;"><img style="width: 100%;" src="../../img/logo.jpg" alt="Logo"><br></td><td style="width: 75%;text-align:right">COTIZACION Nº <? echo $numero_cotizacion;?></td></tr></table><br><table cellspacing="0" style="width: 100%; text-align: left; font-size: 10pt;"><tr><td style="width:50%; "><strong>Dirección:</strong> <br>San Miguel, El Salvador C.A.<br> Teléfono.: (503)2222-2222</td></tr></table><table cellspacing="0" style="width: 100%; text-align: left; font-size: 11pt;"><tr><td style="width: 100%;text-align:right">Fecha: <? echo date("d-m-Y");?></td></tr></table><table cellspacing="0" style="width: 100%; text-align: left; font-size: 11pt;"><tr><td style="width:15%; ">Atención:</td><td style="width:50%"><? echo $atencion; ?> </td><td style="width:15%;text-align:right"> Teléfono:</td><td style="width:20%"> <? echo $tel1; ?> </td></tr><tr><td style="width:15%; ">Empresa:</td><td style="width:50%"><? echo $empresa; ?></td><td style="width:15%;text-align:right"> Teléfono:</td><td style="width:20%"> <? echo $tel2; ?> </td></tr><tr><td style="width:15%; ">Email:</td><td style="width:50%"><? echo $email; ?></td></tr></table><table cellspacing="0" style="width: 100%; text-align: left;font-size: 11pt"><tr><td style="width:100%; ">A continuación Presentamos nuestra oferta que esperamos sea de su conformidad.</td></tr></table><table cellspacing="0" style="width: 100%; border: solid 1px black; background: #E7E7E7; text-align: center; font-size: 10pt;padding:1mm;"><tr><th style="width: 10%">CANT.</th><th style="width: 60%">DESCRIPCION</th><th style="width: 15%">PRECIO UNIT.</th><th style="width: 15%">PRECIO TOTAL</th></tr></table><?php$sumador_total=0;$sql=mysqli_query($con, "select * from productos_demo, tmp_cotizacion where productos_demo.id_producto=tmp_cotizacion.id_producto and tmp_cotizacion.session_id='".$session_id."'");while ($row=mysqli_fetch_array($sql)){$id_tmp=$row["id_tmp"];$id_producto=$row["id_producto"];$codigo_producto=$row['codigo_producto'];$cantidad=$row['cantidad_tmp'];$nombre_producto=$row['nombre_producto'];$id_marca_producto=$row['id_marca_producto'];if (!empty($id_marca_producto)){$sql_marca=mysqli_query($con,"select nombre_marca from marcas_demo where id_marca='$id_marca_producto'");$rw_marca=mysqli_fetch_array($sql_marca);$nombre_marca=$rw_marca['nombre_marca'];$marca_producto=" ".strtoupper($nombre_marca);}else {$marca_producto='';}$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?><table cellspacing="0" style="width: 100%; border: solid 1px black; text-align: center; font-size: 11pt;padding:1mm;"><tr><td style="width: 10%; text-align: center"><?php echo $cantidad; ?></td><td style="width: 60%; text-align: left"><? echo $nombre_producto.$marca_producto;?></td><td style="width: 15%; text-align: right"><? echo $precio_venta_f;?></td><td style="width: 15%; text-align: right"><? echo $precio_total_f;?></td></tr></table><?php//Insert en la tabla detalle_cotizacion$insert_detail=mysqli_query($con, "INSERT INTO detalle_cotizacion_demo VALUES ('','$numero_cotizacion','$id_producto','$cantidad','$precio_venta_r')");}?><table cellspacing="0" style="width: 100%; border: solid 1px black; background: #E7E7E7; text-align: center; font-size: 11pt;padding:1mm;"><tr><th style="width: 87%; text-align: right;">TOTAL : </th><th style="width: 13%; text-align: right;">$ <? echo number_format($sumador_total,2);?></th></tr></table>*** Precios incluyen IVA ***<br><table cellspacing="0" style="width: 100%; text-align: left; font-size: 11pt;"><tr><td style="width:50%;text-align:right">Condiciones de pago: </td><td style="width:50%; "> <? echo $condiciones; ?></td></tr><tr><td style="width:50%;text-align:right">Validez de la oferta: </td><td style="width:50%; "> <? echo $validez; ?></td></tr><tr><td style="width:50%;text-align:right">Tiempo de entrega: </td><td style="width:50%; "> <? echo $entrega; ?></td></tr></table><br><br><br><br><table cellspacing="10" style="width: 100%; text-align: left; font-size: 11pt;"><tr><td style="width:33%;text-align: center;border-top:solid 1px">Vendedor</td><td style="width:33%;text-align: center;border-top:solid 1px">Cotizado</td><td style="width:33%;text-align: center;border-top:solid 1px">Aceptado Cliente</td></tr></table></page><?$date=date("Y-m-d H:i:s");$insert=mysqli_query($con,"INSERT INTO cotizaciones_demo VALUES ('','$numero_cotizacion','$date','$atencion','$tel1','$empresa','$tel2','$email','$condiciones','$validez','$entrega')");$delete=mysqli_query($con,"DELETE FROM tmp_cotizacion WHERE session_id='".$session_id."'");?>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.
VER DEMOSTRACIÓN DESCARGAR ARCHIVOS