private function getsourcepdf(array $data)
 {
     ini_set('memory_limit', '1024M');
     if (!is_dir(dirname(__DIR__) . '/tmp')) {
         mkdir(dirname(__DIR__) . '/tmp');
     }
     chmod(dirname(__DIR__) . '/tmp', 0777);
     $params = ['error' => null, 'errorinfo' => ''];
     $tmpFileName = 'gantt_export_' . Helper::randomString() . '.pdf';
     $tmpFilePath = \OC::$SERVERROOT . \OC_App::getAppWebPath('owncollab_chart') . '/tmp/' . $tmpFileName;
     $encodeData = 'data=' . urlencode($data['data']) . '&type=pdf';
     ob_start();
     system('curl --request POST "https://export.dhtmlx.com/gantt" --data "' . $encodeData . '"');
     $result = ob_get_clean();
     //$params['$encodeData'] = $encodeData;
     //$params['$tmpFilePath'] = print_r($result, true);
     //$params['result strlen'] = strlen($result);
     $print_portrait = isset($data['printconf']['orientation']) && $data['printconf']['orientation'] == 'P';
     $print_paper_size = isset($data['printconf']['paper_size']) ? $data['printconf']['paper_size'] : 'A4';
     $print_notes = isset($data['pagenotes']) ? $data['pagenotes'] : false;
     if ($result) {
         if ($is_save = file_put_contents($tmpFilePath, $result)) {
             $downloadPath = $this->explodePDF($tmpFilePath, $print_portrait, $print_paper_size, $print_notes);
             if ($downloadPath) {
                 $params['download'] = $downloadPath;
             } else {
                 $params['errorinfo'] = 'Error: download path exist';
             }
         } else {
             $params['errorinfo'] = 'Saved PDF file fail. Temp path: ' . $tmpFilePath;
         }
     } else {
         $params['errorinfo'] = 'Request to export.dhtmlx.com is failed. Or response is empty';
     }
     if (is_array($params)) {
         return new DataResponse($params);
     }
 }
Example #2
0
 public function insertTask($data)
 {
     $result = null;
     $task['type'] = $data['type'] ? $data['type'] : 'task';
     $task['text'] = $data['text'];
     $task['users'] = $task['users'] ? $task['users'] : '';
     $task['start_date'] = Helper::toTimeFormat($data['start_date']);
     $task['end_date'] = Helper::toTimeFormat($data['end_date']);
     $task['open'] = 1;
     $task['parent'] = $data['parent'] ? (int) $data['parent'] : 1;
     try {
         $_result = $this->connect->insert($this->tableName, $task);
         if ($_result) {
             return $this->connect->db->lastInsertId();
         }
     } catch (\Exception $e) {
         $result = 'error:' . $e->getMessage();
     }
     return $result;
 }
Example #3
0
    //$l10n = $container->query('OCP\IL10N'); $l = \OC::$server->getL10N('owncollab_chart');
    return ['id' => $appName, 'order' => 10, 'href' => $urlGenerator->linkToRoute($appName . '.main.index'), 'icon' => $urlGenerator->imagePath($appName, 'gantt.svg'), 'name' => $l10n->t('Gantt')];
});
// Create public accept, only redirecting
$shred = new Sharedchart();
$shred->match();
/**
 * Loading translations
 * The string has to match the app's folder name
 */
Util::addTranslations($appName);
/**
 * Application styles and scripts
 */
if (Helper::isApp($appName)) {
    Util::addStyle($appName, 'jquery.custom-scrollbar');
    Util::addStyle($appName, 'jquery-ui-timepicker');
    Util::addStyle($appName, 'main');
    Util::addScript($appName, 'libs/jquery.custom-scrollbar');
    Util::addScript($appName, 'libs/ns.application');
    Util::addScript($appName, 'init');
    // dhtmlxGantt v.4.0.0 Standard
    Util::addStyle($appName, 'dhtmlxgantt');
    Helper::provider('config', ['domain' => '']);
}
/**
 * Detect and appoints styles and scripts for particular app page
 */
$currentUri = Helper::getCurrentUri($appName);
if ($currentUri == '/') {
}
Example #4
0
 /**
  * @PublicPage
  * @NoAdminRequired
  * @NoCSRFRequired
  */
 public function index()
 {
     $pKey = Helper::post('key');
     $pApp = Helper::post('app');
     if ($pKey != 'jasj765Uyt87ouIIfars' || $pApp != 'owncollab_chart') {
         return false;
     }
     //название календаря тасков в которых пользователь берет участие как отдельный пользователь
     $userTaskName = 'project';
     //все id пользователей
     $allUsers = $this->connect->users->get();
     //таблица тасков
     $allTasks = $this->connect->task()->get();
     //массив тасков, ключами которого является id таска
     $arrIdTasks = [];
     for ($i = 0; $i < count($allTasks); $i++) {
         $arrIdTasks[$allTasks[$i]['id']] = $allTasks[$i];
     }
     $userTaskName = $arrIdTasks[1]['text'];
     //массив id тасков, ключами которого являются id пользователей
     $userTasks = [];
     for ($i = 0; $i < count($allUsers); $i++) {
         $temp_arr = [];
         for ($j = 0; $j < count($allTasks); $j++) {
             $taskUser = json_decode($allTasks[$j]['users'])->users;
             if (in_array($allUsers[$i]['uid'], $taskUser)) {
                 $temp_arr[$allTasks[$j]['id']] = '';
             }
         }
         $userTasks[$allUsers[$i]['uid']] = $temp_arr;
         unset($temp_arr);
     }
     //id текущих пользователей
     $usersId = array_keys($userTasks);
     //id пользователей с таблицы синхронизации
     $usersIdCal = $this->connect->calendar()->getUsersId();
     //добавление в таблицу синхронизации новых пользователей
     $newUserId = array_diff($usersId, $usersIdCal);
     $this->connect->calendar()->insertAllById($newUserId);
     //удаление удаленных пользователей с таблицы синхронизации
     $deleteUserId = array_diff($usersIdCal, $usersId);
     $this->connect->calendar()->deleteAllById($deleteUserId);
     //синхронизация тасков
     //uid  id_tasks (json)
     $tasksIdCalTable = $this->connect->calendar()->get();
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         //создание рабочего календаря для каждого пользователя
         $user = $tasksIdCalTable[$i]['uid'];
         if (!$this->userManager->userExists($user)) {
             throw new \InvalidArgumentException("User <{$user}> in unknown.");
         }
         $principalBackend = new Principal($this->userManager, $this->groupManager);
         $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
         //проверка существования календаря
         if (!$caldav->getCalendarByUri("principals/users/{$user}", $userTaskName)) {
             //создание календаря если его нет
             $caldav->createCalendar("principals/users/{$user}", $userTaskName, []);
         }
         //находим id календаря пользователя $calendarId
         $userCalendar = $caldav->getCalendarByUri("principals/users/{$user}", $userTaskName);
         if (array_key_exists($tasksIdCalTable[$i]['uid'], $userTasks)) {
             //массив тасков одного пользователя с таблицы синхронизации
             $taskArr = (array) json_decode($tasksIdCalTable[$i]['id_tasks']);
             if ($taskArr == '') {
                 $taskArr = [];
             }
             //массив тасков одного пользователя с чартов
             $mainTasksArr = $userTasks[$tasksIdCalTable[$i]['uid']];
             if ($mainTasksArr == '') {
                 $mainTasksArr = [];
             }
             //новые таски------------------------------------------------------------------
             $idNewTasks = array_values(array_diff(array_keys($mainTasksArr), array_keys($taskArr)));
             if (count($idNewTasks)) {
                 //создаем новые события календаря
                 //проходим в цыкле по новых тасках пользователя
                 for ($j = 0; $j < count($idNewTasks); $j++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     //                        $key = array_keys($idNewTasks);
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$idNewTasks[$j]]['text'], $description, $arrIdTasks[$idNewTasks[$j]]['start_date'], $arrIdTasks[$idNewTasks[$j]]['end_date']);
                     //записываем id события в таблицу синхронизации
                     $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                     $res[$idNewTasks[$j]] = (int) $insertId;
                     $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($res));
                 }
             }
             //удаленные таски----------------------------------------------------------------
             $idDeleteTask = array_values(array_diff(array_keys($taskArr), array_keys($mainTasksArr)));
             if (count($idDeleteTask)) {
                 //удаляем старые события
                 $deleteId = [];
                 foreach ($taskArr as $k => $v) {
                     if (in_array($k, $idDeleteTask)) {
                         $deleteId[] = $v;
                     }
                 }
                 $this->connect->calendarObjects()->delete($deleteId);
                 //удаляем таск с таблицы синхронизации
                 $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                 foreach ($res as $k => $v) {
                     if (!in_array($k, $idDeleteTask)) {
                         $newRes[$k] = $v;
                     }
                 }
                 $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($newRes));
             }
             //обновляем события текущих тасков-----------------------------------------------
             if (count($taskArr)) {
                 //обновляем события текущих тасков
                 for ($k = 0; $k < count($taskArr); $k++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $description = '';
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $result = $this->connect->calendarObjects()->updateFromTasks(array_values($taskArr)[$k], $uid, $arrIdTasks[array_keys($taskArr)[$k]]['text'], $description, $arrIdTasks[array_keys($taskArr)[$k]]['start_date'], $arrIdTasks[array_keys($taskArr)[$k]]['end_date'], $uri, $etag, $userCalendar['id']);
                 }
             }
         }
     }
     //все id групп
     $allGroups = $this->connect->groups->get();
     //массив id тасков, ключами которого являются id груп
     $groupTasks = [];
     //перебираем группы
     for ($i = 0; $i < count($allGroups); $i++) {
         //юзеры i-той группы
         $usersGroup = $this->connect->groupUser()->getByGid($allGroups[$i]['gid']);
         $temp = [];
         $temp_arr = [];
         for ($k = 0; $k < count($allTasks); $k++) {
             $taskGroup = json_decode($allTasks[$k]['users'])->groups;
             if (in_array($allGroups[$i]['gid'], $taskGroup)) {
                 $temp_arr[$allTasks[$k]['id']] = '';
             }
         }
         for ($j = 0; $j < count($usersGroup); $j++) {
             $temp[$usersGroup[$j]] = $temp_arr;
         }
         $groupTasks[$allGroups[$i]['gid']] = $temp;
         unset($temp_arr);
     }
     //id текущих груп
     $groupId = array_keys($groupTasks);
     //id груп с таблицы синхронизации
     $groupIdCal = $this->connect->calendarGroup()->getGroupsId();
     //добавление в таблицу синхронизации новых груп
     $newGroupId = array_diff($groupId, $groupIdCal);
     $this->connect->calendarGroup()->insertAllById($newGroupId);
     //удаление удаленных груп с таблицы синхронизации
     $deleteGroupId = array_diff($groupIdCal, $groupId);
     $this->connect->calendarGroup()->deleteAllById($deleteGroupId);
     //синхронизация тасков
     //gid[$i]=>admin
     //users (json)["bogdan","oleg","alex","ivan"]
     //id_tasks (json){"2":81,"3":82,"4":83,"5":84}
     $tasksIdCalTable = $this->connect->calendarGroup()->get();
     //$tasksIdCalTable[0]['gid']=admin;
     //$tasksIdCalTable[0]['id_tasks']=json(id_tasks);
     //проходим по всех группах
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         $group = $tasksIdCalTable[$i]['gid'];
         //admin
         //вытаскиваем всех юзеров i-той группы (admin)
         //$userGroup[0]['uid'] = 'bogdan';
         $usersGroup = array_keys($groupTasks[$group]);
         //находим учасников с группы таблицы синхронизации
         $usersGroupTable = json_decode($tasksIdCalTable[$i]['id_tasks'], true);
         if (!$usersGroupTable) {
             $usersGroupTable = [];
         }
         //добавляем новых юзеров в группу--------------------------------------------------
         $newUsers = array_values(array_diff($usersGroup, array_keys($usersGroupTable)));
         if (count($newUsers)) {
             //---------------------------------------------------------------------------------
             //создание рабочего календаря для каждого пользователя
             for ($j = 0; $j < count($newUsers); $j++) {
                 $user = $newUsers[$j];
                 if (!$this->userManager->userExists($user)) {
                     throw new \InvalidArgumentException("User <{$user}> in unknown.");
                 }
                 $principalBackend = new Principal($this->userManager, $this->groupManager);
                 $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
                 //проверка существования календаря
                 if (!$caldav->getCalendarByUri("principals/users/{$user}", $group)) {
                     //создание календаря если его нет
                     $caldav->createCalendar("principals/users/{$user}", $group, []);
                 }
             }
             //---------------------------------------------------------------------------------
             for ($j = 0; $j < count($newUsers); $j++) {
                 $arr = [];
                 $usersGroupTable[$newUsers[$j]] = $arr;
             }
         }
         //удаляем старых юзеров с группы---------------------------------------------------
         $deletedUsers = array_values(array_diff(array_keys($usersGroupTable), $usersGroup));
         if (count($deletedUsers)) {
             for ($j = 0; $j < count($deletedUsers); $j++) {
                 //удаляем календарь и таски этого юзера
                 $userCalendar = $caldav->getCalendarByUri("principals/users/{$deletedUsers[$j]}", $group);
                 $caldav->deleteCalendar($userCalendar['id']);
                 //удаляем ячейку юзера с таблицы синхронизации
                 unset($usersGroupTable[$deletedUsers[$j]]);
             }
         }
         //проверяем таски каждого юзера
         foreach ($usersGroupTable as $k => $v) {
             $newTasks = array_values(array_diff(array_keys($groupTasks[$group][$k]), array_keys($v)));
             //находим id календаря пользователя $calendarId, если его пользователь удалил - создаем обратно
             $userCalendar = $caldav->getCalendarByUri("principals/users/{$k}", $group);
             if (!$userCalendar) {
                 $result = $caldav->createCalendar("principals/users/{$k}", $group, []);
                 $userCalendar = [];
                 $userCalendar['id'] = $result;
             }
             if (count($newTasks)) {
                 for ($n = 0; $n < count($newTasks); $n++) {
                     //-------------------------------------
                     //создание нового события
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$newTasks[$n]]['text'], $description, $arrIdTasks[$newTasks[$n]]['start_date'], $arrIdTasks[$newTasks[$n]]['end_date']);
                     //-------------------------------------
                     $v[$newTasks[$n]] = (int) $insertId;
                 }
             }
             //удаленные таски
             $deleteTasks = array_values(array_diff(array_keys($v), array_keys($groupTasks[$group][$k])));
             if (count($deleteTasks)) {
                 $arr_del = [];
                 for ($n = 0; $n < count($deleteTasks); $n++) {
                     $arr_del[] = $v[$deleteTasks[$n]];
                     unset($v[$deleteTasks[$n]]);
                 }
                 $this->connect->calendarObjects()->delete($arr_del);
             }
             $usersGroupTable[$k] = $v;
             if (!$usersGroupTable) {
                 $usersGroupTable = '';
             }
             foreach ($v as $taskId => $eventId) {
                 $uid = $this->connect->calendarObjects()->randhesh(25);
                 $description = '';
                 $etag = $this->connect->calendarObjects()->randhesh(32);
                 $uri = 'ownCloud-';
                 $uri .= $this->connect->calendarObjects()->randhesh(50);
                 $uri .= '.ics';
                 $result = $this->connect->calendarObjects()->updateFromTasks($eventId, $uid, $arrIdTasks[$taskId]['text'], $description, $arrIdTasks[$taskId]['start_date'], $arrIdTasks[$taskId]['end_date'], $uri, $etag, $userCalendar['id']);
             }
         }
         $this->connect->calendarGroup()->updateUsersTasks($group, $usersGroupTable);
     }
 }
 /**
  *
  * @PublicPage
  * @NoAdminRequired
  * @NoCSRFRequired
  *
  * @param $share
  * @return TemplateResponse
  */
 public function publicChart($share)
 {
     $project = $this->connect->project()->getShare($share);
     $params = ['template' => 'guest', 'protected' => false, 'wrongpw' => false, 'requesttoken' => false];
     if ($project['open'] == 1 && $project['is_share'] == 1) {
         // static requesttoken
         $params['requesttoken'] = md5($project['share_password'] . md5($project['share_link']));
         // share time is over
         if ($project['share_is_expire'] == '1' && strtotime($project['share_expire_time']) < time()) {
             $params['protected'] = true;
             $params['template'] = 'guest';
         } else {
             //
             $session_publickey = Helper::session('publickey');
             if (!empty($session_publickey) && $session_publickey == $params['requesttoken']) {
                 $params['template'] = 'project';
             } else {
                 if ($project['share_is_protected'] == 1) {
                     $post_requesttoken = Helper::get('requesttoken');
                     $post_password = Helper::get('password');
                     $params['protected'] = true;
                     $params['template'] = 'authenticate';
                     if ($post_requesttoken == $params['requesttoken'] && md5($post_password) == $project['share_password']) {
                         Helper::session('publickey', $params['requesttoken']);
                         $params['template'] = 'project';
                     } else {
                         if (!empty($post_password)) {
                             $params['wrongpw'] = true;
                         }
                     }
                 } else {
                     $params['template'] = 'project';
                 }
             }
         }
     }
     if ($params['template'] == 'guest') {
         $template = new \OCP\Template('', '404', 'guest');
         $template->printPage();
         exit;
     }
     if ($params['template'] == 'authenticate') {
         return new TemplateResponse($this->appName, 'authenticate', ['wrongpw' => $params['wrongpw'], 'requesttoken' => $params['requesttoken']], 'guest');
     }
     if ($params['template'] == 'project') {
         unset($project['is_share']);
         unset($project['share_link']);
         unset($project['share_is_protected']);
         unset($project['share_password']);
         unset($project['share_is_expire']);
         unset($project['share_expire_time']);
         $jsonData = ['project' => $project, 'tasks' => $this->connect->task()->get(), 'links' => $this->connect->link()->get()];
         $params = ['current_user' => null];
         return new TemplateResponse($this->appName, 'main', $params);
     }
 }