PageRenderTime 135ms CodeModel.GetById 27ms RepoModel.GetById 3ms app.codeStats 1ms

/api.php

https://github.com/BrianPrz/worklist
PHP | 3501 lines | 3032 code | 306 blank | 163 comment | 488 complexity | 520a8870194e6de7aeb08cb5345a0bd6 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /**
  3. * Copyright (c) 2014, High Fidelity Inc.
  4. * All Rights Reserved.
  5. *
  6. * http://highfidelity.io
  7. */
  8. require_once ("config.php");
  9. require_once ("models/DataObject.php");
  10. require_once ("models/Review.php");
  11. require_once ("models/Users_Favorite.php");
  12. require_once ("models/Budget.php");
  13. Session::check();
  14. if (!defined("ALL_ASSETS")) define("ALL_ASSETS", "all_assets");
  15. // TODO: add API keys to these function calls
  16. // uploadProfilePicture
  17. // getSystemDrawerJobs
  18. // getTimezone
  19. if(validateAction()) {
  20. if(!empty($_REQUEST['action'])){
  21. mysql_connect (DB_SERVER, DB_USER, DB_PASSWORD);
  22. mysql_select_db (DB_NAME);
  23. switch($_REQUEST['action']){
  24. case 'updateuser':
  25. validateAPIKey();
  26. updateuser();
  27. break;
  28. case 'pushVerifyUser':
  29. validateAPIKey();
  30. pushVerifyUser();
  31. break;
  32. case 'login':
  33. validateAPIKey();
  34. loginUserIntoSession();
  35. break;
  36. case 'getTaskPosts':
  37. getTaskPosts();
  38. break;
  39. case 'uploadProfilePicture':
  40. uploadProfilePicture();
  41. break;
  42. case 'updateProjectList':
  43. validateAPIKey();
  44. updateProjectList();
  45. break;
  46. case 'getSystemDrawerJobs':
  47. getSystemDrawerJobs();
  48. break;
  49. case 'bidNotification':
  50. validateAPIKey();
  51. sendBidNotification();
  52. break;
  53. case 'processW2Masspay':
  54. validateAPIKey();
  55. processW2Masspay();
  56. break;
  57. case 'doScanAssets':
  58. validateAPIKey();
  59. doScanAssets();
  60. break;
  61. case 'version':
  62. validateAPIKey();
  63. exec('svnversion > ver');
  64. break;
  65. case 'sendContactEmail':
  66. // @TODO: why do we require an API key for this?
  67. // I don't get it. The request is sent via JS, so if we included the API key it would
  68. // then become visible to all who want to see it, leaving the form open for abuse... - lithium
  69. // validateAPIKey();
  70. sendContactEmail();
  71. break;
  72. case 'getTimezone':
  73. getTimezone();
  74. break;
  75. case 'updateLastSeen':
  76. updateLastSeen();
  77. break;
  78. case 'sendTestNotifications':
  79. validateAPIKey();
  80. sendTestNotifications();
  81. break;
  82. case 'autoPass':
  83. validateAPIKey();
  84. autoPassSuggestedJobs();
  85. break;
  86. case 'processPendingReviewsNotifications':
  87. validateAPIKey();
  88. processPendingReviewsNotifications();
  89. break;
  90. case 'pruneJournalEntries' :
  91. validateAPIKey();
  92. pruneJournalEntries();
  93. break;
  94. case 'createRepo':
  95. createRepo();
  96. break;
  97. case 'createSandbox':
  98. createSandbox();
  99. break;
  100. case 'createDatabaseNewProject':
  101. createDatabaseNewProject();
  102. break;
  103. case 'sendNewProjectEmails':
  104. sendNewProjectEmails();
  105. break;
  106. case 'modifyConfigFile':
  107. modifyConfigFile();
  108. break;
  109. case 'addPostCommitHook':
  110. addPostCommitHook();
  111. break;
  112. case 'deployStagingSite':
  113. deployStagingSite();
  114. break;
  115. case 'getFavoriteUsers':
  116. getFavoriteUsers();
  117. break;
  118. case 'getTwilioCountries':
  119. getTwilioCountries();
  120. break;
  121. case 'deployErrorNotification':
  122. validateAPIKey();
  123. deployErrorNotification();
  124. break;
  125. case 'saveSoundSettings':
  126. saveSoundSettings();
  127. break;
  128. case 'sendNotifications':
  129. validateAPIKey();
  130. sendNotifications();
  131. break;
  132. case 'checkInactiveProjects':
  133. validateAPIKey();
  134. checkInactiveProjects();
  135. break;
  136. case 'checkRemovableProjects':
  137. validateAPIKey();
  138. checkRemovableProjects();
  139. break;
  140. case 'addProject':
  141. addProject();
  142. break;
  143. case 'addWorkitem':
  144. addWorkitem();
  145. break;
  146. case 'setFavorite':
  147. setFavorite();
  148. break;
  149. case 'manageBudget':
  150. manageBudget();
  151. break;
  152. case 'getBidItem':
  153. getBidItem();
  154. break;
  155. case 'getBonusHistory':
  156. getBonusHistory();
  157. break;
  158. case 'getFeeItem':
  159. getFeeItem();
  160. break;
  161. case 'getCodeReviewStatus':
  162. getCodeReviewStatus();
  163. break;
  164. case 'getFeeSums':
  165. getFeeSums();
  166. break;
  167. case 'getJobInformation':
  168. getJobInformation();
  169. break;
  170. case 'getMultipleBidList':
  171. getMultipleBidList();
  172. break;
  173. case 'getProjects':
  174. getProjects();
  175. break;
  176. case 'getReport':
  177. getReport();
  178. break;
  179. case 'getSkills':
  180. getSkills();
  181. break;
  182. case 'getStats':
  183. $req = isset($_REQUEST['req'])? $_REQUEST['req'] : 'table';
  184. $interval = isset($_REQUEST['req'])? $_REQUEST['req'] : 30;
  185. echo json_encode(getStats($req, $interval));
  186. break;
  187. case 'getUserItem':
  188. getUserItem();
  189. break;
  190. case 'getUserItems':
  191. getUserItems();
  192. break;
  193. case 'getUserList':
  194. getUserList();
  195. break;
  196. case 'getUsersList':
  197. getUsersList();
  198. break;
  199. case 'getUserStats':
  200. getUserStats();
  201. break;
  202. case 'getWorkitem':
  203. getWorkitem();
  204. break;
  205. case 'getWorklist':
  206. getWorklist();
  207. break;
  208. case 'payBonus':
  209. payBonus();
  210. break;
  211. case 'payCheck':
  212. payCheck();
  213. break;
  214. case 'pingTask':
  215. pingTask();
  216. break;
  217. case 'refreshFilter':
  218. refreshFilter();
  219. break;
  220. case 'userReview':
  221. userReview();
  222. break;
  223. case 'workitemSandbox':
  224. workitemSandbox();
  225. break;
  226. case 'testFlight':
  227. testFlight();
  228. break;
  229. case 'updateBudget':
  230. updateBudget();
  231. break;
  232. case 'userNotes':
  233. userNotes();
  234. break;
  235. case 'visitQuery':
  236. visitQuery();
  237. break;
  238. case 'wdFee':
  239. wdFee();
  240. break;
  241. case 'budgetInfo':
  242. budgetInfo();
  243. break;
  244. case 'budgetHistory':
  245. budgetHistory();
  246. break;
  247. case 'timeline':
  248. timeline();
  249. break;
  250. case 'newUserNotification':
  251. validateAPIKey();
  252. sendNewUserNotification();
  253. break;
  254. case 'sendJobReport':
  255. validateAPIKey();
  256. sendJobReport();
  257. break;
  258. default:
  259. die("Invalid action.");
  260. }
  261. }
  262. }
  263. function validateAction() {
  264. if (validateRequest()) {
  265. return true;
  266. } else {
  267. return false;
  268. }
  269. }
  270. function validateRequest() {
  271. if( ! isset($_SERVER['HTTPS'])) {
  272. error_log("Only HTTPS connection is accepted.");
  273. die("Only HTTPS connection is accepted.");
  274. } else if ( ! isset($_REQUEST['action'])) {
  275. error_log("API not defined");
  276. die("API not defined");
  277. } else {
  278. return true;
  279. }
  280. }
  281. function validateAPIKey() {
  282. if( ! isset($_REQUEST["api_key"])) {
  283. error_log("No api key defined.");
  284. die("No api key defined.");
  285. } else if(strcmp($_REQUEST["api_key"],API_KEY) != 0 ) {
  286. error_log("Wrong api key provided.");
  287. die("Wrong api key provided.");
  288. } else {
  289. return true;
  290. }
  291. }
  292. /*
  293. * Setting session variables for the user so he is logged in
  294. */
  295. function loginUserIntoSession(){
  296. $db = new Database();
  297. $uid = (int) $_REQUEST['user_id'];
  298. $sid = $_REQUEST['session_id'];
  299. $csrf_token = md5(uniqid(rand(), TRUE));
  300. $sql = "SELECT * FROM ".WS_SESSIONS." WHERE session_id = '".mysql_real_escape_string($sid, $db->getLink())."'";
  301. $res = $db->query($sql);
  302. $session_data ="running|s:4:\"true\";";
  303. $session_data .="userid|s:".strlen($uid).":\"".$uid."\";";
  304. $session_data .="username|s:".strlen($_REQUEST['username']).":\"".$_REQUEST['username']."\";";
  305. $session_data .="nickname|s:".strlen($_REQUEST['nickname']).":\"".$_REQUEST['nickname']."\";";
  306. $session_data .="admin|s:".strlen($_REQUEST['admin']).":\"".$_REQUEST['admin']."\";";
  307. $session_data .="csrf_token|s:".strlen($csrf_token).":\"".$csrf_token."\";";
  308. if(mysql_num_rows($res) > 0){
  309. $sql = "UPDATE ".WS_SESSIONS." SET ".
  310. "session_data = '".mysql_real_escape_string($session_data,$db->getLink())."' ".
  311. "WHERE session_id = '".mysql_real_escape_string($sid, $db->getLink())."';";
  312. $db->query($sql);
  313. } else {
  314. $expires = time() + SESSION_EXPIRE;
  315. $db->insert(WS_SESSIONS,
  316. array("session_id" => $sid,
  317. "session_expires" => $expires,
  318. "session_data" => $session_data),
  319. array("%s","%d","%s")
  320. );
  321. }
  322. }
  323. function uploadProfilePicture() {
  324. // check if we have a file
  325. if (empty($_FILES)) {
  326. respond(array(
  327. 'success' => false,
  328. 'message' => 'No file uploaded!'
  329. ));
  330. }
  331. if (empty($_REQUEST['userid'])) {
  332. respond(array(
  333. 'success' => false,
  334. 'message' => 'No user ID set!'
  335. ));
  336. }
  337. $ext = end(explode(".", $_FILES['profile']['name']));
  338. $tempFile = $_FILES['profile']['tmp_name'];
  339. $imgName = strtolower($_REQUEST['userid'] . '.' . $ext);
  340. $path = APP_IMAGE_PATH . $imgName;
  341. try {
  342. File::s3Upload($tempFile, $path);
  343. $query = "
  344. UPDATE `" . USERS . "`
  345. SET `picture` = '" . mysql_real_escape_string($imgName) . "' ,
  346. `s3bucket` = '" . S3_BUCKET ."'
  347. WHERE `id` = " . (int) $_REQUEST['userid'] . "
  348. LIMIT 1";
  349. if (! mysql_query($query)) {
  350. error_log("s3upload mysql: ".mysql_error());
  351. respond(array(
  352. 'success' => false,
  353. 'message' => SL_DB_FAILURE
  354. ));
  355. }
  356. respond(array(
  357. 'success' => true,
  358. 'picture' => $imgName
  359. ));
  360. } catch (Exception $e) {
  361. $success = false;
  362. $error = 'There was a problem uploading your file';
  363. error_log(__FILE__.": Error uploading images to S3:\n$e");
  364. return $this->setOutput(array(
  365. 'success' => false,
  366. 'message' => 'An error occured while uploading the file, please try again!'
  367. ));
  368. }
  369. }
  370. function updateuser(){
  371. $sql = "UPDATE ".USERS." ".
  372. "SET ";
  373. $id = (int)$_REQUEST["user_id"];
  374. foreach($_REQUEST["user_data"] as $key => $value){
  375. $sql .= $key." = '".mysql_real_escape_string($value)."', ";
  376. }
  377. $sql = substr($sql,0,(strlen($sql) - 1));
  378. $sql .= " ".
  379. "WHERE id = ".$id;
  380. mysql_query($sql);
  381. }
  382. function pushVerifyUser(){
  383. $user_id = intval($_REQUEST['id']);
  384. $sql = "UPDATE " . USERS . " SET `confirm` = '1', is_active = '1' WHERE `id` = $user_id";
  385. mysql_unbuffered_query($sql);
  386. respond(array('success' => false, 'message' => 'User has been confirmed!'));
  387. }
  388. function updateProjectList(){
  389. $repo = basename($_REQUEST['repo']);
  390. $project = new Project();
  391. $project->loadByRepo($repo);
  392. $commit_date = date('Y-m-d H:i:s');
  393. $project->setLastCommit($commit_date);
  394. $project->save();
  395. }
  396. function getSystemDrawerJobs(){
  397. $sql = " SELECT "
  398. . " SUM(CASE WHEN w.status = 'Bidding' THEN 1 ELSE 0 END) AS bidding, "
  399. . " SUM(CASE WHEN w.status = 'Review' THEN 1 ELSE 0 END) AS review "
  400. . " FROM " . WORKLIST . " AS w "
  401. . " WHERE w.status = 'Bidding' OR (w.status = 'Review' "
  402. . " AND w.code_review_completed = 0 "
  403. . " AND w.code_review_started = 0);";
  404. $result = mysql_query($sql);
  405. if ($result && ($row = mysql_fetch_assoc($result))) {
  406. $bidding_count = $row['bidding'];
  407. $review_count = $row['review'];
  408. $need_review = array();
  409. if ($review_count) {
  410. $sql = " SELECT w.id, w.summary "
  411. . " FROM " . WORKLIST . " AS w "
  412. . " WHERE w.status = 'Review' "
  413. . " AND w.code_review_completed = 0 "
  414. . " AND w.code_review_started = 0"
  415. . " LIMIT 7;";
  416. $result = mysql_query($sql);
  417. while ($row = mysql_fetch_assoc($result)) {
  418. $need_review[] = array(
  419. 'id' => $row['id'],
  420. 'summary' => $row['summary']
  421. );
  422. }
  423. }
  424. respond(array(
  425. 'success' => true,
  426. 'bidding' => $bidding_count,
  427. 'review' => $review_count,
  428. 'need_review' => $need_review
  429. ));
  430. } else {
  431. respond(array('success' => false, 'message' => "Couldn't retrieve jobs"));
  432. }
  433. }
  434. function sendBidNotification() {
  435. require_once('./classes/Notification.class.php');
  436. $notify = new Notification();
  437. $notify->emailExpiredBids();
  438. }
  439. function processW2Masspay() {
  440. if (!defined('COMMAND_API_KEY')
  441. or !array_key_exists('COMMAND_API_KEY',$_POST)
  442. or $_POST['COMMAND_API_KEY'] != COMMAND_API_KEY)
  443. { die('Action Not configured'); }
  444. $con = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD);
  445. if (!$con) {
  446. die('Could not connect: ' . mysql_error());
  447. }
  448. mysql_select_db(DB_NAME, $con);
  449. $sql = " UPDATE " . FEES . " AS f, " . WORKLIST . " AS w, " . USERS . " AS u "
  450. . " SET f.paid = 1, f.paid_date = NOW() "
  451. . " WHERE f.paid = 0 AND f.worklist_id = w.id AND w.status = 'Done' "
  452. . " AND f.withdrawn = 0 "
  453. . " AND f.user_id = u.id "
  454. . " AND u.has_W2 = 1 "
  455. . " AND w.status_changed < CAST(DATE_FORMAT(NOW(),'%Y-%m-01') as DATE) "
  456. . " AND f.date < CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE); ";
  457. // Marks all Fees from the past month as paid (for DONEd jobs)
  458. if (!$result = mysql_query($sql)) { error_log("mysql error: ".mysql_error()); die("mysql_error: ".mysql_error()); }
  459. $total = mysql_affected_rows();
  460. if( $total) {
  461. echo "{$total} fees were processed.";
  462. } else {
  463. echo "No fees were found!";
  464. }
  465. $sql = " UPDATE " . FEES . " AS f, " . USERS . " AS u "
  466. . " SET f.paid = 1, f.paid_date = NOW() "
  467. . " WHERE f.paid = 0 "
  468. . " AND f.bonus = 1 "
  469. . " AND f.withdrawn = 0 "
  470. . " AND f.user_id = u.id "
  471. . " AND u.has_W2 = 1 "
  472. . " AND f.date < CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE); ";
  473. // Marks all Fees from the past month as paid (for DONEd jobs)
  474. if (!$result = mysql_query($sql)) { error_log("mysql error: ".mysql_error()); die("mysql_error: ".mysql_error()); }
  475. $total = mysql_affected_rows();
  476. if( $total) {
  477. echo "{$total} bonuses were processed.";
  478. } else {
  479. echo "No bonuses were found!";
  480. }
  481. mysql_close($con);
  482. }
  483. function doScanAssets() {
  484. $scanner = new ScanAssets();
  485. $scanner->scanAll();
  486. }
  487. function respond($val){
  488. exit(json_encode($val));
  489. }
  490. function sendContactEmail(){
  491. $name = isset($_REQUEST['name']) ? $_REQUEST['name'] : '';
  492. $email = isset($_REQUEST['email']) ? $_REQUEST['email'] : '';
  493. $phone = isset($_REQUEST['phone']) ? $_REQUEST['phone'] : '';
  494. $proj_name = isset($_REQUEST['project']) ? $_REQUEST['project'] : '';
  495. $proj_desc = isset($_REQUEST['proj_desc']) ? $_REQUEST['proj_desc'] : '';
  496. $website = isset($_REQUEST['website']) ? $_REQUEST['website'] : '';
  497. if (empty($phone) || empty($email) || empty($phone) || empty($proj_name) || empty($proj_desc)) {
  498. exit(json_encode(array('error' => 'All Fields are required!')));
  499. }
  500. require_once('./classes/Notification.class.php');
  501. $notify = new Notification();
  502. if ($notify->emailContactForm($name, $email, $phone, $proj_name, $proj_desc, $website)) {
  503. exit(json_encode(array('success' => true)));
  504. } else {
  505. exit(json_encode(array('error' => 'There was an error sending your message, please try again later.')));
  506. }
  507. }// end sendContactEmail
  508. function autoPassSuggestedJobs() {
  509. $con = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
  510. if (!$con) {
  511. die('Could not connect: ' . mysql_error());
  512. }
  513. mysql_select_db(DB_NAME, $con);
  514. $sql = "SELECT id FROM `" . WORKLIST ."` WHERE status IN ( 'Suggested' , 'SuggestedWithBid', 'Bidding') AND DATEDIFF(now() , status_changed) > 30";
  515. $result = mysql_query($sql);
  516. $delay = 0;
  517. if(mysql_num_rows($result) > 1) {
  518. $delay = 5;
  519. }
  520. while ($row = mysql_fetch_assoc($result)) {
  521. $status = 'Pass';
  522. $workitem = new WorkItem($row['id']);
  523. $prev_status = $workitem->getStatus();
  524. // change status of the workitem to PASS.
  525. $workitem->setStatus($status);
  526. if ($workitem->save()) {
  527. $recipients = array('creator');
  528. $emails = array();
  529. $data = array('prev_status' => $prev_status);
  530. if ($prev_status == 'Bidding') {
  531. $recipients[] = 'usersWithBids';
  532. $emails = preg_split('/[\s]+/', ADMINS_EMAILS);
  533. }
  534. //notify
  535. Notification::workitemNotify(
  536. array(
  537. 'type' => 'auto-pass',
  538. 'workitem' => $workitem,
  539. 'recipients' => $recipients,
  540. 'emails' => $emails
  541. ),
  542. $data
  543. );
  544. //sendJournalnotification
  545. $journal_message = "\\\\#" . $workitem->getId() . " updated by @Otto. Status set to " . $status;
  546. sendJournalNotification(stripslashes($journal_message));
  547. } else {
  548. error_log("Otto failed to update the status of workitem #" . $workitem->getId() . " to " . $status);
  549. }
  550. sleep($delay);
  551. }
  552. mysql_free_result($result);
  553. mysql_close($con);
  554. }
  555. function getTimezone() {
  556. if (isset($_REQUEST['username'])) {
  557. $username = $_REQUEST['username'];
  558. } else {
  559. respond(array('succeeded' => false, 'message' => 'Error: Could not determine the user'));
  560. }
  561. $user = new User();
  562. if ($user->findUserByUsername($username)) {
  563. respond(array('succeeded' => true, 'message' => $user->getTimezone()));
  564. } else {
  565. respond(array('succeeded' => false, 'message' => 'Error: Could not determine the user'));
  566. }
  567. }
  568. function updateLastSeen() {
  569. if (isset($_REQUEST['username'])) {
  570. $username = $_REQUEST['username'];
  571. } else {
  572. respond(array('succeeded' => false, 'message' => 'Error: Could not determine the user'));
  573. }
  574. $qry = "UPDATE ". USERS ." SET last_seen = NOW() WHERE username='". $username ."'";
  575. if ($res = mysql_query($qry)) {
  576. respond(array('succeeded' => true, 'message' => 'Last seen time updated!'));
  577. } else {
  578. respond(array('succeeded' => false, 'message' => mysql_error()));
  579. }
  580. }
  581. function processPendingReviewsNotifications() {
  582. // Check if it is time to process notifications
  583. if (!isset($_REQUEST['force']) && !canProcessNotifications()) {
  584. return;
  585. }
  586. // process pending journal notifications
  587. $pendingReviews = Review::getReviewsWithPendingJournalNotifications();
  588. if($pendingReviews !== false && count($pendingReviews) > 0) {
  589. echo "<br/>Processing " . count($pendingReviews) . " reviews.";
  590. foreach ($pendingReviews as $review) {
  591. $tReview = new Review();
  592. $tReview->loadById($review['reviewer_id'], $review['reviewee_id']);
  593. if ($tReview->journal_notified == 0) {
  594. sendReviewNotification($tReview->reviewee_id, 'update',
  595. $tReview->getReviews($tReview->reviewee_id, $tReview->reviewer_id, ' AND r.reviewer_id=' . $tReview->reviewer_id));
  596. } else {
  597. sendReviewNotification($tReview->reviewee_id, 'new',
  598. $tReview->getReviews($tReview->reviewee_id, $tReview->reviewer_id, ' AND r.reviewer_id=' . $tReview->reviewer_id));
  599. }
  600. $tReview->journal_notified = 1;
  601. $tReview->save('reviewer_id', 'reviewee_id');
  602. usleep(4000000);
  603. }
  604. } else {
  605. echo "<br />Processed. No pending Reviews.";
  606. }
  607. resetCronFile();
  608. }
  609. function canProcessNotifications() {
  610. $file = REVIEW_NOTIFICATIONS_CRON_FILE;
  611. // If no temp file is set (first time?) run it
  612. if (!file_exists($file)) {
  613. return true;
  614. } else {
  615. $hour = (int) file_get_contents($file);
  616. $serverHour = (int) date('H');
  617. if ($serverHour == $hour) {
  618. return true;
  619. } else {
  620. echo "<br/>It is not time yet.";
  621. echo "<br/>Next hour: " . $hour;
  622. echo "<br/>Current hour:" . $serverHour;
  623. return false;
  624. }
  625. }
  626. }
  627. function resetCronFile() {
  628. $hourLag = mt_rand(5, 12);
  629. $serverHour = (int) date('H');
  630. $newHour = $hourLag + $serverHour;
  631. if ($newHour > 23) {
  632. $newHour -= 24;
  633. }
  634. echo "<br/>Cron File Reseted.";
  635. echo "<br/>Next hour: " . $newHour;
  636. unlink(REVIEW_NOTIFICATIONS_CRON_FILE);
  637. file_put_contents(REVIEW_NOTIFICATIONS_CRON_FILE, $newHour);
  638. chmod (REVIEW_NOTIFICATIONS_CRON_FILE, 0755);
  639. }
  640. // Prune Journal entries by deleting all entries except the latest 100
  641. function pruneJournalEntries() {
  642. $sql = " SELECT MAX(id) AS maxId FROM " . ENTRIES;
  643. $result = mysql_query($sql);
  644. if ($result) {
  645. $row = mysql_fetch_assoc($result);
  646. } else {
  647. die( 'Failed to get all entries');
  648. }
  649. $total = (int) $row['maxId'] - 100;
  650. $sql = " DELETE FROM " . ENTRIES . " WHERE id <= {$total};";
  651. echo $sql;
  652. $result = mysql_unbuffered_query($sql);
  653. echo "<br/> # of deleted entries: " . mysql_affected_rows();
  654. }
  655. function createDatabaseNewProject() {
  656. $sandBoxUtil = new SandBoxUtil();
  657. if (array_key_exists('project', $_REQUEST)) {
  658. try {
  659. if ($sandBoxUtil->createDatabaseNewProject($_REQUEST['project'], $_REQUEST['username'])) {
  660. echo json_encode(array('success'=>true, 'message'=>'Database created succesfully'));
  661. } else {
  662. echo json_encode(array('success'=>false, 'message'=>'Database creation failed'));
  663. }
  664. } catch (Exception $e) {
  665. echo json_encode(array('success'=>false, 'message'=>$e->getMessage()));
  666. }
  667. } else {
  668. echo json_encode(array('success'=>false, 'message'=>'Missing Parameters'));
  669. }
  670. }
  671. function createRepo() {
  672. $sandBoxUtil = new SandBoxUtil();
  673. if (array_key_exists('project', $_REQUEST)) {
  674. try {
  675. if ($sandBoxUtil->createRepo($_REQUEST['project'])) {
  676. echo json_encode(array('success'=>true, 'message'=>'Repository created succesfully'));
  677. } else {
  678. echo json_encode(array('success'=>false, 'message'=>'Repository not created'));
  679. }
  680. } catch (Exception $e) {
  681. echo json_encode(array('success'=>false, 'message'=>$e->getMessage()));
  682. }
  683. } else {
  684. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  685. }
  686. }
  687. function createSandbox() {
  688. $sandBoxUtil = new SandBoxUtil();
  689. if (array_key_exists('username', $_REQUEST) && array_key_exists('nickname', $_REQUEST)
  690. && array_key_exists('unixusername', $_REQUEST) && array_key_exists('projectname', $_REQUEST)) {
  691. try {
  692. if ($sandBoxUtil->createSandbox($_REQUEST['username'],
  693. $_REQUEST['nickname'],
  694. $_REQUEST['unixusername'],
  695. $_REQUEST['projectname'],
  696. null,
  697. $_REQUEST['newuser'])) {
  698. $user = new User();
  699. $user->findUserByNickname($_REQUEST['nickname']);
  700. $user->setHas_sandbox(1);
  701. $user->setUnixusername($_REQUEST['unixusername']);
  702. $user->setProjects_checkedout($_REQUEST['projectname']);
  703. $user->save();
  704. echo json_encode(array('success'=>true, 'message'=>'Sandbox created'));
  705. } else {
  706. echo json_encode(array('success'=>false, 'message'=>'Sandbox creation and project checkout failed'));
  707. }
  708. } catch (Exception $e) {
  709. echo json_encode(array('success'=>false, 'message'=>$e->getMessage()));
  710. }
  711. } else {
  712. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  713. }
  714. }
  715. function sendNewProjectEmails() {
  716. if (array_key_exists('username', $_REQUEST) && array_key_exists('nickname', $_REQUEST)
  717. && array_key_exists('unixusername', $_REQUEST) && array_key_exists('projectname', $_REQUEST)) {
  718. $data = array();
  719. $data['project_name'] = $_REQUEST['projectname'];
  720. $data['nickname'] = $_REQUEST['unixusername'];
  721. $data['database_user'] = $_REQUEST['dbuser'];
  722. $data['repo_type'] = $_REQUEST['repo_type'];
  723. $data['github_repo_url'] = $_REQUEST['github_repo_url'];
  724. $user = new User();
  725. sendTemplateEmail(SUPPORT_EMAIL, 'ops-project-created', $data);
  726. if (!sendTemplateEmail($_REQUEST['username'], $_REQUEST['template'], $data)) {
  727. echo json_encode(array('success'=>false, 'message'=>'Emails not sent'));
  728. } else {
  729. echo json_encode(array('success'=>true, 'message'=>'Emails sent out'));
  730. }
  731. } else {
  732. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  733. }
  734. }
  735. function modifyConfigFile() {
  736. $sandBoxUtil = new SandBoxUtil();
  737. if (array_key_exists('username', $_REQUEST) && array_key_exists('nickname', $_REQUEST)
  738. && array_key_exists('unixusername', $_REQUEST) && array_key_exists('projectname', $_REQUEST)) {
  739. if ($sandBoxUtil->modifyConfigFile($_REQUEST['unixusername'],
  740. $_REQUEST['projectname'],
  741. $_REQUEST['dbuser'])) {
  742. echo json_encode(array('success'=>true, 'message'=>'Sandbox created'));
  743. } else {
  744. echo json_encode(array('success'=>false, 'message'=>'Sandbox creation and project checkout failed'));
  745. }
  746. } else {
  747. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  748. }
  749. }
  750. function addPostCommitHook() {
  751. $sandBoxUtil = new SandBoxUtil();
  752. if (array_key_exists('repo', $_REQUEST)) {
  753. try {
  754. if ($sandBoxUtil->addPostCommitHook($_REQUEST['repo'])) {
  755. echo json_encode(array('success'=>true, 'message'=>'Post commit hook added'));
  756. } else {
  757. echo json_encode(array('success'=>false, 'message'=>'Failed adding post commit hook'));
  758. }
  759. } catch (Exception $e) {
  760. echo json_encode(array('success'=>false, 'message'=>$e->getMessage()));
  761. }
  762. } else {
  763. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  764. }
  765. }
  766. function deployStagingSite() {
  767. $sandBoxUtil = new SandBoxUtil();
  768. if (array_key_exists('repo', $_REQUEST)) {
  769. try {
  770. if ($sandBoxUtil->deployStagingSite($_REQUEST['repo'])) {
  771. echo json_encode(array('success'=>true, 'message'=>'Post commit hook added'));
  772. } else {
  773. echo json_encode(array('success'=>false, 'message'=>'Failed adding post commit hook'));
  774. }
  775. } catch (Exception $e) {
  776. echo json_encode(array('success'=>false, 'message'=>$e->getMessage()));
  777. }
  778. } else {
  779. echo json_encode(array('success'=>false, 'message'=>'Missing parameters'));
  780. }
  781. }
  782. function getFavoriteUsers() {
  783. if (!$userid = (isset($_SESSION['userid']) ? $_SESSION['userid'] : 0)) {
  784. echo json_encode(array('favorite_users' => array()));
  785. return;
  786. }
  787. $users_favorite = new Users_Favorite();
  788. $data = array('favorite_users' => $users_favorite->getFavoriteUsers($userid));
  789. echo json_encode($data);
  790. }
  791. /**
  792. * Returns a list of all the countries supported by Twilio
  793. */
  794. function getTwilioCountries() {
  795. $sql = 'SELECT `country_code`, `country_phone_prefix` FROM `' . COUNTRIES . '` WHERE `country_twilio_enabled` = 1';
  796. $result = mysql_query($sql);
  797. if(!is_resource($result)) {
  798. echo json_encode(array(
  799. 'success' => false,
  800. 'message' => 'Could not retrieve the list of twilio supported countries'
  801. ));
  802. return;
  803. }
  804. $list = array();
  805. while ($row = mysql_fetch_assoc($result)) {
  806. $list[$row['country_code']] = $row['country_phone_prefix'];
  807. }
  808. echo json_encode(array(
  809. 'success' => true,
  810. 'list' => $list
  811. ));
  812. return;
  813. }
  814. function deployErrorNotification() {
  815. $work_item_id = isset($_REQUEST['workitem']) ? $_REQUEST['workitem'] : 0;
  816. $error_msg = isset($_REQUEST['error']) ? base64_decode($_REQUEST['error']) : '';
  817. $commit_rev = isset($_REQUEST['rev']) ? $_REQUEST['rev'] : '';
  818. require_once('classes/Notification.class.php');
  819. $notify = new Notification();
  820. $notify->deployErrorNotification($work_item_id, $error_msg, $commit_rev);
  821. exit(json_encode(array('success' => true)));
  822. }
  823. function saveSoundSettings() {
  824. if (!$userid = (isset($_SESSION['userid']) ? $_SESSION['userid'] : 0)) {
  825. echo json_encode(array('success'=>false, 'message'=>'Not logged-in user'));
  826. return;
  827. }
  828. try {
  829. $settings = 0;
  830. $settings_arr = preg_split('/:/', $_REQUEST['settings'], 5);
  831. if ((int) $settings_arr[0]) {
  832. $settings = $settings | JOURNAL_CHAT_SOUND;
  833. }
  834. if ((int) $settings_arr[1]) {
  835. $settings = $settings | JOURNAL_SYSTEM_SOUND;
  836. }
  837. if ((int) $settings_arr[2]) {
  838. $settings = $settings | JOURNAL_BOT_SOUND;
  839. }
  840. if ((int) $settings_arr[3]) {
  841. $settings = $settings | JOURNAL_PING_SOUND;
  842. }
  843. if ((int) $settings_arr[4]) {
  844. $settings = $settings | JOURNAL_EMERGENCY_ALERT;
  845. }
  846. $user = new User();
  847. $user->findUserById($userid);
  848. $user->setSound_settings($settings);
  849. $user->save();
  850. echo json_encode(array('success'=>true, 'message'=>'Settings saved'));
  851. } catch(Exception $e) {
  852. echo json_encode(array('success'=>false, 'message'=>'Settings saving failed'));
  853. }
  854. }
  855. function sendNotifications() {
  856. if (! array_key_exists('command', $_REQUEST)) {
  857. echo json_encode(array('success' => false, 'message' => 'Missing parameters'));
  858. exit;
  859. }
  860. $command = $_REQUEST['command'];
  861. switch ($command) {
  862. case 'statusNotify':
  863. if (! array_key_exists('workitem', $_REQUEST)) {
  864. echo json_encode(array('success' => false, 'message' => 'Missing parameters'));
  865. exit;
  866. }
  867. $workitem_id = (int) $_REQUEST['workitem'];
  868. $workitem = new WorkItem;
  869. $workitem->loadById($workitem_id);
  870. Notification::statusNotify($workitem);
  871. error_log('api.php: statusNotify completed');
  872. break;
  873. }
  874. echo json_encode(array('success' => true, 'message' => 'Notifications sent'));
  875. }
  876. function checkInactiveProjects() {
  877. $report_message = '';
  878. $db = new Database();
  879. $sql_inactive_projects = "
  880. SELECT w.project_id, p.name, p.contact_info, u.nickname, MAX(status_changed) AS last_change
  881. FROM " . WORKLIST . " AS w
  882. INNER JOIN " . PROJECTS . " AS p ON w.project_id=p.project_id
  883. LEFT JOIN " . USERS . " AS u ON u.id=p.owner_id
  884. WHERE p.active = 1 OR 1
  885. GROUP BY w.project_id HAVING last_change < DATE_SUB(NOW(), INTERVAL 90 DAY)
  886. ORDER BY p.name ASC";
  887. // Delete accounts which exists for at least 45 days and never have been used.
  888. $result = $db->query($sql_inactive_projects);
  889. while ($row = mysql_fetch_assoc($result)) {
  890. $project = new Project($row['project_id']);
  891. // send email
  892. $data = array(
  893. 'owner' => $row['nickname'],
  894. 'projectUrl' => Project::getProjectUrl($row['project_id']),
  895. 'projectName' => $row['name']
  896. );
  897. if (! sendTemplateEmail($row['contact_info'], 'project-inactive', $data)) {
  898. $report_message .= ' <p> Ok ---';
  899. } else {
  900. $report_message .= ' <p> Fail -';
  901. }
  902. $report_message .= ' Project (' . $row['project_id'] . ')- <a href="' . Project::getProjectUrl($row['project_id']) . '">' . $row['name'] . '</a> -- Last changed status: ' . $row['last_change'] . '</p>';
  903. $project->setActive(0);
  904. $project->save();
  905. }
  906. // Send report to ops if any project was set as inactive
  907. if ($report_message != '') {
  908. $headers['From'] = DEFAULT_SENDER;
  909. $subject = "Inactive Projects Report";
  910. $body = $report_message;
  911. if (!send_email(OPS_EMAIL, $subject, $body, null, $headers )) {
  912. error_log ('checkActiveProjects cron: Failed to send email report');
  913. }
  914. }
  915. }
  916. function checkRemovableProjects() {
  917. $report_message = '';
  918. $db = new Database();
  919. $sql_projects = "
  920. SELECT p.project_id, p.name, u.nickname, p.creation_date
  921. FROM " . PROJECTS . " AS p
  922. LEFT JOIN " . USERS . " AS u ON u.id=p.owner_id
  923. WHERE p.project_id NOT IN (SELECT DISTINCT w1.project_id
  924. FROM " . WORKLIST . " AS w1)
  925. AND p.creation_date < DATE_SUB(NOW(), INTERVAL 180 DAY)";
  926. $result = $db->query($sql_projects);
  927. while ($row = mysql_fetch_assoc($result)) {
  928. // send email
  929. $data = array(
  930. 'owner' => $row['nickname'],
  931. 'projectUrl' => Project::getProjectUrl($row['project_id']),
  932. 'projectName' => $row['name'],
  933. 'creation_date' => date('Y-m-d', strtotime($row['creation_date']))
  934. );
  935. if (sendTemplateEmail($row['contact_info'], 'project-removed', $data)) {
  936. $report_message .= ' <p> Ok email---';
  937. } else {
  938. $report_message .= ' <p> Failed email -';
  939. }
  940. $report_message .= ' Project (' . $row['project_id'] . ')- <a href="' . Project::getProjectUrl($row['project_id']) . '">' . $row['name'] . '</a> -- Created: ' . $row['creation_date'] . '</p>';
  941. // Remove projects dependencies
  942. // Remove project users
  943. $report_message .= '<p> Users removed for project id ' . $row['project_id'] . ':</p>';
  944. $sql_get_project_users = "SELECT * FROM " . PROJECT_USERS . " WHERE project_id = " . $row['project_id'];
  945. $result_temp = $db->query($sql_get_project_users);
  946. while ($row_temp = mysql_fetch_assoc($result_temp)) {
  947. $report_message .= dump_row_values($row_temp);
  948. }
  949. $sql_remove_project_users = "DELETE FROM " . PROJECT_USERS . " WHERE project_id = " . $row['project_id'];
  950. $db->query($sql_remove_project_users);
  951. // Remove project runners
  952. $report_message .= '<p> Designers removed for project id ' . $row['project_id'] . ':</p>';
  953. $sql_get_project_runners = "SELECT * FROM " . PROJECT_RUNNERS . " WHERE project_id = " . $row['project_id'];
  954. $result_temp = $db->query($sql_get_project_runners);
  955. while ($row_temp = mysql_fetch_assoc($result_temp)) {
  956. $report_message .= dump_row_values($row_temp);
  957. }
  958. $sql_remove_project_runners = "DELETE FROM " . PROJECT_RUNNERS . " WHERE project_id = " . $row['project_id'];
  959. $db->query($sql_remove_project_runners);
  960. // Remove project roles
  961. $report_message .= '<p> Roles removed for project id ' . $row['project_id'] . ':</p>';
  962. $sql_get_project_roles = "SELECT * FROM " . ROLES . " WHERE project_id = " . $row['project_id'];
  963. $result_temp = $db->query($sql_get_project_roles);
  964. while ($row_temp = mysql_fetch_assoc($result_temp)) {
  965. $report_message .= dump_row_values($row_temp);
  966. }
  967. $sql_remove_project_roles = "DELETE FROM " . ROLES . " WHERE project_id = " . $row['project_id'];
  968. $db->query($sql_remove_project_roles);
  969. $url = TOWER_API_URL;
  970. $fields = array(
  971. 'action' => 'staging_cleanup',
  972. 'name' => $row['name']
  973. );
  974. $result = CURLHandler::Post($url, $fields);
  975. // Remove project
  976. $report_message .= '<p> Project id ' . $row['project_id'] . ' removed </p>';
  977. $sql_get_project = "SELECT * FROM " . PROJECTS . " WHERE project_id = " . $row['project_id'];
  978. $result_temp = $db->query($sql_get_project);
  979. while ($row_temp = mysql_fetch_assoc($result_temp)) {
  980. $report_message .= dump_row_values($row_temp);
  981. }
  982. $sql_remove_project = "DELETE FROM " . PROJECTS . " WHERE project_id = " . $row['project_id'];
  983. $db->query($sql_remove_project);
  984. }
  985. // Send report to ops if any project was set as inactive
  986. if ($report_message != '') {
  987. $headers['From'] = DEFAULT_SENDER;
  988. $subject = "Removed Projects Report";
  989. $body = $report_message;
  990. if (!send_email(OPS_EMAIL, $subject, $body, null, $headers )) {
  991. error_log ('checkActiveProjects cron: Failed to send email report');
  992. }
  993. }
  994. }
  995. function dump_row_values($row) {
  996. $dump = '<p>';
  997. foreach ($row as $key=> $val ) {
  998. $dump .= '"' . $key . '" => ' . $val . ':';
  999. }
  1000. $dump .= '</p>';
  1001. return $dump;
  1002. }
  1003. function addProject() {
  1004. $journal_message = '';
  1005. $nick = '';
  1006. $userId = getSessionUserId();
  1007. if ($userId) {
  1008. initUserById($userId);
  1009. $user = new User();
  1010. $user->findUserById( $userId );
  1011. $nick = $user->getNickname();
  1012. $project = new Project();
  1013. $cr_3_favorites = $_REQUEST["cr_3_favorites"];
  1014. $args = array(
  1015. 'name',
  1016. 'description',
  1017. 'logo',
  1018. 'website',
  1019. 'checkGitHub',
  1020. 'github_repo_url',
  1021. 'defaultGithubApp',
  1022. 'githubClientId',
  1023. 'githubClientSecret'
  1024. );
  1025. foreach ($args as $arg) {
  1026. $$arg = !empty($_POST[$arg]) ? $_POST[$arg] : '';
  1027. }
  1028. if (!ctype_alnum($name)) {
  1029. die(json_encode(array('error' => "The name of the project can only contain letters (A-Z) and numbers (0-9). Please review and try again.")));
  1030. }
  1031. $repository = $name;
  1032. if ($project->getIdFromName($name)) {
  1033. die(json_encode(array('error' => "Project with the same name already exists!")));
  1034. }
  1035. $project->setName($name);
  1036. $project->setDescription($description);
  1037. $project->setWebsite($website);
  1038. $project->setContactInfo($user->getUsername());
  1039. $project->setOwnerId($userId);
  1040. $project->setActive(true);
  1041. $project->setLogo($logo);
  1042. if ($checkGitHub == 'true') {
  1043. $project->setRepo_type('git');
  1044. $project->setRepository($github_repo_url);
  1045. if ($defaultGithubApp == 'false') {
  1046. $project->setGithubId($githubClientId);
  1047. $project->setGithubSecret($githubClientSecret);
  1048. }
  1049. } else {
  1050. $project->setRepo_type('svn');
  1051. $project->setRepository($name);
  1052. }
  1053. $project->save();
  1054. $journal_message = '@' . $nick . ' added project *' . $name . '*';
  1055. if (!empty($journal_message)) {
  1056. //sending journal notification
  1057. sendJournalNotification($journal_message);
  1058. }
  1059. echo json_encode(array( 'return' => "Done!"));
  1060. } else {
  1061. echo json_encode(array( 'error' => "You must be logged in to add a new project!"));
  1062. }
  1063. }
  1064. function setFavorite() {
  1065. if ( !isset($_REQUEST['favorite_user_id']) ||
  1066. !isset($_REQUEST['newVal']) ) {
  1067. echo json_encode(array( 'error' => "Invalid parameters!"));
  1068. }
  1069. $userId = getSessionUserId();
  1070. if ($userId > 0) {
  1071. initUserById($userId);
  1072. $user = new User();
  1073. $user->findUserById( $userId );
  1074. $favorite_user_id = (int) $_REQUEST['favorite_user_id'];
  1075. $newVal = (int) $_REQUEST['newVal'];
  1076. $users_favorites = new Users_Favorite();
  1077. $res = $users_favorites->setMyFavoriteForUser($userId, $favorite_user_id, $newVal);
  1078. if ($res == "") {
  1079. // send chat if user has been marked a favorite
  1080. $favorite_user = new User();
  1081. $favorite_user->findUserById($favorite_user_id);
  1082. if ($newVal == 1) {
  1083. $resetUrl = SECURE_SERVER_URL . 'jobs#userid=' . $favorite_user_id ;
  1084. $resetUrl = '<a href="' . $resetUrl . '" title="Your profile">' . $resetUrl . '</a>';
  1085. $data = array();
  1086. $data['link'] = $resetUrl;
  1087. $nick = $favorite_user->getNickname();
  1088. if (! sendTemplateEmail($favorite_user->getUsername(), 'trusted', $data)) {
  1089. error_log("setFavorite: send_email failed on favorite notification");
  1090. }
  1091. // get favourite count
  1092. $count = $users_favorites->getUserFavoriteCount($favorite_user_id);
  1093. if ($count > 0) {
  1094. if ($count == 1) {
  1095. $message = "**{$count}** person";
  1096. } else {
  1097. $message = "**{$count}** people";
  1098. }
  1099. $journal_message = '@' . $nick . ' is now trusted by ' . $message . '!';
  1100. //sending journal notification
  1101. sendJournalNotification(stripslashes($journal_message));
  1102. }
  1103. }
  1104. echo json_encode(array( 'return' => "Trusted saved."));
  1105. } else {
  1106. echo json_encode(array( 'error' => $res));
  1107. }
  1108. } else {
  1109. echo json_encode(array( 'error' => "You must be logged in!"));
  1110. }
  1111. }
  1112. function manageBudget() {
  1113. // Check that this info is requested by a runner
  1114. if (!isset($_SESSION['is_runner']) || $_SESSION['is_runner'] != 1) {
  1115. echo "Error: Unauthorized";
  1116. die;
  1117. }
  1118. // Check a section request is given
  1119. if (!isset($_REQUEST['section'])) {
  1120. echo "No section requested.";
  1121. die;
  1122. }
  1123. $budget_id = 0;
  1124. if (isset($_REQUEST['budget_id'])) {
  1125. $budget_id = (int) $_REQUEST['budget_id'];
  1126. }
  1127. // Check if we've received sorting request
  1128. $sortby = "";
  1129. $desc = "";
  1130. $sort = false;
  1131. if (isset($_REQUEST['sortby']) && isset($_REQUEST['desc'])) {
  1132. switch ($_REQUEST['sortby']) {
  1133. case 'be-id':
  1134. case 'bet-id':
  1135. $sortby = 'id';
  1136. break;
  1137. case 'be-budget':
  1138. $sortby = 'budget_id';
  1139. break;
  1140. case 'bet-budget':
  1141. $sortby = 'budget_title';
  1142. break;
  1143. case 'be-summary':
  1144. $sortby = 'summary';
  1145. break;
  1146. case 'bet-notes':
  1147. $sortby = 'notes';
  1148. break;
  1149. case 'be-who':
  1150. case 'bet-who':
  1151. $sortby = 'who';
  1152. break;
  1153. case 'be-amount':
  1154. case 'bet-amount':
  1155. $sortby = 'amount';
  1156. break;
  1157. case 'be-status':
  1158. $sortby = 'status';
  1159. break;
  1160. case 'be-created':
  1161. case 'bet-created':
  1162. $sortby = 'created';
  1163. break;
  1164. case 'be-paid':
  1165. $sortby = 'paid';
  1166. break;
  1167. }
  1168. $desc = $_REQUEST['desc'];
  1169. $sort = true;
  1170. }
  1171. $section = $_REQUEST['section'];
  1172. if (!isset($_REQUEST['method'])) {
  1173. switch ($section) {
  1174. case 0:
  1175. if ($sort) {
  1176. echo BudgetTools::getAllocated($budget_id, $sortby, $desc);
  1177. } else {
  1178. echo BudgetTools::getAllocated($budget_id);
  1179. }
  1180. break;
  1181. case 1:
  1182. if ($sort) {
  1183. echo BudgetTools::getSubmitted($budget_id, $sortby, $desc);
  1184. } else {
  1185. echo BudgetTools::getSubmitted($budget_id);
  1186. }
  1187. break;
  1188. case 2:
  1189. if ($sort) {
  1190. echo BudgetTools::getPaid($budget_id, $sortby, $desc);
  1191. } else {
  1192. echo BudgetTools::getPaid($budget_id);
  1193. }
  1194. break;
  1195. case 3:
  1196. if ($sort) {
  1197. echo BudgetTools::getTransferred($budget_id, $sortby, $desc);
  1198. } else {
  1199. echo BudgetTools::getTransferred($budget_id);
  1200. }
  1201. break;
  1202. }
  1203. } else {
  1204. if ($_REQUEST['method'] == 'export') {
  1205. // Export to CSV
  1206. switch ($section) {
  1207. case 0:
  1208. $data = json_decode(BudgetTools::getAllocated());
  1209. BudgetTools::exportCSV($data);
  1210. break;
  1211. case 1:
  1212. $data = json_decode(BudgetTools::getSubmitted());
  1213. BudgetTools::exportCSV($data);
  1214. break;
  1215. case 2:
  1216. $data = json_decode(BudgetTools::getPaid());
  1217. BudgetTools::exportCSV($data);
  1218. break;
  1219. case 3:
  1220. $data = json_decode(BudgetTools::getTransferred($budget_id));
  1221. BudgetTools::exportCSV_Transferred($data);
  1222. break;
  1223. }
  1224. }
  1225. }
  1226. }
  1227. function getBidItem() {
  1228. $blankbid = array(
  1229. 'id' => 0,
  1230. 'bidder_id' => 0,
  1231. 'worklist_id' => 0,
  1232. 'email' => '*name hidden*',
  1233. 'bid_amount' => '0',
  1234. 'done_in' => '',
  1235. 'notes' => '',
  1236. );
  1237. $blankjson = json_encode($blankbid);
  1238. $item = isset($_REQUEST['item']) ? (int)$_REQUEST['item'] : 0;
  1239. if ($item == 0) {
  1240. echo $blankjson;
  1241. return;
  1242. }
  1243. $userId = getSessionUserId();
  1244. $user = new User();
  1245. if ($userId > 0) {
  1246. $user = $user->findUserById($userId);
  1247. } else {
  1248. $user->setId(0);
  1249. }
  1250. // Guest or hacking
  1251. if ($user->getId() == 0) {
  1252. echo $blankjson;
  1253. return;
  1254. }
  1255. $bid = new Bid($item);
  1256. if ($bid->id) {
  1257. $workItem = new WorkItem();
  1258. $workItem->conditionalLoadByBidId($item);
  1259. // Runner, item creator, or bidder can see item.
  1260. if ($user->isRunner() || ($user->getId() == $workItem->getCreatorId()) || ($user->getId() == $bid->bidder_id)) {
  1261. $bid->setAnyAccepted($workItem->hasAcceptedBids());
  1262. $row = $bid->toArray();
  1263. $row['notes'] = html_entity_decode($row['notes'], ENT_QUOTES);
  1264. $json = json_encode($row);
  1265. echo $json;
  1266. } else {
  1267. echo $blankjson;
  1268. }
  1269. }
  1270. }
  1271. function getBonusHistory() {
  1272. checkLogin();
  1273. if (empty($_SESSION['is_runner'])) {
  1274. die(json_encode(array()));
  1275. }
  1276. $limit = 7;
  1277. $page = (int) $_REQUEST['page'];
  1278. $rid = (int) $_REQUEST['rid'];
  1279. $uid = (int) $_REQUEST['uid'];
  1280. $where = 'AND `'.FEES.'`.`payer_id` = ' . $uid;
  1281. // Add option for order results
  1282. $orderby = "ORDER BY `".FEES."`.`date` DESC";
  1283. $qcnt = "SELECT count(*)";
  1284. $qsel = "SELECT DATE_FORMAT(`date`, '%m-%d-%Y') as date,
  1285. `amount`,
  1286. `nickname`,
  1287. `desc`";
  1288. $qbody = " FROM `".FEES."`
  1289. LEFT JOIN `".USERS."` ON `".USERS."`.`id` = `".FEES."`.`user_id`
  1290. WHERE `bonus` = 1 AND `amount` != 0 $where ";
  1291. $qorder = "$orderby LIMIT " . ($page - 1) * $limit . ",$limit";
  1292. $rtCount = mysql_query("$qcnt $qbody");
  1293. if ($rtCount) {
  1294. $row = mysql_fetch_row($rtCount);
  1295. $items = intv

Large files files are truncated, but you can click here to view the full file