protected function updateCollections(ICompanyService $implementation, array $data)
 {
     $implementation = parent::updateCollections($implementation, $data);
     if (array_key_exists('guest_os', $data) && is_array($data['guest_os'])) {
         $data_guests = $data['guest_os'];
         foreach ($data_guests as $guest_id) {
             $this->registerGuest($implementation, $guest_id);
         }
     }
     //add hyper visors
     if (array_key_exists('hypervisors', $data) && is_array($data['hypervisors'])) {
         $data_hypervisors = $data['hypervisors'];
         foreach ($data_hypervisors as $hypervisor_id) {
             $this->registerHyperVisor($implementation, $hypervisor_id);
         }
     }
     //add capabilities
     if (array_key_exists('capabilities', $data) && is_array($data['capabilities'])) {
         $data_capabilities = $data['capabilities'];
         foreach ($data_capabilities as $capability_data) {
             $this->addCapability($capability_data, $implementation);
         }
     }
     return $implementation;
 }
 /**
  * @param ICompanyService $consultant
  * @param array $data
  * @return ICompanyService|void
  * @throws EntityValidationException
  * @throws NotFoundEntityException
  */
 protected function updateCollections(ICompanyService $consultant, array $data)
 {
     $consultant = parent::updateCollections($consultant, $data);
     //languages
     if (array_key_exists('languages_spoken', $data) && is_array($data['languages_spoken'])) {
         $languages_data = $data['languages_spoken'];
         $lang_order = 0;
         foreach ($languages_data as $language_name) {
             $language = $this->language_repository->getByName($language_name);
             if (!$language) {
                 $language = $this->factory->buildSpokenLanguage($language_name);
                 $this->language_repository->add($language);
             }
             $consultant->addSpokenLanguages($language, $lang_order++);
         }
     }
     //config management
     if (array_key_exists('configuration_management', $data) && is_array($data['configuration_management'])) {
         $configuration_management_expertise_data = $data['configuration_management'];
         foreach ($configuration_management_expertise_data as $config_id) {
             $config = $this->configuration_management_expertise_repository->getById($config_id);
             if (!$config) {
                 throw new NotFoundEntityException('ConfigurationManagementType', sprintf(' id %s', $config_id));
             }
             $consultant->addConfigurationManagementExpertise($config);
         }
     }
     //services offered
     if (array_key_exists('services_offered', $data) && is_array($data['services_offered'])) {
         $services_offered_data = $data['services_offered'];
         foreach ($services_offered_data as $service_data) {
             $service = $this->service_offered_repository->getById(intval($service_data['id']));
             if (!$service) {
                 throw new NotFoundEntityException('ConsultantServiceOfferedType', sprintf(' id %s', intval($service['id'])));
             }
             if (array_key_exists('regions', $service_data) && is_array($service_data['regions'])) {
                 $regions = $service_data['regions'];
                 foreach ($regions as $region_id) {
                     $region = $this->region_repository->getById(intval($region_id));
                     if (!$region) {
                         throw new NotFoundEntityException('Region', sprintf(' id %s', intval($region_id)));
                     }
                     $consultant->addServiceOffered($service, $region);
                 }
             }
         }
     }
     //Areas of OpenStack Expertise
     if (array_key_exists('expertise_areas', $data) && is_array($data['expertise_areas'])) {
         $expertise_areas_data = $data['expertise_areas'];
         foreach ($expertise_areas_data as $expertise_area_id) {
             $component = $this->component_repository->getById(intval($expertise_area_id));
             if (!$component) {
                 throw new NotFoundEntityException('OpenStackComponent', sprintf(' id %s', intval($expertise_area_id)));
             }
             $consultant->addExpertiseArea($component);
         }
     }
     //Reference Clients
     if (array_key_exists('reference_clients', $data) && is_array($data['reference_clients'])) {
         $reference_clients_data = $data['reference_clients'];
         foreach ($reference_clients_data as $client_name) {
             $client = $this->factory->buildClient(trim($client_name));
             $consultant->addPreviousClients($client);
         }
     }
     //Offices
     if (array_key_exists('offices', $data) && is_array($data['offices'])) {
         $reference_offices_data = $data['offices'];
         foreach ($reference_offices_data as $office_data) {
             $validator = $this->validator_factory->buildValidatorForOffice($office_data);
             if ($validator->fails()) {
                 return $this->validationError($validator->messages());
             }
             $address_info = new AddressInfo($office_data['address_1'], $office_data['address_2'], $office_data['zip_code'], $office_data['state'], $office_data['city'], $office_data['country']);
             //list($lat,$lng) = $this->geo_coding_service->getAddressCoordinates($address_info);
             $office = $this->factory->buildOffice($address_info);
             $office->setLat((double) $office_data['lat']);
             $office->setLng((double) $office_data['lng']);
             $consultant->addOffice($office);
         }
     }
     return $consultant;
 }