input; $array = $jinput->get('id', 0, 'array'); if(is_array($array)) { $this->setId((int)$array[0]); } } /** * Method to set the identifier * * @access public * @param int category identifier */ public function setId($id) { // Set category id and wipe data $this->_id = $id; $this->_data = null; } /** * Method to get data * * @access public * @return array */ public function getData() { if (!$this->_loadData()) { $this->_initData(); } return $this->_data; } /** * Method to load data * * @access protected * @return boolean True on success */ protected function _loadData() { // Lets load the content if it doesn't already exist if (empty($this->_data)) { $db = Factory::getContainer()->get('DatabaseDriver'); $query = $db->getQuery(true); $query->select(array('r.*','u.name AS username', 'a.title AS eventtitle', 'a.waitinglist', 'a.maxbookeduser', 'a.minbookeduser', 'a.recurrence_type', 'a.seriesbooking')); $query->from('#__jem_register as r'); $query->join('LEFT', '#__users AS u ON (u.id = r.uid)'); $query->join('LEFT', '#__jem_events AS a ON (a.id = r.event)'); $query->where(array('r.id= '.$db->quote($this->_id))); $this->_db->setQuery($query); $this->_data = $this->_db->loadObject(); // Merge status and waiting if (!empty($this->_data) && !empty($this->_data->waiting) && ($this->_data->status == 1)) { $this->_data->status = 2; } return (boolean) $this->_data; } return true; } /** * Method to initialise the data * * @access protected * @return boolean True on success */ protected function _initData() { // Lets load the content if it doesn't already exist if (empty($this->_data)) { $data = Table::getInstance('jem_register', ''); $data->username = null; if (empty($data->eventtitle)) { $jinput = Factory::getApplication()->input; $eventid = $jinput->getInt('eventid', 0); $table = $this->getTable('Event', 'JemTable'); $table->load($eventid); if (!empty($table->title)) { $data->eventtitle = $table->title; $data->event = $table->id; $data->maxbookeduser = $table->maxbookeduser; $data->minbookeduser = $table->minbookeduser; $data->recurrence_type = $table->recurrence_type; $data->seriesbooking = $table->seriesbooking; } $data->waitinglist = isset($table->waitinglist) ? $table->waitinglist : 0; } $this->_data = $data; } return true; } public function toggle() { $attendee = $this->getData(); if (!$attendee->id) { $this->setError(Text::_('COM_JEM_MISSING_ATTENDEE_ID')); return false; } $row = Table::getInstance('jem_register', ''); $row->bind($attendee); $row->waiting = ($attendee->waiting || ($attendee->status == 2)) ? 0 : 1; if ($row->status == 2) { $row->status = 1; } return $row->store(); } /** * Method to store the attendee * * @access public * @return boolean True on success * */ public function store($data) { $eventid = $data['event']; $userid = $data['uid']; $id = !empty($data['id']) ? (int)$data['id'] : 0; $status = isset($data['status']) ? $data['status'] : false; // Split status and waiting if ($status !== false) { if ($status == 2) { $data['status'] = 1; $data['waiting'] = 1; } elseif ($status == 1) { $data['waiting'] = 0; } } // $row = $this->getTable('jem_register', ''); $row = Table::getInstance('jem_register', ''); if ($id > 0) { $row->load($id); $old_data = clone $row; } // bind it to the table if (!$row->bind($data)) { Factory::getApplication()->enqueueMessage($row->getError(), 'error'); return false; } // sanitise id field $row->id = (int)$row->id; $db = Factory::getContainer()->get('DatabaseDriver'); // Check if user is already registered to this event $query = $db->getQuery(true); $query->select(array('COUNT(id) AS count')); $query->from('#__jem_register'); $query->where('event = '.$db->quote($eventid)); $query->where('uid = '.$db->quote($userid)); if ($row->id) { $query->where('id != '.$db->quote($row->id)); } $db->setQuery($query); $cnt = $db->loadResult(); if ($cnt > 0) { Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_ERROR_USER_ALREADY_REGISTERED'), 'warning'); return false; } // Are we saving from an item edit? if ($row->id) { } else { if ($row->status === 0) { // todo: add "invited" field to store such timestamps? } else { // except status "invited" $row->uregdate = gmdate('Y-m-d H:i:s'); } // Get event $query = $db->getQuery(true); $query->select(array('id','maxplaces','waitinglist','recurrence_first_id','recurrence_type','seriesbooking','singlebooking')); $query->from('#__jem_events'); $query->where('id= '.$db->quote($eventid)); $db->setQuery($query); $event = $db->loadObject(); // If recurrence event, save series event $events = array(); if($event->recurrence_type){ // Retrieving seriesbooking $seriesbooking = $data["seriesbooking"]; $singlebooking = $data["singlebooking"]; // If event has 'seriesbooking' active if($event->seriesbooking && $seriesbooking && !$singlebooking){ //GEt date and time now $dateFrom = date('Y-m-d', time()); $timeFrom = date('H:i', time()); // Get the all recurrence events of serie from now $query = $db->getQuery(true); $query->select(array('id','recurrence_first_id','maxplaces','waitinglist','recurrence_type','seriesbooking','singlebooking')); $query->from('#__jem_events as a'); $query->where('((a.recurrence_first_id = 0 AND a.id = ' . (int)($event->recurrence_first_id?$event->recurrence_first_id:$event->id) . ') OR a.recurrence_first_id = ' . (int)($event->recurrence_first_id?$event->recurrence_first_id:$event->id) . ")"); $query->where("(a.dates > '" . $dateFrom . "' OR a.dates = '" . $dateFrom . "' AND dates >= '" . $timeFrom . "')"); $db->setQuery($query); $events = $db->loadObjectList(); } } if (!isset($events) || !count ($events)){ $events [] = clone $event; } foreach ($events as $e) { // Check if user is registered to each series event $query = $db->getQuery(true); $query->select(array('COUNT(id) AS count')); $query->from('#__jem_register'); $query->where('event = '.$db->quote($e->id)); $query->where('uid = '.$db->quote($userid)); $db->setQuery($query); $cnt = $db->loadResult(); if ($cnt > 0) { Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_ERROR_USER_ALREADY_REGISTERED') . '[id: ' . $e->id . ']', 'warning'); continue; } $row_aux= clone $row; $row_aux->event = $e->id; // Get register information of the event $query = $db->getQuery(true); $query->select(array('COUNT(id) AS registered', 'COALESCE(SUM(waiting), 0) AS waiting')); $query->from('#__jem_register'); $query->where('status = 1 AND event = ' . $db->quote($e->id)); $db->setQuery($query); $register = $db->loadObject(); // If no one is registered yet, $register is null! if (is_null($register)) { $register = new stdClass; $register->registered = 0; $register->waiting = 0; $register->booked = 0; } else { $register->booked = $register->registered + $register->waiting; } // put on waiting list ? if (($event->maxplaces > 0) && ($status == 1)) // there is a max and user will attend { // check if the user should go on waiting list if ($register->booked >= $event->maxplaces) { if (!$event->waitinglist) { Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_ERROR_REGISTER_EVENT_IS_FULL'), 'warning'); return false; } else { $row_aux->waiting = 1; } }else{ $row_aux->status = $status; } }else{ $row_aux->status = $status; } // Make sure the data is valid if (!$row_aux->check()) { $this->setError($row->getError()); return false; } // Store it in the db if (!$row_aux->store()) { Factory::getApplication()->enqueueMessage($row->getError(), 'error'); return false; } } return $row; } } /** * Method to set status of registered * * @param array $pks IDs of the attendee records * @param int $value Status value: -1 - "not attending", 0 - "invited", 1 - "attending", 2 - "on waiting list" * @return boolean True on success. */ public function setStatus($pks, $value = 1) { // Sanitize the ids. $pks = (array)$pks; \Joomla\Utilities\ArrayHelper::toInteger($pks); if (empty($pks)) { $this->setError(Text::_('JERROR_NO_ITEMS_SELECTED')); return false; } // Split status and waiting if ($value == 2) { $status = 1; $waiting = 1; } else { $status = (int)$value; $waiting = 0; } try { $db = Factory::getContainer()->get('DatabaseDriver'); $db->setQuery( 'UPDATE #__jem_register' . ' SET status = '.$status.', waiting = '.$waiting. ' WHERE id IN ('.implode(',', $pks).')' ); if ($db->execute() === false) { throw new Exception($db->getErrorMsg()); } } catch (Exception $e) { JemHelper::addLogEntry($e->getMessage(), __METHOD__, Log::ERROR); $this->setError($e->getMessage()); return false; } // JemHelper::addLogEntry("Registration status of record(s) ".implode(', ', $pks)." set to $value", __METHOD__, Log::DEBUG); return true; } }