function creaPDF($colname_factura, $tmpName) { global $database_f4, $f4, $interface, $setsProlec, $url_dir; $FWK_PDFFONTS = 'pdf/fonts/'; $FWK_PDFDEFAULTFONT = '/face5/' . $url_dir . '/f4/extensiones/pdf/fonts/Helvetica.afm'; $FWK_PDFCOURIERFONT = 'pdf/fonts/Courier.afm'; // Obtener factura y sus anexos $TIPOSCOMPROBANTEMXP = array(1 => "Factura", 3 => "Nota de Cr.", 2 => "NOTA DE DEBITO"); mysql_select_db($database_f4, $f4); $query_factura = sprintf("SELECT facturas.idfactura, facturas.idempresa, facturas.idsello,\n\tfacturas.serie, facturas.folio, archivo,\n\tdate_format( facturas.timestampemision, '%%d/%%m/%%Y %%T') as timestampemision,\n\tfacturas.noaprob, facturas.rfccliente, facturas.estatus, facturas.sello, facturas.cadena, facturas.factura,\n\tfacturas.idif, facturas.tipocfd, empresa.bu\n\tFROM facturas inner join empresa on (facturas.idempresa=empresa.idempresa)\n\tWHERE facturas.idfactura = %s", $colname_factura); $factura = mysql_query($query_factura, $f4); $row_factura = mysql_fetch_assoc($factura); $totalRows_factura = mysql_num_rows($factura); print_r($row_factura); mysql_select_db($database_f4, $f4); $query_partida = sprintf("SELECT * FROM face_partidas WHERE face_factura_idface_factura = %s ORDER BY numero ASC", $row_factura['idif']); $partidas = mysql_query($query_partida, $f4); $partidasArray = array(); while ($partRow = mysql_fetch_assoc($partidas)) { array_push($partidasArray, $partRow); } $dom = new DOMDocument(); $dom->loadXML(base64_decode($row_factura['factura'])); $NS = "http://www.sat.gob.mx/cfd/2"; $NSP = ""; $xp = new DOMXPath($dom); $nsElems = $dom->getElementsByTagNameNS($NS, 'Comprobante'); if ($nsElems->item(0) != null) { $xp->registerNamespace("C", "http://www.sat.gob.mx/cfd/2"); $NSP = "C:"; } $comprobanteNode = null; $elements = $xp->query("/" . $NSP . "Comprobante"); foreach ($elements as $comprobanteNode) { } $emisorNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Emisor"); foreach ($elements as $emisorNode) { } $emisordomicilioNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Emisor/" . $NSP . "DomicilioFiscal"); foreach ($elements as $emisordomicilioNode) { } $expedidoNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Emisor/" . $NSP . "ExpedidoEn"); foreach ($elements as $expedidoNode) { } $receptorNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Receptor"); foreach ($elements as $receptorNode) { } $receptordomicilioNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Receptor/" . $NSP . "Domicilio"); foreach ($elements as $receptordomicilioNode) { } $conceptoNode = null; $conceptos = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Conceptos/" . $NSP . "Concepto"); $impuestosNode = null; $elements = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Impuestos"); foreach ($elements as $impuestosNode) { } $trasladoNode = null; $traslados = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Impuestos/" . $NSP . "Traslados/" . $NSP . "Traslado"); $retencionNode = null; $retenciones = $xp->query("/" . $NSP . "Comprobante/" . $NSP . "Impuestos/" . $NSP . "Retenciones/" . $NSP . "Retencion"); mysql_select_db($database_f4, $f4); $query_empresa = sprintf("SELECT * FROM empresa WHERE idempresa = %s", $row_factura['idempresa']); $empresa = mysql_query($query_empresa, $f4); $row_empresa = mysql_fetch_assoc($empresa); mysql_select_db($database_f4, $f4); $query_sello = sprintf("SELECT * FROM sellos WHERE idsello = %s", $row_factura['idsello']); $sello = mysql_query($query_sello, $f4); $row_sello = mysql_fetch_assoc($sello); mysql_select_db($database_f4, $f4); $query_sucursal = "SELECT * FROM sucursales WHERE sucursal = '" . $row_sello['sucursal'] . "'"; $sucursal = mysql_query($query_sucursal, $f4); $row_sucursal = mysql_fetch_assoc($sucursal); $totalRows_sucursal = mysql_num_rows($sucursal); //descuentos $desc1 = 0.0; $desc2 = 0.0; //================================================================================================================== // Crea el documento pdf $pdf = new Cezpdf('LETTER', 'portrait'); //'LETTER' (612.00,792.00) $pdf->ezSetMargins(100, 30, 30, 30); //$pdf->selectFont($FWK_PDFDEFAULTFONT); $pdf->setLineStyle(0.7, '', '', '', 0); $pdf->openHere('Fit'); if ($row_factura['tipocfd'] == 3) { $pdf->setStrokeColor(255, 0, 0); } if ($row_factura['tipocfd'] == 2) { $pdf->setStrokeColor(0, 255, 0); } // Inicia numeracin de páginas. $pdf->ezStartPageNumbers(400, 50, 10, 'left', '{PAGENUM} of {TOTALPAGENUM}', 1); $pagina = 1; $primeraPagina = $pdf->currentPage; // i. Agrega el logo de la empresa $logofile = "logos/prueba_logo.jpg"; //TENDRA QUE VENIR DE UN PARAMETRO EN LA BD. $pdf->addJpegFromFile($logofile, 30, 655, 200); // i. Agrega la leyenda "cancelada" if ($row_factura['estatus'] == 0) { $pdf->setColor(0.9, 0.9, 0.9); $pdf->addText(180, 200, 65, "<b>CANCELADA</b>", -45); $pdf->setColor(0, 0, 0); } // ------------------------------------------ENCABEZADO ------------------------------------------ //ENCABEZADO DE LA FACTURA $tipoDocto = $TIPOSCOMPROBANTEMXP[$row_factura['tipocfd']]; $emisor = utf8_decode($emisorNode->getAttribute('rfc')) . "\n"; $emisor .= utf8_decode($emisordomicilioNode->getAttribute('calle') . " " . $emisordomicilioNode->getAttribute('noExterior') . " " . $emisordomicilioNode->getAttribute('noInterior')) . "\n"; $emisor .= utf8_decode($emisordomicilioNode->getAttribute('colonia')); if ($emisordomicilioNode->getAttribute('localidad') != "") { $emisor .= "\n" . utf8_decode($emisordomicilioNode->getAttribute('localidad')); } if ($emisordomicilioNode->getAttribute('municipio') != "") { $emisor .= "\n" . utf8_decode($emisordomicilioNode->getAttribute('municipio')); } if ($emisordomicilioNode->getAttribute('estado') != "") { $emisor .= ", " . utf8_decode($emisordomicilioNode->getAttribute('estado')); } if ($emisordomicilioNode->getAttribute('codigoPostal') != "") { $emisor .= "\nCP " . utf8_decode($emisordomicilioNode->getAttribute('codigoPostal')); } $emisor .= " " . utf8_decode($emisordomicilioNode->getAttribute('pais')); $sucursal = ""; if ($row_sucursal['sucursal'] != "Principal_") { $sucursal = "Sucursal " . utf8_decode($row_sucursal['sucursal']) . "\n"; $sucursal .= utf8_decode($expedidoNode->getAttribute('calle') . " " . $expedidoNode->getAttribute('noExterior') . " " . $expedidoNode->getAttribute('noInterior')) . "\n"; $sucursal .= utf8_decode($expedidoNode->getAttribute('colonia')) . "\n"; $sucursal .= utf8_decode($expedidoNode->getAttribute('municipio')) . ", " . utf8_decode($expedidoNode->getAttribute('estado')) . "\n"; $sucursal .= "CP " . utf8_decode($expedidoNode->getAttribute('codigoPostal')) . " " . utf8_decode($expedidoNode->getAttribute('pais')); } ////////// i. Nombre del emisor $tableData = array(array("dato" => "<b>Obintel S.A. de C.V.</b>")); $colOptions = array("dato" => array('justification' => 'left', 'width' => 200)); $options = array('showLines' => 0, 'showHeadings' => 0, 'shaded' => 0, 'shadeCol' => array(1, 1, 1), 'fontSize' => 9, 'textCol' => array(0, 0, 0), 'rowGap' => 0, 'colGap' => 0, 'xPos' => 240, 'xOrientation' => 'right', 'width' => 200, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla nombre del emisor $pdf->ezSetY(714); $pdf->ezTable($tableData, $colNames, "", $options); ////////// i. Datos del emisor y de la sucursal $tableData = array(array("emisor" => $emisor, "espacio" => "", "sucursal" => $sucursal)); $colOptions = array("emisor" => array('justification' => 'left', 'width' => 205), "espacio" => array('justification' => 'left', 'width' => 10), "sucursal" => array('justification' => 'left', 'width' => 120)); $options = array('showLines' => 0, 'showHeadings' => 0, 'shaded' => 0, 'shadeCol' => array(1, 1, 1), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 0, 'colGap' => 0, 'xPos' => 240, 'xOrientation' => 'right', 'width' => 335, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla $pdf->ezSetDy(-6); $pdf->ezTable($tableData, "", "", $options); ////////// i. Datos del documento $foliodocto = rellena("0", 6, $comprobanteNode->getAttribute('folio')); $seriedocto = $comprobanteNode->getAttribute('serie'); if (!empty($seriedocto)) { $foliodocto = $seriedocto . "-" . rellena("0", 6, $comprobanteNode->getAttribute('folio')); } $fechastr = $comprobanteNode->getAttribute('fecha'); $fechatok = explode("T", $fechastr); $toksf = explode("-", $fechatok[0]); $fechastr = $toksf[2] . "-" . $toksf[1] . "-" . $toksf[0] . " " . $fechatok[1]; $ncert = $comprobanteNode->getAttribute('noCertificado'); $aprob = $comprobanteNode->getAttribute('anoAprobacion') . "-" . $comprobanteNode->getAttribute('noAprobacion'); $tableData = array(array("dato" => "<b>" . $tipoDocto . "</b>"), array("dato" => "<b>" . $foliodocto . "</b>"), array("dato" => "Fecha"), array("dato" => $fechastr), array("dato" => "Certificado"), array("dato" => $ncert), array("dato" => "Año y No. Aprobación"), array("dato" => $aprob)); $colOptions = array("dato" => array('justification' => 'left', 'width' => 120)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 2, 'shadeCol' => array(1, 1, 1), 'shadeCol2' => array(0.9, 0.9, 0.9), 'fontSize' => 7, 'textCol' => array(1, 1, 1), 'rowGap' => 2, 'colGap' => 5, 'xPos' => 455, 'xOrientation' => 'right', 'width' => 120, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla datos del documento //$pdf->ezSetDy(-12); $pdf->ezTable($tableData, "", "", $options); ////////// i. Datos del cliente $tableData = array(array("dato" => "<b>Cliente</b>"), array("dato" => utf8_decode($receptorNode->getAttribute('nombre'))), array("dato" => utf8_decode($receptorNode->getAttribute('rfc'))), array("dato" => utf8_decode($receptordomicilioNode->getAttribute('calle')) . " " . utf8_decode($receptordomicilioNode->getAttribute('noExterior')) . " " . utf8_decode($receptordomicilioNode->getAttribute('noInterior')) . " " . utf8_decode($receptordomicilioNode->getAttribute('colonia'))), array("dato" => utf8_decode($receptordomicilioNode->getAttribute('municipio')) . ", " . utf8_decode($receptordomicilioNode->getAttribute('estado'))), array("dato" => utf8_decode($receptordomicilioNode->getAttribute('estado'))), array("dato" => utf8_decode($receptordomicilioNode->getAttribute('codigoPostal')))); $colOptions = array("dato" => array('justification' => 'left', 'width' => 410)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 1, 'shadeCol' => array(0.9, 0.9, 0.9), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 2, 'colGap' => 5, 'xPos' => 35, 'xOrientation' => 'right', 'width' => 410, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla datos del cliente $pdf->ezSetDy(84); $pdf->ezTable($tableData, "", "", $options); $actualY = $pdf->y; $pdf->setColor(0, 0, 0); $pdf->filledRectangle(30, $actualY - 30, 540, 18); $pdf->ezSetY($actualY - 15); $pdf->setColor(1, 1, 1); $pdf->ezText("<b>Cant</b>", 7, array('left' => 18, 'justification' => 'left')); $pdf->ezSetY($actualY - 15); $pdf->ezText("<b>Descripción</b>", 7, array('left' => 55, 'justification' => 'left')); $pdf->ezSetY($actualY - 15); $pdf->ezText("<b>Unitario</b>", 7, array('left' => 448, 'justification' => 'left')); $pdf->ezSetY($actualY - 15); $pdf->ezText("<b>Importe</b>", 7, array('left' => 513, 'justification' => 'left')); ////////// i. Partidas $tableData = array(); $renglones = 0; $rowData = array("cantidad" => "", "descripcion" => "", "unitario" => "", "importe" => ""); $partidaCnt = 0; foreach ($conceptos as $conceptoNode) { $partidaCnt++; $renglones += 2; $currentObj = array(); $currentObj["cantidad"] = number_format(abs(doubleval($conceptoNode->getAttribute('cantidad'))), 0); $currentObj["descripcion"] = utf8_decode($conceptoNode->getAttribute('descripcion')); $currentObj["unitario"] = number_format($conceptoNode->getAttribute('valorUnitario'), 2); $currentObj["importe"] = number_format(doubleval($conceptoNode->getAttribute('importe')), 2); array_push($tableData, $currentObj); } $currentObj = array(); $currentObj["cantidad"] = ""; $currentObj["descripcion"] = ""; $currentObj["unitario"] = ""; $currentObj["importe"] = ""; if ($renglones < 10) { for ($renglones; $renglones < 10; $renglones++) { array_push($tableData, $currentObj); } } $colNames = array("cantidad" => "<b>Cant</b>", "descripcion" => "<b>Descripción</b>", "unitario" => "<b>Unitario</b>", "importe" => "<b>Precio</b>"); $colOptions = array("cantidad" => array('justification' => 'center', 'width' => 50), "descripcion" => array('justification' => 'left', 'width' => 370), "unitario" => array('justification' => 'right', 'width' => 60), "importe" => array('justification' => 'right', 'width' => 60)); $options = array('showLines' => 1, 'showHeadings' => 1, 'shaded' => 1, 'shadeCol' => array(0.9, 0.9, 0.9), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 4, 'colGap' => 5, 'xPos' => 35, 'xOrientation' => 'right', 'width' => 410, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla partidas $pdf->ezSetDy(11); $pdf->ezTable($tableData, $colNames, "", $options); ////////// i. Cantidad con letra $cadena = covertirNumLetras(number_format($comprobanteNode->getAttribute('total'), 2, ".", '')); $tableData = array(array("dato" => "<b>Total con letra</b>\n" . trim($cadena))); $colNames = array("dato" => "<b>Cant</b>"); $colOptions = array("dato" => array('justification' => 'left', 'width' => 420)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 0, 'shadeCol' => array(0.9, 0.9, 0.9), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 10, 'colGap' => 10, 'xPos' => 40, 'xOrientation' => 'right', 'width' => 120, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla cantidad con letra $pdf->ezSetDy(0); $pdf->ezTable($tableData, $colNames, "", $options); ////////// i. Totales $f_importe = "\$" . number_format($comprobanteNode->getAttribute('subTotal'), 2); $f_iva_T = $impuestosNode->getAttribute('totalImpuestosTrasladados'); $f_total = "\$" . number_format($comprobanteNode->getAttribute('total'), 2); $tableData = array(); $rowData = array("leyenda" => "", "cantidad" => ""); $subtotal = array("dato" => "Subtotal", "valor" => $f_importe); array_push($tableData, $subtotal); foreach ($traslados as $trasladoNode) { $tasaImpuesto = array(); $tasaImpuesto_t = number_format($trasladoNode->getAttribute('tasa'), 0); $tasaImpuesto["dato"] = $trasladoNode->getAttribute('impuesto') . " " . $tasaImpuesto_t . "%"; $tasaImpuesto["valor"] = "\$" . number_format($trasladoNode->getAttribute('importe'), 2); array_push($tableData, $tasaImpuesto); } foreach ($retenciones as $retencionNode) { $tasaImpuesto = array(); $tasaImpuesto_t = number_format($retencionNode->getAttribute('tasa'), 0); $tasaImpuesto["dato"] = "Ret. " . $retencionNode->getAttribute('impuesto') . " " . $tasaImpuesto_t . "%"; $tasaImpuesto["valor"] = "\$" . number_format($retencionNode->getAttribute('importe'), 2); array_push($tableData, $tasaImpuesto); } $total = array("dato" => "<b>Total</b>", "valor" => "<b>" . $f_total . "</b>"); array_push($tableData, $total); $colNames = array("dato" => "<b>Cant</b>", "valor" => "Precio"); $colOptions = array("dato" => array('justification' => 'right', 'width' => 60), "valor" => array('justification' => 'right', 'width' => 60)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 1, 'shadeCol' => array(0.9, 0.9, 0.9), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 3, 'colGap' => 5, 'xPos' => 455, 'xOrientation' => 'right', 'width' => 120, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla totales $pdf->ezSetDy(36); $pdf->ezTable($tableData, $colNames, "", $options); ////////// i. Sello $tableData = array(array("dato" => "<b>Sello Digital</b>\n" . $row_factura['sello'])); $colNames = array("dato" => "<b>Cant</b>"); $colOptions = array("dato" => array('justification' => 'left', 'width' => 400)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 0, 'shadeCol' => array(0.8, 0.8, 0.8), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 10, 'colGap' => 10, 'xPos' => 40, 'xOrientation' => 'right', 'width' => 120, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla sello $pdf->ezSetDy(-5); $pdf->ezTable($tableData, $colNames, "", $options); ////////// i. Cadena original $tableData = array(array("dato" => "<b>Cadena Original</b>\n" . utf8_decode(utf8_decode($row_factura['cadena'])))); $colNames = array("dato" => "<b>Cant</b>"); $colOptions = array("dato" => array('justification' => 'left', 'width' => 400)); $options = array('showLines' => 1, 'showHeadings' => 0, 'shaded' => 0, 'shadeCol' => array(0.8, 0.8, 0.8), 'fontSize' => 7, 'textCol' => array(0, 0, 0), 'rowGap' => 10, 'colGap' => 10, 'xPos' => 40, 'xOrientation' => 'right', 'width' => 120, 'cols' => $colOptions, 'innerLineThickness' => 0.3, 'outerLineThickness' => 0.3); // Dibuja la tabla cadena original $pdf->ezSetDy(-5); $pdf->ezTable($tableData, $colNames, "", $options); // Leyendas $pdf->ezSetDy(-12); $leyendas = 'EFECTOS FISCALES AL PAGO. PAGO EN UNA SOLA EXHIBICION. ESTE DOCUMENTO ES UNA IMPRESION DE UN COMPROBANTE FISCAL DIGITAL'; $pdf->setColor(0.5, 0.5, 0.5); $pdf->ezText($leyendas, 5, array('left' => 0, 'justification' => 'left')); $pdf->setColor(0, 0, 0); //REGRESA PARA PONER ENCABEZADO EN PAGINAS 2 -> if ($pdf->ezPageCount > 1) { $datos = array(); $datos['logo'] = $logofile; $datos['totalPaginas'] = $pdf->ezPageCount; $datos['tipoDocto'] = $tipoDocto; $datos['foliodocto'] = $foliodocto; $datos['fechastr'] = $fechastr; for ($pn = 2; $pn <= $pdf->ezPageCount; $pn++) { $datos['paginaActual'] = $pn; //a partir de la segunda pagina. $pdf->reopenObject($pdf->ezPages[$pn]); headerDoc($pdf, $datos); } } //ESCRIBE REPORTE AL ARCHIVO. //================================================================================ $pdfcode = $pdf->output(); //save the file if ($tmpName) { $nombrePDF = tempnam("tmp/", 'face5') . ".pdf"; $nombreToks = explode("/", $nombrePDF); if (count($nombreToks) < 2) { $nombreToks = explode("\\", $nombrePDF); } $lastTok = count($nombreToks) - 1; $nombrePDF = $nombreToks[$lastTok]; $archivoPDF = "tmp/" . $nombrePDF; $archivos = array($nombrePDF, $archivoPDF); } else { $nombrePDF = $tipoDocto . "_" . $row_factura['serie'] . $row_factura['folio'] . ".pdf"; $archivoPDF = "tmp/" . $nombrePDF; $archivos = array($nombrePDF, $archivoPDF); } $fp = fopen($archivoPDF, 'w'); fwrite($fp, $pdfcode); fclose($fp); return $archivos; }