Proyectos de Subversion LeadersLinked - Backend

Rev

Autoría | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Controller;


use Laminas\Db\Adapter\AdapterInterface;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\Mvc\I18n\Translator;

use Laminas\View\Model\JsonModel;
use Laminas\View\Model\ViewModel;
use LeadersLinked\Mapper\DiscoveryContactBlackListMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\DiscoveryContactMapper;
use Laminas\Db\Sql\Expression;
use LeadersLinked\Mapper\DiscoveryContactInteractionMapper;
use LeadersLinked\Mapper\DiscoveryContactInteractionTypeMapper;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;


// Create an action controller.
class DiscoveryContactProgressUserController extends AbstractActionController
{
    /**
     *
     * @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 LoggerInterface $logger
     * @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;
    }




    public function indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();

        $request = $this->getRequest();

        if ($request->isGet()) {
            $headers  = $request->getHeaders();
            $isJson = false;

            if ($headers->has('Accept')) {
                $accept = $headers->get('Accept');

                $prioritized = $accept->getPrioritized();

                foreach ($prioritized as $key => $value) {
                    $raw = trim($value->getRaw());

                    if (!$isJson) {
                        $isJson = strpos($raw, 'json');
                    }
                }
            }
           
            
            //$isJson =  true;
            if ($isJson) {
                $user_uuid = $this->params()->fromQuery('user');
                if(!$user_uuid) {
                    
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_PARAMETERS_ARE_INVALID'
                    ]);
                }
                
                $userMapper = UserMapper::getInstance($this->adapter);
                $user = $userMapper->fetchOneByUuid($user_uuid);
                
                if(!$user) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_USER_NOT_FOUND'
                    ]);
                }
                

                $startDate = $this->params()->fromQuery('startDate');
                if (empty($startDate)) {
                    $startDate = date('Y-m-d');
                }

                $endDate = $this->params()->fromQuery('endDate');
                if (empty($endDate)) {
                    $endDate = date('Y-m-d');
                }
                
                $dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);
                $dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);
                


                if (!$dtStartDate || !$dtEndDate) {
                    $startDate = date('Y-m-d');
                    $endDate = date('Y-m-d');
                } else {

                    if ($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {
                        $startDate = date('Y-m-d');
                        $endDate = date('Y-m-d');
                    }
                    
                }
                
                //echo ' $startDate  = ' .  $startDate  . ' $endDate = ' . $endDate; exit;
                
                $table = [];
                

                $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
                
                do {
                    $tempDate = $dt->format('Y-m-d');
                    $table[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];
                    $dt->add(new \DateInterval('P1D'));
                     
                    
                } while($endDate > $tempDate);
                
                
                $discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
                $contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
                
                
                
                $queryMapper = QueryMapper::getInstance($this->adapter);

                
                $discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
                $discoveryContactInteractionType =  $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
                if(!$discoveryContactInteractionType) {
                    $discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
                }
                

      
                $select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);
                $select->columns([
                    'total' => new Expression('COUNT(*)'),
                    'date' => new Expression('DATE(added_on)'),
                ]);
                $select->where->equalTo('interaction_type_id', $discoveryContactInteractionType->id);
                $select->where->between( new Expression('DATE(added_on)') , $startDate,  $endDate);
                $select->where->equalTo('user_id', $user->id);
                
                if($contact_ids) {
                    $select->where->notIn('contact_id', $contact_ids);
                }
                
                $select->group([ new Expression('DATE(added_on)'), 'user_id']);
                $select->order('date ASC');
 
                $records = $queryMapper->fetchAll($select);
                foreach($records as $record)
                {
                    $table[ $record['date']  ][ 'value' ] = $record['total']; 
                }
                
                $records = array_values($table);
                
                $labels = [];
                $values = [];
                
    
                
                $table = [];
                foreach($records as $record)
                {
                    
                    
                    
                    array_push($labels, $record['label']);
                    array_push($values, $record['value']);
                    
                    array_push($table, [
                        'total' => $record['value'],
                        'date' => $record['label']
                    ]);
                }
                
                
               
           
                
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'table' => $table,
                        'graph' => [
                            'labels' => $labels,
                            'values' => $values
                        ]
                    ]
                    
                ]);
            } else {
                $discoveryContactInteractionMapper = DiscoveryContactInteractionMapper::getInstance($this->adapter);
                $user_ids = $discoveryContactInteractionMapper->fetchAllUserIdsForCompanyId($currentCompany->id);
                
                $users = [];
                $userMapper = UserMapper::getInstance($this->adapter);
                $records = $userMapper->fetchAllByIds($user_ids);
                foreach($records as $record) 
                {
                    $users[ $record->uuid ] = trim($record->first_name . ' ' . $record->last_name) . ' (' . $record->email . ')';
                }
                
                
                
                
                
                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/discovery-contact-progress-user/index.phtml');
                $viewModel->setVariables([
                    'users' => $users
                ]);
                return $viewModel;
            }
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
    
    public function downloadAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request = $this->getRequest();
        
        if ($request->isGet()) {
            $user_uuid = $this->params()->fromQuery('user');
            if(!$user_uuid) {
                
                return new JsonModel([
                    'success' => false, 
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
                ]);
            }
            
            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOneByUuid($user_uuid);
            
            if(!$user) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_USER_NOT_FOUND'
                ]);
            }
            
            
            $startDate = $this->params()->fromQuery('startDate');
            if (empty($startDate)) {
                $startDate = date('Y-m-d');
            }
            
            $endDate = $this->params()->fromQuery('endDate');
            if (empty($endDate)) {
                $endDate = date('Y-m-d');
            }
            
            $dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);
            $dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);
            
            
            
            if (!$dtStartDate || !$dtEndDate) {
                $startDate = date('Y-m-d');
                $endDate = date('Y-m-d');
            } else {
                
                if ($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {
                    $startDate = date('Y-m-d');
                    $endDate = date('Y-m-d');
                }
                
            }
            
            //echo ' $startDate  = ' .  $startDate  . ' $endDate = ' . $endDate; exit;
            
            $graph = [];
            
            
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
            
            do {
                $tempDate = $dt->format('Y-m-d');
                $graph[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];
                $dt->add(new \DateInterval('P1D'));
                
                
            } while($endDate > $tempDate);
            
            $discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
            $contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
            
            
            
            $queryMapper = QueryMapper::getInstance($this->adapter);

            
            $discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
            $discoveryContactInteractionType =  $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
            if(!$discoveryContactInteractionType) {
                $discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
            }
            


            $select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);
            $select->columns([
                'total' => new Expression('COUNT(*)'),
                'date' => new Expression('DATE(added_on)'),
            ]);
            $select->where->equalTo('interaction_type_id', $discoveryContactInteractionType->id);
            $select->where->between( new Expression('DATE(added_on)') , $startDate,  $endDate);
            $select->where->equalTo('user_id', $user->id);
            
            if($contact_ids) {
                $select->where->notIn('id', $contact_ids);
            }
            
            
            $select->group([ new Expression('DATE(added_on)'), 'user_id']);
            $select->order('date ASC');
            
            $records = $queryMapper->fetchAll($select);
            foreach($records as $record)
            {
                $graph[ $record['date']  ][ 'value' ] = $record['total'];
            }
            
            $records = array_values($graph);
            
            $spreadsheet = new Spreadsheet();
            $spreadsheet->getProperties()->setTitle('Relevamiento de Contacto por usuario');
            
            $spreadsheet->setActiveSheetIndex(0);
            
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
            $spreadsheet->getActiveSheet()->SetCellValue('A1', 'Desde:');
            $spreadsheet->getActiveSheet()->SetCellValue('B1', $dt->format('d/m/Y'));
            
            
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
            $spreadsheet->getActiveSheet()->SetCellValue('C1', 'Hasta:');
            $spreadsheet->getActiveSheet()->SetCellValue('D1', $dt->format('d/m/Y'));
            
            
            $spreadsheet->getActiveSheet()->SetCellValue('A2', trim($user->first_name . ' ' . $user->last_name) . ' (' . $user->email . ')');
            $spreadsheet->getActiveSheet()->setMergeCells(['A2', 'B2', 'C2', 'D2']);
     
            $spreadsheet->getActiveSheet()->SetCellValue('A4', 'Fecha');
            $spreadsheet->getActiveSheet()->SetCellValue('B4', 'Total');
            
            
  
            $row = 5;
            foreach($records as $record)
            {
                $spreadsheet->getActiveSheet()->setCellValue('A' . $row, $record['label']);
                $spreadsheet->getActiveSheet()->setCellValue('B' . $row, $record['value']);
                $row++;
            }


            
            $fileName = 'reporte_relevamiento_de_contact_progreso_por_dia_por_usuario_'  . date('d-m-Y-h-i-a', time()) . '.xls';
            $tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contact_progreso_por_dia_por_usuario_' . time());
            
            $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
            $writer->save($tempFilename);
            
            $content = file_get_contents($tempFilename);
            @unlink($tempFilename);
            
            return new JsonModel([
                'success' => true,
                'data' => [
                    'content' => base64_encode($content),
                    'basename' => $fileName
                    
                ]
            ]);

        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
}