PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/include/class.project.php

https://bitbucket.org/icarito/pmc
PHP | 713 lines | 503 code | 68 blank | 142 comment | 43 complexity | 39034925e4d922799a850d6669a6fd92 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1
  1. <?php
  2. /**
  3. * Die Klasse stellt Methoden bereit um Projekte zu bearbeiten
  4. *
  5. * @author Open Dynamics <info@o-dyn.de>
  6. * @name project
  7. * @package Collabtive
  8. * @version 0.6
  9. * @link http://www.o-dyn.de
  10. * @license http://opensource.org/licenses/gpl-license.php GNU General Public License v3 or later
  11. */
  12. class project
  13. {
  14. private $mylog;
  15. /**
  16. * Konstruktor
  17. * Initialisiert den Eventlog
  18. */
  19. function __construct()
  20. {
  21. $this->mylog = new mylog;
  22. }
  23. /**
  24. * Add a project
  25. *
  26. * @param string $name Name des Projekts
  27. * @param string $desc Projektbeschreibung
  28. * @param string $end Date on which the project is due
  29. * @param int $assignme Assign yourself to the project
  30. * @return int $insid ID des neu angelegten Projekts
  31. */
  32. function add($name, $desc, $end, $budget, $assignme = 0)
  33. {
  34. $name = mysql_real_escape_string($name);
  35. $desc = mysql_real_escape_string($desc);
  36. $end = mysql_real_escape_string($end);
  37. $assignme = (int) $assignme;
  38. $budget = (float) $budget;
  39. $end = strtotime($end);
  40. $now = time();
  41. $ins1 = mysql_query("INSERT INTO projekte (`name`, `desc`, `end`, `start`, `status`, `budget`) VALUES ('$name','$desc','$end','$now',1,'$budget')");
  42. $insid = mysql_insert_id();
  43. if ($assignme == 1)
  44. {
  45. $uid = $_SESSION['userid'];
  46. $this->assign($uid, $insid);
  47. }
  48. if ($ins1)
  49. {
  50. mkdir(CL_ROOT . "/files/" . CL_CONFIG . "/$insid/", 0777);
  51. $this->mylog->add($name, 'projekt', 1, $insid);
  52. return $insid;
  53. }
  54. else
  55. {
  56. return false;
  57. }
  58. }
  59. /**
  60. * Imports a project from Basecamp into Collabtive
  61. *
  62. * @param string $name Name of the project
  63. * @param string $desc Description of the project
  64. * @param string $start Date on which the project was started
  65. * @param int $status Status of the project
  66. * @return int $insid ID des neu angelegten Projekts
  67. */
  68. function AddFromBasecamp($name, $desc, $start, $status = 1)
  69. {
  70. $name = mysql_real_escape_string($name);
  71. $desc = mysql_real_escape_string($desc);
  72. $start = mysql_real_escape_string($start);
  73. $id = (int) $id;
  74. $status = (int) $status;
  75. $start = strtotime($start);
  76. $tod = date("d.m.Y");
  77. $now = strtotime($tod . " +1week");
  78. $ins1 = mysql_query("INSERT INTO projekte (`name`, `desc`,`end`, `start`, `status`) VALUES ('$name','$desc','$now','$start','$status')");
  79. $insid = mysql_insert_id();
  80. if ($ins1)
  81. {
  82. mkdir(CL_ROOT . "/files/" . CL_CONFIG . "/$insid/", 0777);
  83. $this->mylog->add($name, 'projekt', 1, $insid);
  84. return $insid;
  85. }
  86. else
  87. {
  88. return false;
  89. }
  90. }
  91. /**
  92. * Bearbeitet ein Projekt
  93. *
  94. * @param int $id Eindeutige Projektnummer
  95. * @param string $name Name des Projekts
  96. * @param string $desc Beschreibungstext
  97. * @param string $end Date on which the project is due
  98. * @return bool
  99. */
  100. function edit($id, $name, $desc, $end, $budget)
  101. {
  102. $id = mysql_real_escape_string($id);
  103. $name = mysql_real_escape_string($name);
  104. $desc = mysql_real_escape_string($desc);
  105. $end = mysql_real_escape_string($end);
  106. $end = strtotime($end);
  107. $id = (int) $id;
  108. $budget = (float) $budget;
  109. $upd = mysql_query("UPDATE projekte SET name='$name',`desc`='$desc',`end`='$end',budget=$budget WHERE ID = $id");
  110. if ($upd)
  111. {
  112. $this->mylog->add($name, 'projekt' , 2, $id);
  113. return true;
  114. }
  115. else
  116. {
  117. return false;
  118. }
  119. }
  120. /**
  121. * Deletes a project including everything else that was assigned to it (e.g. Milestones, tasks, timetracker entries)
  122. *
  123. * @param int $id Project ID
  124. * @return bool
  125. */
  126. function del($id)
  127. {
  128. $userid = $_SESSION["userid"];
  129. $id = mysql_real_escape_string($id);
  130. $id = (int) $id;
  131. // Delete assignments of tasks of this project to users
  132. $task = new task();
  133. $tasks = $task->getProjectTasks($id);
  134. if (!empty($tasks))
  135. {
  136. foreach ($tasks as $tas)
  137. {
  138. $del_taskassign = mysql_query("DELETE FROM tasks_assigned WHERE task = $tas[ID]");
  139. }
  140. }
  141. // Delete files and the assignments of these files to the messages they were attached to
  142. $fil = new datei();
  143. $files = $fil->getProjectFiles($id, 1000000);
  144. if (!empty($files))
  145. {
  146. foreach ($files as $file)
  147. {
  148. $del_files = $fil->loeschen($file[ID]);
  149. }
  150. }
  151. $del_messages = mysql_query("DELETE FROM messages WHERE project = $id");
  152. $del_milestones = mysql_query("DELETE FROM milestones WHERE project = $id");
  153. $del_projectassignments = mysql_query("DELETE FROM projekte_assigned WHERE projekt = $id");
  154. $del_tasklists = mysql_query("DELETE FROM tasklist WHERE project = $id");
  155. $del_tasks = mysql_query("DELETE FROM tasks WHERE project = $id");
  156. $del_timetracker = mysql_query("DELETE FROM timetracker WHERE project = $id");
  157. $del_logentries = mysql_query("DELETE FROM log WHERE project = $id");
  158. $del = mysql_query("DELETE FROM projekte WHERE ID = $id");
  159. delete_directory(CL_ROOT . "/files/" . CL_CONFIG . "/$id");
  160. if ($del)
  161. {
  162. $this->mylog->add($userid, 'projekt', 3, $id);
  163. return true;
  164. }
  165. else
  166. {
  167. return false;
  168. }
  169. }
  170. /**
  171. * Copy a project
  172. * by: Daniel Tlach <danaketh@gmail.com>,
  173. * Philipp Kiszka <info@o-dyn.de>
  174. *
  175. * @param int $id ID of project to copy
  176. * @return int $insid ID des neu angelegten Projekts
  177. */
  178. function makecopy($id)
  179. {
  180. // copy project
  181. $q = mysql_query("INSERT INTO projekte (`name`, `desc`, `end`, `start`, `status`, `budget`) SELECT `name`, `desc`, `end`, `start`, `status`, `budget` FROM projekte WHERE ID = " . (int)$id);
  182. $insid = mysql_insert_id();
  183. $uid = $_SESSION['userid'];
  184. $this->assign($uid, $insid);
  185. $milesobj = new milestone();
  186. $objtasklist = new tasklist();
  187. $objtask = new task();
  188. if ($q)
  189. {
  190. $pname = $this->getProject($insid);
  191. $name = $pname["name"] . " Copy";
  192. mysql_query("UPDATE projekte SET `name` = '$name' WHERE ID = " . $insid . " LIMIT 1");
  193. // now copy the milestones
  194. $miles = $milesobj->getAllProjectMilestones($id);
  195. if (!empty($miles))
  196. {
  197. // go through the milestones
  198. foreach ($miles as $ms)
  199. {
  200. // copy milestone
  201. $msid = $milesobj->add($insid, $ms["name"] , $ms["desc"] , $ms["end"] , 1);
  202. // get all tasklists for milestone
  203. $qb = mysql_query("SELECT * FROM tasklist WHERE project = $id AND milestone = $ms[ID]");
  204. if ($qb)
  205. {
  206. // go through the tasklists
  207. while ($tl = mysql_fetch_array($qb))
  208. {
  209. // copy tasklist
  210. $tlid = $objtasklist->add_liste($insid, $tl["name"] , $tl["desc"], 0, $msid);
  211. // get tasks for the tasklist
  212. $tasks = $objtasklist->getTasksFromList($tl["ID"]);
  213. if (!empty($tasks))
  214. {
  215. foreach ($tasks as $task)
  216. {
  217. $taskobj->add($task["end"], $task["title"] , $task["text"] , $tlid , $uid , $insid);
  218. } // tasks END
  219. }
  220. } // tasklists END
  221. }
  222. } // milestones END
  223. }
  224. // get all tasklists and tasks that do not belong to a milestone
  225. $qb = mysql_query("SELECT * FROM tasklist WHERE project = $id AND milestone = 0");
  226. if ($qb)
  227. {
  228. // go through the tasklists
  229. while ($tl = mysql_fetch_array($qb))
  230. {
  231. // copy tasklist
  232. $tlid = $objtasklist->add_liste($insid, $tl["name"] , $tl["desc"], 0, $msid);
  233. // get tasks for the tasklist
  234. $tasks = $objtasklist->getTasksFromList($tl["ID"]);
  235. if (!empty($tasks))
  236. {
  237. foreach ($tasks as $task)
  238. {
  239. $taskobj->add($task["end"], $task["title"] , $task["text"] , $tlid , $uid , $insid);
  240. } // tasks END
  241. }
  242. } // tasklists END
  243. }
  244. mkdir(CL_ROOT . "/files/" . CL_CONFIG . "/$insid/", 0777);
  245. $this->mylog->add($name, 'projekt', 1, $insid);
  246. return $insid;
  247. }
  248. else
  249. {
  250. return false;
  251. }
  252. }
  253. /**
  254. * Mark a project as "active / open"
  255. *
  256. * @param int $id Eindeutige Projektnummer
  257. * @return bool
  258. */
  259. function open($id)
  260. {
  261. $id = mysql_real_escape_string($id);
  262. $id = (int) $id;
  263. $upd = mysql_query("UPDATE projekte SET status=1 WHERE ID = $id");
  264. if ($upd)
  265. {
  266. $nam = mysql_query("SELECT name FROM projekte WHERE ID = $id");
  267. $nam = mysql_fetch_row($nam);
  268. $nam = $nam[0];
  269. $this->mylog->add($nam, 'projekt', 4, $id);
  270. return true;
  271. }
  272. else
  273. {
  274. return false;
  275. }
  276. }
  277. /**
  278. * Marks a project, its tasks, tasklists and milestones as "finished / closed"
  279. *
  280. * @param int $id Eindeutige Projektnummer
  281. * @return bool
  282. */
  283. function close($id)
  284. {
  285. $id = mysql_real_escape_string($id);
  286. $id = (int) $id;
  287. $mile = new milestone();
  288. $milestones = $mile->getAllProjectMilestones($id, 100000);
  289. if (!empty($milestones))
  290. {
  291. foreach ($milestones as $miles)
  292. {
  293. $close_milestones = mysql_query("UPDATE milestones SET status = 0 WHERE ID = $miles[ID]");
  294. }
  295. }
  296. $task = new task();
  297. $tasks = $task->getProjectTasks($id);
  298. if (!empty($tasks))
  299. {
  300. foreach ($tasks as $tas)
  301. {
  302. $close_tasks = mysql_query("UPDATE tasks SET status = 0 WHERE ID = $tas[ID]");
  303. }
  304. }
  305. $tasklist = new tasklist();
  306. $tasklists = $tasklist->getProjectTasklists($id);
  307. if (!empty($tasklists))
  308. {
  309. foreach ($tasklists as $tl)
  310. {
  311. $close_tasklists = mysql_query("UPDATE tasklist SET status = 0 WHERE ID = $tl[ID]");
  312. }
  313. }
  314. $upd = mysql_query("UPDATE projekte SET status=0 WHERE ID = $id");
  315. if ($upd)
  316. {
  317. $nam = mysql_query("SELECT name FROM projekte WHERE ID = $id");
  318. $nam = mysql_fetch_row($nam);
  319. $nam = $nam[0];
  320. $this->mylog->add($nam, 'projekt', 5, $id);
  321. return true;
  322. }
  323. else
  324. {
  325. return false;
  326. }
  327. }
  328. /**
  329. * Weist ein Projekt einem bestimmten Mitglied zu
  330. *
  331. * @param int $user Eindeutige Mitgliedsnummer
  332. * @param int $id Eindeutige Projektnummer
  333. * @return bool
  334. */
  335. function assign($user, $id)
  336. {
  337. $user = mysql_real_escape_string($user);
  338. $id = mysql_real_escape_string($id);
  339. $user = (int) $user;
  340. $id = (int) $id;
  341. $ins = mysql_query("INSERT INTO projekte_assigned (user,projekt) VALUES ($user,$id)");
  342. if ($ins)
  343. {
  344. return true;
  345. }
  346. else
  347. {
  348. return false;
  349. }
  350. }
  351. /**
  352. * Entfernt ein Projekt aus der Zuweisung an ein bestimmtes Mitglied
  353. *
  354. * @param int $user Eindeutige Mitgliedsnummer
  355. * @param int $id Eindeutige Projektnummer
  356. * @return bool
  357. */
  358. function deassign($user, $id)
  359. {
  360. $user = mysql_real_escape_string($user);
  361. $id = mysql_real_escape_string($id);
  362. $user = (int) $user;
  363. $id = (int) $id;
  364. $sql = "DELETE FROM projekte_assigned WHERE user = $user AND projekt = $id";
  365. $milestone = new milestone();
  366. $donemiles = $milestone->getDoneProjectMilestones($id);
  367. if (!empty($donemiles))
  368. {
  369. foreach ($donemiles as $dm)
  370. {
  371. $sql1 = mysql_query("DELETE FROM milestones_assigned WHERE user = $user AND milestone = $dm[ID]");
  372. }
  373. }
  374. $openmiles = $milestone->getAllProjectMilestones($id, 100000);
  375. if (!empty($openmiles))
  376. {
  377. foreach ($openmiles as $om)
  378. {
  379. $sql2 = mysql_query("DELETE FROM milestones_assigned WHERE user = $user AND milestone = $om[ID]");
  380. }
  381. }
  382. $task = new task();
  383. $tasks = $task->getProjectTasks($id);
  384. if (!empty($tasks))
  385. {
  386. foreach ($tasks as $t)
  387. {
  388. $sql3 = mysql_query("DELETE FROM tasks_assigned WHERE user = $user AND task = $t[ID]");
  389. }
  390. }
  391. $del = mysql_query($sql);
  392. if ($del)
  393. {
  394. return true;
  395. }
  396. else
  397. {
  398. return false;
  399. }
  400. }
  401. /**
  402. * Gibt alle Daten eines Projekts aus
  403. *
  404. * @param int $id Eindeutige Projektnummer
  405. * @param int $status
  406. * @return array $project Projektdaten
  407. */
  408. function getProject($id)
  409. {
  410. $id = (int) $id;
  411. $sel = mysql_query("SELECT * FROM projekte WHERE ID = $id");
  412. $project = mysql_fetch_array($sel, MYSQL_ASSOC);
  413. if (!empty($project))
  414. {
  415. if ($project["end"])
  416. {
  417. $daysleft = $this->getDaysLeft($project["end"]);
  418. $project["daysleft"] = $daysleft;
  419. $endstring = date("d.m.Y", $project["end"]);
  420. $project["endstring"] = $endstring;
  421. }
  422. else
  423. {
  424. $project["daysleft"] = 0;
  425. }
  426. $startstring = date(CL_DATEFORMAT, $project["start"]);
  427. $project["startstring"] = $startstring;
  428. $project["name"] = stripslashes($project["name"]);
  429. $project["desc"] = stripslashes($project["desc"]);
  430. $project["done"] = $this->getProgress($project["ID"]);
  431. return $project;
  432. }
  433. else
  434. {
  435. return false;
  436. }
  437. }
  438. /**
  439. * Listet die aktuellsten Projekte auf
  440. *
  441. * @param int $status Bearbeitungsstatus der Projekte (1 = offenes Projekt)
  442. * @param int $lim Anzahl der anzuzeigenden Projekte
  443. * @return array $projekte Active projects
  444. */
  445. function getProjects($status = 1, $lim = 10)
  446. {
  447. $status = mysql_real_escape_string($status);
  448. $lim = mysql_real_escape_string($lim);
  449. $status = (int) $status;
  450. $lim = (int) $lim;
  451. $projekte = array();
  452. $sel = mysql_query("SELECT ID FROM projekte WHERE `status`=$status ORDER BY end ASC LIMIT $lim");
  453. while ($projekt = mysql_fetch_array($sel))
  454. {
  455. $project = $this->getProject($projekt["ID"]);
  456. array_push($projekte, $project);
  457. }
  458. if (!empty($projekte))
  459. {
  460. return $projekte;
  461. }
  462. else
  463. {
  464. return false;
  465. }
  466. }
  467. /**
  468. * Listet alle einem Mitglied zugewiesenen Projekte auf
  469. *
  470. * @param int $user Eindeutige Mitgliedsnummer
  471. * @param int $status Bearbeitungsstatus von Projekten (1 = offenes Projekt)
  472. * @return array $myprojekte Projekte des Mitglieds
  473. */
  474. function getMyProjects($user, $status = 1)
  475. {
  476. $user = mysql_real_escape_string($user);
  477. $status = mysql_real_escape_string($status);
  478. $user = (int) $user;
  479. $status = (int) $status;
  480. $myprojekte = array();
  481. $sel = mysql_query("SELECT projekt FROM projekte_assigned WHERE user = $user ORDER BY ID ASC");
  482. while ($projs = mysql_fetch_row($sel))
  483. {
  484. $projekt = mysql_fetch_array(mysql_query("SELECT ID FROM projekte WHERE ID = $projs[0] AND status=$status"), MYSQL_ASSOC);
  485. if ($projekt)
  486. {
  487. $project = $this->getProject($projekt["ID"]);
  488. array_push($myprojekte, $project);
  489. }
  490. }
  491. if (!empty($myprojekte))
  492. {
  493. return $myprojekte;
  494. }
  495. else
  496. {
  497. return false;
  498. }
  499. }
  500. /**
  501. * Listet alle IDs der Projekte eines Mitglieds auf
  502. *
  503. * @param int $user Eindeutige Mitgliedsnummer
  504. * @return array $myprojekte Projekt-Nummern
  505. */
  506. function getMyProjectIds($user)
  507. {
  508. $user = mysql_real_escape_string($user);
  509. $user = (int) $user;
  510. $myprojekte = array();
  511. $sel = mysql_query("SELECT projekt FROM projekte_assigned WHERE user = $user ORDER BY end ASC");
  512. if ($sel)
  513. {
  514. while ($projs = mysql_fetch_row($sel))
  515. {
  516. $sel2 = mysql_query("SELECT ID FROM projekte WHERE ID = $projs[0]");
  517. $projekt = mysql_fetch_array($sel2);
  518. if ($projekt)
  519. {
  520. array_push($myprojekte, $projekt);
  521. }
  522. }
  523. }
  524. if (!empty($myprojekte))
  525. {
  526. return $myprojekte;
  527. }
  528. else
  529. {
  530. return false;
  531. }
  532. }
  533. /**
  534. * Listet alle einem bestimmen Projekt zugewiesenen Mitglieder auf
  535. *
  536. * @param int $project Eindeutige Projektnummer
  537. * @param int $lim Maximum auszugebender Mitglieder
  538. * @return array $members Projektmitglieder
  539. */
  540. function getProjectMembers($project, $lim = 10, $paginate = true)
  541. {
  542. $project = mysql_real_escape_string($project);
  543. $lim = mysql_real_escape_string($lim);
  544. $project = (int) $project;
  545. $lim = (int) $lim;
  546. $members = array();
  547. if ($paginate)
  548. {
  549. $num = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM projekte_assigned WHERE projekt = $project"));
  550. $num = $num[0];
  551. $lim = (int)$lim;
  552. SmartyPaginate::connect();
  553. // set items per page
  554. SmartyPaginate::setLimit($lim);
  555. SmartyPaginate::setTotal($num);
  556. $start = SmartyPaginate::getCurrentIndex();
  557. $lim = SmartyPaginate::getLimit();
  558. }
  559. else
  560. {
  561. $start = 0;
  562. }
  563. $sel1 = mysql_query("SELECT user FROM projekte_assigned WHERE projekt = $project LIMIT $start,$lim");
  564. $usr = new user();
  565. while ($user = mysql_fetch_array($sel1))
  566. {
  567. $theuser = $usr->getProfile($user[0]);
  568. array_push($members, $theuser);
  569. }
  570. if (!empty($members))
  571. {
  572. return $members;
  573. }
  574. else
  575. {
  576. return false;
  577. }
  578. }
  579. function countMembers($project)
  580. {
  581. $project = (int) $project;
  582. $num = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM projekte_assigned WHERE projekt = $project"));
  583. return $num[0];
  584. }
  585. /**
  586. * Progressmeter
  587. *
  588. * @param int $project Project ID
  589. * @return array $done Percent of finished tasks
  590. */
  591. function getProgress($project)
  592. {
  593. $project = mysql_real_escape_string($project);
  594. $project = (int) $project;
  595. $otasks = mysql_query("SELECT COUNT(*) FROM tasks WHERE project = $project AND status = 1");
  596. $otasks = mysql_fetch_row($otasks);
  597. $otasks = $otasks[0];
  598. $clotasks = mysql_query("SELECT COUNT(*) FROM tasks WHERE project = $project AND status = 0");
  599. $clotasks = mysql_fetch_row($clotasks);
  600. $clotasks = $clotasks[0];
  601. $totaltasks = $otasks + $clotasks;
  602. if ($totaltasks > 0 and $clotasks > 0)
  603. {
  604. $done = $clotasks / $totaltasks * 100;
  605. $done = round($done);
  606. }
  607. else
  608. {
  609. $done = 0;
  610. }
  611. return $done;
  612. }
  613. function getProjectFolders($project)
  614. {
  615. $project = (int) $project;
  616. $sel = mysql_query("SELECT * FROM projectfolders WHERE project = $project");
  617. $folders = array();
  618. while ($folder = mysql_fetch_array($sel))
  619. {
  620. array_push($folders, $folder);
  621. }
  622. if (!empty($folders))
  623. {
  624. return $folders;
  625. }
  626. else
  627. {
  628. return false;
  629. }
  630. }
  631. /**
  632. * Gibt die verbleibenden Tage von einem gegeben Zeitpunkt bis heute zur?ck
  633. *
  634. * @param int $end Zu vergleichender Zeitpunkt
  635. * @return int Verbleibende volle Tage
  636. */
  637. private function getDaysLeft($end)
  638. {
  639. $tod = date("d.m.Y");
  640. $start = strtotime($tod);
  641. $diff = $end - $start;
  642. return floor($diff / 86400);
  643. }
  644. }
  645. ?>