Bueno vamos a crear un pequeño ejemplo de como generar diariamente un reporte en archivo plano CSV y enviarlo por correo electrónico
Lo que haremos es lo siguiente
Generamos un archivo CSV consultando únicamente las llamadas realizadas en ese día , lo enviaremos a un correo electrónico y programaremos por medio de cron que todos los días se genere y se envié ese reporte .
Primero crearemos una carpeta nueva en /var/www/html/
tome esta carpeta para poder ver que fucnione si desean solo cambian la ruta detrás de la carpeta html para evitar que cualquier pueda entrar
1.) Crear la carpeta desde consola hacemos esto :
cd /var/www/html
mkdir reportesJK
2.) Vamos a crear dos archivos un PHP que generara todo el proceso y otro que se comunicara con la base de datos .
Creamos un archivo llamado conexion.php de la siguiente manera
Desde la consola digitamos
vim conexion.php
El sistema nos abrirá una ventana digitamos la tecla "insert" de nuestro PC y copiamos tal cual este texto
SI NO SABES MUCHO DE VIM PUEDES USAR NANO lo que importa es crear el archivo tal cual .
<?php // generar
$conexion = mysql_connect("localhost","root","tuclave");
mysql_select_db("asteriskcdrdb",$conexion);
mysql_query("SET NAMES 'utf8'");
?>
En el campo donde dice tuclave poner la clave MySql para poder entrar a la tabla
Ahora saldremos dando en al tecla "esc" luego escribimos : y terminamos con wq , si no sabes usar bien VIM por favor verifica el proceso .
Ahora ya en al consola crearemos el archivo que hara todo que se llamara Reportes.php
vim Reportes.php
Pegamos todo este contenido
<?php
// Creado por Fernando Londoño JK Sistemas y Telecomunicaciones Colombia
$Hoy = date('Y-m-d'); // Aquí se crear una variante del dia a analizar.
$JK = "0"; // contador
$NameCSV = "/var/www/html/reportesJK/Llamadas-".$Hoy.".csv"; // Nombre archivo generado
// Aqui ponemso el encabezado del archivo generado
$TituloCSV = "Fecha,CLI,Destino,Contexto,Canal,Canal de destino,Estado,LastDate,Duracion,Tiempo Contestacion,Amaflags,Account Code,Uniqueid,Userfield,Archivo grabacion,Cnum,Cnam,outbound_Cnum,outbound_Cnam,dst_cnam,did";
$fp = fopen($NameCSV, 'c') or die("Error al generar CSV 0");
fwrite($fp, $TituloCSV);
fclose($fp);
include "conexion.php"; // el archivo que nos conectara con la base de datos
$sentencia="SELECT * FROM cdr"; // seleccionamos todas los registros TAL VEZ puede modificar para evitar los duplicados o algo
$resultado=mysql_query($sentencia);
while($filas=mysql_fetch_assoc($resultado))
{
$diaHoy = substr($filas['calldate'], 0, 10);
if($diaHoy == $Hoy)
{
$DatosLlamada = $filas['calldate'].",".$filas['clid']."," .$filas['src']. "," .$filas['dst']."," .$filas['dcontext']."," .$filas['channel']."," .$filas['dstchannel'].",".$filas['lastapp'].",".$filas['lastdata'].",".$filas['duration'].",".$filas['billsec'].",".$filas['disposition'].",".$filas['amaflags'].",".$filas['accountcode'].",".$filas['uniqueid'].",".$filas['userfield'].",".$filas['recordingfile'].",".$filas['cnum'].",".$filas['cnam'].",".$filas['outbound_cnum'].",".$filas['outbound_cnam'].",".$filas['dst_cnam'].",".$filas['did'];
$fp = fopen($NameCSV, 'a+') or die("Error al generar archivo ! ");
fwrite($fp, PHP_EOL.$DatosLlamada);
fclose($fp);
$JK++;
}
}
mysql_close();
// envio por EMAIL :
//Recipiente
$to = 'tu_correo@ejemplo.com';
//remitente del correo
$from = 'tu_correo@ejemplo.com';
$fromName = 'TU NOMBRE';
//Asunto del email
$subject = 'Envio reportes de llamadas ';
//Ruta del archivo adjunto
$file = "/var/www/html/reportesJK/Llamadas-".$Hoy.".csv";
//Contenido del Email
$htmlContent = '<h1>Correo electrónico PHP con datos adjuntos Envio reportes de llamadas hecho @ferchoorias</h1>
<p>Este correo electrónico ha enviado desde script PHP con datos adjuntos hecho por JK SISTEMAS, en el muestra el reporte de '.$JK.' Llamadas hechas en el reporte adjunto</p>';
//Encabezado para información del remitente
$headers = "De: $fromName"." <".$from.">";
//Limite Email
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
//Encabezados para archivo adjunto
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
//límite multiparte
$message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $htmlContent . "\n\n";
//preparación de archivo
if(!empty($file) > 0){
if(is_file($file)){
$message .= "--{$mime_boundary}\n";
$fp = @fopen($file,"rb");
$data = @fread($fp,filesize($file));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name=\"".basename($file)."\"\n" .
"Content-Description: ".basename($files[$i])."\n" .
"Content-Disposition: attachment;\n" . " filename=\"".basename($file)."\"; size=".filesize($file).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
}
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $from;
//Enviar EMail
$mail = @mail($to, $subject, $message, $headers, $returnpath);
//Estado de envío de correo electrónico
echo $mail?"<h1>Correo enviado.</h1>":"<h1>El envío de correo falló.</h1>";
?>
ya después hacemos lo mismos ESC tecla : y terminamos wq .
Ahora daremos permisos y propietarios de estos archivos
Desde la consola digitamos esto
chmod 777 /var/www/html/reportesJK
chmod 777 /var/www/html/reportesJK/*
chown asterisk.asterisk /var/www/html/reportesJK/*
chown asterisk.asterisk /var/www/html/reportesJK/
Ahora lo que haremos es generar en crontab una tarea que se desarrolle todos los dias a las 11:30 de la noche es decir 21: 30 horas (ES IMPORTANTE toca el mismo día que se quieren los registros de la llamada para poder funcionar) .
Escribimos desde consola
crontab -e
agregamos en cront la tarea
30 21 * * * /var/www/html/reportesJK/Reportes.php
y listo :
Ahora para probar podemos ingresar de esta manera
https://IP_servidor/reportesJK/Reportes.php
Ahí debería salir al final que se envió correctamente tu correo , también puedes ver los reportes generados en
https://IP_servidor/reportesJK/
Debería salirte una lista de los reportes generados
Explicación del código
quiero decir que no soy un programador experto pero lo intento , lo que hacemos es lo siguiente :
Creo que no hace falta explicar el archivo conexión explicaremos el otro archivo
Reportes.php
en la primera parte creamos la variable $Hoy que nos va a generar la fecha de hoy , $JK es un contador y $NameCSV es el nombre de nuestro archivo que cambia con la varialbe $Hoy .
$TituloCSV es el encabezado de nuestro archivo CSV, ASTERISK GENERA 23 DATOS POR LLAMADA ahí están todos, si desea no poner tantos esta es una de las partes de donde los debe quitar . puede cambiar le nombre si lo desea respetando la coma que los separa.
ya con $fp generamos le archivo como tal
$Hoy = date('Y-m-d'); // Aquí se crear una variante del dia a analizar.
$JK = "0"; // contador
$NameCSV = "/var/www/html/reportesJK/Llamadas-".$Hoy.".csv"; // Nombre archivo generado
// Aqui ponemso el encabezado del archivo generado
$TituloCSV = "Fecha,CLI,Destino,Contexto,Canal,Canal de destino,Estado,LastDate,Duracion,Tiempo Contestacion,Amaflags,Account Code,Uniqueid,Userfield,Archivo grabacion,Cnum,Cnam,outbound_Cnum,outbound_Cnam,dst_cnam,did";
$fp = fopen($NameCSV, 'c') or die("Error al generar CSV 0");
fwrite($fp, $TituloCSV);
fclose($fp)
Ahora explicare como se selecciona la información de la base de datos
include "conexion.php"; // el archivo que nos conectara con la base de datos
$sentencia="SELECT * FROM cdr"; //
$resultado=mysql_query($sentencia);
while($filas=mysql_fetch_assoc($resultado))
{
$diaHoy = substr($filas['calldate'], 0, 10);
if($diaHoy == $Hoy)
{
$DatosLlamada = $filas['calldate'].",".$filas['clid']."," .$filas['src']. "," .$filas['dst']."," .$filas['dcontext']."," .$filas['channel']."," .$filas['dstchannel'].",".$filas['lastapp'].",".$filas['lastdata'].",".$filas['duration'].",".$filas['billsec'].",".$filas['disposition'].",".$filas['amaflags'].",".$filas['accountcode'].",".$filas['uniqueid'].",".$filas['userfield'].",".$filas['recordingfile'].",".$filas['cnum'].",".$filas['cnam'].",".$filas['outbound_cnum'].",".$filas['outbound_cnam'].",".$filas['dst_cnam'].",".$filas['did'];
$fp = fopen($NameCSV, 'a+') or die("Error al generar archivo ! ");
fwrite($fp, PHP_EOL.$DatosLlamada);
fclose($fp);
$JK++;
}
}
mysql_close();
En lo anterior lo que hacemos es seleccionar todos los registros de CDR la tabla que tiene las llamadas
$sentencia="SELECT * FROM cdr"
usted puede poner un where y simplificar el proceso ...
después manipulamos el dato $filas['calldate'] ,este tiene la fecha de la llamada , pero lo tiene con hora minutos y segundos , lo que hacemos es quitar esos datos y dejar solo la fecha es decir de esta forma como esta
2021-07-08 11:15:41 esto es lo que posee $filas['calldate']
Cuando hacemos esto
$diaHoy = substr($filas['calldate'], 0, 10);
guardamos en la variable $diaHoy solo 2021-07-08 (año -mes -dia)
y con un IF podemos solo tomar los datos de ese dia
if($diaHoy == $Hoy)
{
$DatosLlamada = $filas['calldate'].",".$filas['clid']."," .$filas['src']. "," .$filas['dst']."," .$filas['dcontext']."," .$filas['channel']."," .$filas['dstchannel'].",".$filas['lastapp'].",".$filas['lastdata'].",".$filas['duration'].",".$filas['billsec'].",".$filas['disposition'].",".$filas['amaflags'].",".$filas['accountcode'].",".$filas['uniqueid'].",".$filas['userfield'].",".$filas['recordingfile'].",".$filas['cnum'].",".$filas['cnam'].",".$filas['outbound_cnum'].",".$filas['outbound_cnam'].",".$filas['dst_cnam'].",".$filas['did'];
$fp = fopen($NameCSV, 'a+') or die("Error al generar archivo ! ");
fwrite($fp, PHP_EOL.$DatosLlamada);
fclose($fp);
$JK++;
}
}
bueno ya con IF sacamos el dato y escribimos todos los 23 datos si no queremos guardar todos solo debemos quitar los que no necesitamos y que cacen con el encabezado .. ya después solo generamos el correo y en crontab ...
ESPERO LES SIRVA DE ALGO !