Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16769 | Autoría | Comparar con el anterior | 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 DiscoveryContactProgressController 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) {
                

                $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);
                
                /*
                select count(*) as cant, date(added_on) as date from tbl_discovery_contacts
                where date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
                group by date(added_on)
                order by date ASC
                 */
                
                $select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);
                $select->columns([
                    'total' => new Expression('COUNT(*)'),
                    'date' => new Expression('DATE(added_on)'),
                ]);
                
                if($contact_ids) {
                    $select->where->notIn('id', $contact_ids);
                }
                
                
                $select->where->between( new Expression('DATE(added_on)') , $startDate,  $endDate);
                $select->group(new Expression('DATE(added_on)'));
                $select->order('date ASC');
                
                $records = $queryMapper->fetchAll($select);
                foreach($records as $record)
                {

                    $graph[ $record['date']  ][ 'value' ] = $record['total']; 
                }
                
                $discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
                $discoveryContactInteractionType =  $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
                if(!$discoveryContactInteractionType) {
                    $discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
                }
                
                
                /*
                  select count(*), user_id, date(added_on) as date from tbl_discovery_contact_interactions
                where interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
                group by date(added_on), user_id
                order by date
                */
                
                $table = [];
                $select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);
                $select->columns([
                    'user_id',
                    '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);
                
                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)
                {
                    $user_id =  $record['user_id'];
                    
                    if(!isset( $table[ $user_id  ])) {
                        
                        $items = [];
                        
                        $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
                        
                        do {
                            $tempDate = $dt->format('Y-m-d');
                            $items[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];
                            $dt->add(new \DateInterval('P1D'));
                            
                            
                        } while($endDate > $tempDate);
                        
                        $table[ $user_id  ] = $items;
                       
                        
                    }
                    
                    
                    $table[ $user_id ][ $record['date'] ]['value'] = $record['total'];
                }
                
                $records = array_values($graph);
                
                $labels = [];
                $values = [];
                
         
                
                foreach($records as $record)
                {
                    array_push($labels, $record['label']);
                    array_push($values, $record['value']);
                }
                
                $graph = [
                    'labels' => $labels,
                    'values' => $values
                ];
                
                $userMapper = UserMapper::getInstance($this->adapter);
                
                
                $first = true;
                $labels = [];
                $users = [];
                
                $records = $table;
                foreach($records as  $user_id => $items)
                {
                    $user = $userMapper->fetchOne($user_id);
                    if(!$user) {
                        continue;
                    }
                    
                    
                    $values = [];
                    foreach($items as $item)
                    {
                        if($first) {
                            array_push($labels,['date' =>  $item['label'] ]);
                        }
                        array_push($values,['value' =>  $item['value'] ]);
                    }
                    
                    array_push($users, [
                       'first_name' => $user->first_name, 
                       'last_name' => $user->last_name,
                       'email' => $user->email,
                       'values' => $values,
                    ]);
                    
                    $first = false;
                    
                }
                
                
                usort($users, function($a, $b) {
                   
                    $result = $a['first_name'] <=> $b['last_name'];
                    if($result === 0) {
                        $a['last_name'] <=> $b['last_name'];
                    }
                    
                    return $result;
                    
                    
                });
                
                $table = [
                    'labels' => $labels, 
                    'users' => $users,
                ];

                
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'graph' => $graph,
                        'table' => $table,
                    ],
                    
                ]);
            } else {
                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/discovery-contact-progress/index.phtml');
                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()) {
            $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);
            
            /*
             select count(*) as cant, date(added_on) as date from tbl_discovery_contacts
             where date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
             group by date(added_on)
             order by date ASC
             */
            
            $select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);
            $select->columns([
                'total' => new Expression('COUNT(*)'),
                'date' => new Expression('DATE(added_on)'),
            ]);
            
            if($contact_ids) {
                $select->where->notIn('id', $contact_ids);
            }
            
            $select->where->between( new Expression('DATE(added_on)') , $startDate,  $endDate);
            $select->group(new Expression('DATE(added_on)'));
            $select->order('date ASC');
            
            $records = $queryMapper->fetchAll($select);
            foreach($records as $record)
            {
                
                $graph[ $record['date']  ][ 'value' ] = $record['total'];
            }
            
            $discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
            $discoveryContactInteractionType =  $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
            if(!$discoveryContactInteractionType) {
                $discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
            }
            
            
            /*
             select count(*), user_id, date(added_on) as date from tbl_discovery_contact_interactions
             where interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
             group by date(added_on), user_id
             order by date
             */
            
            $table = [];
            $select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);
            $select->columns([
                'user_id',
                '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);
            
            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)
            {
                $user_id =  $record['user_id'];
                
                if(!isset( $table[ $user_id  ])) {
                    
                    $items = [];
                    
                    $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
                    
                    do {
                        $tempDate = $dt->format('Y-m-d');
                        $items[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];
                        $dt->add(new \DateInterval('P1D'));
                        
                        
                    } while($endDate > $tempDate);
                    
                    $table[ $user_id  ] = $items;
                    
                    
                }
                
                
                $table[ $user_id ][ $record['date'] ]['value'] = $record['total'];
            }
            
            $records = array_values($graph);
            
            $spreadsheet = new Spreadsheet();
            $spreadsheet->getProperties()->setTitle('Relevamiento de Contacto');
            
            $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'));
            
     
           
            
            $col = 1;
            
            foreach($records as $record)
            {
                $spreadsheet->getActiveSheet()->setCellValue([$col, 3], $record['label']);
                $spreadsheet->getActiveSheet()->setCellValue([$col, 4], $record['value']);
                $col++;
            }
            
            $spreadsheet->getActiveSheet()->SetCellValue('A6', $this->translator->translate('LABEL_FIRST_NAME'));
            $spreadsheet->getActiveSheet()->SetCellValue('B6', $this->translator->translate('LABEL_LAST_NAME'));
            $spreadsheet->getActiveSheet()->SetCellValue('C6', $this->translator->translate('LABEL_EMAIL'));

            
            $col = 4;
            
            foreach($records as $record)
            {
                $spreadsheet->getActiveSheet()->setCellValue([$col, 6], $record['label']);

                $col++;
            }
            
            
            $userMapper = UserMapper::getInstance($this->adapter);


            
            $row = 7;
            $records = $table;
            foreach($records as  $user_id => $items)
            {
                $user = $userMapper->fetchOne($user_id);
                if(!$user) {
                    continue;
                }
                
                
                $spreadsheet->getActiveSheet()->SetCellValue([1, $row], $user->first_name);
                $spreadsheet->getActiveSheet()->SetCellValue([2, $row], $user->last_name);
                $spreadsheet->getActiveSheet()->SetCellValue([3, $row], $user->email);
                
                
                $col = 4;

                foreach($items as $item)
                {
                    $spreadsheet->getActiveSheet()->SetCellValue([$col, $row],  $item['value']);
                    $col++;

                }
                
                $row++;
                
            }
            
            $fileName = 'reporte_relevamiento_de_contact_progreso_por_dia_'  . date('d-m-Y-h-i-a', time()) . '.xls';
            $tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contact_progreso_por_dia_' . 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'
        ]);
    }
}