Este formato de factura cuenta con las características fundamentales, nombre de la empresa, nombre del cliente, datos de la factura, datos de lo productos, etc.
El formato esta en PHP y es personalizable modificando el código fuente, los valores están en arrays y las posiciones de las tablas se calculan dependiendo el tamaño de los arrays.
Es necesario contar con la librería FPDF que sirve para generar los documentos PDF. Pagina de FPDF . Al final se ofrece un enlace de descarga que incluye el código de ejemplo y la librería FPDF.
Este formato de factura esta en tamaño carta original.
Codigo
A continuación el código del ejemplo, ya tiene los comentarios para poder modificar cada sección.
<?php | |
/// Powered by Evilnapsis go to http://evilnapsis.com | |
include "fpdf/fpdf.php"; | |
$pdf = new FPDF($orientation='P',$unit='mm'); | |
$pdf->AddPage(); | |
$pdf->SetFont('Arial','B',20); | |
$textypos = 5; | |
$pdf->setY(12); | |
$pdf->setX(10); | |
// Agregamos los datos de la empresa | |
$pdf->Cell(5,$textypos,"NOMBRE DE LA EMPRESA"); | |
$pdf->SetFont('Arial','B',10); | |
$pdf->setY(30);$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"DE:"); | |
$pdf->SetFont('Arial','',10); | |
$pdf->setY(35);$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"Nombre de la empresa"); | |
$pdf->setY(40);$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"Direccion de la empresa"); | |
$pdf->setY(45);$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"Telefono de la empresa"); | |
$pdf->setY(50);$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"Email de la empresa"); | |
// Agregamos los datos del cliente | |
$pdf->SetFont('Arial','B',10); | |
$pdf->setY(30);$pdf->setX(75); | |
$pdf->Cell(5,$textypos,"PARA:"); | |
$pdf->SetFont('Arial','',10); | |
$pdf->setY(35);$pdf->setX(75); | |
$pdf->Cell(5,$textypos,"Nombre del cliente"); | |
$pdf->setY(40);$pdf->setX(75); | |
$pdf->Cell(5,$textypos,"Direccion del cliente"); | |
$pdf->setY(45);$pdf->setX(75); | |
$pdf->Cell(5,$textypos,"Telefono del cliente"); | |
$pdf->setY(50);$pdf->setX(75); | |
$pdf->Cell(5,$textypos,"Email del cliente"); | |
// Agregamos los datos del cliente | |
$pdf->SetFont('Arial','B',10); | |
$pdf->setY(30);$pdf->setX(135); | |
$pdf->Cell(5,$textypos,"FACTURA #12345"); | |
$pdf->SetFont('Arial','',10); | |
$pdf->setY(35);$pdf->setX(135); | |
$pdf->Cell(5,$textypos,"Fecha: 11/DIC/2019"); | |
$pdf->setY(40);$pdf->setX(135); | |
$pdf->Cell(5,$textypos,"Vencimiento: 11/ENE/2020"); | |
$pdf->setY(45);$pdf->setX(135); | |
$pdf->Cell(5,$textypos,""); | |
$pdf->setY(50);$pdf->setX(135); | |
$pdf->Cell(5,$textypos,""); | |
/// Apartir de aqui empezamos con la tabla de productos | |
$pdf->setY(60);$pdf->setX(135); | |
$pdf->Ln(); | |
///////////////////////////// | |
//// Array de Cabecera | |
$header = array("Cod.", "Descripcion","Cant.","Precio","Total"); | |
//// Arrar de Productos | |
$products = array( | |
array("0010", "Producto 1",2,120,0), | |
array("0024", "Producto 2",5,80,0), | |
array("0001", "Producto 3",1,40,0), | |
array("0001", "Producto 3",5,80,0), | |
array("0001", "Producto 3",4,30,0), | |
array("0001", "Producto 3",7,80,0), | |
); | |
// Column widths | |
$w = array(20, 95, 20, 25, 25); | |
// Header | |
for($i=0;$i<count($header);$i++) | |
$pdf->Cell($w[$i],7,$header[$i],1,0,'C'); | |
$pdf->Ln(); | |
// Data | |
$total = 0; | |
foreach($products as $row) | |
{ | |
$pdf->Cell($w[0],6,$row[0],1); | |
$pdf->Cell($w[1],6,$row[1],1); | |
$pdf->Cell($w[2],6,number_format($row[2]),'1',0,'R'); | |
$pdf->Cell($w[3],6,"$ ".number_format($row[3],2,".",","),'1',0,'R'); | |
$pdf->Cell($w[4],6,"$ ".number_format($row[3]*$row[2],2,".",","),'1',0,'R'); | |
$pdf->Ln(); | |
$total+=$row[3]*$row[2]; | |
} | |
///////////////////////////// | |
//// Apartir de aqui esta la tabla con los subtotales y totales | |
$yposdinamic = 60 + (count($products)*10); | |
$pdf->setY($yposdinamic); | |
$pdf->setX(235); | |
$pdf->Ln(); | |
///////////////////////////// | |
$header = array("", ""); | |
$data2 = array( | |
array("Subtotal",$total), | |
array("Descuento", 0), | |
array("Impuesto", 0), | |
array("Total", $total), | |
); | |
// Column widths | |
$w2 = array(40, 40); | |
// Header | |
$pdf->Ln(); | |
// Data | |
foreach($data2 as $row) | |
{ | |
$pdf->setX(115); | |
$pdf->Cell($w2[0],6,$row[0],1); | |
$pdf->Cell($w2[1],6,"$ ".number_format($row[1], 2, ".",","),'1',0,'R'); | |
$pdf->Ln(); | |
} | |
///////////////////////////// | |
$yposdinamic += (count($data2)*10); | |
$pdf->SetFont('Arial','B',10); | |
$pdf->setY($yposdinamic); | |
$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"TERMINOS Y CONDICIONES"); | |
$pdf->SetFont('Arial','',10); | |
$pdf->setY($yposdinamic+10); | |
$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"El cliente se compromete a pagar la factura."); | |
$pdf->setY($yposdinamic+20); | |
$pdf->setX(10); | |
$pdf->Cell(5,$textypos,"Powered by Evilnapsis"); | |
$pdf->output(); |
De la linea 11 a la 24 están los datos de la empresa: nombre, dirección, teléfono e email.
De la linea 26 a la 38 están los datos del cliente: nombre, dirección, teléfono e email.
De la linea 40 a la 52 están los datos de la factura: numero de factura, fecha de creación, fecha de vencimiento.
De la linea 54 a la 88 se crea la tabla de productos, en la linea 59 se definen los nombres de la cabecera de la tabla y la linea 61 se definen los datos de los productos, todo en arrays.
Nota: Los subtotales de cada linea se calculan multiplicando cantidad por precio, estos datos se suman para dar en valor total de la factura.
En la linea 90 a la 118 se definen los datos de subtotales, descuento, impuesto y total.
De la linea 119 a la 136 se finalizan con los términos y condiciones.
Resultado
Este es el resultado al ejecutar el código en el navegador (Es necesario usar Xampp o similar).
Descarga
A continuación les dejo el enlace de descarga del ejemplo y la librería FPDF incluida.
Link: https://drive.google.com/file/d/1vRCs5eTEhT8QQ77cQsPldmHzrZFjAgf5/view
Recuerden que después de hacer click deben esperar 5 segundos y después click en “Saltar Publicidad” en la esquina superior derecha. Gracias por su apoyo.
No se olviden de comentar, compartir y suscribirse.
Saludos a todos 😀
Muchas gracias amigo