Hace unos días desarrollando un sistema el cuál requiere generar facturas, estuve buscando una manera de poder hacerlo práctico, esto ya que la factura se mandaría a un formato preimpreso, por lo que la información debería coincidir con el formato, lo primero que me recomendaron es usar FPDF el cuál es una librería que funciona en PHP y que es relativamente fácil de usar, digo relativamente porqué hay que usar coordenadas para poder generar el documento lo que la vuelve algo complicada, más aun si se quiere dejar libertad al usuario que genere sus propios formatos.
Imaginaba que se podía hacer algo con OpenOffice (OO), ya que usa ODF(Open Document Format) el cuál es un formato abierto en XML. Los archivos generados por OpenOffice vienen comprimidos en formato .zip, al descomprimirlos genera varios archivos, de los cuáles el principal es content.xml, el cuál contiene la información que hemos capturado en el archivo, esto aplica para archivos de Hojas de Calculo, Procesador de Textos o una presentación de OO.
Despues de desmenuzar los archivos de OpenOffice se me ocurrieron varias mafufadas que no tiene caso comentar aquí, pero lo cuál me llevó a encontrar una Librería Abierta llamada TinyButStrong [http://www.tinybutstrong.com/] , la cuál tiene un plugin para OpenOffice llamada TinyDoc [http://tinydoc.unesolution.fr/] que permite rellenar una plantilla de OpenOffice fácilmente y en unas cuantas líneas, lo que nos ahorra mucho trabajo al generar reportes.
El concepto es muy fácil, definir variables en nuestro documento que luego serían sustiuídas. Por ejemplo si en nuestro documento de OpenOffice pusiéramos en alguna parte:
[factura.fecha]
En TinyDoc tendríamos que tener un arreglo que contenga la llave fecha para que la sustituya en OpenOffice
$_factura=array("fecha"=>"2009-01-01");
De tal forma que ese arreglo lo asignamos al "parser" de plantillas de TinyDoc, algo como lo que se hace en los templates de smarty
$doc->mergeXmlField('factura',$_factura);
Si queremos listar información por ejemplo el detalle de una factura (productos) usaríamos el método
$doc->mergeXmlBlock('detalle',$_detalle);
En Open Office usaríamos [detalle;block=table:table-row] para indicar que es un bloque de datos, y luego poner en alguna parte del documento[detalle.cantidad][detalle.descripcion][detalle.preciounitario][detalle.importe] para que liste el contenido del arreglo de arreglos, dónde el arreglo de detalle sería un arreglo como la siguiente manera
Y con esto se sustituiría la información en OpenOffice, respetando el estilo, posición, etc., por lo que tendríamos un reporteador WYSIWYG( Waht You See Is What You Get - Lo que ves es lo que obtienes).
Por ejemplo aquí muestro como sería el archivo plantilla en OpenOffice usando la "sintaxis" de TinyButStrong, De Lado derecho vemos como quedaría el archivo de OpenOffice despues de que se parseo con TinyButStrong.
(Click para ver la imagen más grande)
Un código de ejemplo de como procesar archivos de Open Office con PHP y TinyButStrong sería:
<?php //llamamos a las librerias de formateo de plantillas de Open Office include('lib/tinyButStrong.class.php'); include('lib/tinyDoc.class.php'); //Creamos un Objeto de la Clase $doc=new tinyDoc(); //Indicamos que OpenOffice esta en formato .zip, en linux hay que verificar que tengamos instalado unzip: sudo apt-get install unzip $doc->setZipMethod('ziparchive'); //Indicamos que el directorio temporal dónde descomprimira el archivo OD* de Open Office $doc->setProcessDir('./tmp'); //Le indicamos el archivo de Open Office que creamos como plantilla $doc->createFrom('formato_factura.odp'); //Indicamos el archivo que escribirá, OpenOffice guarda en content.xml la información capturada en el archivo $doc->loadXml('content.xml'); //Funcion que formateara la plantilla de Open Office
crea_factura($doc); //Indicamos que genere uan descarga del archivo para el usuario $doc->sendResponse(); //Elimina toda la información que fué creada temporalmente $doc->remove();
function crea_factura($doc) { //En el archivo plantilla de de openoffice tenemos [factura.fecha], [factura.subtotla], [factura.iva], [factura.total], [factura.totaltext] //Lo que hace la clase es cambiar la información por la que asinemos aquí, si vemos asignamos el arreglo a factura y el método usado es mergeXmlField $doc->mergeXmlField('factura', array( 'id'=>'1', 'fecha'=>date('Y-m-d'), 'subtotal'=>10250, 'iva'=>1537.5, 'total'=>10787.5, 'totaltext'=>'Diez Mil Setecientos Pesos Cincuenta Centavos', ) ); //Al igual que en factura a cliente le asignamos el arreglo de cliente que tiene las llaves que seran sustituidas en la plantilla //usamos el metodo mergeXmlField ya que es un arreglo unidimensional $doc->mergeXmlField('cliente', array( 'id'=>'1001', 'nombre'=>'OaxRom SA de CV', 'direccion'=>'Encuentranos en http://www.oaxrom.com', 'rfc'=>'OAX090101C45' ) ); //Este método es interesante, ya que nos permitirá mostrar listados en la plantilla //En la plantilla tenemos [detalle.cantida] [detalle.descripcion][detalle;block=table:table-row] [detalle.preciounitario] [detalle.importe] //Usando la funcion mergeXmlBlock, podremos listar información de un arreglo de arreglos en forma de listas, esto es práctico cuándo se intenta //mostrar informacion de productos en una factura por ejemplo, donde el numero de productos puede ser 1 o varios, esto lo que comunmente se llama detalle $doc->mergeXmlBlock('detalle', array( array( 'cantidad'=>2, 'descripcion'=>'Adaptador SPA3102', 'preciounitario'=>1450.00, 'importe'=>2900 ), array( 'cantidad'=>3, 'descripcion'=>'Modulos FXO', 'preciounitario'=>1400.00, 'importe'=>4200.00 ), array( 'cantidad'=>1, 'descripcion'=>'Router Inalambrico WRT54G ', 'preciounitario'=>650, 'importe'=>650 ), array( 'cantidad'=>1, 'descripcion'=>'Tarificador Web Asterisk', 'preciounitario'=>2500, 'importe'=>2500 ), ) ); //Ya que la clase asigna los valores, guarda la información $doc->saveXml(); /*
$doc->loadXml('styles.xml');
$doc->mergeXmlField('header',
array(
'title' => 'made with tinyDoc and',
'img' => 'images/samples/openoffice-by-benjamin-bois.png',
)
);
$doc->mergeXmlField('footer',
array(
'signature' => 'image credit : Benjamin Bois',
)
);
$doc->saveXml();
*/ //cerramos el archivo $doc->close(); } ?>
He subido un proyecto de ejemplo a http://files.mexrom.net
entra con login:invitado y password:invitado
Entra a la carpeta TinyButStrong y descarga el archivo factura.zip
Descomprime la carpeta en algún directorio de tú servidor web y desde tu navegador abre por ejemplo:
http://localhost/factura/formato_factura.php
Y esto debería generarte un archivo de OpenOffice como muestro en la parte derecha de la imagen de arriba.
Con tinyDoc es fácil crear reportes en PHP y obteniendo datos de MySQL, solo es cuestión de crear la plantilla y listo..
Puedes obtener más información en : http://tinydoc.unesolution.fr/
Los domingos en canal 22 está pasando un buen documental titulado "La Verdadera Historia de Internet", anteriormente hablaron de IBM, Microsoft, Google y este domingo se aventaron la historia sobre napster, myspace, facebook, youtube, craiglist y wikipedia, de verdad que está bastante interesante el documental, ya que trata sobre como fué evolucionando el internet a traves de los años hasta la revolución digital que se vive en estos días.
Pueden empezar a ver desde el primer capítulo en youtube en la siguiente URL: http://www.youtube.com/watch?v=nH0cby2lMk8
Hace tiempo instalè Firefox 3.0 pero desde que lo instalè algo que no me gusto de esta versiòn fuè su nueva barra de direcciones, a muchos les parece novedoso y bonito, lo novedoso si lo es, pero para mi no es tan bonito, esto porquè la nueva barra de firefox permite hacer bùsquedas en el historial o los bookmarks de las palabras que pongamos en el navegador, quizà para muchos esto les funcione pero en mi caso no, ya que siempre inicio poniendo en la barra de direcciones el principio del url.
Entonces por ejemplo si pusiera phylevn, para buscar phylevn.binniza.com, con la actual barra de firefox 3 me listaría todas las páginas dónde tengo las URL o tìtulos de las páginas lleven phylevn como flickr.com/phylevn, youtube.com/phylevn, twitter/phylevn, etc., pero esto no es práctico ya que solo busco la url que empieza con phylevn.
Por lo que buscando en internet encontré en un foro que la forma fácil y rápida de asemejar la barra de direcciones de firefox 3 a la versiòn 2 es editando la configuraciòn, para esto solo basta escribir en la barra de direcciones:
Hace unos días me contactaron para ver si podía instalar una aplicación .Net CF para Windows CE 4.2 en una terminal portátil con Windows CE 5.0, el detalle al hacer la instalación es que el desarrollo tenía librerías desarrolladas para CE 4.2 por lo que no era posible ejecutar la aplicación en Windows CE 5.0, entonces había 2 opciones migrar el desarrollo hacia 5.0 ó conseguir alguna terminal con Windows CE 4.2.
En el primer caso los que me contactaron no tenían el código fuente ya que la empresa que les desarrolló la aplicación no les dió el código fuente, una de las razones del porqué usar Software Libre, esto ya que en mi caso cuándo hago desarrollos entregó el código fuente a la empresa que le programo. En la segunda opción de conseguir terminales con Windows CE 4.2 el detalle es que estas terminales se dejaron de producir hace algunos par de años y salió la versión de MC9090 con Windows CE 5.0. Afortunadamente es posible hacer un downgrade de Windows CE 5.0 a Windows CE 4.2 y que es básicamente lo que comento a continuación.
Antes que nada primero obtener los siguientes archivos de la página de Motorola (Antes Symbol Technologies).
Imagen de Windows CE 4.2 para MC90xx
90xxc42OS010007.bgz
Imagen del Platform de MC90xx
90xxc42Plat018.hex
Imagen de Application del MC90xx
90xxc42App32M018.bgz
Tabla de Particiones de la MC90xx
90xxc42PT32M018.hex
Se puede usar las imágenes Splash Screen de algunas otras versiones.. http://software.symbol.com/detail.cfm?prod=1765
Ya que se obtengan los archivos mencionados, conectar la cuna de la terminal a la corriente eléctrica, esto es muy importante al igual que asegurarse que no haya una desconexión eléctrica durante el proceso de instalación de las imágenes en la memoria EEPROM de la terminal, ya que podría dejar temporalmente como un buen pisapapeles a la terminal hasta que sea enviada al soporte de Symbol.
Reiniciar la terminal en modo IPL(Initial Program Loader), para esto sacar la batería de la terminal, presionar el botón del scanner y el botón de power al mismo tiempo, mantenerlos presionados, y conectar la terminal a la cuna. Si todo salió bien se debería ver el menú de IPL, si es así soltar los botones anteriores.
Ahora conectar el cable usb de la cuna a la PC, aquí es importante que previamente se haya cargado el "Device Configuration Package" , al conectar el cable USB a la PC pedirá unos drivers, estos buscarlos en el directorio dónde se instaló el DCP.
Ya que se hayan instalado los drivers del cable USB entonces mediante DCP cargar los archivos .hex a la terminal portátil.
En el Menú del IPL cargar las imagenes en el siguiente orden:
Partition Table
Windows CE 4.2 Image
Platform Image
Application Image
Splash Screen
En el programa DCP seleccionar los archivos correspondientes y en el puerto de conexión seleccionar el puerto USB para hacer el envío a la terminal de las imágenes de los archivos .hex, es importante que durante el envío no se desconecte el puerto USB de la cuna ni tampoco se desconecte de la correinte eléctrica.
Cuándo se termine de hacer el procedimiento seleccionar del menú IPL la opción de reiniciar, y si todo salió bien se tendría instalado Windows CE 4.2 en vez de Windows CE 5.0 en la terminal portátil MC9090.
Como recomendación para los que contratan desarrollos de aplicaciones para Terminales Portáiles es que les incluyan el código fuente y si es posible que los desarrollos incluyan versiones para diversos sistemas operativos de Windows Mobile, .Net CF permite entregar versiones para Pocket PC hasta Windows Mobile, incluyendo Windows CE 4.X y Windows CE 5.X. También hay que analizar el ciclo de soporte incluído en las terminales a utilizar.
No teniendo otra forma de colaborar con México en esta situación de alerta nacional y para con mi gente más que con lo poco que sé que de programación, hoy he liberado una versión beta de un software llamado iMest que permite envío de SMS múltiples por tipos de contactos desde una página web.
Este software queda licenciado bajo la GPL lo que indica que cualquiera puede descargarlo, usarlo sin costo alguno, modificarlo y distribuirlo entre otras ventajas del Software Libre
La intención de este software es que diversas personas, empresas y organizaciones puedan tener una base de datos de las personas relacionadas con la entidad y asi puedan enviarle información a sus teléfonos celulares casi de manera instantánea y personalizada usando como gateway sms algun teléfono Nokia, de tal forma que puedan informarse sobre diversas contigencias.
El proyecto puede descargarse desde la siguiente URL https://sourceforge.net/projects/binnizawebsms/
Pueden verse algunos screenshots desde la siguiente URL: https://sourceforge.net/project/screenshots.php?group_id=260344
Para mayor información sobre el uso, requerimientos, instalación y configuración del software vaya a la siguiente página: http://phylevn.binniza.com/index.php?page/Binnita_NetApps_iMest_WebSMS
Espero este software pueda serle útil a alguien.
Cómo cualquier beta este software debe tener gran cantidad de errores y horrores de programación, se aceptan comentarios, sugerencias y tips de programación.
Cualquier duda sobre la instalación y configuración del software siéntanse en la libertad de hacérmela saber y a vuelta de correo poder darles una respuesta.
Phylevn
Qué el asistente comprenda desde los conceptos básicos de Telefonía Tradicional y Voz Sobre IP hasta conocimientos avanzados de telefonía IP.
Conozca como instalar y configurar Tarjetas de Telefonía Sangoma & Digium.
Sepa diferenciar el uso de los diversos protocolos de comunicación.
Conozca la diferencia y uso de los diversos códecs.
Integrar nuevas aplicaciones alrededor de Asterisk.
Configurar las aplicaciones básicas de un conmutador IP.
Configurar extensiones y manejar el dialplan de Asterisk.
Configuración de IVRs, Grupos de marcación, DISAs, FollowMe, etc.,
Ruteo de llamadas por diveras tecnologías.
Instalar un Administrador Gráfico para Asterisk
Programación de aplicaciones con Asterisk Gateway Interface
Monitoreo de llamadas
Integración de aplicaciones desarrolladas con el Asterisk Manager Interface
Detección de fallos
Integración de aplicaciones externas con Asterisk
Integración de vTiger CRM con Asterisk
Curso de Introducción a la plataforma Linux.
Se provee un curso de introducción opcional que consta de 6 horas previas al curso de VoIP para que los asistentes nuevos en Linux puedan comprender aun más los aspectos fundamentales del Sistema Operativo Linux, plataforma sobre la cuál se integra la tecnología de Asterisk VoIP y conozcan el entorno sobre la cual se implementa Asterisk PBX.
Temario del curso de Linux Core
¿ Qué es Linux ?
Obteniendo Linux
Distribuciones Linux
Instalación de Linux
Sistema de Archivos de Linux
Comandos principales
Permisos de usuarios y accesos de archivos.
Ejecución de aplicaciones.
Instalación de paquetes.
Compilación e instalación de aplicaciones medante código fuente.
Manejo de editor de texto en linux.
Edición de archivos de configuración.
Configuración de servicios de arranque en Linux.
Registros y Mensajes del Sistema.
Detección de hardware.
Monitoreo de sistema(CPU, RAM, Disco Duro).
Configuración de Redes en Linux.
Temario del Curso de Implementación de Asterisk VoIP
SESIÓN 1
Teoría
Conceptos Básicos de Telefonía Tradicional.
Terminología de la Telefonía tradicional.
Concepto básicos de Voz sobre IP.
Situación Actual de la Telefonía Tradicional en México
¿ Qué es la Telefonía IP ?
Ventajas de Implementación de Telefonía IP en las Empresas.
Diferencia entre Voz sobre IP vs Telefonía IP.
Términos y Aspectos legales en México
Protocolos de Voz sobre IP
Codecs de Voz sobre IP
¿ Qué es Asterisk PBX?
Aplicaciones de un Conmutador de Voz sobre IP basados en Asterisk PBX.
Practica
Instalación de Servidor Linux
Configurando de usuarios
Configuración del sistema de paquetes y repositorios de Linux.
Configurando servicio de consola remota(SSH) para acceso remoto.
Instalación de paquetes requeridos para Asterisk y FreePBX.
Descarga de código fuente de aplicaciones requeridas para instalación de Asterisk PBX.
Compilación de paquetes requeridos.
Instalación de Paquetes de Conmutador de Voz Sobre IP con Asterisk PBX.
Instalación de Drivers DAHDI o ZAPTEL para tarjetas Sangoma ó Digium.
Configuración de tarjetas con DAHDI y ZAPTEL.
Configuración de opciones generales de zapata.conf y dahdi.conf
Configuración de grupos y canales de puertos FXO
Instalación de Gateway para desarrollo de Aplicaciones de Voz Sobre IP.
Instalación de Sonidos en español para IVR.
Instalación y Configuración de Administrador Web FreePBX para Asterisk PBX.
Actualización e instalación de nuevos módulos de FreePBX.
Actualización e instalación de módulos no oficiales de FreePBX
Esquema de archivos de configuración de FreePBX y Asterisk PBX.
Edición de Archivos Generales de configuración de Asterisk PBX.
Edición de archivos de configuración de Usuarios y Extensiones de Asterisk PBX.
Configuración de Softphone en Linux, Windows y PocketPC como extensiones del conmutador de VoIP
Evaluación de la Sesión
Retroalimentación
SESION 2
Practica
Configuración de Planes y Reglas de Marcación en archivos de configuración de Asterisk PBX.
Configuración de Equipos FXS como extensiones de Conmutador VoIP.
Configuración de Puertos FXO de SPA3102 como líneas de salida PSTN
Configuración de Puertos FXO de tarjetas como líneas de salida PSTN.
Configuración de dispositivo PAP2 para conexión de Fax.
Consideraciones para Fax sobre IP.
Configuración de Correo de Voz para extensiones.
Configuración de conexión a un proveedor VoIP para realizar y recibir llamadas desde la red PSTN.
Instalación de Códecs g729.
Configuración de servicio DID(Número telefónico vía VoIP) con Asterisk PBX.
Configuración de Ruteo de llamadas Entrantes al conmutador de VoIP.
Configuración de Ruteo para llamadas Salientes del Conmutador de VoIP.
Configuración de password y pins para llamadas salientes.
Configuración de música de fondo para diversos contextos y grupos de marcación.
Configuración de Follow ME.
Configuración de Call Back.
Configuración de Grupos de Marcación.
Grabación de llamadas.
Instalación de aplicación para revisión de llamadas grabadas.
Implementación de Monitoreo y susurro de llamadas.
Grabación de Mensajes para IVR y otros servicios del conmutador de Voz Sobre IP.
Configuración de grupos de toma de llamadas.
Transferencia y Toma de Llamadas
Evaluación de la Sesión
Retroalimentación
SESION 3
Práctica
AudioConferencia en Asterisk PBX.
VideoConferencia en Asterisk PBX
Configuración de Acceso Remoto para Marcación Directa ( DISA ).
Programación de AGI para implementación de DISA personalizado.
Configuración de Ruteo de Llamadas por Horarios de Marcación.
Configuración de Aplicaciones Interactivas de Voz ( IVR ).
Configuración de dispositivo USB e integración con FreePBX para envío de SMS desde aplicación web.
Configuración de Colas de Llamadas.
Revisión de Códigos de Marcación de Asterisk.
Revisión del Panel de Marcación de FreePBX.
Modificación de base de datos de CDR de Asterisk PBX.
Configuración y programación de CDR.
Modificación del sistema de reportes CDR de FreePBX.
Uso de la consola para depuración de eventos de Asterisk
Conociendo las opciones de la consola de Asterisk
Recarga de funciones de Asterisk
Monitoreando canales en Asterisk
Conociendo el log de Asterisk
Detección de problemas y fallos en Asterisk.
Instalación de IAXModem & Hylafax como Fax Virtual
Instalación y Configuración de AvantFax como Administrador Web de Faxes.
Configuración de Hylafax para envío de Fax desde Aplicaciones Windows.
Evaluación de la Sesión
Retroalimentación
SESION 4
Práctica
Instalación del FrameWork de PHP AGI
Que es un AGI
Qué es AMI
Instalación de Festival y parlante en español
Programación AGI(Asterisk Gateway Interface) demo de interfaz entre Asterisk y Aplicación LAMP
Ejecución de Aplicaciones desde llamadas telefónicas con Asterisk
Desarrollo de aplicaciones VoIP haciendo uso de AMI(Asterisk Manager Interface)
Programación de AMI para monitoreo de llamadas
Programación de AMI para interfaz con sistema de tarificación de llamadas
Integración de aplicación Click to Call.
Configuración de WebPhone
Integración de sistema de detección de movimiento con Asterisk.
Configuración de Marcaciones Internas para Accesos a Diversas Aplicaciones VoIP desarrolladas.
Integración de AsterCRM con Conmutador de Voz sobre IP.
Tarificador de llamadas
Implementación de un Conmutador de Voz sobre IP para un escenario real.
Evaluación de la Sesión
Retroalimentación
Material Entregable:
Disco con todos los paquetes a usar en el curso de implementación del conmutador de Voz sobre IP.
Distribución de Linux Server & Linux Desktop.
Libro Electrónico El Futuro de la Telefonía.
Documentación sobre el proceso de instalación de Asterisk VoIP.
Presentación del curso de Voz sobre IP.
Cuenta VoIP con 10 Dlls de Crédito & DID para prueba de llamadas vía VoIP.
Teléfono VoIP Aastra 6730i, ATA SPA3102 o Tarjeta X100P 1 Puerto FXO.
Lugar:
Por definir por parte de los asistentes
Fecha y Horarios del curso:
Fecha y Horario: Por definir por parte de los asistentes
Límite de Asistentes:
Por definir
Adicionales:
Cualquier duda posterior a la fecha del curso podrá atenderse vía correo electrónico o messenger para atender dudas que hayan salido con respecto algunos de los temas, instalación o configuración de los temas vistos en el curso.
Inversión:
Cotizar el costo mediante el sistema de cotizaciones, por favor regístrese en nuestro sistema y seleccione Curso Especializado de Asterisk PBX para que le llegue a su correo información de curso y costo.
50 % Antes del curso y el resto previo al inicio del curso.
Descuentos:
A partir de 3 Personas Inscritas hay un descuento del 10% sobre el costo original.
Instalando Red5 como base para instalar un sistema de videoconferencia web, en el tutorial de instalación veo que recomiendan usar Flash 10 en Linux ó MacOS esto para mejor rendimiento del CPU sobre aplicaciones Flash, esto ya que comúnmente al abrir una página de youtube por ejemplo el consumo de CPU se disparaba al monitorearlo en la consola de Linux, por lo que decidí actualizar la versión de flash al pre-release del plugin de Flash 10.
Lo primero que hay que hacer es obtener el prerelease de Flash 10 de la siguiente url: http://www.adobe.com/go/getflashplayer
mkdir ~/software/ cd ~/software/software wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_10_linux.tar.gz cd/usr/src sudotar-xzvf ~/software/install_flash_player_10_linux.tar.gz cd install_flash_player_10_linux whereis firefox
firefox: /usr/bin/firefox /etc/firefox /usr/lib/firefox /usr/share/firefox /usr/share/man/man1/firefox.1.gz #El directorio de firefox es /usr/lib/frefox #cerrar firefox ó el navegador que se usa #ejecutar el instalador de flash 10 sh ./install_flash_player #Y aceptar la instalación y la licencia #luego introducir el directorio de firefox ó el navegador que se usa #aceptar nuevamente la instalación y listo #reiniciar firefox abrir algunapágina con flash y ya debería verse en propiedades de flash que se usa la versión 10.
Asterbilling es un software que permite integrar un tarificador a Asterisk basado en prefijos, longitud del número de marcado, entre otras cosas, muy apto para ser usado en casetas telefónicas, aparte que tiene un sistema de monitoreo para cuándo se marque un número muestre el tiempo marcado, el número, etc y de ahi mismo imprimir un ticket.
Como plugin adicional para Asterbilling hice un script en php que lo que hace es consultar desde un teléfono el costo de las llamadas desde un cabina en específica, de tal forma que usando festival te regresa de forma hablada la fecha marcada, el tiempo de la llamada, el número marcado y el costo total de la llamada en base a la tarifa aplicada.
Este script también permitiría imprimir un ticket en una impresora de tickets conectada al puerto serial, solo bastaría crear un archivo con la información y mandarlo al puerto lpt.
#!/usr/bin/php -q <?php //llamamos a las librerias de phpagi require("phpagi/phpagi.php"); //activamos la bandera de enviar todo lo que se realice a consola como modo depuracion error_reporting(E_ALL); //creamos una instancia de la clase AGI $agi=new AGI(); //generamos el comando Answer de Asterisk, este comando siempre lo ejecutamos al inicio de un AGI $agi->answer(); //Este demo consultaria informacion en una base de datos y regresaria la informacion de forma hablada por lo que generamos una conexion a la base de datos de sql $conexion=mysql_connect("localhost","astercc","astercc") or die("Error: El servidor no puede conectar con la base de datos"); //Referenciamos el cursor a la base de datos mysql_select_db("astercc",$conexion); //obtenemos el caller id de quien realiza la llamada $_cid=$agi->parse_callerid(); //enviamos un mensaje de voz por medio de festival que esta configurado en idioma espanol $saludo_hora=(date("H")<12)?"Buenos Dias!"<img src="plugins/Emoticons/images/face-sad.png" border="0" alt="face-sad.png " width="16" height="16"/>(date("H")<19)?"Buenas tardes!":"Buenas Noches!");
$agi->text2wav("Hola $saludo_hora"); do{ $agi->text2wav('¿Que cabina desea tarificar? 0 para salir');
//enviamos un beep y esperamos 20 segundos en la espera de una respuesta $_result=$agi->get_data('beep',5000,20); //obtenemos la informacion introducida desde el telefono $cabina=$_result['result']; if($cabina!="" and $cabina!="0"){ $query="select c.id, c.calldate, c.src, c.dst, c.didnumber, c.duration, c.billsec, c.disposition, c.calltype, c.userfield,
m.dialprefix, m.numlen, m.destination, m.connectcharge, m.initblock, m.rateinitial, m.billingblock
from mycdr c, myrate m
where c.src='$cabina' and c.disposition like '%ANSWERED%'
and c.userfield='UNBILLED'
and (c.dst like concat(m.dialprefix,'%') or length(c.dst)=m.numlen)
and (c.groupid=m.groupid or m.groupid=0)
and (c.resellerid=m.resellerid or m.resellerid=0)
order by
"; //select c.id, c.calldate, c.src, c.dst, c.didnumber, c.duration, c.billsec, c.disposition, c.calltype, c.userfield,m.dialprefix, m.numlen, m.destination, m.connectcharge, m.initblock, m.rateinitial, m.billingblock from mycdr c, myrate m where c.src='102' and c.disposition like '%ANSWERED%' and c.userfield=UNBILLED and (c.dst like concat(m.dialprefix,'%') or length(c.dst)=m.numlen) and (c.groupid=m.groupid or m.groupid=0) and (c.resellerid=m.resellerid or m.resellerid=0) $agi->verbose($query); $_result=mysql_query($query); //verificamos si existe un resultado $total=0; $subtotal=0; $ticket=""; $count=1; while($_re=mysql_fetch_array($_result)){ $subtotal=$_re[13]; if($_re[6]>$_re[14]){ $charge_additional=(ceil(($_re[7]-$_re[14])/$_re[16]))*$_re[15]; $subtotal+=$charge_additional; } $total+=$subtotal; $ticket.=" llamada $count.
Fecha: $_re[1].
Tiempo de la llamada: $_re[6] segundos.
Numero Marcado: $_re[4].
Tarifa aplicada: $_re[destination].
Costo: $subtotal pesos.."; } if($total>0){ $agi->text2wav("Total a pagar $total pesos. Desglose : ".$ticket." Total a pagar: $total pesos"); $agi->text2wav("Desea imprimir el ticket?Presione 1 para Aceptar. Otro para salir"); $_result=$agi->get_data('beep',5000,20); $print=$_result['result']; if($print==1){ $ticket=str_replace(".",".\n",$ticket)."\n\nTotal a pagar: ".$total." pesos"; //imprimir ticket //guarda archivo //manda archivo a LPT //elimina archivo impreso //guardar registro } }else{ $agi->text2wav("No hay llamadas para tarificar en la cabina $cabina!"); } } }while($cabina!='0'); $agi->text2wav("Hasta luego. $saludo_hora"); //al finalizar el script del AGI siempre es recomendable ejecutar esta funcion para no dejar el canal abierto. $agi->hangup(); ?>
//*****
En los últimos meses, semanas y días he sido estafado desde empresas grandes en la vida real e internet hasta por estafadores callejeros, causándome entre pérdidas económicas, enojos, tristezas, y un sin fin de sentimientos que ya hasta me preocupa que pueda ser diabético de los corajes que este país dónde es una realidad el dicho milenario que reza "el que no tranza no avanza"..
Bien lo repetían mis maestros de la secundaria que "nadie aprende en cabeza ajena", y si es muy cierto, lástima que en esos ayeres mi cabeza pensaba en cosas ajenas a las que debían ocuparse bajo esas aulas de paredes de ladrillo rojo, pero como no iba a pensar en otras cosas si estaba muy chula la < voice class="clavillazo" > "méeendiga"!< /voice>. Pero volviendo al tema del post, estaba con que "nadie aprende en cabeza ajena" y me refiero a que si antes hubiera investigado un poco más creo que no me hubieran estafado, al menos no me hubieran estafado en algunos casos de manera infantil y tan profesional en otros.
A lo que voy con esto es que gracias a "Reportero Ciudadano" dónde recogen las quejas, comentarios, experiencias, observaciones, alertas, advertencias de diferentes personas que muchas veces son vejados, estafados y demás, pocas veces tienen un medio para poder sacar sus frustraciones, entonces El Universal les ha acercado este espacio al menos para que externen su sentir que me ha parecido una excelente idea.
Lo interesante de este proyecto es que a lo largo de varios meses que lleva funcionando, se está convirtiendo en una gran base de datos de experiencias, un medio que desde mi punto de vista debería ser obligatorio consultar antes de hacer una operación riesgosa ó desconocida, ya que puede haber ahí alguna persona desafortunada que haya tenido una mala experiencia con algo que quizá tú estés por hacer y que su comentario te ayude a declinar hacia una estafa premeditadamente anunciada.
De manera accidental o quizá incidental ese sistema de "El Universal" -un sistema al cuál mis queridos maestros del "Tecnológico de Oaxaca" llamaban un "Sistema Expertos" - se está convirtiendo para esta Selva asfáltica dónde predomina la ley del que más tranza, una gran respuesta y posible salvación para el ciudadano.
Lo único que le está faltando a "El Universal" es un buen sistema de búsquedas que ayude rápidamente a encontrar palabras, frases, etc., de manera rápida, de tal forma que pueda convertirse en una referencia rápida ante una duda.
Por ejemplo leyendo esta noche sin luna y sin sueño las quejas de algunos usuarios en "Reporte Ciudadano", si alguien quisiera contratar un crédito con "POP BOX", antes podrían conocer las experiencias de otros usuarios que han tenido con esta empresa y de ahí decidir si hacer ó no una transacción. O por ejemplo si quisieran comprar un celular y antes de ir a la plaza del celular buscar información de "Plaza del celular" en "Reporte Ciudadano" para verificar si ya hay una mala experiencia de alguien en ese dichoso lugar. Y así usar "Reporte Ciudadano" como un medio para poder saber algo de.. antes de..
Por eso digo que "Reporte Ciudadano" con una buena herramienta de búsqueda se convertiría en una herramienta excelente como "Sistema Experto para Inexpertos", y con un poco mayor de promoción igual como la referencia obligada antes de hacer una transacción ó para otros asuntos, hasta podrían ganar más en publicidad los de El Universal si se pusieran las pilas .
Pero en fin.. a falta de esa herramienta de búsqueda interna de El Universal, Google se vuelve tú mejor aliado, pues "todo lo que no lo sabe, lo redirige", a lo que voy es que siguiendo el ejemplo anterior de "POP BOX" y "Plaza del celular", si alguien deseara saber más sobre "POP BOX" solo bastaría poner en el cajón de búsqueda de google: "POP BOX" site:http://interactivo.eluniversal.com.mx/contactanos/n_wcontactanos_vercomentariosEC.html
Al igual si buscará información de Plaza del Celular bastaría hacer lo siguiente: "Plaza del celular" site:http://interactivo.eluniversal.com.mx/contactanos/n_wcontactanos_vercomentariosEC.html
También podrían ayudarse de los "comandos" de Google para poder encontrar información más precisa, en el caso anterior por ejemplo al introducir en la busqueda una frase entre comillas, le estamos diciendo al navegador que busque la frase completa, si la ponemos sin comillas buscará que una página que contenga las palabras aunque no estén en el mismo orden ó juntas.
Si ponemos "site:" le estamos diciendo a google que busque dentro de un sitio y directorio específico.
Como este post va enfocado a los usuarios finales no a informáticos que saben más de "Google Hacking" postearé con calma después como usar los códigos de búsqueda de google para poder encontrar información más precisa dentro de "Reporte Ciudadano del Universal" y en internet en general.
Leyendo la página web de Red5 que es un proyecto Open Source que funciona como servidor de Aplicaciones Flash, hay un documento que habla de la diferencia de Free y Open Source.
Free en el idioma anglosajón puede tomar 2 acepciones, Free de Libre.. ó Free de Gratis, cómo en cerveza gratis.
El documento me gustó porque aclara la diferencia que hay entre Free y Open Source, ya que actualmente hay una diferencia interna entre algunos líderes del Software Libre como Richard Stallman y otros que apoyan al Open Source.
Básicamente el documento comenta lo siguiente:
"Free" Refiere a si un desarrollador de una pieza de software requiere ó no remuneración económica( Ej. dinero) por ello. Si el desarrollador(Individuo, Compañía, etc) no quieren dinero ó alguna otra forma de compensación financiera por su software,entonces ese software se dice que es "free" de Gratuito. No implica si el código fuente es abierto ó cerrado.
Cuándo nos referimos a una pieza de software(aplicación), usualmente nos referimos a los binarios. Estos son los programas de computadora que al final se entregan compilados. En computación moderna, los desarrolladores escriben sus programas(aplicaciones/software) en lenguajes de Alto-Nivel que son entonces compilados dentro de un código que la computadora pueda entender. El código inicial escrito por el programador es llamado "código fuente". Esto es la propiedad intelectual del desarrollador y el ó ella puede escoger si quiere liberar su código fuente separadamente de la aplicación/programa/software misma.
Si el desarrollador escoge liberar el código fuente de su aplicación, la aplicación se dice ser "Fuente Abierta" ó "Código Abierto" (Open Source). Indicando que el código fuente está disponible para descarga, escrutinio público, mejoramiento, etc. Una aplicación puede ser de Código Abierto (Open Source) y no ser "Free"( de Gratis). Los dos conceptos en el idioma anglosajón no están relacionados (Free y Open Source)
Pro lo tanto, una aplicación puede ser alguna de las siguientes cosas (ó combinacion de ellas):
Free de Gratis, Código Cerrado
Free de Libre ó Gratis, Código Abierto
Comercial, Código Cerrado
Comercial, Código Abierto.
No es inusual ver una aplicación siendo ofrecida bajo licencias duales (Incluso más que 2 licencias).
Espero no haber confundido más, pero la idea básicamente es comentar que una aplicación puede ser de código abierto pero no gratis.. muchos piensan que por ser de código abierto tiene que se gratuito hasta el soporte.. así como también que una aplicación sea gratis no significa que pueda entrar a modificar el código..
Comentarios Recientes