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!');
}
예제 #2
0
}
// 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>
예제 #3
0
		}

		$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{
예제 #4
0
         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;
                     }
예제 #5
0
	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;
		}
	}
예제 #6
0
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;
}
예제 #7
0
	$_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) : "").
예제 #8
0
	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;
	}
예제 #9
0
	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';
	}
예제 #10
0
 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;
 }
예제 #11
0
	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;
	}