className = (new \ReflectionClass($this))->getShortName(); $this->prefix = 'twingle_event_'; // Add value for campaign type $event['campaign_type_id'] = 'twingle_event'; // Get custom field name for event_id $this->id_custom_field = Cache::getInstance() ->getCustomFieldMapping()['twingle_event_id']; } /** * Synchronizes events between Twingle and CiviCRM (both directions) * based on the timestamp. * * @param array $values * @param TwingleApiCall $twingleApi * @param bool $is_test * If TRUE, don't do any changes * * @return array|null * Returns a response array that contains title, id, event_id, project_ * and status or NULL if $values is not an array * * @throws CiviCRM_API3_Exception */ public static function sync( array $values, TwingleApiCall &$twingleApi, bool $is_test = FALSE ) { // If $values is an array if (is_array($values)) { // Instantiate TwingleEvent try { $event = new TwingleEvent( $values, self::TWINGLE ); } catch (Exception $e) { // Log Exception Civi::log()->error( "Failed to instantiate TwingleEvent: $e->getMessage()" ); // Return result array with error description return [ "title" => $values['description'], "event_id" => (int) $values['id'], "project_id" => (int) $values['project_id'], "status" => "Failed to instantiate TwingleEvent: $e->getMessage()", ]; } // Check if the TwingleEvent campaign already exists if (!$event->exists()) { // ... if not, get embed data and create event try { $result = $event->create($is_test); } catch (Exception $e) { // Log Exception Civi::log()->error( "Could not create campaign from TwingleEvent: $e->getMessage()" ); // Return result array with error description return [ "title" => $values['description'], "event_id" => (int) $values['id'], "project_id" => (int) $values['project_id'], "status" => "Could not create campaign from TwingleEvent: $e->getMessage()", ]; } } else { $result = $event->getResponse('TwingleEvent exists'); // If Twingle's version of the event is newer than the CiviCRM // TwingleEvent campaign update the campaign if ($values['updated_at'] > $event->lastUpdate()) { try { $event->update($values); $result = $event->create(); $result['status'] = $result['status'] == 'TwingleEvent created' ? 'TwingleEvent updated' : 'TwingleEvent Update failed'; } catch (Exception $e) { // Log Exception Civi::log()->error( "Could not update TwingleEvent campaign: $e->getMessage()" ); // Return result array with error description $result = $event->getResponse( "Could not update TwingleEvent campaign: $e->getMessage()" ); } } elseif ($result['status'] == 'TwingleEvent exists') { $result = $event->getResponse('TwingleEvent up to date'); } } // Return a response of the synchronization return $result; } else { return NULL; } } /** * Translate values between CiviCRM Campaigns and Twingle * * @param array $values * array of which values shall be translated * * @param string $direction * self::IN -> translate array values from Twingle to CiviCRM
* self::OUT -> translate array values from CiviCRM to Twingle * * @throws Exception */ private function formatValues(array &$values, string $direction) { if ($direction == self::IN) { // Change timestamp into DateTime string if ($values['last_update']) { $values['last_update'] = self::getDateTime($values['last_update']); } } elseif ($direction == self::OUT) { // Change DateTime string into timestamp $values['updated_at'] = self::getTimestamp($values['updated_at']); $values['confirmed_at'] = self::getTimestamp($values['confirmed_at']); $values['created_at'] = self::getTimestamp($values['created_at']); // Cast project target to integer $values['project_target'] = (int) $values['project_target']; } else { throw new Exception( "Invalid Parameter $direction for formatValues()" ); } } /** * Get a response that describes the status of a TwingleEvent * * @param string $status * status of the TwingleEvent you want the response for * * @return array * Returns a response array that contains title, id, project_id and status */ public function getResponse(string $status) { return [ 'title' => $this->values['description'], 'id' => (int) $this->id, 'event_id' => (int) $this->values['id'], 'project_id' => (int) $this->values['project_id'], 'status' => $status, ]; } /** * Return a timestamp of the last update of the Campaign * * @return int|null */ public function lastUpdate() { return self::getTimestamp($this->values['updated_at']); } /** * Returns the project_id of a TwingleEvent * * @return int */ public function getProjectId() { return (int) $this->values['project_id']; } /** * Returns the event_id of a TwingleEvent * * @return int */ public function getEventId() { return (int) $this->values['id']; } }