<?php
namespace App\Application\Internit\LeadBundle\Service;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use App\Application\Internit\LeadBundle\Entity\LeadErrorLog;
class ResendLeadWorkerCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('resend:lead:worker')
->setDescription('Consome fila de leads e envia e-mail');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$conn = $this->getContainer()->get('doctrine')->getConnection();
$entityManager = $this->getContainer()->get('doctrine')->getManager();
$rows = $conn->fetchAll("SELECT * FROM lead_queue WHERE status = 'pendente'");
foreach ($rows as $row) {
$mailer1 = $this->getContainer()->get('admin.mail.service');
$mailer2 = $this->getContainer()->get('admin.mail.service2');
$lead = $entityManager->getRepository('ApplicationInternitLeadBundle:Lead')->find($row['lead_id']);
$copyEmails = explode(',', $row['copy_emails']);
try {
if (!$lead) {
$conn->update('lead_queue', ['status' => 'falhou', 'updated_at' => date('Y-m-d H:i:s')], ['id' => $row['id']]);
continue;
}
$html = $this->getContainer()->get('templating')->render(
'@ApplicationInternit/SettingBundle/Resources/views/Mail/emailLead.html.twig',
['data' => $lead, 'corretor' => $row['broker_name']]
);
$enviado = false;
// Primeira tentativa
try {
$mailer1->setMessage()
->setTo($row['broker_email'] ?? $lead->getProduct()->getEmail())
->setCC($copyEmails)
->setSubject("[leadcalper] " . $lead->getProduct()->getName() . ' - ' . $lead->getGroup() . ' - ' . $row['broker_name'])
->setBody(
$html,
'text/html'
);
$mailer1->send();
$lead->setSendStatus('Sim 1');
$entityManager->persist($lead);
$entityManager->flush();
$enviado = true;
} catch (\Exception $e1) {
// Segunda tentativa
try {
$mailer2->setMessage()
->setTo($row['broker_email'] ?? $lead->getProduct()->getEmail())
->setCc($copyEmails)
->setSubject("[leadcalper] " . $lead->getProduct()->getName() . ' - ' . $lead->getGroup() . ' - ' . $row['broker_name'])
->setBody($html, 'text/html')
->send();
$lead->setSendStatus('Sim 2');
$entityManager->persist($lead);
$entityManager->flush();
$enviado = true;
} catch (\Exception $e2) {
// Ambos falharam
$lead->setSendStatus('Não');
$conn->update('lead_queue', [
'status' => 'falhou',
'updated_at' => date('Y-m-d H:i:s')
], ['id' => $row['id']]);
$log = new LeadErrorLog();
$log->setLead($lead ?? null);
$entityManager->persist($lead);
$log->setErrorMessage('Falha na tentativa de reenvio de lead, os 2 emails falharam.');
$log->setErrorType('Erro de envio de email');
$log->setCreatedAt(new \DateTime());
$entityManager->persist($log);
$entityManager->flush();
$output->writeln("Lead {$row['lead_id']} falhou nos dois envios.");
continue;
}
}
if ($enviado) {
$conn->delete('lead_queue', ['id' => $row['id']]);
$output->writeln("Lead {$row['lead_id']} enviado com sucesso.");
}
} catch (\Exception $e) {
$lead->setSendStatus('Não');
$entityManager->persist($lead);
$entityManager->flush();
$conn->update('lead_queue', ['status' => 'falhou', 'updated_at' => date('Y-m-d H:i:s')], ['id' => $row['id']]);
$output->writeln("Erro inesperado no lead ID {$row['lead_id']}");
}
}
$output->writeln("Processamento finalizado.");
}
}