function add_activities($offset, $limit) { global $dt_db, $si_db, $company_rates, $user_rates, $invoices, $checks; debug("add_activities({$limit}, offset)"); $task_activity_sql = "\n\tSELECT ta.id, ta.task_id, ta.user_id, ta.text, ta.start_ts, ta.end_ts, ta.invoice, ta.check, p.company_id \n\tFROM `task_activities` AS ta\n\tLEFT JOIN tasks AS t ON t.id = ta.task_id\n\tLEFT JOIN projects AS p ON p.id = t.project_id\n\tLIMIT {$offset}, {$limit}\n\t"; $task_activity_result = $dt_db->query($task_activity_sql, TRUE); assert_die($task_activity_result, "Could not get task activities!\n" . $dt_db->getLastError()); debug('Got ' . $task_activity_result->numRows() . ' task activity rows from phpdt.'); while ($row = $task_activity_result->fetchArray(MYSQL_ASSOC)) { $ta = new SI_TaskActivity(); $ta->task_id = $row['task_id']; $ta->user_id = $row['user_id']; $ta->text = $row['text']; $ta->start_ts = $row['start_ts']; $ta->end_ts = $row['end_ts']; $ta->hourly_rate = $company_rates[$row['company_id']]; $ta->hourly_cost = $user_rates[$row['user_id']]; // Special exception for david if ($row['user_id'] == 10 && $row['end_ts'] < mktime(0, 0, 0, 1, 1, 2005)) { $ta->getUser(); $ta->_user->rate_type = 'HOURLY'; } $GLOBALS['phpdt_cost_ts'] = $row['end_ts']; assert_die($ta->add(), "Error adding task activity!\n" . $ta->getLastError()); $invoices[$row['invoice']]['company_id'] = $row['company_id']; if ($ta->end_ts > $invoices[$row['invoice']]['timestamp']) { $invoices[$row['invoice']]['timestamp'] = $ta->end_ts; } $invoices[$row['invoice']]['ids'][] = $ta->id; $checks[$row['check']]['user_id'] = $row['user_id']; $checks[$row['check']]['ids'][] = $ta->cost_trans_id; if ($ta->end_ts > $checks[$row['check']]['timestamp']) { $checks[$row['check']]['timestamp'] = $ta->end_ts; } $checks[$row['check']]['amount'] += $ta->cost; } $task_activity_result->free(); debug('Added task activities to sureinvoice!'); }
} // Create a new day $day = new Day($_GET['y'], $_GET['m'], $_GET['d']); // Get the task data $task = new SI_Task(); $tasks = $task->getCalendarTasks($user_id, $day->getTimestamp(), $day->getTimestamp() + 24 * 60 * 60, 'hour'); if ($tasks === FALSE) { $error_msg .= "Could not retrieve Tasks!\n"; debug_message($task->getLastError()); } // Get the activity data $ta = new SI_TaskActivity(); $activities = $ta->getCalendarActivities($user_id, $day->getTimestamp(), $day->getTimestamp() + 24 * 60 * 60, 'hour'); if ($activities === FALSE) { $error_msg .= "Could not retrieve activities!\n"; debug_message($ta->getLastError()); } // Make sure the current date is selected $sHours = array(new Hour(date('Y'), date('m'), date('d'), date('H'))); // Build the hour list for that day $day->build($sHours); $title = "Calendar - Month View"; require 'header.php'; ?> <table class="dg_table" width="450"> <TR> <TD COLSPAN="2" CLASS="dg_header_cell"><?php echo date('l F jS', $day->thisDay(true)); ?> </TD> </TR>
} $hourly_rate = $item_code->getCompanyPrice($company->id, $_POST['item_code_id']); if($hourly_rate === FALSE){ $error_msg = "Error getting price for this item code!"; debug_message($item_code->getLastError()); } if(!isset($_POST['hourly_rate']) || empty($_POST['hourly_rate'])){ $_POST['hourly_rate'] = $hourly_rate; } $task_activity->updateFromAssocArray($_POST); if($task_activity->add()){ if(is_array($_POST['item_ids'])){ if($task_activity->setItems($_POST['item_ids']) === FALSE){ $error_msg .= "Error adding completed items to activity!\n"; debug_message($task_activity->getLastError()); } } if(is_array($_POST['expense']) && $_POST['expense']['item_code_id'] > 0){ if(!empty($_POST['expense']['description']) && !empty($_POST['expense']['cost']) && !empty($_POST['expense']['price'])){ $exp = new SI_Expense(); $exp->updateFromAssocArray($_POST['expense']); $exp->task_id = $task_activity->task_id; $exp->created_ts = time(); if($exp->add() === FALSE){ $error_msg .= "Error adding new expense!\n"; debug_message($exp->getLastError()); } }else{
break; } $task_activity->hourly_rate = $item_code->getCompanyPrice($company->id, $task_activity->item_code_id); if ($task_activity->hourly_rate === FALSE) { $output['error'] = "Error getting price for this item code:\n" . $item_code->getLastError(); break; } $sct = $task->getSalesCommissionType(); $task_activity->sales_com_type_id = $sct->id; if ($task_activity->add()) { if ($project->sendUpdateNotification(array("Added new task activity " . $GLOBALS['CONFIG']['url'] . '/task_activity.php?mode=edit&id=' . $task_activity->id)) === FALSE) { $output['error'] = "Error sending update notification:\n" . $project->getLastError(); break; } } else { $output['error'] = "Error adding Task Activity:\n" . $task_activity->getLastError(); break; } break; default: if (isset($action_map[$request->action])) { if (is_array($action_map[$request->action])) { if (class_exists($action_map[$request->action][0])) { $class = new $action_map[$request->action][0](); if (method_exists($class, $action_map[$request->action][1])) { $result = call_user_func_array(array($class, $action_map[$request->action][1]), $params); if ($result === false) { $output['error'] = $class->getLastError(); } else { $output['result'] = $result; }
function delete($id = NULL){ global $db_conn; if(!isset($id)){ $id = $this->id; } if(!isset($id)){ $this->error = "SI_TaskActivity::delete() : TaskActivity id not set\n"; return FALSE; } $ta = new SI_TaskActivity(); if($ta->get($id) === FALSE){ $this->error = "SI_TaskActivity::delete(): Error getting current activity: ".$ta->getLastError(); return FALSE; } if($ta->_deleteTransactions() === FALSE){ $this->error = "SI_TaskActiviy::delete(): Error removing transactions: ".$ta->getLastError(); return FALSE; } $result = $db_conn->query("DELETE FROM task_activities WHERE id = $id"); if($result){ return TRUE; }else{ $this->error = "SI_TaskActivity::delete() : ".$db_conn->getLastError()."\n"; return FALSE; } }
function soap_add_task_activity($username, $password, $task_activity) { global $loggedin_user; $user = auth_user($username, $password); if ($user === FALSE) { return new soap_fault('Client', '', 'Access Denied'); } $loggedin_user = $user; $task = new SI_Task(); $project = new SI_Project(); $item_code = new SI_ItemCode(); $ta = new SI_TaskActivity(); $ta->start_ts = $task_activity['start_ts']; $ta->end_ts = $task_activity['end_ts']; $ta->task_id = $task_activity['task_id']; $ta->user_id = $loggedin_user->id; $ta->text = $task_activity['text']; $ta->item_code_id = $task_activity['item_code_id']; if ($ta->task_id > 0 || $ta->start_ts > 0 || $ta->end_ts > 0) { if ($ta->task_id <= 0 || $ta->start_ts <= 0 || $ta->end_ts <= 0) { return new soap_fault('Client', '', 'Invalid data fields in task_activity'); } } if ($task->get($ta->task_id) === FALSE) { return new soap_fault('Client', '', 'Could not retreive task ID ' . $ta->task_id, $task->getLastError()); } if ($project->get($task->project_id) === FALSE) { return new soap_fault('Client', '', 'Could not retreive project!', $project->getLastError()); } if (!$project->hasRights(PROJECT_RIGHT_EDIT)) { return new soap_fault('Client', '', 'Insufficent access rights for this project!'); } $ta->hourly_cost = $loggedin_user->hourly_rate; $company = $project->getCompany(); if ($company === FALSE) { return new soap_fault('Client', '', 'Could not get company information!', $project->getLastError()); } $ta->hourly_rate = $item_code->getCompanyPrice($company->id, $ta->item_code_id); if ($ta->hourly_rate === FALSE) { return new soap_fault('Client', '', 'Error getting price for this item code!', $item_code->getLastError()); } $sct = $task->getSalesCommissionType(); $ta->sales_com_type_id = $sct->id; if ($ta->add()) { $project->sendUpdateNotification(array("Added new task activity " . $GLOBALS['CONFIG']['url'] . '/task_activity.php?mode=edit&id=' . $task_activity->id)); } else { return new soap_fault('Client', '', 'Error adding Task Activity!', $ta->getLastError()); } return $ta->id; }
$_REQUEST['billable'] = 'N'; } if(!$loggedin_user->hasRight('admin') && !$loggedin_user->isDeveloper()){ $_REQUEST['billable'] = 'Y'; $_REQUEST['company_id'] = $loggedin_user->company_id; } if(!$loggedin_user->hasRight('admin') && $loggedin_user->isDeveloper()){ $_REQUEST['resource_id'] = $loggedin_user->id; } $activities = $activity->find($_REQUEST['start_ts'], $_REQUEST['end_ts']+86400, $_REQUEST['resource_id'], $_REQUEST['company_id'], $_REQUEST['billable']); if($activities === FALSE){ $error_msg .= "Error getting report data!\n"; debug_message($activity->getLastError()); } $csv_output = ''; for($i=0; $i<count($activities); $i++){ if($i == 0){ // Print the header $csv_output = "Company,Project,Task,Started,Completed,Time Spent\n"; } $csv_output .= '"'.$activities[$i]->company_name. '","'.$activities[$i]->project_name. '","'.$activities[$i]->task_name. '","'.($activities[$i]->start_ts>0 ? date("n/j/y H:i", $activities[$i]->start_ts) : "None"). '","'.($activities[$i]->end_ts>0 ? date("n/j/y H:i", $activities[$i]->end_ts) : "None"). '","'.($activities[$i]->start_ts>0 && $activities[$i]->end_ts>0 && $activities[$i]->end_ts > $activities[$i]->start_ts ? formatLengthOfTime($activities[$i]->end_ts - $activities[$i]->start_ts) : "").
function addTaskActivities($ta_ids, $aggregation_type = SI_ACTIVITY_AGGREGATION_TASK){ if(!is_array($ta_ids) || count($ta_ids) <= 0){ $this->error = "SI_Invoice::addTaskActivities(): Invalid parameter!"; return FALSE; } $clause = " WHERE a.id IN (".implode(',', $ta_ids).")"; $ta = new SI_TaskActivity(); $tas = $ta->retrieveSet($clause); if($tas === FALSE){ $this->error = "SI_Invoice::addTaskActivities(): Error getting activities: ".$ta->getLastError(); return FALSE; } $tas_count = count($tas); $lines = array(); for($i=0; $i<$tas_count; $i++){ if($aggregation_type == SI_ACTIVITY_AGGREGATION_TASK){ $key = $tas[$i]->task_id.$tas[$i]->hourly_rate; }elseif($aggregation_type == SI_ACTIVITY_AGGREGATION_ITEM_CODE){ $key = $tas[$i]->item_code_id.$tas[$i]->hourly_rate; }else{ $key = $tas[$i]->id; } if(!isset($lines[$key])){ $lines[$key] =& new SI_InvoiceLine(); $lines[$key]->invoice_id = $this->id; $lines[$key]->item_code_id = $tas[$i]->item_code_id; } $il =& $lines[$key]; if($tas[$i]->getTask() === FALSE){ $this->error = "SI_Invoice::addTaskActivities(): Error getting task for activity: ".$tas[$i]->getLastError(); return FALSE; } if($tas[$i]->_task->getProject() === FALSE){ $this->error = "SI_Invoice::addTaskActivities(): Error getting project for activity: ".$tas[$i]->getLastError(); return FALSE; } $il->quantity += round(($tas[$i]->end_ts - $tas[$i]->start_ts) / 60 /60, 2); $il->unit_price = $tas[$i]->hourly_rate; if($aggregation_type == SI_ACTIVITY_AGGREGATION_ITEM_CODE){ $ic = $tas[$i]->getItemCode(); $il->description = $ic->description; }else{ $il->description = $tas[$i]->_task->_project->name.": ".$tas[$i]->_task->name; } $il->addLink(SI_INVOICE_LINE_LINK_ACTVITY, $tas[$i]->id); $il->addTax(); } if(!$this->_lines) $this->_lines = array(); foreach($lines as $line){ if($line->add() === FALSE){ $this->error = "SI_Invoice::addTaskActivities(): Error adding line item: ".$line->getLastError(); return FALSE; } $this->_lines[] = $line; } return TRUE; }
function getUnitPrice(){ if($this->task_activity_id > 0){ $ta = new SI_TaskActivity(); if($ta->get($this->task_activity_id) === FALSE){ $this->error = 'SI_InvoiceLineLink::getUnitPrice(): Error getting task activity: '.$ta->getLastError(); return FALSE; } return $ta->hourly_rate; }elseif($this->expense_id > 0){ $ex = new SI_Expense(); if($ex->get($this->expense_id) === FALSE){ $this->error = 'SI_InvoiceLineLink::getPrice(): Error getting expense: '.$ex->getLastError(); return FALSE; } return $ex->price; }elseif($this->payment_schedule_id > 0){ $ps = new SI_PaymentSchedule(); if($ps->get($this->payment_schedule_id) === FALSE){ $this->error = 'SI_InvoiceLineLink::getPrice(): Error getting scheduled payment: '.$ps->getLastError(); return FALSE; } return $ps->amount; } return 'Unknown'; }
function run($preview = true) { $results = array(); if (is_readable($this->file)) { $handle = fopen($this->file, "r"); $first_row = true; while (($data = fgetcsv($handle, 4096, ",")) !== FALSE) { if ($first_row) { $first_row = false; continue; } // Process a row $result = array(); $result['action'] = 'Import'; $result['start_ts'] = strtotime($data[$this->column_mappings[SI_IMPORT_COLUMN_START]]); if (isset($this->column_mappings[SI_IMPORT_COLUMN_DURATION])) { // Duration based import $result['end_ts'] = $result['start_ts'] + floatval($data[$this->column_mappings[SI_IMPORT_COLUMN_DURATION]]) * 60 * 60; } else { // Start and end time provided $result['start_ts'] = strtotime($data[$this->column_mappings[SI_IMPORT_COLUMN_END]]); } if (isset($this->column_mappings[SI_IMPORT_COLUMN_COMMENTS])) { $result['comments'] = $data[$this->column_mappings[SI_IMPORT_COLUMN_COMMENTS]]; } else { $results['comments'] = ''; } $user = $data[$this->column_mappings[SI_IMPORT_COLUMN_USER]]; $normalized_user = $this->normalize($user); if (empty($normalized_user)) { $normalized_user = '******'; } if ($this->users[$normalized_user]['action'] == SI_IMPORT_ACTION_SKIP) { $result['user_id'] = 0; $result['message'] = "Skipped because no user map for '{$user}' was configured"; $result['action'] = "Skip"; $results[] = $result; continue; } else { $result['user_id'] = $this->users[$normalized_user]['param']; } $task = $data[$this->column_mappings[SI_IMPORT_COLUMN_TASK]]; $normalized_task = $this->normalize($task); if (empty($normalized_task)) { $normalized_task = '_blank_'; } if ($this->tasks[$normalized_task]['action'] == SI_IMPORT_ACTION_SKIP) { $result['task_id'] = 0; $result['message'] = "Skipped because no task map for '{$task}' was configured"; $result['action'] = "Skip"; $results[] = $result; continue; } else { $result['task_id'] = $this->tasks[$normalized_task]['param']; } $task = new SI_Task(); $task->get($result['task_id']); $ic = $data[$this->column_mappings[SI_IMPORT_COLUMN_ITEMCODE]]; $normalized_ic = $this->normalize($ic); if (empty($normalized_ic)) { $normalized_ic = '_blank_'; } if ($this->item_codes[$normalized_ic]['action'] == SI_IMPORT_ACTION_SKIP) { $result['item_code_id'] = $task->getDefaultItemCode(); if ($result['item_code_id'] == 0) { $result['message'] = "Skipped because no item code map for '{$ic}' was configured and no default item code exists for project"; $result['action'] = "Skip"; $results[] = $result; continue; } else { $result['message'] = "Item Code retreived from project"; } } else { $result['item_code_id'] = $this->item_codes[$normalized_ic]['param']; } if ($result['start_ts'] <= 0 || $result['end_ts'] <= 0) { $result['message'] = "Invalid start or end time"; $result['action'] = "Skip"; $results[] = $result; continue; } if ($result['start_ts'] > $result['end_ts']) { $result['message'] = "Start Time is before end time"; $result['action'] = "Skip"; $results[] = $result; continue; } if ($result['end_ts'] - $result['start_ts'] > 12 * 60 * 60) { $result['message'] = "Length of time is too long, >12 hours"; $result['action'] = "Skip"; $results[] = $result; continue; } $project = new SI_Project(); $company = new SI_Company(); $task = new SI_Task(); $item_code = new SI_ItemCode(); $task_activity = new SI_TaskActivity(); $task_activity->start_ts = $result['start_ts']; $task_activity->end_ts = $result['end_ts']; $task_activity->task_id = $result['task_id']; $task_activity->user_id = $result['user_id']; $task_activity->text = $result['comments']; $task_activity->item_code_id = $result['item_code_id']; if ($task_activity->task_id > 0 || $task_activity->start_ts > 0 || $task_activity->end_ts > 0) { if ($task_activity->task_id <= 0 || $task_activity->start_ts <= 0 || $task_activity->end_ts <= 0) { $result['action'] = "Skip"; $result['message'] = "Skipping incomplete entry\n"; $results[] = $result; continue; } } else { $result['action'] = "Skip"; $result['message'] = "Skipping incomplete entry\n"; $results[] = $result; continue; } if ($task->get($task_activity->task_id) === FALSE) { $result['action'] = "Skip"; $result['message'] = "Could not retreive task:\n" . $task->getLastError(); $results[] = $result; continue; } if ($project->get($task->project_id) === FALSE) { $result['action'] = "Skip"; $result['message'] = "Could not retreive project:\n" . $project->getLastError(); $results[] = $result; continue; } $user = new SI_User(); if ($user->get($task_activity->user_id) === FALSE) { $result['action'] = "Skip"; $result['message'] = "Could not retreive user:\n" . $user->getLastError(); $results[] = $result; continue; } $task_activity->hourly_cost = $user->hourly_rate; $company = $project->getCompany(); if ($company === FALSE) { $result['action'] = "Skip"; $result['message'] = "Could not get company information:\n" . $project->getLastError(); $results[] = $result; continue; } $task_activity->hourly_rate = $item_code->getCompanyPrice($company->id, $task_activity->item_code_id); if ($task_activity->hourly_rate === FALSE) { $result['action'] = "Skip"; $result['message'] = "Error getting price for this item code:\n" . $item_code->getLastError(); $results[] = $result; continue; } $sct = $task->getSalesCommissionType(); $task_activity->sales_com_type_id = $sct->id; if (!$preview) { if (!$task_activity->add()) { $result['action'] = "Skip"; $result['message'] = "Error adding Task Activity:\n" . $task_activity->getLastError(); } } $results[] = $result; } } return $results; }
function _getLinked(){ $id = intval($this->id); if($id <= 0) return TRUE; if($this->_ta == FALSE){ $ta = new SI_TaskActivity(); $tas = $ta->retrieveSet("WHERE a.cost_trans_id = $id OR a.com_trans_id = $id"); if($tas === FALSE){ $this->error = "Error getting linked task: ".$ta->getLastError(); return FALSE; } if(count($tas) == 1){ $this->_ta = &$tas[0]; } } if($this->_check == FALSE){ $check = new SI_Check(); $checks = $check->retrieveSet("WHERE trans_id = $id"); if($checks === FALSE){ $this->error = "Error getting linked task: ".$check->getLastError(); return FALSE; } if(count($checks) == 1){ $this->_check = &$checks[0]; } } return TRUE; }