forked from SimplesIP/pabx-app
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
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; |
|
} |
|
?>
|
|
|