diff --git a/booked/bookedapi.php b/booked/bookedapi.php new file mode 100644 index 0000000..e318720 --- /dev/null +++ b/booked/bookedapi.php @@ -0,0 +1,1218 @@ +root = $root; + } + + $this->username = $username; + $this->password = $password; + + if (! isset ( $opts ['timeout'] ) || ! is_int ( $opts ['timeout'] )) { + $opts ['timeout'] = 600; + } + + $this->ch = curl_init (); + + if (isset ( $opts ['CURLOPT_FOLLOWLOCATION'] ) && $opts ['CURLOPT_FOLLOWLOCATION'] === true) { + curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, true ); + } + + curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, true ); + //curl_setopt($this->ch, CURLOPT_VERBOSE, true); + curl_setopt ( $this->ch, CURLOPT_USERAGENT, 'TS_Booked-PHP/1.0.0' ); + curl_setopt ( $this->ch, CURLOPT_HEADER, false ); + curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, true ); + curl_setopt ( $this->ch, CURLOPT_CONNECTTIMEOUT, 30 ); + curl_setopt ( $this->ch, CURLOPT_TIMEOUT, $opts ['timeout'] ); + } + + /** + * Class destuctor called atomatically when processing completes + */ + public function __destruct() { + if (is_resource ( $this->ch )) { + curl_close ( $this->ch ); + } + } + + /** + * Call this function once with force set to true, after you call PHP's startsession() + * + * Returns true on success and false if call fails. + * + * @param boolean $force + * Set this to true to force a new autherization. + * @return boolean + * + */ + public function authenticate($force = false) { + if (self::isAuthenticated () && $force == false) { + return true; + } + + $endpoint = $this->root . AUTHENTICATE; + + $params ['username'] = $this->username; + + $params ['password'] = $this->password; + + $result = $this->call ( $endpoint, $params, 'post' ); + + if (! $result) { + return false; + } + + $_SESSION ['bookedapi_sessionToken'] = ( string ) $result ['sessionToken']; + + $_SESSION ['bookedapi_sessionExpires'] = ( string ) $result ['sessionExpires']; + + $_SESSION ['bookedapi_userId'] = ( string ) $result ['userId']; + return true; + } + + // Reservation Functions + + + /** + * Gets all reservations if $referenceNumber is not set, otherwise + * returns only the reservation $referenceNumber refers to. + * + * @param string $referenceNumber + * Reference Number of Reservation + * @return boolean|Ambigous + */ + public function getReservation($referenceNumber = null, $userId = null, $resourceId = null, $scheduleId = null, $startDateTime = null, $endDateTime = null) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + if ($referenceNumber != null) { + + $endpoint = $this->root . GETRESERVATIONS . $referenceNumber; + } else { + + if ($userId != null || $resourceId != null || $scheduleId != null || $startDateTime != null || $endDateTime != null) { + + $filters = '?userId=' . $userId . '&resourceId=' . $resourceId . '&scheduleId=' . $scheduleId . '&startDateTime=' . $startDateTime . '&endDateTime=' . $endDateTime; + + $endpoint = $this->root . FILTERRESERVATION . $filters; + } else { + + $endpoint = $this->root . GETRESERVATIONS; + } + } + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + return $result; + } + + + // Schedule Functions + + /** + * Loads all schedules + * @return boolean|Ambigous + */ + public function getAllSchedules(){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . SCHEDULES; + + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * Loads a specific schedule by id + * @param integer $scheduleId + * @return boolean|Ambigous + */ + public function getSchedule($scheduleId){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . SCHEDULES . $scheduleId; + + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * Loads slots for a specific schedule + * + * Optional query string parameters: resourceId, startDateTime, endDateTime. + * If no dates are provided the default schedule dates will be returned. + * If dates do not include the timezone offset, the timezone of the authenticated user will be assumed. + * + * @param integer $scheduleId + * @param integer $resourceId + * @param string $startDateTime + * @param string $endDateTime + * @return boolean|Ambigous + */ + public function getSlots($scheduleId, $resourceId = null, $startDateTime = null, $endDateTime = null){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . SCHEDULES . $scheduleId . SLOTS; + + if($resourceId || $startDateTime || $endDateTime){ + + $endpoint = $endpoint . "?resourceId=" . $resourceId; + $endpoint = $endpoint . "&startDateTime=" . $startDateTime; + $endpoint = $endpoint . "&endDateTime=" . $endDateTime; + } + + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + + + } + + + // Resource Functions + + /** + * if $resourceId is null, will return all resources + * otherwise will return the resource with the id of $resourceId + * @param integer $resourceId + * @return boolean|Ambigous + */ + public function getResource($resourceId = null) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + if ($resourceId != null && is_int ( $resourceId )) { + + $endpoint = $this->root . GETRESOURCES . $resourceId; + } else { + + $endpoint = $this->root . GETRESOURCES; + } + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * @return boolean|Ambigous + */ + public function getResourceStatuses(){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES . STATUS; + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * @return boolean|Ambigous + */ + public function getResourceStatusReasons(){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES . STATUS . STATUSREASONS; + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * @return boolean|Ambigous + */ + public function getResourceTypes(){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES . RESOURCETYPES; + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + + } + + public function createResource($resourceObject){ + + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES; + + $result = $this->call ( $endpoint, $resourceObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + + + } + + public function updateResource($resourceId, $resourceObject){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES. $resourceId; + + $result = $this->call ( $endpoint, $resourceObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * @param integer $resourceId + * @return boolean|Ambigous + */ + public function deleteResource($resourceId){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETRESOURCES. $resourceId; + + $result = $this->call ( $endpoint, null, 'delete', true); + + if (! $result) { + return false; + } + + return $result; + + } + + // Accessory Functions + + /** + * Gets all accessories if $accessoryId is null + * otherwise if $accessoryId is a valid integer + * the function will return just that accessory. + * Will return false if accessory id or accessories don't exist. + * + * @param integer $accessoryId + * @return boolean|Ambigous + */ + public function getAccessory($accessoryId = null) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + if (is_int ( $accessoryId )) { + + $endpoint = $this->root . GETACCESSORY . $accessoryId; + } else { + + $endpoint = $this->root . GETACCESSORY; + } + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + // Attribute Functions + + /** + * @param array $attibuteObject + * @return boolean|Ambigous + */ + public function createCustomAttribute($attibuteObject){ + + + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETATTRIBUTE; + + $result = $this->call ( $endpoint, $attibuteObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * @param integer $attributeId + * @param array $attibuteObject + * @return boolean|Ambigous + */ + public function updateCustomAttribute($attributeId, $attibuteObject){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETATTRIBUTE . $attributeId; + + $result = $this->call ( $endpoint, $attibuteObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * @param integer $attributeId + * @return boolean|Ambigous + */ + public function deleteCustomAttribute($attributeId){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETATTRIBUTE . $attributeId; + + $result = $this->call ( $endpoint, null, 'delete', true); + + if (! $result) { + return false; + } + + return $result; + + } + + /** + * + * @param integer $categoryId + * @return boolean|Ambigous + */ + public function getCategoryAttributes($categoryId) { + + if (! is_int ( $categoryId )) { + return false; + } + + if ($categoryId != ATT_CAT_RESERVATION || $categoryId != ATT_CAT_USER || $categoryId != ATT_CAT_RESOURCE) { + + return false; + } + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETCATATTRIBUTE . $categoryId; + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * + * @param integer $attributeId + * @return boolean|Ambigous + */ + public function getAttribute($attributeId) { + if (! is_int ( $attributeId )) { + return false; + } + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . GETATTRIBUTE . $attributeId; + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * + * @param string $dateTime + * @return boolean|Ambigous + */ + public function getAvailability($dateTime = null) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + if ($dateTime == null) { + + $endpoint = $this->root . GETAVAILABILITY; + } else { + + $endpoint = $this->root . GETAVAILABILITY . '?dateTime=' . urlencode($dateTime); + } + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * + * @param integer $groupId + * @return boolean|Ambigous + */ + public function getGroups($groupId = null) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + if ($groupId != null && is_int ( $groupId )) { + + $endpoint = $this->root . GETGROUPS . $groupId; + } else { + + $endpoint = $this->root . GETGROUPS; + } + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + /** + * + * @param array $reservationObject + * @return boolean|Ambigous + */ + public function createReservation($reservationObject) { + + + $endpoint = $this->root . RESERVATIONS; + + $result = $this->call ( $endpoint, $reservationObject, 'post', true ); + + if (! $result) { + return false; + } + + return $result; + } + public function approveReservation($referenceNumber){ + + $endpoint = $this->root . RESERVATIONS . $referenceNumber . '/Approval'; + + $result = $this->call( $endpoint, null, 'post', true ); + + if (! $result) { + return false; + } + + return $result; + } + /** + * @param string $referenceNumber + * @param array $updatedReservationObject + * @param string $updateScope + * @return boolean|Ambigous + */ + public function updateReservation($referenceNumber, $updatedReservationObject, $updateScope = null) { + + // updateScope are this|full|future + if (checkScope($updateScope)){ + $endpoint = $this->root . RESERVATIONS . $referenceNumber . '?updateScope=' . $updateScope; + }else{ + $endpoint = $this->root . RESERVATIONS . $referenceNumber; + } + + + + $result = $this->call( $endpoint, $reservationObject, 'post', true ); + + if (! $result) { + return false; + } + + return $result; + } + + public function deleteReservation($referenceNumber, $updateScope = null){ + //this|full|future + + if (checkScope($updateScope)){ + $endpoint = $this->root . RESERVATIONS . $referenceNumber . '?updateScope=' . $updateScope; + }else{ + $endpoint = $this->root . RESERVATIONS . $referenceNumber; + } + + $result = $this->call( $endpoint, null, 'delete', true ); + + if (! $result) { + return false; + } + + return $result; + + + } + + public function createUser($userObject){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . USERS; + + $result = $this->call ( $endpoint, $userObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + } + + public function updateUser($userId, $userObject){ + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . USERS . $userId; + + $result = $this->call ( $endpoint, $userObject, 'post', true); + + if (! $result) { + return false; + } + + return $result; + } + + public function getAllUsers($username = null, $email = null, $firstName = null, $lastName = null, $phone = null, $organization = null){ + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + if ($username || $email || $firstName || $lastName || $phone || $organization){ + $username = urlencode($username); + $email = urlencode($email); + $firstName = urlencode($firstName); + $lastName = urlencode($lastName); + $phone = urlencode($phone); + $organization = urlencode($organization); + $endpoint = $this->root . USERS . '?username=' . $username . '&email=' . $email . '&firstName=' . $firstName . '&lastName=' . $lastName . '&phone=' . $phone . '&organization=' . $organization; + }else{ + $endpoint = $this->root . USERS; + } + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + public function getUser($userId){ + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . USERS . $userId; + + + $result = $this->call ( $endpoint, self::buildAuthParams (), 'get' ); + + if (! $result) { + return false; + } + + return $result; + } + + public function deleteUser($userId){ + + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + $endpoint = $this->root . USERS . $userId; + + $result = $this->call ( $endpoint, null, 'delete', true); + + if (! $result) { + return false; + } + + return $result; + } + + + private function checkScope($scope){ + + if ($updateScope == 'this' || $updateScope == 'full' || $updateScope == 'future'){ + return true; + } + return false; + } + /** + * @return boolean|number + */ + public function getCurrentUserId() { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + + return ( int ) $_SESSION ['bookedapi_userId']; + } + + public function signOut(){ + //TODO: Create signOut API CALL + } + + + /** + * + * @param string $endpoint + * @param array $params + * @param string $method + * @return boolean|mixed + */ + private function call($endpoint, $params = array(), $method, $postAuth = false) { + + $ch = $this->ch; + + curl_setopt ( $ch, CURLOPT_URL, $endpoint ); +// curl_setopt($ch, CURLOPT_VERBOSE, true); + + if ($method == 'post') { + curl_setopt ( $this->ch, CURLOPT_POST, true ); + curl_setopt ( $ch, CURLOPT_HTTPHEADER, array ( + 'Content-Type: application/json' + ) ); + + if ($params != null){ + $params = json_encode ( $params ); + curl_setopt ( $ch, CURLOPT_POSTFIELDS, $params ); + } + + + } + + if ($method == 'delete') { + $ch = curl_init(); + curl_setopt ( $this->ch, CURLOPT_POST, false ); + curl_setopt ( $this->ch, CURLOPT_HTTPGET, false ); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); + if (isset($params)){ + $json = json_encode($params); + }else{ + $json = ''; + } + curl_setopt($ch, CURLOPT_POSTFIELDS, $json); + + + } + + if ($method == 'get') { + curl_setopt ( $this->ch, CURLOPT_POST, false ); + curl_setopt ( $this->ch, CURLOPT_HTTPGET, true ); + $this->buildAuthHttpHeader ( $params ['SessionToken'], $params ['UserId'] ); + } + + if ($postAuth) { + if (! self::isAuthenticated ()) { + if (! $this->authenticate ( true )) { + return false; + } + } + $this->buildAuthHttpHeader ( $_SESSION ['bookedapi_sessionToken'], $_SESSION ['bookedapi_userId'] ); + } + + $response_body = curl_exec ( $ch ); + + $info = curl_getinfo ( $ch ); + + if (curl_error ( $ch )) { + return json_decode ( $info, true ); + } + + if (floor ( $info ['http_code'] / 100 ) >= 4) { + return false; + } + + return json_decode ( $response_body, true ); + } + + /** + * + * @param string $SessionToken + * @param integer $UserId + */ + private function buildAuthHttpHeader($SessionToken, $UserId) { + $XBookedSessionToken = 'X-Booked-SessionToken: ' . $SessionToken; + $XBookedUserId = 'X-Booked-UserId: ' . $UserId; + curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, array ( + $XBookedSessionToken, + $XBookedUserId + ) ); + } + + /** + * + * @return boolean + */ + private static function isAuthenticated() { + $date1 = new DateTime ( $_SESSION ['bookedapi_sessionExpires'], new DateTimeZone ( YOURTIMEZONE ) ); + + $date2 = new DateTime ( date ( DATE_ISO8601, time () ), new DateTimeZone ( YOURTIMEZONE ) ); + + $minutesInterval = date_interval_create_from_date_string ( '1 minute' ); + + $date1->sub ( $minutesInterval ); + + if ((! $_SESSION ['bookedapi_sessionToken'] == null) && ($date2 <= $date1)) { + return true; + } + + return false; + } + + /** + * + * @return array + */ + private static function buildAuthParams() { + $params ['SessionToken'] = $_SESSION ['bookedapi_sessionToken']; + $params ['UserId'] = $_SESSION ['bookedapi_userId']; + return $params; + } + + /** + * + * @param integer $userId + * @param string $title + * @param integer $resourceId + * @param array $resourcesObject + * @param array $accessoriesObject + * @param array $customAttributesObject + * @param string $description + * @param string $startDateTime + * @param string $endDateTime + * @param array $recurrenceRuleObject + * @param array $inviteesObject + * @param array $participantsObject + * @param array $startReminderObject + * @param array $endReminderObject + * @return array + */ + public static function buildReservationObject($userId, $title, $resourceId, $resourcesObject = array (), $accessoriesObject = array (), $customAttributesObject = array (), $description = null, $startDateTime, $endDateTime, $recurrenceRuleObject = array (), $inviteesObject = array (), $participantsObject = array (), $startReminderObject = array (), $endReminderObject = array ()) { + $reservationObject = array ( + 'accessories' => $accessoriesObject, + 'customAttributes' => $customAttributesObject, + 'description' => ( string ) $description, + 'endDateTime' => $endDateTime, + 'startDateTime' => $startDateTime, + 'invitees' => $inviteesObject, + 'participants' => $participantsObject, + 'resourceId' => ( int ) $resourceId, + 'resources' => $resourcesObject, + 'recurrenceRule' => $recurrenceRuleObject, + 'title' => ( string ) $title, + 'userId' => ( int ) $userId, + 'startReminder' => $startReminderObject, + 'endReminder' => $endReminderObject + ); + + return $reservationObject; + } + public static function buildAccessoryObject($accessoryId, $quantityRequested) { + $ao = array ( + 'accessoryId' => ( int ) $accessoryId, + 'quantityRequested' => ( int ) $quantityRequested + ); + + return $ao; + } + public static function buildAccessoriesObject($accessories = array()) { + return $accessories; + } + public static function buildAttributeObject($attributeId, $attributeValue) { + $atto = array ( + 'attributeId' => ( int ) $attributeId, + 'attributeValue' => ( string ) $attributeValue + ); + return $atto; + } + public static function buildAttributesObject($attributes = array()) { + return $attributes; + } + public static function buildInviteeObject($inviteeId) { + $i = ( int ) $inviteeId; + + return $i; + } + public static function buildInviteesObject($invitees = array()) { + return $invitees; + } + public static function buildParticipantObject($participantId) { + $i = ( int ) $participantId; + + return $i; + } + public static function buildParticipantsObject($participants = array()) { + return $participants; + } +/* public static function buildResourceObject($resourceId) { + $r = ( int ) $resourceId; + + return $r; + } */ + public static function buildResourcesObject($resources = array()) { + $resources; + + return $resources; + } + public static function buildReminderObject($value, $interval) { + + // interval = hours or minutes or days + $ro = array ( + 'value' => ( int ) $value, + 'interval' => ( string ) $interval + ); + + return $ro; + } + + // recurrenceRule + // {"type":"daily|monthly|none|weekly|yearly","interval":3,"monthlyType":"dayOfMonth|dayOfWeek|null","weekdays":[0,1,2,3,4,5,6],"repeatTerminationDate":"2015-09-16T20:51:36-0700"} + public static function buildRecurrenceRuleObject($type, $interval, $monthlyType, $weekdays = array(), $repeatTerminationDate) { + $rule = array ( + 'type' => ( string ) $type, + 'interval' => ( int ) $interval, + 'monthlyType' => ( string ) $monthlyType, + 'weekdays' => $weekdays, + 'repeatTerminationDate' => $repeatTerminationDate + ); + + return $rule; + } + + //{"label":"attribute name","type":"Allowed values for type: 4 (checkbox), 2 (multi line), 3 (select list), 1 (single line)","categoryId":"Allowed values for category: 1 (reservation), 4 (resource), 5 (resource type), 2 (user)","regex":"validation regex","required":true,"possibleValues":["possible","values","only valid for select list"],"sortOrder":100,"appliesToId":10} + + /** + * @param string $label + * @param integer $type + * @param integer $categoryId + * @param integer $appliesToId + * @param integer $sortOrder + * @param string $regex + * @param boolean $required + * @param array $possibleValues + * @return array + */ + public static function buildAttibuteObject( + $label, + $type, + $categoryId, + $appliesToId, + $sortOrder = 0, + $regex = null, + $required = false, + $possibleValues = array()){ + + $attributeObject = array ( + 'label' => (string) $label, + 'type' => (int) $type, + 'categoryId' => (int) $categoryId, + 'appliesToId' => (int) $appliesToId, + 'sortOrder' => (int) $sortOrder, + 'regex' => (string) $regex, + 'required' => (boolean) $required, + 'possibleValues' => $possibleValues); + + return $attributeObject; + + } + + // {"name":"resource name","location":"location","contact":"contact information","notes":"notes","minLength":"1d0h0m","maxLength":"3600","requiresApproval":true,"allowMultiday":true,"maxParticipants":100,"minNotice":"86400","maxNotice":"0d12h30m","description":"description","scheduleId":10,"autoAssignPermissions":true,"customAttributes":[{"attributeId":1,"attributeValue":"attribute value"}],"sortOrder":1,"statusId":1,"statusReasonId":2,"resourceTypeId":1} + public static function buildResourceObject( + $name, + $location = null, + $contact = null, + $notes = null, + $minLength, // in "seconds" or "1d2h3m" format + $maxLength, // in "seconds" or "1d2h3m" format + $requiresApproval = false, + $allowMultiday = false, + $maxParticipants, + $minNotice, // in "seconds" or "1d2h3m" format + $maxNotice, // in "seconds" or "1d2h3m" format + $description = null, + $scheduleId, + $autoAssignPermissions = true, + $customAttributesObject = array (), // {"attributeId":1,"attributeValue":"attribute value"} + $sortOrder = 0, + $statusId = null, + $statusReasonId = null, + $resourceTypeId = null){ + + $resourceObject = array ( + 'name' => (string) $name, + 'location' => (string) $location, + 'contact' => (string) $contact, + 'notes' => (string) $notes, + 'minLength' => (string) $minLength, // in "seconds" or "1d2h3m" format + 'maxLength' => (string) $maxLength, // in "seconds" or "1d2h3m" format + 'requiresApproval' => (boolean) $requiresApproval, + 'allowMultiday' => (boolean) $allowMultiday, + 'maxParticipants' => (int) $maxParticipants, + 'minNotice' => (string) $minNotice, // in "seconds" or "1d2h3m" format + 'maxNotice' => (string) $maxNotice, // in "seconds" or "1d2h3m" format + 'description' => (string) $description, + 'scheduleId' => (int) $scheduleId, + 'autoAssignPermissions' => (boolean) $autoAssignPermissions, + 'customAttributes' => $customAttributesObject, + 'sortOrder' => (int) $sortOrder, + 'statusId' => (int) $statusId, + 'statusReasonId' => (int) $statusReasonId, + 'resourceTypeId' => (int) $resourceTypeId); + + return $resourceObject; + } + + // {"attributeId":1,"attributeValue":"attribute value"} + public static function buildCustomAttributeObject($attributeId,$attributeValue){ + + $customAttributeObject = array ( + 'attributeId' => (int) $attributeId, + 'attributeValue' => (string) $attributeValue); + + return $customAttributeObject; + } + + //{"password":"unencrypted password","language":"en_us","firstName":"first","lastName":"last","emailAddress":"email@address.com","userName":"username","timezone":"America\/Chicago","phone":"123-456-7989","organization":"organization","position":"position","customAttributes":[{"attributeId":99,"attributeValue":"attribute value"}],"groups":[1,2,4]} + public static function buildUserobject( $password, + $language = 'en_us', + $firstName = null, + $lastName = null, + $emailAddress = null, + $userName, + $timezone = YOURTIMEZONE, + $phone = null, + $organization = null, + $position = null, + $customAttributesObject = array(), + $groupsObject = array ()) { + $userobject = array ( + 'password' => (string) $password, + 'language' => (string) $language, + 'firstName'=> (string) $firstName, + 'lastName' => (string) $lastName, + 'emailAddress' => (string) $emailAddress, + 'userName' => (string) $userName, + 'timezone' => (string) $timezone, + 'phone' => (string) $phone, + 'organization' => (string) $organization, + 'position' => (string) $position, + 'customAttributes' => $customAttributesObject, + 'groups' => $groupsObject); + + return $userobject; + } + + +} + +?> + diff --git a/booked/bookedapiconfig.php b/booked/bookedapiconfig.php new file mode 100644 index 0000000..02b4f09 --- /dev/null +++ b/booked/bookedapiconfig.php @@ -0,0 +1,72 @@ + diff --git a/booked/control.zaf b/booked/control.zaf new file mode 100644 index 0000000..eb74ff7 --- /dev/null +++ b/booked/control.zaf @@ -0,0 +1,38 @@ +Plugin: booked + +Description:: + Plugin for booked PHP reservation system +:: + +Version: 0.1 +Url: https://raw.githubusercontent.com/limosek/zaf-plugins/master/booked +Web: https://github.com/limosek/zaf-plugins + +Parameters:: + url http://localhost/booked/Services/index.php + timezone UTC + username zaf + password +:: + +# Dependencies +Depends-dpkg: php5-cli +Depends-opkg: php +Depends-bin: php + +# Install +Install-files: bookedapi.php bookedapiconfig.php +Install-bin: getr.php + +Item num_reservations: +Return: int +Parameters:: + from 'now' '' + to '+1 hour' '' +:: +Description:: + Get number of reservations in given time range +:: +Cmd: getr.php "$from" "$to" +/Item + diff --git a/booked/getr.php b/booked/getr.php new file mode 100755 index 0000000..5d8b720 --- /dev/null +++ b/booked/getr.php @@ -0,0 +1,46 @@ +#!/usr/bin/env php +getTimestamp(); + } else { + $from=time(); + } + if ($to) { + $to=New DateTime($to); + $to=$to->getTimestamp(); + } else { + $to=time()+3600; + } + + $bookedapiclient = new bookedapiclient(getenv("username"), getenv("password")); + $bookedapiclient-> authenticate(); + $reservations=$bookedapiclient->getReservation(null,null,null,date("c",$from),date("c",$to)); + + $cnt=0; + foreach ($reservations["reservations"] as $r) { + $start=New DateTime($r["startDate"]); + $start->setTimezone(New DateTimeZone(getenv("timezone"))); + $end=New DateTime($r["endDate"]); + $end->setTimezone(New DateTimeZone(getenv("timezone"))); + $sstart=$start->getTimestamp(); + $send=$end->getTimestamp(); + if ($sstart>=$from && $send<=$to) { + $cnt++; + } + } + + echo $cnt; + + +