function editDetails($slug, Request $request, Application $app)
 {
     if (!$this->build($slug, $request, $app)) {
         $app->abort(404, "Venue does not exist.");
     }
     if ($this->parameters['venue']->getIsDeleted()) {
         die("No");
         // TODO
     }
     $form = $app['form.factory']->create(new VenueEditForm($app), $this->parameters['venue']);
     if ('POST' == $request->getMethod()) {
         $form->bind($request);
         if ($form->isValid()) {
             $area = null;
             if (is_array($request->request->get('areas'))) {
                 $areaRepository = new AreaRepository();
                 $countryRepository = new CountryRepository();
                 foreach ($request->request->get('areas') as $areaCode) {
                     if (substr($areaCode, 0, 9) == 'EXISTING:') {
                         $area = $areaRepository->loadBySlug($app['currentSite'], substr($areaCode, 9));
                     } else {
                         if (substr($areaCode, 0, 4) == 'NEW:' && $app['currentUserPermissions']->hasPermission('org.openacalendar', 'AREAS_CHANGE')) {
                             $newArea = new AreaModel();
                             $newArea->setTitle(substr($areaCode, 4));
                             $areaRepository->create($newArea, $area, $app['currentSite'], $this->parameters['country'], $app['currentUser']);
                             $areaRepository->buildCacheAreaHasParent($newArea);
                             $area = $newArea;
                         }
                     }
                 }
             }
             if ($area) {
                 $this->parameters['venue']->setAreaId($area->getId());
             } else {
                 $this->parameters['venue']->setAreaId(null);
             }
             foreach ($app['extensions']->getExtensionsIncludingCore() as $extension) {
                 $extension->addDetailsToVenue($this->parameters['venue']);
             }
             $venueEditMetaData = new VenueEditMetaDataModel();
             $venueEditMetaData->setUserAccount($app['currentUser']);
             if ($form->has('edit_comment')) {
                 $venueEditMetaData->setEditComment($form->get('edit_comment')->getData());
             }
             $venueEditMetaData->setFromRequest($request);
             $venueRepository = new VenueRepository();
             $venueRepository->editWithMetaData($this->parameters['venue'], $venueEditMetaData);
             return $app->redirect("/venue/" . $this->parameters['venue']->getSlugForURL());
         }
     }
     $this->parameters['form'] = $form->createView();
     return $app['twig']->render('site/venue/edit.html.twig', $this->parameters);
 }
 public function update(VenueModel $venue, $fields, VenueEditMetaDataModel $venueEditMetaDataModel)
 {
     $alreadyInTransaction = $this->db->inTransaction();
     // Make Information Data
     $fieldsSQL1 = array();
     $fieldsParams1 = array('id' => $venue->getId());
     foreach ($fields as $field) {
         $fieldsSQL1[] = " " . $field . "=:" . $field . " ";
         if ($field == 'title') {
             $fieldsParams1['title'] = substr($venue->getTitle(), 0, VARCHAR_COLUMN_LENGTH_USED);
         } else {
             if ($field == 'lat') {
                 $fieldsParams1['lat'] = $venue->getLat();
             } else {
                 if ($field == 'lng') {
                     $fieldsParams1['lng'] = $venue->getLng();
                 } else {
                     if ($field == 'description') {
                         $fieldsParams1['description'] = $venue->getDescription();
                     } else {
                         if ($field == 'address') {
                             $fieldsParams1['address'] = $venue->getAddress();
                         } else {
                             if ($field == 'address_code') {
                                 $fieldsParams1['address_code'] = substr($venue->getAddressCode(), 0, VARCHAR_COLUMN_LENGTH_USED);
                             } else {
                                 if ($field == 'country_id') {
                                     $fieldsParams1['country_id'] = $venue->getCountryId();
                                 } else {
                                     if ($field == 'area_id') {
                                         $fieldsParams1['area_id'] = $venue->getAreaId();
                                     } else {
                                         if ($field == 'is_duplicate_of_id') {
                                             $fieldsParams1['is_duplicate_of_id'] = $venue->getIsDuplicateOfId();
                                         } else {
                                             if ($field == 'is_deleted') {
                                                 $fieldsParams1['is_deleted'] = $venue->getIsDeleted() ? 1 : 0;
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // Make History Data
     $fieldsSQL2 = array('venue_id', 'user_account_id', 'created_at', 'approved_at');
     $fieldsSQLParams2 = array(':venue_id', ':user_account_id', ':created_at', ':approved_at');
     $fieldsParams2 = array('venue_id' => $venue->getId(), 'user_account_id' => $venueEditMetaDataModel->getUserAccount() ? $venueEditMetaDataModel->getUserAccount()->getId() : null, 'created_at' => $this->timesource->getFormattedForDataBase(), 'approved_at' => $this->timesource->getFormattedForDataBase());
     if ($venueEditMetaDataModel->getEditComment()) {
         $fieldsSQL2[] = ' edit_comment ';
         $fieldsSQLParams2[] = ' :edit_comment ';
         $fieldsParams2['edit_comment'] = $venueEditMetaDataModel->getEditComment();
     }
     foreach ($this->possibleFields as $field) {
         if (in_array($field, $fields) || $field == 'title') {
             $fieldsSQL2[] = " " . $field . " ";
             $fieldsSQLParams2[] = " :" . $field . " ";
             if ($field == 'title') {
                 $fieldsParams2['title'] = substr($venue->getTitle(), 0, VARCHAR_COLUMN_LENGTH_USED);
             } else {
                 if ($field == 'lat') {
                     $fieldsParams2['lat'] = $venue->getLat();
                 } else {
                     if ($field == 'lng') {
                         $fieldsParams2['lng'] = $venue->getLng();
                     } else {
                         if ($field == 'description') {
                             $fieldsParams2['description'] = $venue->getDescription();
                         } else {
                             if ($field == 'address') {
                                 $fieldsParams2['address'] = $venue->getAddress();
                             } else {
                                 if ($field == 'address_code') {
                                     $fieldsParams2['address_code'] = substr($venue->getAddressCode(), 0, VARCHAR_COLUMN_LENGTH_USED);
                                 } else {
                                     if ($field == 'country_id') {
                                         $fieldsParams2['country_id'] = $venue->getCountryId();
                                     } else {
                                         if ($field == 'area_id') {
                                             $fieldsParams2['area_id'] = $venue->getAreaId();
                                         } else {
                                             if ($field == 'is_duplicate_of_id') {
                                                 $fieldsParams2['is_duplicate_of_id'] = $venue->getIsDuplicateOfId();
                                             } else {
                                                 if ($field == 'is_deleted') {
                                                     $fieldsParams2['is_deleted'] = $venue->getIsDeleted() ? 1 : 0;
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             $fieldsSQL2[] = " " . $field . "_changed ";
             $fieldsSQLParams2[] = " 0 ";
         } else {
             $fieldsSQL2[] = " " . $field . "_changed ";
             $fieldsSQLParams2[] = " -2 ";
         }
     }
     try {
         if (!$alreadyInTransaction) {
             $this->db->beginTransaction();
         }
         // Information SQL
         $stat = $this->db->prepare("UPDATE venue_information  SET " . implode(",", $fieldsSQL1) . " WHERE id=:id");
         $stat->execute($fieldsParams1);
         // History SQL
         $stat = $this->db->prepare("INSERT INTO venue_history (" . implode(",", $fieldsSQL2) . ") VALUES (" . implode(",", $fieldsSQLParams2) . ")");
         $stat->execute($fieldsParams2);
         if (!$alreadyInTransaction) {
             $this->db->commit();
         }
     } catch (Exception $e) {
         if (!$alreadyInTransaction) {
             $this->db->rollBack();
         }
         throw $e;
     }
 }
 function newVenue(Request $request, Application $app)
 {
     $areaRepository = new AreaRepository();
     $countryRepository = new CountryRepository();
     $venue = new VenueModel();
     $this->parameters = array('country' => null, 'parentAreas' => array(), 'area' => null, 'childAreas' => array(), 'startAreaBrowserFromScratch' => true);
     if (isset($_GET['area_id'])) {
         $ar = new AreaRepository();
         $this->parameters['area'] = $ar->loadBySlug($app['currentSite'], $_GET['area_id']);
         if ($this->parameters['area']) {
             $checkArea = $this->parameters['area']->getParentAreaId() ? $ar->loadById($this->parameters['area']->getParentAreaId()) : null;
             while ($checkArea) {
                 array_unshift($this->parameters['parentAreas'], $checkArea);
                 $checkArea = $checkArea->getParentAreaId() ? $ar->loadById($checkArea->getParentAreaId()) : null;
             }
             $cr = new CountryRepository();
             $this->parameters['country'] = $cr->loadById($this->parameters['area']->getCountryID());
             $venue->setCountryId($this->parameters['country']->getId());
             $areaRepoBuilder = new AreaRepositoryBuilder();
             $areaRepoBuilder->setSite($app['currentSite']);
             $areaRepoBuilder->setCountry($this->parameters['country']);
             $areaRepoBuilder->setParentArea($this->parameters['area']);
             $areaRepoBuilder->setIncludeDeleted(false);
             $this->parameters['childAreas'] = $areaRepoBuilder->fetchAll();
             $this->parameters['startAreaBrowserFromScratch'] = false;
         }
     }
     $form = $app['form.factory']->create(new VenueNewForm($app['currentTimeZone'], $app), $venue);
     if ('POST' == $request->getMethod()) {
         $form->bind($request);
         if ($form->isValid()) {
             $postAreas = $request->request->get('areas');
             if (is_array($postAreas)) {
                 $area = null;
                 foreach ($postAreas as $areaCode) {
                     if (substr($areaCode, 0, 9) == 'EXISTING:') {
                         $area = $areaRepository->loadBySlug($app['currentSite'], substr($areaCode, 9));
                     } else {
                         if (substr($areaCode, 0, 4) == 'NEW:' && $app['currentUserPermissions']->hasPermission('org.openacalendar', 'AREAS_CHANGE')) {
                             $newArea = new AreaModel();
                             $newArea->setTitle(substr($areaCode, 4));
                             $areaRepository->create($newArea, $area, $app['currentSite'], $countryRepository->loadById($venue->getCountryId()), $app['currentUser']);
                             $areaRepository->buildCacheAreaHasParent($newArea);
                             $area = $newArea;
                         }
                     }
                 }
                 if ($area) {
                     $venue->setAreaId($area->getId());
                 }
             }
             foreach ($app['extensions']->getExtensionsIncludingCore() as $extension) {
                 $extension->addDetailsToVenue($venue);
             }
             $venueEditMetaData = new VenueEditMetaDataModel();
             $venueEditMetaData->setUserAccount($app['currentUser']);
             if ($form->has('edit_comment')) {
                 $venueEditMetaData->setEditComment($form->get('edit_comment')->getData());
             }
             $venueRepository = new VenueRepository();
             $venueRepository->createWithMetaData($venue, $app['currentSite'], $venueEditMetaData);
             return $app->redirect("/venue/" . $venue->getSlug());
         }
     }
     $this->parameters['form'] = $form->createView();
     return $app['twig']->render('site/venuenew/new.html.twig', $this->parameters);
 }
 public function markDuplicateWithMetaData(AreaModel $duplicateArea, AreaModel $originalArea, AreaEditMetaDataModel $areaEditMetaDataModel)
 {
     global $DB;
     if ($duplicateArea->getId() == $originalArea->getId()) {
         return;
     }
     try {
         $DB->beginTransaction();
         $duplicateArea->setIsDuplicateOfId($originalArea->getId());
         $duplicateArea->setIsDeleted(true);
         $this->areaDBAccess->update($duplicateArea, array('is_duplicate_of_id', 'is_deleted'), $areaEditMetaDataModel);
         // Move Venues
         $venueDBAccess = new VenueDBAccess($DB, new \TimeSource());
         $vrb = new VenueRepositoryBuilder();
         $vrb->setArea($duplicateArea);
         $venueEditMetaData = new VenueEditMetaDataModel();
         $venueEditMetaData->setUserAccount($areaEditMetaDataModel->getUserAccount());
         foreach ($vrb->fetchAll() as $venue) {
             $venue->setAreaId($originalArea->getId());
             $venueDBAccess->update($venue, array('area_id'), $venueEditMetaData);
         }
         // Move Events
         $eventRepoBuilder = new EventRepositoryBuilder();
         $eventRepoBuilder->setArea($duplicateArea);
         $eventDBAccess = new EventDBAccess($DB, new \TimeSource());
         $eventEditMetaData = new EventEditMetaDataModel();
         $eventEditMetaData->setUserAccount($areaEditMetaDataModel->getUserAccount());
         foreach ($eventRepoBuilder->fetchAll() as $event) {
             // Check Area actually matches here because we may get events at a venue.
             // Based on the order we do things in (ie Move Venue, Move Event) we shouldn't but let's be safe.
             if ($event->getAreaId() == $duplicateArea->getId() && $event->getVenueId() == null) {
                 $event->setAreaId($originalArea->getId());
                 $eventDBAccess->update($event, array('area_id'), $eventEditMetaData);
             }
         }
         // Move Child Areas
         $areaRepoBuilder = new AreaRepositoryBuilder();
         $areaRepoBuilder->setParentArea($duplicateArea);
         $areaRepoBuilder->setIncludeParentLevels(0);
         $flag = false;
         foreach ($areaRepoBuilder->fetchAll() as $area) {
             // lets just double check we haven't got any child areas.
             if ($area->getParentAreaId() == $duplicateArea->getId()) {
                 $area->setParentAreaId($originalArea->getId());
                 $this->areaDBAccess->update($area, array('parent_area_id'), $areaEditMetaDataModel);
                 $flag = true;
             }
         }
         if ($flag) {
             // now must clear caches
             $this->deleteParentCacheForArea($originalArea);
             $this->deleteParentCacheForArea($duplicateArea);
         }
         $DB->commit();
     } catch (Exception $e) {
         $DB->rollBack();
     }
 }
 public function markDuplicate(VenueModel $duplicateVenue, VenueModel $originalVenue, UserAccountModel $user = null)
 {
     $venueEditMetaDataModel = new VenueEditMetaDataModel();
     $venueEditMetaDataModel->setUserAccount($user);
     $this->markDuplicateWithMetaData($duplicateVenue, $originalVenue, $venueEditMetaDataModel);
 }
 function addDataToEventBeforeSave(EventModel $eventModel)
 {
     $this->addDataToEventBeforeCheck($eventModel);
     if ($this->draftEvent->getDetailsValue('event.newvenue')) {
         $venueModel = new VenueModel();
         $venueModel->setSiteId($this->site->getId());
         $venueModel->setCountryId($this->draftEvent->getDetailsValue('event.country_id'));
         $venueModel->setTitle($this->draftEvent->getDetailsValue('venue.title'));
         $venueModel->setAddress($this->draftEvent->getDetailsValue('venue.address'));
         $venueModel->setAddressCode($this->draftEvent->getDetailsValue('venue.address_code'));
         $venueModel->setDescription($this->draftEvent->getDetailsValue('venue.description'));
         if ($this->draftEvent->getDetailsValue('venue.lat')) {
             $venueModel->setLat($this->draftEvent->getDetailsValue('venue.lat'));
             $venueModel->setLng($this->draftEvent->getDetailsValue('venue.lng'));
         }
         if ($this->draftEvent->getDetailsValue('area.id')) {
             $venueModel->setAreaId($this->draftEvent->getDetailsValue('area.id'));
         }
         foreach ($this->application['extensions']->getExtensionsIncludingCore() as $extension) {
             $extension->addDetailsToVenue($venueModel);
         }
         $vee = new VenueEditMetaDataModel();
         $vee->setUserAccount($this->application['currentUser']);
         // TODO $vee->setFromRequest();
         $venueRepository = new VenueRepository();
         $venueRepository->createWithMetaData($venueModel, $this->site, $vee);
         $eventModel->setVenueId($venueModel->getId());
     }
 }