PABX criado para pesquisas
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

521 lines
18 KiB

#!/usr/bin/php -q
<?php
/*
* Workflow
* Solicitante: Amarildo Carlos da Silva
* Autor: Amarildo Pereira
* Data: 12/02/2013
* Objetivo: Enviar resumo diário da operação dos callcenters existentes para uma lista de emails
* Obs: Para incluir a logo do paraceiro basta substituir o arquivo logoParciro.png por um arquivos
* do mesmo nome contendo a logo citada. Lembrando que é necessário ajustar o tamanho, que preferencialmente
* deve ter as dimenções proporcionais ao da logo da simples que é 192 x 48 px.
*/
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set("memory_limit", "512M");
/*
* Constantes
*/
/*
* Indica que o serviço de envio está temporariamente inativo
*/
define('SERVICO_INDISPONIVEL', 99);
/*
* Indica que o email esta destivado para receber o workflow
*/
define('EMAIL_INATIVO', 98);
/*
* Indica que o email não pode ser enviado
*/
define('ERRO_ENVIO_EMAIL', 97);
/*
* Indica que o envio é diário
*/
define('ENVIO_DIARIO', 1);
/*
* Indica que o envio é mensal
*/
define('ENVIO_MENSAl', 2);
/*
* Inclusao de modulos externos
*/
require 'util/util.php';
require("phpmailer/class.phpmailer.php");
require("jpgraph/jpgraph.php");
require("jpgraph/jpgraph_bar.php");
require("workflow.php");
require("funcoes/shared.php");
//require("config.php");
$versao = '1.0';
/*
* Arquivo de log
*/
$pathLog = "/var/log/asterisk/workflow.log";
/*
* Imagens anexadas ao html da mensagem
*/
$embedImg = array();
/*
* Relatorios gravados em disco
*/
$relHtml = array();
/*
* Se não for definido uma conexão para o banco de dados aqui, o sistema irá
* usar a configuração padrão baseada nas informações contidas no arquivo
* /var/lib/asterisk/scripts/callcenter/bd e retornadas pela função GetDefStrDb()
* contida no arquivo funcoes/shared.php localizado no diretorio include.
*/
$conStr = false;
//$conStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '10.254.254.208', '5432', 'pbx', 'contacte', 'ctepgSQL');
/*
* Se a configuração não foi definida manualmente retorna a configuração padrão.
*/
if ($conStr === false) {
$conStr = GetDefStrDb();
}
/*
* Inicia a conexão com banco de dados.
*/
$conn = pg_connect($conStr);
if (!$conn) {
$msg = "Não foi possivel conectar ao banco de dados!\n$conStr";
PreparaLog("ConexaoBancoDados", $msg, true);
exit;
}
/*
* Inicialização de variáveis globais.
*/
$dataAtual = substr(FormataDBDataHora(GetData($conn)), 0, 10);
$debug = 0;
/*
* Data para envio, sempre o dia anterior
*/
$dataEnvio = GetData($conn, -1);
$mesEnvio = GetMesEnvio($conn);
//if($debug)$dataEnvio = '2014-01-25';
/*
* Carrega parametros para o array:
* $wkfParam[ wkf_status_servico, wkf_hora_envio, wkf_minuto_envio, wkf_smtp,
* wkf_smtp_user, wkf_smtp_senha, wkf_smtp_port, wkf_smtp_requer_aut]
*/
$wkfParam = GetParamWkf($conn);
$statusServico = $wkfParam['wkf_status_servico'];
$horaEnvio = sprintf('%s:%s', (int) $wkfParam['wkf_hora_envio'], (int) $wkfParam['wkf_minuto_envio']);
if ($statusServico) {
$tpEnvio = 0;
/*
* Esta função retorna 1 para envio diário e 2 para envio mensal. A verificação é feita com base
* na tabela pbx_workflow_reg_envio_mensal ex.: O campo wkf_data_envio = '112013' significa que
* o envio referente ao mes 11/2013 já foi efetuado então retorna 1. O Sistema se baseia na data
* corrente e sempre envia informações do dia anterior assim com envia um resumo da operação do
* mes anterior sempre que ha uma mudança de mês, ou seja se o script rodar no dia 01/12/2013 irá
* verificar que o registro referente a '122013' ainda não esta presente em wkf_data_envio e a fun-
* ção retornara 2 indicando que devemos enviar o resumo mensal, entretando o sistema não esta pre-
* so a fazer esta verificação no dia 01 sendo que se o script por algum motivo não rodar neste dia
* o envio seguira normalmente no dia subsequente.
*/
$tipoEnvio = GetTipoEnvio($conn, $mesEnvio);
while (++$tpEnvio <= $tipoEnvio) {
/*
* Configura a data de envio baseada no seu tipo
* ex.:
* ENVIO_DIARIO = '2013-01-16';
* ENVIO_MENSAl = '"112013
*/
$_dataEnvio_ = $tpEnvio == ENVIO_DIARIO ? $dataEnvio : $mesEnvio;
/*
* Verifica se esta na hora de enviar conforme definido na parametrização
*/
$horaAtual = sprintf('%s:%s', (int) date('H'), (int) date('i'));
if ($debug == 9)
$horaEnvio = $horaAtual;
/*
* O sistema tenta enviar apenas na hora cadastrada, se houver falha esta será registrada no log
* mas as informações não serão enviadas
*/
//$_envia = (($tpEnvio == ENVIO_DIARIO) && ($horaEnvio == $horaAtual) && !VerificaEnvio($conn, $dataEnvio)) || (($tpEnvio == ENVIO_MENSAl) && ($horaEnvio == $horaAtual));
$_envia = ($horaEnvio == $horaAtual);
if ($_envia && !VerificaEnvio($conn, $dataEnvio, $tpEnvio)) {
/*
* Carrega lista de email com base no tipo de envio, pois alguns clientes estão configurados para
* receber apenas um tipo de informação enquanto outros recebem ambas (diária e mensal).
*/
$listaEmails = CarregaEmails($conn, $tpEnvio);
foreach ($listaEmails as $email) {
/*
* Indica que o email esta habilitado para receber informações.
*/
if ($email['wkf_status']) {
if (!VerificaEnvioEmail($conn, $email['wkf_email'], $_dataEnvio_, $tpEnvio)) {
EnviaEmail($conn, $email, $wkfParam, $dataAtual, $_dataEnvio_, $tpEnvio);
}
} else {
$msg = sprintf("Email: %s Esta Desativado! Data Envio: %s", $email['wkf_email'], $_dataEnvio_);
PreparaLog("PreparaEnvio", $msg, true);
}
}
RegistraEnvio($conn, $_dataEnvio_, $tpEnvio);
ApagaArquivosWkf($relHtml, $embedImg);
} else if ($debug) {
PreparaLog("VerificaEnvio", "Verificação de Envio " . (($tpEnvio == ENVIO_DIARIO) ? "Diário" : "Mensal"), false);
}
}
} else {
$msg = "O serviço de envio esta desativado! Data Envio: $dataEnvio";
PreparaLog("PreparaEnvio", $msg, true);
;
}
function ApagaArquivosWkf(&$relHtml, &$embedImg) {
if (count($relHtml))
foreach ($relHtml as $arq)
@unlink($arq);
if (count($embedImg))
foreach ($embedImg as $arq)
@unlink($arq);
$embedImg = array();
$relHtml = array();
}
function GetDebug() {
return $GLOBALS["debug"];
}
function GetData($db, $soma = 0) {
/*
* Função utiliza os recursos do banco de dados para fazer
* adição de datas, ex.: $soma = 1 a data atual será acrescida
* em 1 dia, $soma = -1 a data atual será decrescida em 1 dia.
*/
$query = "select now()::date + ($soma)";
$result = @pg_query($db, $query);
$dados = @pg_fetch_row($result);
return $dados[0];
}
function GetMesEnvio($db) {
/*
* Índice para envio de email mensal é mês+ano -> 052013
*/
$data = explode("-", GetData($db));
$mes = $data[1] == 1 ? 12 : $data[1] - 1;
$ano = $data[1] == 1 ? ($data[0] - 1) : $data[0];
return sprintf("%s%s", str_pad($mes, 2, '0', STR_PAD_LEFT), $ano);
}
function PreparaLog($metodo, $msg, $er) {
global $pathLog, $versao;
$data = date('d/m/Y H:i:s');
$type = !$er ? "OK" : "ER";
$str = "";
$str = sprintf("Funcao: [%s] Data: [%s] Versao: %s Status: [%s]\n", $metodo, $data, $versao, $type);
$str .= sprintf("Msg: %s\n", $msg);
/*
* Captura informacoes sobre erros no sistema
*/
@$erro = (GetPhpVerision() >= 530) ? error_get_last() : array();
if (count($erro)) {
$typeE = $erro["type"];
$desprezaErros = array(8192, 16384, 8, 2048, 1024);
if (array_search($typeE, $desprezaErros) === false) {
$str .= "[ERRO_SYS]\n";
$str .= sprintf("File: [%s] Line: [%s] Type: [%s] \nMsg: [%s]\n", $erro["file"], $erro["line"], $erro["type"], $erro["message"]);
$str .= "[/ERRO_SYS]\n";
}
}
$str .= "Fim[$metodo]\n\n";
GravaLog($str, $pathLog);
}
function GetParamWkf($db) {
$query = "select wkf_status_servico, wkf_hora_envio, wkf_minuto_envio, wkf_smtp,
wkf_smtp_user, wkf_smtp_senha, wkf_smtp_port, wkf_smtp_requer_aut, wkf_logo_parceiro
from pbx_workflow_parametros
where wkf_id = 1";
$result = @pg_query($db, $query);
if (!$result) {
PreparaLog("GetParamWkf", $query, true);
exit;
}
$dados = @pg_fetch_array($result);
return $dados;
}
function VerificaEnvio($conn, $dataEnvio, $tpEnvio) {
global $debug;
//if($debug == 9) return 0;
if ($tpEnvio == ENVIO_DIARIO) {
$query = "select count(*) from pbx_workflow_reg_envio where wkf_data_envio = '$dataEnvio'";
} else {
$query = "select count(*) from pbx_workflow_reg_envio_mensal where wkf_data_envio = '$dataEnvio'";
}
$result = @pg_query($conn, $query);
if (!$result) {
PreparaLog("VerificaEnvio", $query, true);
exit;
}
$row = @pg_fetch_row($result);
return $row[0];
}
function VerificaEnvioEmail($conn, $email, $dataEnvio, $tpEnvio) {
$query = "select count(*)
from %s
where wkf_data_envio = '$dataEnvio'
and wkf_email = '$email'
and wkf_status = '1'";
$query = sprintf($query, $tpEnvio == ENVIO_DIARIO ? "pbx_workflow_reg_envio_email" : "pbx_workflow_reg_envio_email_mensal");
$result = @pg_query($conn, $query);
if (!$result) {
PreparaLog("VerificaEnvioEmail", $query, true);
exit;
}
$row = @pg_fetch_row($result);
return $row[0];
}
function CarregaEmails($conn, $tpEnvio) {
/*
* wkf_tipo_envio = 0 -> recebe workflow diário e mensal
* wkf_tipo_envio = 1 -> recebe workflow diário
* wkf_tipo_envio = 2 -> recebe workflow mensal
*/
global $debug;
$emails = array();
$tipo = $tpEnvio == ENVIO_DIARIO ? "0,1" : "0,2";
if ($debug == 9) {
$emails[] = array('wkf_email_id' => '15', 'wkf_email' => 'amarildo.pereira@simplesip.com.br', 'wkf_nome' => 'Amarildo Pereira', 'wkf_status' => '1', 'rest_dac' => '0');
return $emails;
}
$query = "select wkf_email_id, wkf_email, wkf_nome, wkf_status, (select count(*) from pbx_workflow_emails_dacs where wkf_email_id = a.wkf_email_id) as rest_dac
from pbx_workflow_emails a
where wkf_tipo_envio in($tipo)
order by wkf_email";
$result = @pg_query($conn, $query);
if (!$result) {
PreparaLog("CarregaEmails", $query, true);
exit;
}
while ($dados = @pg_fetch_array($result)) {
$emails[] = $dados;
}
return $emails;
}
function dropTemporaryTable($db, $nomeTable) {
$query = "select isTmpTable('$nomeTable');";
$result = @pg_query($db, $query);
if ($result)
$row = @pg_fetch_row($result);
if ($result && $row[0]) {
$query = "drop table $nomeTable;";
$result = @pg_query($db, $query);
}
if (!$result) {
PreparaLog("dropTemporaryTable", $query, true);
return false;
}
return true;
}
function EnviaEmail($conn, $emailParam, $wkfParam, $dataAtual, $dataEnvio, $tpEnvio) {
global $debug;
$emailId = $emailParam['wkf_email_id'];
$email = $emailParam['wkf_email'];
$emailNome = $emailParam['wkf_nome'];
$restDac = $emailParam['rest_dac'];
$Img = &$GLOBALS["embedImg"];
$body = GetMsg($conn, $dataEnvio, $dataAtual, $restDac, $emailId, $tpEnvio);
$msg = "Data Envio: $dataEnvio, DdataAtual: $dataAtual, RestDac: $restDac, EmailId: $emailId, TpEnvio: $tpEnvio";
if ($debug == 9)
PreparaLog("EnviaEmail", $msg, false);
/*
* Carrega parametros para o array:
* $wkfParam[ wkf_smtp,
* wkf_smtp_user, wkf_smtp_senha, wkf_smtp_port, wkf_smtp_requer_aut]
*/
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = $wkfParam["wkf_smtp"];
$mail->Port = $wkfParam["wkf_smtp_port"];
$mail->SMTPAuth = $wkfParam["wkf_smtp_user"] != "";
if ($mail->SMTPAuth) {
/*
* Autenticação smtp
*/
$mail->Username = $wkfParam["wkf_smtp_user"];
$mail->Password = $wkfParam["wkf_smtp_senha"];
}
$mail->From = $wkfParam["wkf_smtp_user"];
$mail->FromName = $tpEnvio == ENVIO_DIARIO ? "Workflow Diário" : "Workflow Mensal";
if (!empty($emailNome)) {
$mail->AddAddress($email, $emailNome);
} else {
$mail->AddAddress($email);
}
$mail->AddCC($wkfParam["wkf_smtp_user"], 'WorkFlow');
$mail->IsHTML(true);
$mail->CharSet = 'iso-8859-1';
$mail->Subject = $tpEnvio == ENVIO_DIARIO ? "Resumo da Operação(Diário)" : "Resumo da Operação(Média Mensal)";
/*
* Adciona imagens do html
*/
$dirApl = "/var/www/html/aplicativo/";
$imgLogo = $dirApl. "imgSite/" . $wkfParam["wkf_logo_parceiro"];
$logoParceiro = file_exists($imgLogo) ? $imgLogo : "/var/lib/asterisk/scripts/workflow/logoParceiro.png";
$logoPrincipal = $dirApl.LOGO_PRINCIPAL_WORKFLOW;
$mail->AddEmbeddedImage($logoPrincipal, CONF_PRINCIPAL_WORKFLOW);
$mail->AddEmbeddedImage($logoParceiro, CONF_PARCEIRO_WORKFLOW);
$resp = GetEnvioDac($email);
foreach ($Img as $key => $value) {
foreach ($resp as $val) {
if ($val['fila'] . '_' . date('Ymd', strtotime('-1days')) . '.jpg' == $value) {
$mail->AddEmbeddedImage($value, $key);
}
}
if (!$resp) {
$mail->AddEmbeddedImage($value, $key);
}
}
$mail->Body = $body;
$mail->AltBody = $body;
$enviado = $mail->Send();
$mail->ClearAllRecipients();
$erro = $mail->ErrorInfo;
RegistraEnvioEmail($conn, $dataEnvio, $email, $emailId, $enviado, $erro, $tpEnvio);
if ($debug == 9)
PreparaLog("EnviaEmail", "$dataEnvio - $email - $erro", false);
if (!$enviado) {
$msg = "Email: $email não pode ser enviado Data Envio: $dataEnvio! Erro: $erro";
PreparaLog("EnviaEmail", $msg, !$enviado);
}
return $enviado;
}
function GetEnvioDac($email) {
global $conn;
$query = "select nome_dac as fila from pbx_workflow_emails a
inner join pbx_workflow_emails_dacs b on a.wkf_email_id = b.wkf_email_id
where wkf_email = '$email'";
$result = pg_query($conn, $query);
return pg_fetch_all($result);
}
function RegistraEnvioEmail($conn, $dataEnvio, $email, $emailId, $enviado, $erro, $tpEnvio) {
global $debug;
$erro = trim($erro);
if ($erro == '')
$erro = "null";
else
$erro = "'$erro'";
if (!$enviado)
$enviado = 0;
else
$enviado = 1;
$table = $tpEnvio == ENVIO_DIARIO ? "pbx_workflow_reg_envio_email" : "pbx_workflow_reg_envio_email_mensal";
//create table pbx_workflow_reg_envio_email(wkf_data_envio date not null, wkf_email varchar(80) not null, wkf_status int, wkf_msg varchar(1024), wkf_data_reg timestamp not null default now(), CONSTRAINT "pkRegEnvioEmail" PRIMARY KEY (wkf_data_envio, wkf_email));
$query = "insert into $table(wkf_data_envio, wkf_email, wkf_status, wkf_msg)values('$dataEnvio', '$email', '$enviado', $erro)";
$result = pg_query($conn, $query);
$ret = $result ? true : false;
if ($debug == 9) {
PreparaLog("RegistraEnvioEmail", $query, false);
}
if (!$ret) {
$msg = sprintf('Registro de envio não pode ser realizado! Email: %s Data Envio: %s Erro: %s', $email, $dataEnvio, pg_last_error($conn));
PreparaLog("RegistraEnvioEmail", $msg, !$ret);
}
return $ret;
}
function RegistraEnvio($conn, $dataEnvio, $tpEnvio) {
$table = $tpEnvio == ENVIO_DIARIO ? "pbx_workflow_reg_envio" : "pbx_workflow_reg_envio_mensal";
$query = "insert into $table(wkf_data_envio)values('$dataEnvio')";
$result = pg_query($conn, $query);
$ret = $result ? true : false;
if (!$ret) {
$msg = 'Registro de envio não pode ser realizado!';
PreparaLog("RegistraEnvio", $msg, !$ret);
}
return $ret;
}
function GetTipoEnvio($db, $mesEnvio) {
$envio = 1;
$query = "select count(*) from pbx_workflow_reg_envio_mensal where wkf_data_envio = '$mesEnvio'";
$result = @pg_query($db, $query);
if (!$result) {
PreparaLog("GetTipoEnvio", $query, true);
exit;
}
$dados = @pg_fetch_row($result);
/*
* Se não houver um registro indicando o envio, incrementa a variavel
* indicando que é necessario enviar o mensal
* $envio = 1 -> Indica que o envio devera ser do dia
* $envio = 2 -> Indica que o envio deverá ser do dia e mês.
*/
if (!$dados[0]) {
$envio++;
}
return $envio;
}
?>