Haremos una serie de modificaciones a nuestra aplicación de facturación luego de haber visto la estructura fundamental en los conceptos anteriores, ésto nos servirá para identificar que partes de la aplicación se deben modificar.
Modificar el acceso a datos utilizando la librería PDO.
Hay que hacer cambios en todos los archivos que accedemos a datos de MySQL.
conexion.php<?php function retornarConexion() { $server="localhost"; $usuario="root"; $clave=""; $base="base1"; return new PDO("mysql:dbname=$base;host=$server", "$usuario","$clave", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); } ?>
En la carpeta 'categorias' debemos modificar:
procesar.php<?php header('Content-Type: application/json'); require("../conexion.php"); $pdo = retornarConexion(); switch ($_GET['accion']) { case 'listar': $sql = $pdo->prepare("select codigo, descripcion from categorias"); $sql->execute(); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'agregar': $sql = $pdo->prepare("insert into categorias(descripcion) values (:descripcion)"); $respuesta = $sql->execute(array("descripcion" => $_POST['descripcion'])); echo json_encode($respuesta); break; case 'recuperar': $sql = $pdo->prepare("select codigo,descripcion from categorias where codigo=:codigo"); $sql->execute(array("codigo" => $_POST['codigo'])); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'borrar': $sql = $pdo->prepare("delete from categorias where codigo=:codigo"); $sql->execute(array("codigo" => $_POST['codigo'])); $sql = $pdo->prepare("delete from productos where codigocategoria=:codigo"); $resultado = $sql->execute(array("codigo" => $_POST['codigo'])); echo json_encode($resultado); break; case 'modificar': $sql = $pdo->prepare("update categorias set descripcion=:descripcion where codigo=:codigo"); $respuesta = $sql->execute(array( "descripcion" => $_POST['descripcion'], "codigo" => $_POST['codigo'] )); echo json_encode($respuesta); break; }
En la carpeta 'clientes' debemos modificar:
procesar.php<?php header('Content-Type: application/json'); require("../conexion.php"); $pdo = retornarConexion(); switch ($_GET['accion']) { case 'listar': $sql = $pdo->prepare("select codigo, nombre, telefono, mail, direccion from clientes"); $sql->execute(); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'agregar': $sql = $pdo->prepare("insert into clientes(nombre,telefono,mail,direccion) values (:nombre,:telefono,:mail,:direccion)"); $respuesta = $sql->execute(array( "nombre" => $_POST['nombre'], "telefono" => $_POST['telefono'], "mail" => $_POST['mail'], "direccion" => $_POST['direccion'] )); echo json_encode($respuesta); break; case 'recuperar': $sql = $pdo->prepare("select codigo, nombre, telefono, mail, direccion from clientes where codigo=:codigo"); $sql->execute(array("codigo" => $_POST['codigo'])); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'borrar': $sql = $pdo->prepare("delete from clientes where codigo=:codigo"); $resultado = $sql->execute(array("codigo" => $_POST['codigo'])); echo json_encode($resultado); break; case 'modificar': $sql = $pdo->prepare("update clientes set nombre=:nombre, telefono=:telefono, mail=:mail, direccion=:direccion where codigo=:codigo"); $respuesta = $sql->execute(array( "nombre" => $_POST['nombre'], "telefono" => $_POST['telefono'], "mail" => $_POST['mail'], "direccion" => $_POST['direccion'], "codigo" => $_POST['codigo'] )); echo json_encode($respuesta); break; }
En la carpeta 'productos' debemos modificar:
procesar.php<?php header('Content-Type: application/json'); require("../conexion.php"); $pdo = retornarConexion(); switch ($_GET['accion']) { case 'listar': $sql = $pdo->prepare("select pro.codigo as codigo, pro.descripcion descripcion, cat.descripcion descripcioncategoria, precio from productos as pro join categorias as cat on cat.codigo=pro.codigocategoria"); $sql->execute(); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'agregar': $sql = $pdo->prepare("insert into productos(descripcion,precio,codigocategoria) values (:descripcion,:precio,:codigocategoria)"); $respuesta = $sql->execute(array( "descripcion" => $_POST['descripcion'], "precio" => $_POST['precio'], "codigocategoria" => $_POST['codigocategoria'] )); echo json_encode($respuesta); break; case 'recuperar': $sql = $pdo->prepare("select codigo, descripcion, precio, codigocategoria from productos where codigo=:codigo"); $sql->execute(array("codigo" => $_POST['codigo'])); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; case 'borrar': $sql = $pdo->prepare("delete from productos where codigo=:codigo"); $resultado = $sql->execute(array("codigo" => $_POST['codigo'])); echo json_encode($resultado); break; case 'modificar': $sql = $pdo->prepare("update productos set descripcion=:descripcion, precio=:precio, codigocategoria=:codigocategoria where codigo=:codigo"); $respuesta = $sql->execute(array( "descripcion" => $_POST['descripcion'], "precio" => $_POST['precio'], "codigocategoria" => $_POST['codigocategoria'], "codigo" => $_POST['codigo'] )); echo json_encode($respuesta); break; case 'listarcategorias': $sql = $pdo->prepare("select codigo, descripcion from categorias"); $sql->execute(); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); echo json_encode($resultado); break; }
En la carpeta raiz del proyecto debemos modificar:
procesar.php<?php header('Content-Type: application/json'); require("conexion.php"); $pdo = retornarConexion(); switch ($_GET['accion']) { case 'agregar': //Recuperamos el precio del producto $sql = $pdo->prepare("select precio from productos where codigo=:codigoproducto"); $sql->execute(array("codigoproducto"=>$_POST['codigoproducto'])); $reg = $sql->fetch(PDO::FETCH_ASSOC); $sql = $pdo->prepare("insert into detallefactura(codigofactura,codigoproducto,cantidad,precio) values (:codigofactura,:codigoproducto,:cantidad,:precio)"); $respuesta = $sql->execute(array("codigofactura" => $_GET['codigofactura'], "codigoproducto"=> $_POST['codigoproducto'], "cantidad"=> $_POST['cantidad'], "precio"=> $reg['precio'] )); echo json_encode($respuesta); break; case 'confirmarfactura': $sql = $pdo->prepare("update facturas set fecha=:fecha, codigocliente=:codigocliente where codigo=:codigofactura"); $respuesta = $sql->execute(array( "fecha" => $_POST['fecha'], "codigocliente" => $_POST['codigocliente'], "codigofactura" => $_GET['codigofactura'] )); echo json_encode($respuesta); break; case 'confirmardescartarfactura': $sql = $pdo->prepare("delete from facturas where codigo=:codigofactura"); $sql->execute(array("codigofactura" => $_GET['codigofactura'])); $sql = $pdo->prepare("delete from detallefactura where codigofactura=:codigofactura"); $respuesta = $sql->execute(array("codigofactura" => $_GET['codigofactura'])); echo json_encode($respuesta); }index.php
<!doctype html> <html lang="es"> <head> <title>Administración de categorías</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="css/bootstrap.min.css"> <script src="js/jquery.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.min.js"></script> </head> <body> <div class="container"> <ul class="nav mt-2"> <li class="nav-item"> <a class="nav-link" href="#">Facturación</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">Administración</a> <div class="dropdown-menu"> <a class="dropdown-item" href="categorias/administracion.html">Mantenimiento de categorías</a> <a class="dropdown-item" href="productos/administracion.html">Mantenimiento de productos</a> <a class="dropdown-item" href="clientes/administracion.html">Mantenimiento de clientes</a> </div> </li> </ul> <?php require("conexion.php"); $pdo = retornarConexion(); $sql = $pdo->prepare( "select fact.codigo as codigo, date_format(fecha,'%d/%m/%Y') as fecha, nombre, round(sum(deta.precio*deta.cantidad),2) as importefactura from facturas as fact join clientes as cli on cli.codigo=fact.codigocliente join detallefactura as deta on deta.codigofactura=fact.codigo group by deta.codigofactura order by codigo desc" ); $sql->execute(); $filas = $sql->fetchAll(PDO::FETCH_ASSOC); ?> <h1>Facturas emitidas</h1> <table class="table table-striped"> <thead> <tr> <th>Factura</th> <th>Cliente</th> <th>Fecha</th> <th class="text-right">Importe</th> <th></th> </tr> </thead> <tbody> <?php foreach ($filas as $fila) { ?> <tr> <td><?php echo $fila['codigo'] ?></td> <td><?php echo $fila['nombre'] ?></td> <td><?php echo $fila['fecha'] ?></td> <td class="text-right"><?php echo '$' . number_format($fila['importefactura'], 2, ',', '.'); ?></td> <td class="text-right"> <a class="btn btn-primary btn-sm botonimprimir" role="button" href="#" data-codigo="<?php echo $fila['codigo'] ?>">Imprime?</a> <a class="btn btn-primary btn-sm botonborrar" role="button" href="#" data-codigo="<?php echo $fila['codigo'] ?>">Borra?</a> </td> </tr> <?php } ?> </tbody> </table> <button type="button" id="btnNuevaFactura" class="btn btn-success">Emitir factura</button> </div> <!-- ModalConfirmarBorrar --> <div class="modal fade" id="ModalConfirmarBorrar" tabindex="-1" role="dialog"> <div class="modal-dialog" style="max-width: 600px" role="document"> <div class="modal-content"> <div class="modal-header"> <h1>¿Realmente quiere borrar la factura?</h1> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarBorrado" class="btn btn-success">Confirmar</button> <button type="button" data-dismiss="modal" class="btn btn-success">Cancelar</button> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function() { $('#btnNuevaFactura').click(function() { window.location = 'facturacion.php'; }); var codigofactura; $('.botonborrar').click(function() { codigofactura = $(this).get(0).dataset.codigo; $("#ModalConfirmarBorrar").modal(); }); $('#btnConfirmarBorrado').click(function() { window.location = 'borrarfactura.php?codigofactura=' + codigofactura; }); $('.botonimprimir').click(function() { window.open('pdffactura.php?' + '&codigofactura=' + $(this).get(0).dataset.codigo, '_blank'); }); }); </script> </body> </html>borrarfactura.php
<?php require("conexion.php"); $pdo = retornarConexion(); $sql = $pdo->prepare("delete from facturas where codigo=:codigofactura"); $sql->execute(array("codigofactura" => $_GET['codigofactura'])); $sql = $pdo->prepare("delete from detallefactura where codigofactura=:codigofactura"); $resultado = $sql->execute(array("codigofactura" => $_GET['codigofactura'])); header('location:index.php');borrarproductodetalle.php
<?php header('Content-Type: application/json'); require("conexion.php"); $pdo = retornarConexion(); $sql = $pdo->prepare("delete from detallefactura where codigo=:codigo"); $resultado = $sql->execute(array("codigo" => $_GET['codigo'])); echo json_encode($resultado); ?>facturacion.php
<!doctype html> <html> <head> <title>Facturación</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="css/bootstrap.min.css"> <script src="js/jquery.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.min.js"></script> </head> <body> <?php require("conexion.php"); $pdo = retornarConexion(); $sql = $pdo->prepare("insert into facturas() values ()"); $sql->execute(); $codigofactura = $pdo->lastInsertId(); ?> <div class="container"> <div class="row mt-4"> <div class="col-md"> <div class="form-group row"> <label for="CodigoFactura" class="col-lg-3 col-form-label">Número de factura:</label> <div class="col-lg-3"> <input type="text" disabled class="form-control" id="CodigoFactura" value="<?php echo $codigofactura; ?>"> </div> </div> <div class="form-group row"> <label for="Fecha" class="col-lg-3 col-form-label">Fecha de emisión:</label> <div class="col-lg-3"> <input type="date" class="form-control" id="Fecha"> </div> </div> <div class="form-group row"> <label for="CodigoCliente" class="col-lg-3 col-form-label">Cliente:</label> <div class="col-lg-3"> <select class="form-control" id="CodigoCliente"> <?php $sql = $pdo->prepare("select codigo, nombre from clientes"); $sql->execute(); $clientes = $sql->fetchAll(PDO::FETCH_ASSOC); echo "<option value='0'>Seleccionar Cliente</option>"; foreach ($clientes as $cli) { echo "<option value='" . $cli['codigo'] . "'>" . $cli['nombre'] . "</option>"; } ?> </select> </div> </div> </div> </div> <div class="row mt-4"> <div class="col-md"> <table class="table table-striped"> <thead> <tr> <th>Código de Artículo</th> <th>Descripción</th> <th class="text-right">Cantidad</th> <th class="text-right">Precio Unitario</th> <th class="text-right">Total</th> <th class="text-right"></th> </tr> </thead> <tbody id="DetalleFactura"> </tbody> </table> <button type="button" id="btnAgregarProducto" class="btn btn-success">Agregar Producto</button> <button type="button" id="btnTerminarFactura" class="btn btn-success">Terminar Factura</button> </div> </div> </div> <!-- ModalProducto(Agregar) --> <div class="modal fade" id="ModalProducto" tabindex="-1" role="dialog"> <div class="modal-dialog" 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> </div> <div class="modal-body"> <div class="form-group"> <label>Producto:</label> <select class="form-control" id="CodigoProducto"> <?php $sql = $pdo->prepare("select codigo, descripcion, precio from productos"); $sql->execute(); $productos = $sql->fetchAll(PDO::FETCH_ASSOC); foreach ($productos as $pro) { echo "<option value='" . $pro['codigo'] . "'>" . $pro['descripcion'] . ' ($' . $pro['precio'] . ")</option>"; } ?> </select> </div> <div class="form-row"> <div class="form-group col-md-12"> <label>Cantidad:</label> <input type="number" id="Cantidad" class="form-control" placeholder="" min="1"> </div> </div> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarAgregarProducto" class="btn btn-success">Agregar a la factura</button> <button type="button" data-dismiss="modal" class="btn btn-success">Cancelar</button> </div> </div> </div> </div> <!-- ModalFinFactura --> <div class="modal fade" id="ModalFinFactura" tabindex="-1" role="dialog"> <div class="modal-dialog" style="max-width: 600px" role="document"> <div class="modal-content"> <div class="modal-header"> <h1>Acciones</h1> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarFactura" class="btn btn-success">Confirmar Factura</button> <button type="button" id="btnConfirmarImprimirFactura" class="btn btn-success">Confirmar e Imprimir Factura</button> <button type="button" id="btnConfirmarDescartarFactura" class="btn btn-success">Descartar la Factura</button> </div> </div> </div> </div> <!-- ModalConfirmarBorrar --> <div class="modal fade" id="ModalConfirmarBorrar" tabindex="-1" role="dialog"> <div class="modal-dialog" style="max-width: 600px" role="document"> <div class="modal-content"> <div class="modal-header"> <h1>¿Realmente quiere borrarlo?</h1> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarBorrado" class="btn btn-success">Confirmar</button> <button type="button" data-dismiss="modal" class="btn btn-success">Cancelar</button> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { var producto; var cliente; document.getElementById('Fecha').valueAsDate = new Date(); //Boton que muestra el diálogo de agregar producto $('#btnAgregarProducto').click(function() { LimpiarFormulario(); $("#Cantidad").val("1"); $("#ModalProducto").modal(); }); //Boton que agrega el producto al detalle $('#btnConfirmarAgregarProducto').click(function() { RecolectarDatosFormulario(); $("#ModalProducto").modal('hide'); if ($("#Cantidad").val() == "") { //Controlamos que no esté vacío la cantidad de productos alert('no puede estar vacío la cantidad de productos.'); return; } EnviarInformacionProducto("agregar"); }); //Boton terminar factura $('#btnTerminarFactura').click(function() { $("#ModalFinFactura").modal(); }); //Boton confirmar factura $('#btnConfirmarFactura').click(function() { if ($('#CodigoCliente').val() == 0) { alert('Debe seleccionar un cliente'); return; } RecolectarDatosCliente(); EnviarInformacionFactura("confirmarfactura"); }); //Boton que descarta la factura generada borrando tanto en la tabla de facturas como detallefactura $('#btnConfirmarDescartarFactura').click(function() { RecolectarDatosCliente(); EnviarInformacionFactura("confirmardescartarfactura"); }); //Boton confirmar factura y ademas genera pdf $('#btnConfirmarImprimirFactura').click(function() { if ($('#CodigoCliente').val() == 0) { alert('Debe seleccionar un cliente'); return; } RecolectarDatosCliente(); EnviarInformacionFacturaImprimir("confirmarfactura"); }); function RecolectarDatosFormulario() { producto = { codigoproducto: $('#CodigoProducto').val(), cantidad: $('#Cantidad').val() }; } function RecolectarDatosCliente() { cliente = { codigocliente: $('#CodigoCliente').val(), fecha: $('#Fecha').val() }; } //Funciones AJAX para enviar y recuperar datos del servidor //******************************************************* function EnviarInformacionProducto(accion) { $.ajax({ type: 'POST', url: 'procesar.php?accion=' + accion + '&codigofactura=' + <?php echo $codigofactura ?>, data: producto, success: function(msg) { RecuperarDetalle(); }, error: function() { alert("Hay un error .."); } }); } function EnviarInformacionFactura(accion) { $.ajax({ type: 'POST', url: 'procesar.php?accion=' + accion + '&codigofactura=' + <?php echo $codigofactura ?>, data: cliente, success: function(msg) { window.location = 'index.php'; }, error: function() { alert("Hay un error .."); } }); } function EnviarInformacionFacturaImprimir(accion) { $.ajax({ type: 'POST', url: 'procesar.php?accion=' + accion + '&codigofactura=' + <?php echo $codigofactura ?>, data: cliente, success: function(msg) { window.open('pdffactura.php?' + '&codigofactura=' + <?php echo $codigofactura ?>, '_blank'); window.location = 'index.php'; }, error: function() { alert("Hay un error .."); } }); } function LimpiarFormulario() { $('#Cantidad').val(''); } }); //Se ejecuta cuando se presiona un boton de borrar un item del detalle var cod; function borrarItem(coddetalle) { cod = coddetalle; $("#ModalConfirmarBorrar").modal(); } $('#btnConfirmarBorrado').click(function() { $("#ModalConfirmarBorrar").modal('hide'); $.ajax({ type: 'POST', url: 'borrarproductodetalle.php?codigo=' + cod, success: function(msg) { RecuperarDetalle(); }, error: function() { alert("Hay un error .."); } }); }); function RecuperarDetalle() { $.ajax({ type: 'GET', url: 'recuperardetalle.php?codigofactura=' + <?php echo $codigofactura ?>, success: function(datos) { document.getElementById('DetalleFactura').innerHTML = datos; }, error: function() { alert("Hay un error .."); } }); } </script> </body> </html>recuperardetalle.php
<?php require("conexion.php"); $pdo = retornarConexion(); $sql = $pdo->prepare("select pro.codigo as codigo, descripcion, round(deta.precio,2) as precio, cantidad, round(deta.precio*cantidad,2) as preciototal, deta.codigo as coddetalle from detallefactura as deta join productos as pro on pro.codigo=deta.codigoproducto where codigofactura=:codigofactura"); $sql->execute(array("codigofactura"=>$_GET['codigofactura'])); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); $pago=0; foreach ($resultado as $fila) { echo "<tr>"; echo "<td>$fila[codigo]</td>"; echo "<td>$fila[descripcion]</td>"; echo "<td class=\"text-right\">$fila[cantidad]</td>"; echo "<td class=\"text-right\">$fila[precio]</td>"; echo "<td class=\"text-right\">$fila[preciototal]</td>"; echo '<td class="text-right"><a class="btn btn-primary" onclick="borrarItem('.$fila['coddetalle'].')" role="button" href="#" id="'.$fila['coddetalle'].'">Borra?</a></td>'; echo "</tr>"; $pago=$pago+$fila['preciototal']; } echo "<tr>"; echo "<td></td>"; echo "<td></td>"; echo "<td></td>"; echo "<td class=\"text-right\"><strong>Importe total</strong></td>"; echo "<td class=\"text-right\"><strong>".number_format(round($pago,2),2,'.','')."</strong></td>"; echo "<td></td>"; echo "</tr>"; ?>pdffactura.php
<?php require('fpdf/fpdf.php'); require("conexion.php"); $pdo = retornarConexion(); $fpdf = new FPDF('P', 'mm', 'letter', true); $fpdf->AddPage('portrait', 'letter'); $fpdf->SetMargins(10, 30, 20, 20); cabecera($fpdf, $pdo); piedepagina($fpdf); titulosdetalle($fpdf); imprimirdetalle($fpdf, $pdo); $fpdf->OutPut(); function cabecera($fpdf, $pdo) { $fpdf->SetFillColor(116, 92, 151); $fpdf->Rect(0, 0, 220, 50, 'F'); $fpdf->SetFont('Arial', 'B', 15); $fpdf->SetTextColor(255, 255, 255); $fpdf->Image('imagenes/logo.png', 10, 1); $sql = $pdo->prepare("select nombre, date_format(fecha,'%d/%m/%Y') as fecha from facturas as fact join clientes as cli on cli.codigo=fact.codigocliente where fact.codigo=:codigofactura"); $sql->execute(array("codigofactura" => $_GET['codigofactura'])); $resultado = $sql->fetch(PDO::FETCH_ASSOC); $fpdf->SetFont('Arial', 'B', 10); $fpdf->SetY(5); $fpdf->SetX(100); $fpdf->Cell(0, 5, "Cliente : ".$resultado['nombre'], 0, 0, 'L', 1); $fpdf->SetY(10); $fpdf->SetX(100); $fpdf->Cell(0, 5, "Fecha de emisión : ".$resultado['fecha'], 0, 0, 'L', 1); } function piedepagina($fpdf) { $fpdf->SetFillColor(116, 92, 151); $fpdf->Rect(0, 250, 220, 50, 'F'); $fpdf->SetY(-28); $fpdf->SetFont('Arial', '', 12); $fpdf->SetTextColor(0, 0, 0); $fpdf->SetX(120); $fpdf->Write(5, 'Gracias por su compra.'); } function titulosdetalle($fpdf) { $fpdf->SetY(60); $fpdf->SetTextColor(255, 255, 255); $fpdf->SetFillColor(79, 78, 77); $fpdf->Cell(30, 10, 'Código', 0, 0, 'C', 1); $fpdf->Cell(70, 10, 'Descripción', 0, 0, 'L', 1); $fpdf->Cell(20, 10, 'Cantidad', 0, 0, 'C', 1); $fpdf->Cell(40, 10, 'Precio', 0, 0, 'R', 1); $fpdf->Cell(30, 10, 'Total', 0, 0, 'R', 1); } function imprimirdetalle($fpdf, $pdo) { $sql = $pdo->prepare("select pro.codigo as codigo, descripcion, round(deta.precio,2) as precio, cantidad, round(deta.precio*cantidad,2) as preciototal, deta.codigo as coddetalle from detallefactura as deta join productos as pro on pro.codigo=deta.codigoproducto where codigofactura=:codigofactura"); $sql->execute(array("codigofactura" => $_GET['codigofactura'])); $resultado = $sql->fetchAll(PDO::FETCH_ASSOC); $fpdf->SetTextColor(0, 0, 0); $fpdf->SetFillColor(255, 255, 255); $fpdf->SetFont('times', '', 12); $fpdf->SetY(70); $fpdf->SetLineWidth(0.2); $pago=0; $item=0; foreach ($resultado as $fila) { $fpdf->Cell(30, 10, $fila['codigo'], 1, 0, 'C', 1); $fpdf->Cell(70, 10, $fila['descripcion'], 1, 0, 'L', 1); $fpdf->Cell(20, 10, $fila['cantidad'], 1, 0, 'R', 1); $fpdf->Cell(40, 10, '$'.number_format($fila['precio'],2,',','.'), 1, 0, 'R', 1); $fpdf->Cell(30, 10, '$'.number_format($fila['preciototal'],2,',','.'), 1, 0, 'R', 1); $fpdf->Ln(); $pago=$pago+$fila['preciototal']; $item++; if ($item==16) { $fpdf->AddPage('portrait', 'letter'); $fpdf->SetMargins(10, 30, 20, 20); cabecera($fpdf, $pdo); piedepagina($fpdf); titulosdetalle($fpdf); $fpdf->SetTextColor(0, 0, 0); $fpdf->SetFillColor(255, 255, 255); $fpdf->SetFont('Arial', '', 12); $fpdf->SetY(70); $fpdf->SetLineWidth(0.2); $item=0; } } $fpdf->SetFont('Arial', 'B', 15); $fpdf->Cell(190, 20, "Importe Total : $".number_format($pago,2,',','.'), 1, 0, 'R', 1); }