public function buildForm(FormBuilderInterface $builder, array $options)
 {
     $this->options = $options;
     $this->institution = $builder->getData();
     $status = InstitutionStatus::getBitValueLabels();
     if (!$this->institution instanceof Institution) {
         throw InstitutionFormException::nonInstitutionFormData(__CLASS__, $this->institution);
     }
     $this->_add($builder, 'name', 'text');
     $this->_add($builder, 'status', 'choice', array('label' => 'Status', 'choices' => $status));
     $this->_add($builder, 'description', 'textarea', array('required' => false));
     $this->_add($builder, 'medicalProviderGroups', 'collection', array('type' => 'medicalProviderGroup_list', 'allow_add' => true, 'allow_delete' => true, 'options' => array('required' => false)));
     $this->_add($builder, 'country', FancyCountryFieldType::NAME, array('label' => 'Country', 'error_bubbling' => false));
     $this->_add($builder, 'city', GlobalCityListType::NAME, array('label' => 'City', 'error_bubbling' => false));
     $this->_add($builder, 'zipCode', 'text', array('label' => 'Zip / Postal Code'));
     $this->_add($builder, 'state', 'state_list', array('label' => 'State / Province'));
     $this->_add($builder, 'contactEmail', 'text', array('label' => 'Email Address ', 'required' => false));
     $this->_add($builder, 'address1', 'detailed_street_address', array('label' => 'Hospital Address'));
     $this->_add($builder, 'addressHint', 'text', array('label' => 'Helpful hint for getting there?', 'required' => false));
     $this->_add($builder, 'contactDetails', 'collection', array('type' => 'simple_contact_detail'));
     $this->_add($builder, 'websites', 'website_custom_field', array('label' => 'Website', 'required' => false));
     $this->_add($builder, 'socialMediaSites', 'social_media_sites_custom_field');
     $this->_add($builder, 'logo', new InstitutionMediaFileType($this->institution->getLogo()));
     $this->_add($builder, 'featuredMedia', new InstitutionMediaFileType($this->institution->getFeaturedMedia()));
     $this->_add($builder, 'coordinates', 'hidden');
     $this->_add($builder, 'type', 'choice', array('label' => 'Institution Type', 'empty_value' => false, 'multiple' => false, 'choices' => InstitutionTypes::getFormChoices()));
 }
 /**
  * Added/Updated recentlyApproved institution type listing. Removed when updated from APPROVED to INACTIVE, SUSPENDED or INACTIVE
  * @param Institution $institution
  */
 function updateInstitutionListing(Institution $institution)
 {
     $criteria = array('institution' => $institution->getId(), 'institutionMedicalCenter' => null);
     $recentlyApprovedListing = $this->em->getRepository('AdminBundle:RecentlyApprovedListing')->findOneBy($criteria);
     if ($recentlyApprovedListing) {
         if ($institution->getStatus() == InstitutionStatus::getBitValueForActiveAndApprovedStatus()) {
             $recentlyApprovedListing->setDateUpdated(new \DateTime());
             $this->em->persist($recentlyApprovedListing);
         } else {
             $this->em->remove($recentlyApprovedListing);
         }
         $this->em->flush();
     } else {
         if ($institution->getStatus() == InstitutionStatus::getBitValueForActiveAndApprovedStatus()) {
             $recentlyApprovedListingService = new RecentlyApprovedListingService();
             $recentlyApprovedListingService->setEntityManager($this->em);
             $recentlyApprovedListing = new RecentlyApprovedListing();
             $recentlyApprovedListing->setInstitution($institution);
             $recentlyApprovedListing->setInstitutionMedicalCenter(null);
             $recentlyApprovedListing->setDateUpdated(new \DateTime());
             $recentlyApprovedListing->setStatus(1);
             $this->em->persist($recentlyApprovedListing);
             $this->em->flush($recentlyApprovedListing);
         }
     }
 }
 function setFilterOptions()
 {
     $statusOptions = array(ListFilter::FILTER_KEY_ALL => ListFilter::FILTER_LABEL_ALL) + InstitutionStatus::getBitValueLabels();
     $this->setNameFilterOption();
     $this->setPayingClientOption();
     $this->setCountryFilterOption();
     $this->setTypeFilterOption();
     $this->setStatusFilterOption($statusOptions);
 }
 function setInstitutionFilterOption()
 {
     $qb = $this->doctrine->getEntityManager()->createQueryBuilder();
     $qb->select('a.id, a.name')->from('InstitutionBundle:Institution', 'a')->where('a.status = :status')->orderBy('a.name', 'ASC')->setParameter('status', InstitutionStatus::getBitValueForActiveAndApprovedStatus());
     $institutions = $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);
     $options = array(ListFilter::FILTER_KEY_ALL => ListFilter::FILTER_LABEL_ALL);
     foreach ($institutions as $each) {
         $options[$each['id']] = $each['name'];
     }
     $this->filterOptions['institution'] = array('label' => 'Institution', 'selected' => $this->queryParams['institution'], 'options' => $options);
 }
 function setFilteredResults()
 {
     $this->queryBuilder = $this->doctrine->getEntityManager()->createQueryBuilder();
     $this->queryBuilder->select('a, inst')->from('InstitutionBundle:InstitutionMedicalCenter', 'a')->innerJoin('a.institution', 'inst');
     $this->queryBuilder->andWhere('inst.status = :approved_status')->setParameter('approved_status', InstitutionStatus::getBitValueForApprovedStatus());
     $name = \trim($this->queryParams['name']);
     if ('' != $name) {
         $this->queryBuilder->andWhere('inst.name LIKE :name')->setParameter('name', "%{$name}%");
     }
     if ($this->queryParams['country'] != ListFilter::FILTER_KEY_ALL) {
         $this->queryBuilder->andWhere('inst.country = :country');
         $this->queryBuilder->setParameter('country', $this->queryParams['country']);
     }
     if ($this->queryParams['city'] != ListFilter::FILTER_KEY_ALL) {
         $this->queryBuilder->andWhere('inst.city = :city');
         $this->queryBuilder->setParameter('city', $this->queryParams['city']);
     }
     $sortBy = $this->sortBy ? $this->sortBy : 'name';
     $sort = "a.{$sortBy} " . $this->sortOrder;
     $this->queryBuilder->add('orderBy', $sort);
     $this->pagerAdapter->setQueryBuilder($this->queryBuilder);
     $this->filteredResult = $this->pager->getResults();
 }
 public function getAllInstitutionByParams($params)
 {
     $query = $this->createQueryBuilder('a')->where('a.status = :status')->andWhere('a.name LIKE :searchTerm')->setParameter('status', InstitutionStatus::getBitValueForActiveAndApprovedStatus())->setParameter('searchTerm', '%' . $params['searchTerm'] . '%');
     if ($params['countryId'] != 'all') {
         $query->andWhere('a.country = :country')->setParameter('country', $params['countryId']);
     }
     if ($params['cityId'] != 'all') {
         $query->andWhere('a.city = :city')->setParameter('city', $params['cityId']);
     }
     $query = $query->orderBy('a.name');
     return $query->getQuery()->getResult();
 }
 /**
  * Get the top specializations and treatments for specified city
  *
  * @param unknown $country
  * @param number $max
  * @return multitype:unknown
  */
 public function getCityTopTreatments($city, $max = 5)
 {
     $connection = $this->getEntityManager()->getConnection();
     if (is_object($city)) {
         $city = $city->getId();
     }
     $stmt = $connection->prepare('
         SELECT b.id, b.name AS name, b.slug AS specialization_slug, COUNT(DISTINCT d.city_id) AS count
         FROM institution_specializations a
         LEFT JOIN specializations b ON a.specialization_id = b.id
         INNER JOIN institution_medical_centers c ON a.institution_medical_center_id = c.id
         LEFT JOIN institutions AS d ON c.institution_id = d.id
         WHERE d.city_id = :city
         AND d.status = :institutionStatus
         AND c.status = :imcStatus
         GROUP BY b.id
         ORDER BY count DESC
         LIMIT :max
    ');
     $stmt->bindValue('institutionStatus', InstitutionStatus::getBitValueForActiveAndApprovedStatus(), \PDO::PARAM_INT);
     $stmt->bindValue('imcStatus', InstitutionMedicalCenterStatus::APPROVED, \PDO::PARAM_INT);
     $stmt->bindValue('city', $city, \PDO::PARAM_INT);
     $stmt->bindValue('max', $max, \PDO::PARAM_INT);
     $stmt->execute();
     $topSpecializations = $stmt->fetchAll();
     $stmt = $connection->prepare('
         SELECT c.id, c.name AS name, c.slug AS treatment_slug, COUNT(DISTINCT e.city_id) AS count, z.slug AS specialization_slug
         FROM institution_specializations a
         INNER JOIN institution_treatments b ON a.id = b.institution_specialization_id
         LEFT JOIN treatments c ON b.treatment_id = c.id
         INNER JOIN institution_medical_centers d ON a.institution_medical_center_id = d.id
         LEFT JOIN institutions AS e ON d.institution_id = e.id
         LEFT JOIN specializations AS z ON a.specialization_id = z.id
         WHERE e.city_id = :city
         AND c.id IS NOT NULL
         AND e.status = :institutionStatus
         AND d.status = :imcStatus
         GROUP BY c.id
         ORDER BY count DESC
         LIMIT :max
    ');
     $stmt->bindValue('institutionStatus', InstitutionStatus::getBitValueForActiveAndApprovedStatus(), \PDO::PARAM_INT);
     $stmt->bindValue('imcStatus', InstitutionMedicalCenterStatus::APPROVED, \PDO::PARAM_INT);
     $stmt->bindValue('city', $city, \PDO::PARAM_INT);
     $stmt->bindValue('max', $max, \PDO::PARAM_INT);
     $stmt->execute();
     $topTreatments = $stmt->fetchAll();
     return array($topSpecializations, $topTreatments);
 }
 /**
  * Check if the $institution is Approved
  *
  * @param Institution $institution
  * @return boolean
  * @author acgvelarde
  */
 public function isApproved(Institution $institution)
 {
     return $institution->getStatus() == InstitutionStatus::getBitValueForApprovedStatus();
 }
 /**
  * 
  * @return \Doctrine\ORM\QueryBuilder
  */
 private function getQueryBuilderForInstitutionPublicProfileData()
 {
     $qb = $this->doctrine->getEntityManager()->createQueryBuilder();
     $qb->select('inst, imc, ct, co, st, icd, fm, lg')->from('InstitutionBundle:Institution', 'inst')->innerJoin('inst.institutionMedicalCenters', 'imc', Join::WITH, 'imc.status = :imcActiveStatus')->setParameter('imcActiveStatus', InstitutionMedicalCenterStatus::APPROVED)->leftJoin('inst.city', 'ct')->leftJoin('inst.country', 'co')->leftJoin('inst.state', 'st')->leftJoin('inst.contactDetails', 'icd')->leftJoin('inst.featuredMedia', 'fm')->leftJoin('inst.logo', 'lg')->where('1=1')->andWhere('inst.status = :activeStatus')->setParameter('activeStatus', InstitutionStatus::getBitValueForApprovedStatus());
     return $qb;
 }
 /**
  * Get query builder for a fully eagerloaded medical center
  * 
  * @return \Doctrine\ORM\QueryBuilder
  */
 private function getQueryBuilderForFullInstitutionMedicalCenterProfile()
 {
     $qb = $this->doctrine->getEntityManager()->createQueryBuilder();
     $qb->select('imc, inst, co, st, ct, inst_lg, imc_lg, inst_fm, imc_m, imc_cd, imc_bh, inst_sp, sp, sp_lg, tr, sub_sp')->from('InstitutionBundle:InstitutionMedicalCenter', 'imc')->innerJoin('imc.institution', 'inst')->leftJoin('inst.country', 'co')->leftJoin('inst.state', 'st')->leftJoin('inst.city', 'ct')->leftJoin('inst.logo', 'inst_lg')->leftJoin('inst.featuredMedia', 'inst_fm')->leftJoin('imc.logo', 'imc_lg')->leftJoin('imc.media', 'imc_m')->leftJoin('imc.contactDetails', 'imc_cd')->leftJoin('imc.businessHours', 'imc_bh')->leftJoin('imc.institutionSpecializations', 'inst_sp')->leftJoin('inst_sp.specialization', 'sp')->leftJoin('sp.media', 'sp_lg')->leftJoin('sp.treatments', 'tr')->leftJoin('tr.subSpecializations', 'sub_sp')->where('1=1')->andWhere('imc.status = :imcActiveStatus')->setParameter('imcActiveStatus', InstitutionMedicalCenterStatus::APPROVED)->andWhere('inst.status = :instActiveStatus')->setParameter('instActiveStatus', InstitutionStatus::getBitValueForApprovedStatus());
     return $qb;
 }
 /**
  * Add Institution Details, step 2 when creating new institution
  * 
  * @param Request $request
  * @return \Symfony\Component\HttpFoundation\Response
  * @author Chaztine Blance
  */
 public function addDetailsAction(Request $request)
 {
     $medicalProviderGroup = $this->getDoctrine()->getRepository('InstitutionBundle:MedicalProviderGroup')->getActiveMedicalGroups();
     $medicalProviderGroupArr = array();
     foreach ($medicalProviderGroup as $e) {
         $medicalProviderGroupArr[] = array('value' => $e->getName(), 'id' => $e->getId());
     }
     $this->get('services.contact_detail')->initializeContactDetails($this->institution, array(ContactDetailTypes::PHONE));
     $this->institution->setName('');
     //set institution name to empty
     // redirect to edit institution if status is already active
     if ($this->get('services.institution')->isActive($this->institution)) {
         return $this->redirect($this->generateUrl('admin_institution_edit_details', array('institutionId' => $this->institution->getId())));
     }
     if ($request->isMethod('GET')) {
         $form = $this->createForm(new InstitutionProfileFormType(), $this->institution);
     }
     if ($request->isMethod('POST')) {
         $formVariables = $request->get(InstitutionProfileFormType::NAME);
         unset($formVariables['_token']);
         $removedFields = \array_diff(InstitutionProfileFormType::getFieldNames(), array_keys($formVariables));
         $form = $this->createForm(new InstitutionProfileFormType(), $this->institution, array(InstitutionProfileFormType::OPTION_HIDDEN_FIELDS => array(''), InstitutionProfileFormType::OPTION_BUBBLE_ALL_ERRORS => false, InstitutionProfileFormType::OPTION_REMOVED_FIELDS => $removedFields));
         $formRequestData = $request->get($form->getName());
         if (isset($formRequestData['medicalProviderGroups'])) {
             // we always expect 1 medical provider group
             // if it is empty remove it from the array
             if (isset($formRequestData['medicalProviderGroups'][0]) && '' == trim($formRequestData['medicalProviderGroups'][0])) {
                 unset($formRequestData['medicalProviderGroups'][0]);
             }
         }
         $form->bind($formRequestData);
         if ($form->isValid()) {
             $institution = $form->getData();
             // update the sign up step status
             $institution->setSignupStepStatus(0);
             // update to active status
             $institution->setStatus(InstitutionStatus::getBitValueForActiveStatus());
             $this->get('services.contact_detail')->removeInvalidContactDetails($institution);
             $this->get('services.institution.factory')->save($institution);
             $this->get('session')->setFlash('notice', "Successfully completed details of {$institution->getName()}.");
             return $this->redirect($this->generateUrl('admin_institution_view', array('institutionId' => $this->institution->getId())));
         }
     }
     return $this->render('AdminBundle:Institution:addDetails.html.twig', array('form' => $form->createView(), 'institution' => $this->institution, 'id' => $this->institution->getId(), 'medicalProvidersJSON' => \json_encode($medicalProviderGroupArr)));
 }
 /**
  * Sign up page handler
  *
  * @param Request $request
  */
 public function signUpAction(Request $request)
 {
     $error_message = '';
     $success = false;
     // checking for security context here does not work since this is not firewalled
     // TODO: find a better approach
     //         if ($this->get('session')->get('institutionId')) {
     // redirect to dashboard if there is an active session
     //return $this->redirect($this->generateUrl('institution_homepage'));
     //         }
     $factory = $this->get('services.institution.factory');
     $institution = $factory->createInstance();
     $institutionUser = new InstitutionUser();
     $this->get('services.contact_detail')->initializeContactDetails($institutionUser, array(ContactDetailTypes::PHONE, ContactDetailTypes::MOBILE));
     $form = $this->createForm(new InstitutionUserSignUpFormType(), $institutionUser);
     if ($request->isMethod('POST')) {
         $form->bind($request);
         if ($form->isValid()) {
             $postData = $request->get('institutionUserSignUp');
             $institutionUser = $form->getData();
             // initialize required database fields
             $institution->setName(uniqid());
             $institution->setAddress1('');
             $institution->setContactEmail('');
             $institution->setContactNumber('');
             $institution->setDescription('');
             $institution->setCoordinates('');
             $institution->setType(trim($postData['type']));
             /* FIX ME! */
             $institution->setState(null);
             $institution->setWebsites('');
             $institution->setStatus(InstitutionStatus::getBitValueForInactiveStatus());
             $institution->setZipCode('');
             $institution->setSignupStepStatus(1);
             // this is always the first step
             $factory->save($institution);
             $institutionUserService = $this->get('services.institution_user');
             // create Institution user
             $institutionUser->setEmail($form->get('email')->getData());
             $institutionUser->setFirstName($form->get('firstName')->getData());
             $institutionUser->setLastName($form->get('lastName')->getData());
             $institutionUser->setContactNumber('');
             $institutionUser->setPassword($institutionUserService->encryptPassword($form->get('password')->getData()));
             $institutionUser->setJobTitle($form->get('jobTitle')->getData());
             $institutionUser->setInstitution($institution);
             $institutionUser->setStatus(SiteUser::STATUS_ACTIVE);
             $this->get('services.contact_detail')->removeInvalidContactDetails($institutionUser);
             // dispatch event
             $this->get('event_dispatcher')->dispatch(InstitutionBundleEvents::ON_ADD_INSTITUTION, $this->get('events.factory')->create(InstitutionBundleEvents::ON_ADD_INSTITUTION, $institution, array('institutionUser' => $institutionUser)));
             // auto login
             $roles = $institutionUserService->getUserRolesForSecurityToken($institutionUser);
             $securityToken = new UsernamePasswordToken($institutionUser, $institutionUser->getPassword(), 'institution_secured_area', $roles);
             $this->get('session')->set('_security_institution_secured_area', \serialize($securityToken));
             $this->get('security.context')->setToken($securityToken);
             $institutionUserService->setSessionVariables($institutionUser);
             // commented out due to duplicate messages
             $request->getSession()->setFlash('callout', "");
             return $this->redirect($this->generateUrl('institution_signup_setup_profile'));
         } else {
             $request->getSession()->setFlash('error', "We need you to correct some of your input. Please check the fields in red.");
         }
     }
     return $this->render('InstitutionBundle:SignUp:signUp.html.twig', array('form' => $form->createView(), 'institutionTypes' => InstitutionTypes::getFormChoices()));
 }
    }
    public static function getBitValueForActiveAndApprovedStatus()
    {
        return self::ACTIVE | self::APPROVED;
    }
    /**
     * Get bit value of status
     * @param int $status
     */
    public static function getBitValue($status)
    {
        return \array_key_exists($status, static::$bits) ? static::$bits[$status] : null;
    }
    public static function getBitValueLabels()
    {
        return static::$bitValueLabels;
    }
    public static function _setStaticValues()
    {
        static::$bits = array(self::ACTIVE => self::ACTIVE, self::INACTIVE => self::INACTIVE, self::APPROVED => self::ACTIVE + self::APPROVED, self::UNAPPROVED => self::ACTIVE + self::UNAPPROVED, self::SUSPENDED => self::ACTIVE + self::SUSPENDED);
        $list = static::getStatusList();
        static::$bitValueLabels = array();
        foreach (static::$bits as $key => $v) {
            if (\array_key_exists($key, $list)) {
                static::$bitValueLabels[$v] = $list[$key];
            }
        }
    }
}
InstitutionStatus::_setStaticValues();
 private function searchCitiesByNameWithTreatment(SearchParameterBag $searchParams)
 {
     $connection = $this->container->get('doctrine')->getEntityManager()->getConnection();
     $treatmentId = null;
     $name = '"%' . $searchParams->get('searchedTerm') . '%"';
     $institutionStatus = InstitutionStatus::getBitValueForActiveAndApprovedStatus();
     $imcStatus = InstitutionMedicalCenterStatus::APPROVED;
     switch ($searchParams->get('treatmentType')) {
         case 'specialization':
             $treatmentId = $searchParams->get('specializationId');
             $sql = "\n                    SELECT a.id AS city_id, a.name AS city_name, b.id AS country_id, b.name AS country_name\n                    FROM cities AS a\n                    LEFT JOIN countries AS b ON a.country_id = b.id\n                    INNER JOIN institutions AS c ON a.id = c.city_id AND b.id = c.country_id\n                    INNER JOIN institution_medical_centers AS d ON c.id = d.institution_id\n                    INNER JOIN institution_specializations AS e ON d.id = e.institution_medical_center_id\n                    WHERE a.name LIKE {$name}\n                    AND c.status = {$institutionStatus}\n                    AND d.status = {$imcStatus}\n                    AND e.specialization_id = {$treatmentId}\n                ";
             break;
         case 'subSpecialization':
             $treatmentId = $searchParams->get('subSpecializationId');
             $sql = "\n                    SELECT a.id AS city_id, a.name AS city_name, b.id AS country_id, b.name AS country_name\n                    FROM cities AS a\n                    LEFT JOIN countries AS b ON a.country_id = b.id\n                    INNER JOIN institutions AS c ON a.id = c.city_id AND b.id = c.country_id\n                    INNER JOIN institution_medical_centers AS d ON c.id = d.institution_id\n                    INNER JOIN institution_specializations AS e ON d.id = e.institution_medical_center_id\n                    INNER JOIN institution_treatments AS f ON f.specialization_id = e.id\n                    LEFT JOIN treatments AS g ON f.treatment_id = g.id\n                    INNER JOIN treatment_sub_specializations AS h ON g.id = h.treatment_id\n                    WHERE a.name LIKE {$name}\n                    AND c.status = {$institutionStatus}\n                    AND d.status = {$imcStatus}\n                    AND h.sub_specialization_id = {$treatmentId}\n                ";
             break;
         case 'treatment':
             $treatmentId = $searchParams->get('treatmentId');
             $sql = "\n                    SELECT a.id AS city_id, a.name AS city_name, b.id AS country_id, b.name AS country_name\n                    FROM cities AS a\n                    LEFT JOIN countries AS b ON a.country_id = b.id\n                    INNER JOIN institutions AS c ON a.id = c.city_id AND b.id = c.country_id\n                    INNER JOIN institution_medical_centers AS d ON c.id = d.institution_id\n                    INNER JOIN institution_specializations AS e ON d.id = e.institution_medical_center_id\n                    INNER JOIN institution_treatments AS f ON f.specialization_id = e.id\n                    WHERE a.name LIKE {$name}\n                    AND c.status = {$institutionStatus}\n                    AND d.status = {$imcStatus}\n                    AND f.treatment_id = {$treatmentId}\n                ";
             break;
     }
     $stmt = $connection->executeQuery($sql);
     //TODO: use prepared statements. there seems to be a bug though: the code
     //below will return an empty result
     //         $stmt = $connection->prepare($sql);
     //         $stmt->bindValue('name', '"%'.$searchParams->get('term').'%"');
     //         $stmt->bindValue('treatmentId', $treatmentId, \PDO::PARAM_INT);
     //$stmt->bindValue('institutionStatus', InstitutionStatus::INACTIVE, \PDO::PARAM_INT);
     return $stmt->fetchAll();
 }