Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3186 | Ir a la última revisión | 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\Cache\Storage\Adapter\AbstractAdapter;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;

use LeadersLinked\Library\Functions;
use LeadersLinked\Form\MyCompanies\CreateForm;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;

use LeadersLinked\Mapper\CompanyLocationMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Model\CompanyUser;
use LeadersLinked\Mapper\CompanyFollowerMapper;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Mapper\CompanySizeMapper;
use LeadersLinked\Model\User;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\UserType;
use LeadersLinked\Mapper\CompanyRoleMapper;


class MyCompaniesController extends AbstractActionController
{
    /**
     *
     * @var AdapterInterface
     */
    private $adapter;
    
    
    /**
     *
     * @var AbstractAdapter
     */
    private $cache;
    
    /**
     *
     * @var  LoggerInterface
     */
    private $logger;

    
    /**
     *
     * @var array
     */
    private $config;
    
    /**
     *
     * @param AdapterInterface $adapter
     * @param AbstractAdapter $cache
     * @param LoggerInterface $logger
     * @param array $config
     */
    public function __construct($adapter, $cache , $logger,  $config)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;

    }
    
    /**
     * 
     * Generación del listado de perfiles
     * {@inheritDoc}
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
     */
    public function indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $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');
                    }
                    
                }
            }
            
            if($isJson) {
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
                
                $search = trim(filter_var($this->params()->fromQuery('search', ''), FILTER_SANITIZE_STRING));
                
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                
                $select = $queryMapper->getSql()->select();
                $select->columns(['id', 'uuid', 'name', 'status',  'image', 'status']);
                $select->from(['c' => CompanyMapper::_TABLE]);
                $select->join(['cu' => CompanyUserMapper::_TABLE], 'cu.company_id  = c.id', ['creator']);
                //$select->join(['i' => IndustryMapper::_TABLE], ' i.id = c.industry_id', ['industry' => 'name']);
                //$select->join(['cs' => CompanySizeMapper::_TABLE], 'cs.id = c.company_size_id', ['company_size' => new Expression("concat(minimum_no_of_employee , '-', maximum_no_of_employee)")]);
                $select->where->equalTo('cu.user_id', $currentUser->id);
                $select->where->in('c.status', [Company::STATUS_ACTIVE, Company::STATUS_PENDING]);
                $select->where->in('cu.creator', [CompanyUser::CREATOR_YES]);
                
                if($search) {
                    $select->where->like('c.name', '%' . $search . '%');
                }
                $select->order('name ASC');
                
                //echo $select->getSqlString($this->adapter->platform); exit;

                $records = $queryMapper->fetchAll($select);

                $items = [];
                foreach($records as $record)
                {
                    
                    switch($record['status']) {
                        case  Company::STATUS_ACTIVE :
                            $status = 'LABEL_ACTIVE';
                            break;
                            
                        case  Company::STATUS_PENDING :
                            $status = 'LABEL_PENDING';
                            break;
                            
                        default : 
                            $status = '';
                            break;
                    }

                    $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($record['id'], $currentUser->id);                   
                    if($companyUser && $companyUser->status == CompanyUser::STATUS_ACCEPTED && $companyUser->backend == CompanyUser::BACKEND_YES ) {
                        $link_my_company = $this->url()->fromRoute('backend/signin-company', ['id' => $record['uuid'] ]);
                    } else {
                        $link_my_company = '';
                    } 

                    $item = [
               
                        'name' => $record['name'],
                        'status' => $status,
                        'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $record['uuid'], 'filename' => $record['image']]),
                        'link_my_company' =>  $link_my_company,
                        'link_view' => $this->url()->fromRoute('company/view', ['id' => $record['uuid'] ]),
                    ];
                    
                    array_push($items, $item);
                }

                
                
                $response = [
                    'success' => true,
                    'data' => $items
                ];
                
                return new JsonModel($response);
                
                
            } else {
                $industries = [];
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $records = $industryMapper->fetchAllActives();
                foreach($records as $record)
                {
                    $industries[$record->uuid] = $record->name;
                }
                
                $companySizes = [];
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $records = $companySizeMapper->fetchAllActives();
                foreach($records as $record)
                {
                    $companySizes[$record->uuid] = $record->name . ' ( ' . $record->minimum_no_of_employee . ' - ' . $record->minimum_no_of_employee . ' )';
                }
                
                $formAdd = new CreateForm($this->adapter);
                
                
                
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/my-companies/index.phtml');
                $viewModel->setVariables([
                    'formAdd' => $formAdd,
                    'industries' => $industries,
                    'company_sizes' => $companySizes,
                ]);
                return $viewModel ;
            }
            
        } else {

            
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    /**
     * 
     * Agregar un nuevo perfil
     * @return \Laminas\View\Model\JsonModel
     */
    public function addAction()
    {
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        
        if($request->isPost()) {
            $form = new  CreateForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            

            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $companySize = $companySizeMapper->fetchOneByUuid($dataPost['company_size_id']);
                
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOneByUuid($dataPost['industry_id']);
                
                $hydrator = new ObjectPropertyHydrator();
                $company = new Company();
                $hydrator->hydrate($dataPost, $company);
                
                
                $company->company_size_id =  $companySize->id;
                $company->industry_id = $industry->id;
                $company->foundation_year = date('Y');
                $company->status = Company::STATUS_PENDING;
                $company->description = '';
                
                $currentUserPlugin = $this->plugin('currentUserPlugin');
                $currentUser = $currentUserPlugin->getUser();
                
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $result = $companyMapper->insert($company);

                if($result) {
                    
                    $companyRoleMapper = CompanyRoleMapper::getInstance($this->adapter);
                    

                    
                    
                    /** Creación del fake user propietario de la empresa */
                    $user = new User();
                    $user->email = 'fake-email'.$company->id;
                    $user->first_name = substr($company->name, 0, 64);
                    $user->last_name = substr($company->name, 64);
                    $user->status = User::STATUS_INACTIVE;
                    $user->blocked = User::BLOCKED_YES;
                    $user->login_attempt = 0;
                    $user->email_verified = User::EMAIL_VERIFIED_YES;
                    $user->show_in_search = User::SHOW_IN_SEARCH_NO;
                    $user->password = 'NO-PASSWORD';
                    $user->usertype_id = UserType::COMPANY;

                    $userMapper = UserMapper::getInstance($this->adapter);
                    $userMapper->insert($user);
                    
                    $companyUser = new CompanyUser();
                    $companyUser->company_id = $company->id;
                    $companyUser->user_id = $user->id;
                    $companyUser->owner = CompanyUser::OWNER_YES;
                    $companyUser->creator = CompanyUser::CREATOR_NO;
                    $companyUser->status = CompanyUser::STATUS_ACCEPTED;
                    
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
                    $companyUserMapper->insert($companyUser);
                    
                    /** agregamos el usuario que lo crea como full administrador */
                    $companyUser = new CompanyUser();
                    $companyUser->company_id = $company->id;
                    $companyUser->user_id = $currentUser->id;
                    $companyUser->owner = CompanyUser::OWNER_NO;
                    $companyUser->creator = CompanyUser::CREATOR_YES;
                    $companyUser->status = CompanyUser::STATUS_ACCEPTED;
                    $companyUser->backend = CompanyUser::BACKEND_YES;
                    $companyUserMapper->insert($companyUser);
                    

       
                    $this->logger->info('Se agrego la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                    
                    $data = [
                        'success'   => true,
                        'data'   => 'LABEL_RECORD_ADDED'
                    ];
                } else {
                    $data = [
                        'success'   => false,
                        'data'      => $companyMapper->getError()
                    ];
                    
                }
                
                return new JsonModel($data);
                
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach($form_messages  as $fieldname => $field_messages)
                {
                    
                    $messages[$fieldname] = array_values($field_messages);
                }
                
                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
            
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            
            return new JsonModel($data);
        }
        
        return new JsonModel($data);
    }
    
    /**
     * 
     * Borrar un perfil excepto el público
     * @return \Laminas\View\Model\JsonModel
     */
    
    
   
    


}