Proyectos de Subversion LeadersLinked - Services

Rev

Rev 383 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php
declare(strict_types = 1);
namespace LeadersLinked\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
// use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Log\LoggerInterface;
use LeadersLinked\Mapper\EmailMapper;
use PHPMailer\PHPMailer\PHPMailer;
use LeadersLinked\Model\Email;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Cache\CacheInterface;

class ProcessScheduledContentCommand extends Command
{

    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;

    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;

    /**
     *
     * @var array
     */
    private $config;

    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;

    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param
     *            \Laminas\Log\LoggerInterface
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    public function __construct($adapter, $cache, $logger, $config, $translator)
    {
        $this->adapter = $adapter;
        $this->cache = $cache;
        $this->logger = $logger;
        $this->config = $config;
        $this->translator = $translator;

        parent::__construct();
    }

    protected function configure(): void
    {
        $this->setName('leaderslinked:process-scheduled-content')
             ->setDescription('Procesa y libera el contenido programado de hábitos y habilidades')
             ->setHelp('Este comando verifica y procesa los hábitos programados para el día actual');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('Iniciando proceso de liberación de contenido programado...');
        
        try {
            // Obtener el día de la semana actual (1 = lunes, 7 = domingo)
            $currentDayNumber = (int)date('N');
            $currentTime = date('H:i:s');
            
            // Mapear el número del día a la columna correspondiente
            $dayColumns = [
                1 => ['active' => 'monday_active', 'time' => 'monday_time'],
                2 => ['active' => 'tuesday_active', 'time' => 'tuesday_time'],
                3 => ['active' => 'wednesday_active', 'time' => 'wednesday_time'],
                4 => ['active' => 'thursday_active', 'time' => 'thursday_time'],
                5 => ['active' => 'friday_active', 'time' => 'friday_time'],
                6 => ['active' => 'saturday_active', 'time' => 'saturday_time'],
                7 => ['active' => 'sunday_active', 'time' => 'sunday_time']
            ];
            
            $currentDayColumns = $dayColumns[$currentDayNumber];
            
            // Obtener el mapper de hábitos
            $habitSkillMapper = \LeadersLinked\Mapper\HabitSkillMapper::getInstance($this->adapter);
            
            // Construir la consulta para obtener hábitos programados para hoy
            $select = $habitSkillMapper->getSql()->select(HabitSkillMapper::_TABLE);
            $select->where([
                $currentDayColumns['active'] => 1,
                $currentDayColumns['time'] . ' <= ?' => $currentTime
            ]);
            
            $habits = $habitSkillMapper->executeFetchAllObject($select, new \LeadersLinked\Model\HabitSkill());
            
            $processedCount = 0;
            foreach ($habits as $habit) {
                try {
                    // Crear un registro para el hábito
                    $register = new \LeadersLinked\Model\HabitSkillRegister();
                    $register->network_id = $habit->network_id;
                    $register->user_id = $habit->user_id;
                    $register->skill_id = $habit->id;
                    $register->date = date('Y-m-d');
                    $register->uuid = uniqid();
                    
                    // Registrar el hábito
                    $registerMapper = \LeadersLinked\Mapper\HabitSkillRegisterMapper::getInstance($this->adapter);
                    if ($registerMapper->insert($register)) {
                        $processedCount++;
                        $this->logger->info(
                            sprintf('Hábito procesado: %s (Usuario: %d)', $habit->name, $habit->user_id),
                            ['habit_id' => $habit->id]
                        );
                    }
                } catch (\Exception $e) {
                    $this->logger->error(
                        sprintf('Error procesando hábito %d: %s', $habit->id, $e->getMessage()),
                        ['exception' => $e]
                    );
                }
            }
            
            $output->writeln(sprintf('Se procesaron %d hábitos programados', $processedCount));
            $output->writeln('Proceso de liberación de contenido programado completado con éxito');
            
            return Command::SUCCESS;
            
        } catch (\Exception $e) {
            $this->logger->error('Error en el proceso de contenido programado: ' . $e->getMessage());
            $output->writeln('<error>Error: ' . $e->getMessage() . '</error>');
            
            return Command::FAILURE;
        }
    }
}