iMest es un software desarrollado bajo la plataforma LAMPG - Linux Apache MySQL PHP y Gnokii.
Este software permite usar Gnokii como interfaz para envío de sms y así poder enviar multiples mensajes SMS personalizados desde una página web a múltiples categorías de contactos.
Características del software.
Envío de mensajes SMS múltiples por tipo de contacto.
Envío de mensajes SMS a múltiples categorías de contacto.
Envío de mensaje SMS personal.
Captura de categorías de contactos.
Captura de contactos.
Asignación de contactos a múltiples categorías.
Programación de fecha de envío de mensajes SMS.
Uso de múltiples teléfonos móviles para envío de SMS.
Importación de contactos.
Captura, edición, listado, búsqueda y eliminación de contactos.
Captura, edición, listado, búsqueda y eliminación de categorías.
Captura, edición, listado, búsqueda y eliminación de mensajes.
Registro de mensajes enviados y no enviados.
Reenvío de mensajes.
Personalización de mensajes múltiples enviados en base a palabras clave.
Detección automática de teléfonos conectados por usb desde configuración del sistema.
#INSTALACION DE OAXROM WEB SMS EN UBUNTU LINUX #actualizamos el repositorio de Ubuntu sudoapt-get update #instalamos las dependencias del software sudoapt-getinstall--yes apache2 sudoapt-getinstall--yes php5 php5-cli php5-mysql php-pear libapache2-mod-php5 php5-curl php5-gd php-db #al instalar el servidor de Base de Datos pedirá una contraseña, introducir "ubuntu" sin comillas o alguna otro password para acceso al servidor que se usará más adelante sudoapt-getinstall--yes mysql-client-5.0 mysql-server-5.0 libmysqlclient15-dev sudoapt-getinstall--yes libgnokii3 libgnokii3-dev gnokii gnokii-common gnokii-cli gnokii-smsd gnokii-smsd-mysql sudoapt-getinstall--yesunzip #entramos al directorio web cd/var/www #obtenemos el software desde internet
Ir al sitio del proyecto en https://sourceforge.net/projects/binnizawebsms/ y obtener la última versión disponible de OaxRom WebSMS #descomprimimos el archivo sudounzip sms.zip #accedemos al directorio cd sms #creamos la base de datos para el WebSMS
mysql -u root -p #password: es el que se introdujo cuándo se instaló mysql en este caso:ubuntu #Asignar password
create database NOMBREBASEDEDATOS;
grant all privileges on NOMBREBASEDEDATOS.* to USUARIO@localhost identified by "SUPERSECRETO";
flush privileges; exit
mysql -u USUARIO -pSUPERSECRETO NOMBREBASEDEDATOS < imest.sql #configurar en el siguiente archivo los parámetros de nombre de base de datos, usuario y password sudo editor includes/config.php #creamos el archivo dónde recibiremos los archivos csv de contacto que importemos mkdir csv #copiamos el directorio cron que contiene un script para monitorear constantemente los envíos de SMS programados sudocp-rf cron csv #buscamos el usuario del servidor web apache ps aux | grep apache #esto podría regresarnos "www-data" en la primera línea sin las comillas, ese valor lo usaríamos a continuación #www-data 8284 0.0 0.4 28404 4388 ? S 14:46 0:00 /usr/sbin/apache2 -k start #asignamos el usuario y grupo del usuario del servidor web a la carpeta creada para que tenga permisos de escritura la aplicación WebSMS sudochown-R www-data:ww-data csv #ponemos al usuario web apache dentro del grupo de usuarios que tienen permiso de usar los puertos módem, esto para enviar sms por los usb de los teléfonos sudo editor /etc/group #buscamos dónde diga dialout y agregar ",www-data" sin las comillas, en este caso dice phylevn pero el valor cambia al usuario del sistema
dialout:x:20<img src="plugins/Emoticons/images/tongue.png"border="0"alt="tongue.png "width="16"height="16"/>hylevn #por
dialout:x:20<img src="plugins/Emoticons/images/tongue.png"border="0"alt="tongue.png "width="16"height="16"/>hylevn,www-data #guardamos, para el caso del editor nano presionando CTRL+O,ENTER para aceptar y luego presionamos CTRL+X para salir. #modificamos la configuración de PHP sudo editor /etc/php5/apache2/php.ini #buscamos los siguientes valores en el archivo y le ponemos los valores aquí mencionados, para buscar en el editor presionar Ctrl +W y teclear default_charset para ir a donde estuviera la linea buscada, igual para las siguientes opciones
default_charset = "utf8"
magic_quotes_gpc = off
upload_max_filesize = 32M
max_execution_time = 900
max_input_time = 900
memory_limit = 128M #ya que se editen estos valores, presionar CTRL+O y ENTER para guardar, luego CTRL+X para salir.
#reiniciamos el servidor web sudo/etc/init.d/apache2 restart
*************
Probando el software de envío de SMS
*************
Abrimos un navegador web a la dirección IP de la máquina dónde se instaló el software de envío de SMS
#por ejemplo si el servidor está sobre la misma máquina que se está usando:
http://localhost/sms/
#Si estuviera en alguna otra máquina
http://DIRECION_IP_DEL_SERVIDOR/sms
#Pedirá un login y password, por default es :
login:admin
password:admin
Para probar el envío de SMS:
Conectar un teléfono por USB, los Nokia funcionan bien.
Cuándo se conecta el teléfono en Linux lo detecta como un puerto TTYACM0
Esto se puede verificar tecleando el comando "dmesg" y podría darnos algo como lo siguiente
[28833.199893] cdc_acm 4-1:1.1: ttyACM0: USB ACM device
Para que el sistema detecte el puerto conectado ir a configuración y seleccionar detectar puerto, si lo lista entonces todo va bien, de lo contrario reintentar
Al momento de detectar el puerto por default crea un archivo de configuración en el directorio csv
Si detectó el puerto ahora se puede enviar el mensaje sms, para esto ir a
Mensajes SMS -> Solo un Mensaje
El introducir un número de celular,
un texto,
seleccionar el archivo de configuración por dónde se desea enviar el SMS, en este caso solo está el que se creó anteriormente,
introduzca las letras para validación y presione enviar.
El sistema enviaría en automático el mensaje SMS al número introducido, verificar que haya llegado correctamente
*************
INFORMACION ADICIONAL
*************
Si por alguna razón no envía los sms, puede ser que linux no le esté permitiendo al usuario apache usar gnokii, para esto editar el archivo<br> sudo editor /etc/sudoers<br>
y agregar
www-data ALL=NOPASSWD: gnokii
esto para que al usar sudo gnokii linux se salte el password y le deje ejecutar el software
*************
GNOKII
*************
#archivo de configuración de gnokii #El sistema permite leer diversos archivos de configuración de Gnokii de tal forma que es posible usar diversos móviles para enviar SMS desde la aplicación web. #Cada teléfono es detectado como un puerto serial por Linux, por ejemplo si se detecta el siguiente puerto /dev/ttyACMO el archivo configurado csv/gnokiiNokia3500 contendría lo siguiente: [global]
port = /dev/ttyACM0
model = AT
connection = serial debug=on #Y asi sucesivamente se pueden configurar diversos teléfonos, el sistema en base al archivo de configuración detectará las configuraciones y las usará para enviar SMS.
*************
Programación para fecha de envío de mensajes.
*************
csv/cron.sh #Archivo que se pondrá en cron para que cada hora se ejecute y verifique si ya se ejecutó cron.php, si no se ha ejecutado lo ejecuta. #Aquí hay que editar el directorio dónde se instaló cron.php
csv/cron.php #Archivo que consulta la base de datos y verifica que mensajes tienen fecha anterior a la actual y que no han sido enviados para poder empezar a enviarlos usando gnokii #En este archivo hay que configurar la ruta del archivo init.php y sms.php #Es importante que el directorio de cron se encuentren fuera del directorio web. #Para que el sistema verifique los mensajes a enviar periodicamente editar el siguiente archivo : sudo editor /etc/crontab #Y agregar al final la siguiente línea
0 **** root php -q/var/www/sms/csv/cron.php #presionar CTRL+O luego ENTER para guardar #reiniciamos el servicio de programador de tareas sudo/etc/init.d/cron restart #con esto el sistema monitoreará cada hora los mensajes SMS por enviar
*************
Configuración de APACHE para enviar SMS desde página web.
*************
find/etc/apache2/-type f| xargsgrep"User " #Posiblemente nos regrese www-data. #Este usuario hay que ponerlo dentro del grupo de dialout $sudo editor /etc/group #agregar al grupo dialout el usuario www-data.
dialout:x:20:gsmsms,www-data #reiniciar apache sudo/etc/init.d/apache restart
*************
Modificando la configuracion
*************
sudo editor includes/config.php
$sqlDb="imest"; $sqlUser="imest"; $sqlPassword="imest"; $sqlServer="localhost"; $appID="jUi109-HJikL"; $appKey="7Uy-L09P;=lIkH";#permite usar el sistema para enviar SMS desde otras aplicaciones con C# mediante metodos POST como por ejemplo la librería webstream ó curl. define('CSV_PATH','/var/www/sms/csv/'); #Directorio dónde se almacenarán los registros CSV importados para importar contactos. $dir_fuentes="/var/www/sms/includes/fonts/"; # si se instaló en otra parte el servidor reeeditar la ruta correspondiente en esta parte define('CONFIG_PATH','/var/www/sms/csv/'); #Directorio dónde se encuentran los archivos de configuración de los dispositivos de gnokii. define('CONFIG_FILE','gnokii'); #archivos de configuración de gnokii que contengan en el nombre de archivo la cadena configurada. por ejemplo /csv/gnokiiNokia3500, /etc/gnokii6130, etc.
Hace algunos días un cliente me solicitó poder visualizar en el reporte de llamadas que viene con FreePBX información adicional. De inicio el reporte muestra los siguientes datos:
Por ejemplo si queremos agregar al final información del PIN que usa el usuario para hacer llamadas entonces pondríamos despues de $FG_TABLE_COL[]=array ("Duration", "duration", "6%", "center", "SORT", "30", "", "", "", "", "", "$minute_function"); lo siguiente
Dónde AccountCode será el titúlo de la columna, el campo relacionado a la tabla CDR, 8% el tamaño de la columna, "center" alineación del texto, Enseguida iría SORT si este campo se pudiera usar para odernar la tabla, "10" número de carácteres a mostrar del campo.
Adicionalmente al ejemplo anterior hay que agregar el campo accountcode a la variable de los campos de la consulta
Hace algunos 6 años trabajé para una compañía que distribuye equipo de Symbol Motorola, recuerdo que en ese tiempo la gente de ventas hacia las cotizaciones a mano a veces en una hoja de excel otras en word, por lo que se me ocurrió desarrollarles un sistema de cotizaciones de tal forma que los clientes podían entrar al sitio web, validarse y desde ahí elegir los productos que requerían cotizar.
En ese tiempo me surgió el detalle de saber de como generar PDFs al vuelo de las cotizaciones generadas por los clientes, ya que los clientes al seleccionar sus productos y presionar el botón de cotizar, el sistema lo que hacía era enviarles una liga a su correo desde dónde podían bajar el PDF directamente.
Para esto eché mano de htmldoc el cuál es un software que permite generar PDF de archivos HTML, al igual convertir PS a PDF y viceversa.
Lo que hice básicamente fué pasarle la url a htmldoc del script php con los parámetros para generar la cotización, de tal forma que htmldoc leía el archivo html generado por PHP y lo convertía a PDF, y solo modificaba los encabezados para que el usuario obtuviera un archivo a guardar.
Lo primero fué poner en un script php el encabezado que debería mandar, que indicara que es un archivo PDF y que lo mandaría como cotización-seguido del número de cotización correspondiente, y que lo enviara como archivo adjunto para que el navegador pidiera que se guardara en un archivo o se mostrará, tal como cuándo le picas a un archivo para descargar.
Abajo del script mandaba una llamada al sistema que solicitaba ejecutar htmldoc con los parámetros adecuados, tal como se muestra en el siguiente código:
--headfootsize 8: tamaño del encabezado y pie de página
--footer '/D' : indica que pondrá la fecha en el pié de página
--jpeg '90' : comprensión de las imágenes
--links : activación de links
--logoimage '".DIR_IMAGES."pdf.png': colocará el logo en la parte superior de la página
--linkcolor '#0000FF' : color de las ligas
--size 'a4' : tamaño del documento
--fontsize 10: tamaño de letra del documento
--charset 8859-15 : conjunto de caracteres a usar
--webpage liga del documento html a convertir a formato PDF
Con esto lo que hacía es que primero el script php generaba la cotización en base a lo requerido por el cliente, htmldoc convertía el documento a pdf y el encabezado que se mandaba al navegador indicaba que ese archivo generado se descargara o se mostrara en el navegador.
En OaxRom Mobile Computing hemos modificado un sistema de tarificación telefónico el cuál está basado en AsterBilling. La modifiación la hemos realizado ya que AsterBilling requiere licencias en la parte de monitoreo de llamadas, pero la parte de la interfaz web del tarificador es OpenSource y es la parte del software que utilizamos para que muestre los datos en base al CDR de Asterisk directamente. Entre otras ventajas que hemos añadido al nuevo software de tarificador para Asterisk PBX que hemos desarrollado y que pronto liberaremos el código es que permite enviar el costo de la llamada en tiempo real a la pantalla de teléfonos SIP que soporten SIP MESSAGE.
Continuemos con el tema del post. En este caso hemos usado FreePBX como entorno de configuración de Asterisk, pero como FreePBX trae su propia base de datos y tabla para el manejor de CDR, en este caso fué necesario modificar esta configuración para poder apuntar a la base de datos del software del tarificador que concentra al sistema de tarificación telefónica junto con el CDR de Asterisk y de FreePBX.
Primero para modificar la configuración del CDR de Asterisk es necesario seguir los siguientes pasos descritos en un post anterior aquí:
Ya que se hayan hechos los cambios en Asterisk quedaría hacer los cambios sobre FreePBX tal como se indica a continuación.
Editar el archivo amportal.conf sudo editor /etc/amportal.conf
Agregar las siguientes líneas CDRDBHOST=localhost CDRDBPORT=3306 CDRDBUSER=USERTARIFICADOR CDRDBPASS=PASSWORDTARIFICADOR CDRDBNAME=DBNAMETARIFICAODR CDRDBTYPE=mysql CDRDBTABLENAME=cdr
Con esto solo basta aplicar los cambios en freepbx /usr/src/freepbx*/apply_conf.sh
Y por último reiniciar asterisk sudo amportal restart
Ahora solo hay que ver la base de datos y verificar que el contenido se muestre en los reportes de FreePBX.
Aquí vemos el contenido del CDR de FreePBX & Asterisk
Y en el tarificador podemos ver las llamadas tarificadas para la cabina 103 que es desde dónde se originaron las llamadas, para esto desde el sistema de tarificación habilitamos que tarifique llamadas con longitud de destino de 3 digitos y el costo de cargo de conexión es por 2 pesos por los primeros 60 segundos y 1 peso adicional por 60 segundos adicionales.
Hace un par de años le regalé en su cumpleaños a mi hermanita un telescopio Lobo, en ese tiempo ella estaba muy chica y poco interes le mostró, pero hace unos días me pidió que sacara el telescopio de dónde estaba guardado, para luego empezar a armarlo. Debo confesar que de astronomía solo conozco la luna y el sol, por lo que en la noche que estabamos intentando comenzar a observar las estrellas me preguntó por cada una de ellas, pero prácticamente quedé mal ya que no podía ubicar ni siquiera a marte o jupiter.
Por lo que me di a la tarea de buscar un software que me permitiera tener esa información, primero encontré un software llamado "Starry Night" pero el detalle fué que es propietario y había que pagar una licencia.
El siguiente software que hallé en sourceforge.net fué gSky, un software que te muestra la ubicación en coordenadas de los astros, planetas y satélites que estuvieran en cierta posición del azimuth, el detalle es que no te los mostraba gráficamente.
Siguiendo buscando encontré Cartes du Ciel el cuál al igual que el anterior te mostraba la posición de los planetas, estrellas y demás en un mapa estelar, el detalle es que a pesar de que es gráfico no lo podías ubicar bien en el horizonte.
Al final encontré un software llamado Stellarium el cuál te permite ubicar los planetas, estrellas, satélites, galaxias, nebulosas, etc., desde una posición geográfica del planeta, en este caso solo tuve que dar las coordenadas desde dónde estábamos observando para que en seguida Stellarium comenzara a mostrar las posiciones de cada una de las estrellas que teníamos en el horizonte y asi poder tener más conocimiento de ellas.
Realmente recomiendo este software para los que se estén adentrando en el mundo de la astronomía, la cuál es bastante interesante y muy cautiva.
Puede obtenerse el software de stellarium de la siguiente página
Hace unos días un cliente me adquirió un sistema de WebSMS Marketing, este sistema permite enviar múltiples SMS personalizados desde una página web lo cuál facilita enviar cientos de mensajes en un solo click a múltiples destinatarios generando mensajes con Nombre, Apellido, Título. Este sistema de mercadotecnia y publicidad usa los puertos seriales de teléfonos móviles que se conectan por USB, pero esto solo funciona en Linux, por lo que para instalar el sistema es requerido tener previamente Linux instalado.
En este caso mi cliente no tiene conocimiento de linux, por lo que me vi a la tarea de facilitarle las cosas, para esto primero intenté crear una imagen mediante VirtualBox, pero igual el proceso de instalación y configuración no es tan rápido y amigable para un usuario neófito. Por lo que al final decidí crear un LiveCD basado en una instalación de Ubuntu con lo que ya estaba todo preinstalado y solo reiniciaba con el disco para tener toda la plataforma de mercadotecnia por SMS preinstalada sin tener que modificar nada en su computadora.
Para esto usé una instalación nueva de Kubuntu dónde hice todo el proceso de configuración de los paquetes necesarios, modificación de archivos de configuración, permisos, crontab, etc., y ya que el sistema estaba a punto solo descargue remastersys para poder crear un ISO de la instalación creada.
Para poder instalar remastersys es necesario agregar el repositorio a /etc/apt/sources.list
Ya que esté instalado remastersys, solo basta ejecutar
sudo remastersys dist
Con lo que comenzará a crear un ISO de nuestra instalación de Kubuntu, esto es muy práctico para hacer respaldos de todo nuestro sistema.
Como nota adicional remastersys no guarda en el ISO personalizado los directorios debajo de home, unicamente el de /home/remastersys, por lo que si se deseara tener una configuración de escritorio personalizada habría que copiar tus archivos ~/.* a /home/remastersys/
Si estuvieras corriendo VirtualBox y de tú instalación virtual desearas generar tú iso y ya no tienes mucho espacio en tu disco duro virtual podrías hacer algo como esto:
Remastersys es una forma rápida y fácil de crear un LiveCD personalizado con tu instalación de Linux. Hay muchas otras formas de hacerlo como Debian from Scratch la cuál es muy recomendable aunque un poco más complicada de generar.
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/
Por default Asterisk guarda los registros de llamadas en un archivo llamado Master.csv el cuál es un archivo de texto separado por comas, pero para otros fines a veces es necesario tenerlo en una base de datos para su posterior consulta, por ello pongo aquí un tutorial de como conectar Asterisk a MySQL para guardar los CDRs.
Sobre entendiendo que ya se tiene instalado Asterisk, MySQL y todas las librerías requeridas continuamos.
Por cuestión de licencias de MySQL, Asterisk ya no incluye la opción de guardar los registros en una base de datos de MySQL, por lo que ahora esa opción viene en Asterisk-addons el cuál se tiene que bajar para la versión de Asterisk a usar y compilarla.
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-addons-1.4.9.tar.gz sudotar-xzvf asterisk-addons-1.4.9.tar.gz cd asterisk-addons-1.4.9 #Ya que se descargue y se descomprima la versión de Asterisk Addons se tendrán que editar los siguientes archivos sudo editor cdr/cdr_addon_mysql.c #agregar al principio la siguiente línea tal como está #define MYSQL_LOGUNIQUEID sudo editor cdr/Makefile #agregar al final la siguiente línea tal como está
CFLAGS+=-DMYSQL_LOGUNIQUEID #ahora si compilamos asterisk-addons sudomake clean &&sudo ./configure &&sudomake&&sudomakeinstall #si es una instalación nueva tendrías que ejecutar despues sudo make samples, si no no es recomendable para que no borre configuraciones ya realizadas. #si todo salió bien en la compilación ahora edita el archivo sudo editor /etc/asterisk/modules.conf # y agrega al final
load => cdr_addon_mysql.so
#ahora crea un usuario con su password y una base de datos de mysql que será para el cdr de asterisk
mysql -u root -p
create database asteriskcdrdb;
grant all privileges on asterisk.* to asterisk@localhost identified by "password";
flush privileges; exit; sudo editor asterisk.sql # crea un archivo y agrega lo siguiente
CREATE TABLE `cdr`( `calldate` datetime NOT NULL default '0000-00-00 00:00:00', `clid` varchar(80) NOT NULL default , `src` varchar(80) NOT NULL default , `dst` varchar(80) NOT NULL default , `dcontext` varchar(80) NOT NULL default , `channel` varchar(80) NOT NULL default , `dstchannel` varchar(80) NOT NULL default , `lastapp` varchar(80) NOT NULL default , `lastdata` varchar(80) NOT NULL default , `duration` int(11) NOT NULL default '0', `billsec` int(11) NOT NULL default '0', `disposition` varchar(45) NOT NULL default , `amaflags` int(11) NOT NULL default '0', `accountcode` varchar(20) NOT NULL default , `uniqueid` varchar(32) NOT NULL default , `userfield` varchar(255) NOT NULL default );
ALTER TABLE `cdr` ADD INDEX (`calldate`);
ALTER TABLE `cdr` ADD INDEX (`dst`);
ALTER TABLE `cdr` ADD INDEX (`accountcode`);
#ahora ejecutemos el script de sql
mysql -u asterisk -p asteriskcdrdb < asterisk.sql #ahora solo falta editar la conexión de asterisk a mysql, para eso editar el siguiente archivo sudo editor /etc/asterisk/cdr_mysql.conf #aqui editar los siguientes valores [global] hostname = localhost dbname=asteriskcdrdb table=cdr
password = password
user = asterisk port=3306 sock=/var/run/mysqld/mysqld.sock userfield=1 #es importante que en sock= asignes dónde mysql coloca ese arhivo en Debian y ubuntu por default lo pone en /var/run/mysqld/mysqld.sock #Ahora ya teniendo casi todo listo solo inicia asterisk sudo asterisk start #si usas freepbx entonces sudo amportal restart #verificamos que se haya cargado el módulo de mysql para asterisk sudo asterisk -rvvv
PhylevnMobile*CLI> module show like mysql #y debería mostrar algo como lo siguiente
Module Description Use Count
cdr_addon_mysql.so MySQL CDR Backend 0
app_addon_sql_mysql.so Simple Mysql Interface 0
res_config_mysql.so MySQL RealTime Configuration Driver 0 3 modules loadedI> #ahora vemos el status de la conexión de MySQL
PhylevnMobile*CLI> cdr mysql status #y mostraría algo como lo siguiente
Connected to asteriskcdrdb@localhost, port 3306 using table cdr for1 hours, 1 minutes, 0 seconds.
Wrote 1 records since last restart. -- Registered IAX2 '300'(AUTHENTICATED) at 127.0.0.1:32768 #Si dice Not Connected entonces verificar los parámetros de conexión a la base de datos e igual checar que la base de datos esté dada de alta. #salimos
PhylevnMobile*CLI>exit #ahora marcamos algún número desde un Softphone o teléfono IP para verificar que esté trabajando. #Checamos el registro de la base de datos
mysql .u asterisk -p asteriskcdrdb
mysql>select* from cdr;
+---------------------+-------------+-----+--------+-----------+------------------+
| calldate | clid | src | dst | dcontext | channel
+---------------------+-------------+-----+--------+-----------+------------------+
| 2009-07-2121:36:44 | "1103"<Support> | 1103 | vmu101
+---------------------+-------------+-----+--------+-----------+------------------+ 1 row inset(0.00 sec)
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(); ?>
//*****
Comentarios Recientes