miércoles, 21 de enero de 2015

Imprimir tickets en impresora Epson TMU 220 con CakePHP 2.5

Esta configuración es para Windows 7 Ultimate, con el dll php_printer copiado a la carpeta de extensiones de php y con la línea de extension agregada en el php.ini.

Asumiendo que usted conoce la estructura básica de un proyecto con el framework CakePHP, es decir el patrón MVC, pasaremos a crear nuestra función en nuestro controlador:

function imprimir($paramdetalle=null){//Recibe parámetro para cargar un detalle de venta
try {
               $detalles = $this->Producto->query("select *
                from tabladetalles
                where codigo=".$paramdetalle);//Donde tabladetalles y el campo código son tu tabla y tu campo                                                                    de identificación

               $printer = "Ticketera";/*Nombre de la impresora ticketera instalada*/

               $ph = printer_open($printer);/*Abrimos la impresora especificada más arriba*/

               printer_start_doc($ph, 'Ticket');/*Iniciamos un documento temporal con el nombre de 'Ticket'*/

               printer_start_page($ph);/*Iniciamos la página en la impresora*/

               //Creamos un fuente para los datos de cabecera del ticket
               $font = printer_create_font("Arial", 20, 8, PRINTER_FW_NORMAL, false, false, false, 0);
               printer_select_font($ph, $font);/*Selecciona la fuente creada*/

               //Datos de la cabecera
               //Donde $ph, es la impresora, "Farmacia S.A.", es el texto, 0, es la columna y 10 es la fila
               printer_draw_text($ph, "Farmacia S.A.", 0, 10);
               printer_draw_text($ph, "RUC: 00000-0", 0, 30);
               printer_draw_text($ph, "Direccion de la farmacia", 0, 50);
               printer_draw_text($ph, "Factura Nro. 000-000-0000001", 0, 70);
               printer_draw_text($ph, "------------------------------------------------------------------", 0, 90);
               printer_draw_text($ph, "Cant", 0, 110);
               printer_draw_text($ph, "Articulo", 60, 110);
               printer_draw_text($ph, "Precio", 220, 110);
               printer_draw_text($ph, "Total", 310, 110);
               printer_draw_text($ph, "IVA", 370, 110);
               printer_draw_text($ph, "------------------------------------------------------------------", 0, 130);
            printer_delete_font($font);/*Eliminamos la fuente utilizada*/
            $cont = 130;/*Creamos un contador para ubicar las filas del detalle del ticket*/

            foreach ($detalles as $detalle) {
                $cont = $cont + 20;/*Incrementamos en 20 el valor para la posición de la fila*/

                /*Creamos otra fuente para el detalle del ticket, un poco más reducido que la cabecera*/
                $fontprd = printer_create_font("Arial", 14, 5, PRINTER_FW_NORMAL, false, false, false, 0);
                printer_select_font($ph, $fontprd);/*Seleccionamos la fuente creada*/
             
                //Imprimimos los datos del detalle en la columna correspondiente al de la cabecera
                printer_draw_text($ph, $detalle[0]['cantidad'], 0, $cont);
                printer_draw_text($ph, $detalle[0]['pro_desc'], 60, $cont);
                printer_select_font($ph, $fontprd);/*Seleccionamos nuevamente la fuente creada para el detalle*/

                //Para alinear los números a la derecha
                $s = strlen(number_format($detalle[0]['pro_precio'], 0, '', '.'));
                $y = 260;
                for ($i = 1; $i < $s + 1; $i++) {
                    $u = $i * -1;
                    printer_draw_text($ph, substr(number_format($detalle[0]['pro_precio'], 0, '', '.'), $u, 1), $y,                         $cont);
                    $y = $y - 8;
                }

                $s1 = strlen(number_format(($detalle[0]['pro_precio'] * $detalle[0]['cantidad']), 0, '', '.'));
                $y1 = 340;
                for ($i1 = 1; $i1 < $s1 + 1; $i1++) {
                    $u1 = $i1 * -1;
                    printer_draw_text($ph, substr(number_format(($detalle[0]['pro_precio'] * $detalle[0]                                   ['cantidad']), 0, '', '.'), $u1, 1), $y1, $cont);
                    $y1 = $y1 - 8;
                }
             
                printer_draw_text($ph, $detalle[0]['pro_tipoimp'], 370, $cont);
                printer_delete_font($fontprd);/*Elimina la fuente utilizada para el detalle*/

            }

             printer_end_page($ph);
             printer_end_doc($ph);
             printer_close($ph);

             $this->Session->setFlash('Impresion realizada exitosamente');/*Muestra un mensaje*/
             $this->redirect(array('action' => 'paginas/' . $paramdetalle));/*Redirecciona a la pagina                                especificada*/

} catch (Exception $ex) {//Captura la exception y la muestra como un mensaje
            $this->Session->setFlash($ex);
        }

}


A estas líneas de código le faltarían el total general, el impuesto, los datos del cliente, la fecha, etc., pero eso ya queda a cuenta de cada uno para agregar.

Estaré subiendo más ejemplos de códigos con CakePHP próximamente, cualquier consulta, pueden comentar