Proyectos de Subversion LeadersLinked - Services

Rev

Rev 1 | 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\QueryMapper;
use LeadersLinked\Mapper\EngagementMapper;
use LeadersLinked\Mapper\EngagementRecordMapper;
use LeadersLinked\Mapper\EngagementUserMapper;
use LeadersLinked\Mapper\DailyPulseEmojiMapper;
use LeadersLinked\Mapper\DailyPulseRecordMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\DailyPulseRecord;
use LeadersLinked\Model\EngagementUser;
use LeadersLinked\Model\EngagementRecord;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Cache\CacheInterface;

class DailyPulseSimulateCommand 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 execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('Comenzamos a generar Daily Pulse de los últimos 30 días');

        $company_id = 1;
        $engagementMapper = EngagementMapper::getInstance($this->adapter);
        $engagement = $engagementMapper->fetchOneByCompanyId($company_id);

        $engagementRecordMapper = EngagementRecordMapper::getInstance($this->adapter);
        $engagementUserMapper = EngagementUserMapper::getInstance($this->adapter);

        $dailyPulseEmojiMapper = DailyPulseEmojiMapper::getInstance($this->adapter);
        $emojis_climate = $dailyPulseEmojiMapper->fetchAllActiveTypeClimateOnYourOrganizationByCompanyId($company_id);
        $max_emojis_climate = count($emojis_climate) - 1;

        $emojis_feel = $dailyPulseEmojiMapper->fetchAllActiveTypeHowAreYouFeelByCompanyId($company_id);
        $max_emojis_feel = count($emojis_feel) - 1;

        $dailyPulseRecordMapper = DailyPulseRecordMapper::getInstance($this->adapter);

        $endDate = date('Y-m-d');
        $startDate = date('Y-m-d', strtotime('-1 MONTH'));

        $seed = (int) (floor(time() / 86400));
        srand($seed);
        $min_users = 100;
        $max_users = 300;

        $queryMapper = QueryMapper::getInstance($this->adapter);

        $output->writeln('$startDate = ' . $startDate);
        $output->writeln('$endDate = ' . $endDate);

        $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
        do {

            $date = $dt->format('Y-m-d');

            $limit = rand($min_users, $max_users);

            $sql = " SELECT id FROM " . UserMapper::_TABLE;
            $sql .= " ORDER BY RAND() LIMIT $limit";

            $output->writeln('$sql = ' . $sql);

            $user_ids = [];

            $records = $queryMapper->fetchAllUsingParameters($sql);
            foreach ($records as $record) {
                array_push($user_ids, $record['id']);
            }

            $max = count($user_ids);
            for ($i = 0; $i < $max; $i ++) {
                $user_id = $user_ids[$i];

                $idx = rand(0, $max_emojis_feel);
                $emoji = $emojis_feel[$idx];

                $dailyPulse = new DailyPulseRecord();
                $dailyPulse->company_id = $company_id;
                $dailyPulse->user_id = $user_id;
                $dailyPulse->emoji_id = $emoji->id;
                $dailyPulse->date = $date;
                $dailyPulse->type = DailyPulseRecord::TYPE_HOW_ARE_YOU_FEEL;
                $dailyPulse->engagement = $engagement ? $engagement->daily_pulse_how_are_you_feel : 0;
                $dailyPulse->points = $emoji->points;

                $result = $dailyPulseRecordMapper->insert($dailyPulse);
                if ($result) {

                    $engagementUserMapper = EngagementUserMapper::getInstance($this->adapter);
                    $engagementUser = $engagementUserMapper->fetchOneByCompanyIdAndUserId($company_id, $user_id);

                    if ($engagementUser) {
                        $engagementUser->points = $engagementUser->points + ($engagement ? $engagement->daily_pulse_how_are_you_feel : 0);
                        $engagementUserMapper->update($engagementUser);
                    } else {
                        $engagementUser = new EngagementUser();
                        $engagementUser->company_id = $company_id;
                        $engagementUser->user_id = $user_id;
                        $engagementUser->points = $engagement ? $engagement->daily_pulse_how_are_you_feel : 0;
                        $engagementUserMapper->insert($engagementUser);
                    }

                    $engagementRecord = new EngagementRecord();
                    $engagementRecord->company_id = $company_id;
                    $engagementRecord->user_id = $user_id;
                    $engagementRecord->date = $date;
                    $engagementRecord->points = $engagement->daily_pulse_how_are_you_feel;
                    $engagementRecord->type = EngagementRecord::TYPE_DAILY_PULSE_HOW_ARE_YOU_FEEL;

                    $engagementRecordMapper = EngagementRecordMapper::getInstance($this->adapter);
                    $engagementRecordMapper->insert($engagementRecord);
                }
            }

            $percentaje = rand(20, 80);

            $max = (int) (($percentaje * 100) / $max);
            for ($i = 0; $i < $max; $i ++) {
                $user_id = $user_ids[$i];

                $idx = rand(0, $max_emojis_climate);
                $emoji = $emojis_climate[$idx];

                $dailyPulse = new DailyPulseRecord();
                $dailyPulse->company_id = $company_id;
                $dailyPulse->user_id = $user_id;
                $dailyPulse->emoji_id = $emoji->id;
                $dailyPulse->type = DailyPulseRecord::TYPE_CLIMATE_ON_YOUR_ORGANIZATION;
                $dailyPulse->date = $date;
                $dailyPulse->engagement = $engagement ? $engagement->daily_pulse_climate_on_your_organization : 0;
                $dailyPulse->points = $emoji->points;

                $result = $dailyPulseRecordMapper->insert($dailyPulse);
                if ($result) {

                    $engagementUserMapper = EngagementUserMapper::getInstance($this->adapter);
                    $engagementUser = $engagementUserMapper->fetchOneByCompanyIdAndUserId($company_id, $user_id);

                    if ($engagementUser) {
                        $engagementUser->points = $engagementUser->points + ($engagement ? $engagement->daily_pulse_climate_on_your_organization : 0);
                        $engagementUserMapper->update($engagementUser);
                    } else {
                        $engagementUser = new EngagementUser();
                        $engagementUser->company_id = $company_id;
                        $engagementUser->user_id = $user_id;
                        $engagementUser->points = $engagement ? $engagement->daily_pulse_climate_on_your_organization : 0;
                        $engagementUserMapper->insert($engagementUser);
                    }

                    $engagementRecord = new EngagementRecord();
                    $engagementRecord->company_id = $company_id;
                    $engagementRecord->user_id = $user_id;
                    $engagementRecord->date = $date;
                    $engagementRecord->points = $engagement->daily_pulse_climate_on_your_organization;
                    $engagementRecord->type = EngagementRecord::TYPE_DAILY_PULSE_CLIMATE_ON_YOUR_ORGANIZATION;

                    $engagementRecordMapper = EngagementRecordMapper::getInstance($this->adapter);
                    $engagementRecordMapper->insert($engagementRecord);
                }
            }

            $output->writeln('$percentaje = ' . $percentaje);

            $dt->add(new \DateInterval('P1D'));
        } while ($date < $endDate);

        $output->writeln('Terminamos a generar Daily Pulse de los últimos 30 días');

        return 0;
    }
}