<?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->fetchAllAssociative("SELECT * FROM lead_queue WHERE status = 'pendente'");
foreach ($rows as $row) {
$entityManager->beginTransaction(); // Inicia a transação
try {
// 1. LIMPEZA DOS EMAILS DE CÓPIA
$copyEmailsRaw = explode(',', $row['copy_emails']);
// Filtra e-mails vazios ou nulos (soluciona o Address in mailbox given [] error)
$copyEmails = array_filter($copyEmailsRaw, function($email) {
return !empty(trim($email));
});
$lead = $entityManager->getRepository('ApplicationInternitLeadBundle:Lead')->find($row['lead_id']);
if (!$lead) {
$conn->update('lead_queue', ['status' => 'falhou', 'updated_at' => date('Y-m-d H:i:s')], ['id' => $row['id']]);
$entityManager->commit();
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 = $this->getContainer()->get('admin.mail.service');
$mailer1->setMessage()
->setTo($row['broker_email'] ?? $lead->getProduct()->getEmail())
->setCC($copyEmails) // Array filtrado!
// ... (restante do setSubject e setBody) ...
->setSubject("[leadcalper] " . $lead->getProduct()->getName() . ' - ' . $lead->getGroup() . ' - ' . $row['broker_name'])
->setBody($html, 'text/html');
$mailer1->send();
$lead->setSendStatus('Sim 1');
$enviado = true;
} catch (\Exception $e1) {
// ... (log de erro 1) ...
try {
$mailer2 = $this->getContainer()->get('admin.mail.service2');
$mailer2->setMessage()
->setTo($row['broker_email'] ?? $lead->getProduct()->getEmail())
->setCc($copyEmails) // Array filtrado!
// ... (restante do setSubject e setBody) ...
->setSubject("[leadcalper] " . $lead->getProduct()->getName() . ' - ' . $lead->getGroup() . ' - ' . $row['broker_name'])
->setBody($html, 'text/html')
->send();
$lead->setSendStatus('Sim 2');
$enviado = true;
} catch (\Exception $e2) {
// Ambos falharam
$lead->setSendStatus('Não');
$output->writeln("Lead {$row['lead_id']} falhou nos dois envios.");
$output->writeln($e2); // Log da última exceção
}
}
// Persiste o status final do Lead
$entityManager->persist($lead);
if ($enviado) {
$conn->delete('lead_queue', ['id' => $row['id']]);
$output->writeln("Lead {$row['lead_id']} enviado com sucesso. Status: {$lead->getSendStatus()}");
} else {
// Atualiza o status da fila como falhou
$conn->update('lead_queue', [
'status' => 'falhou',
'updated_at' => date('Y-m-d H:i:s')
], ['id' => $row['id']]);
}
// Finaliza a transação e salva Lead e Fila
$entityManager->flush();
$entityManager->commit();
} catch (\Exception $e) {
// Em caso de qualquer erro inesperado, faça rollback
if ($entityManager->getConnection()->isTransactionActive()) {
$entityManager->rollback();
}
// Atualiza a fila como falha
$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']}: " . $e->getMessage());
}
}
$output->writeln("Processamento finalizado.");
return 0;
}
}