public static function widget_dashboard_invoices()
 {
     $si_project_id = self::get_si_project_id_from_psp_project_id();
     if (is_a($si_project_id, 'WP_Post')) {
         $si_project_id = $si_project_id->ID;
     }
     $si_project = SI_Project::get_instance($si_project_id);
     if (!is_a($si_project, 'SI_Project')) {
         return;
     }
     $invoices = $si_project->get_invoices();
     $estimates = $si_project->get_estimates();
     $payments = $si_project->get_payments();
     if ($invoices) {
         self::load_addon_view('panorama/invoices-widget', array('invoices' => $invoices, 'estimates' => $estimates, 'payments' => $payments), true);
     }
     /**
      * By default we are only going to show estimates
      * that do not have invoices associated. That estimate can
      * be linked from the invoices table instead.
      */
     $estimates_to_show = array();
     foreach ($estimates as $estimate_id) {
         $ass_invoice_id = si_get_estimate_invoice_id($estimate_id);
         if (!$ass_invoice_id || get_post_type($ass_invoice_id) != SI_Invoice::POST_TYPE) {
             $estimates_to_show[] = $estimate_id;
         }
     }
     if ($estimates) {
         self::load_addon_view('panorama/estimates-widget', array('invoices' => $invoices, 'estimates' => $estimates_to_show, 'payments' => $payments), true);
     }
 }
 /**
  * Show the history
  *
  * @param WP_Post $post
  * @param array   $metabox
  * @return
  */
 public static function show_project_history_view($post, $metabox)
 {
     if ($post->post_status == 'auto-draft') {
         printf('<p>%s</p>', __('No history available.', 'sprout-invoices'));
         return;
     }
     $project = SI_Project::get_instance($post->ID);
     self::load_view('admin/meta-boxes/projects/history-premium', array('id' => $post->ID, 'post' => $post, 'project' => $project, 'historical_records' => array_reverse($project->get_history())), false);
 }
 public static function show_pspsi_meta_box($post, $metabox)
 {
     $si_project_id = get_post_meta($post->ID, self::META_KEY, true);
     $invoices = array();
     $estimates = array();
     $payments = array();
     if ($si_project_id) {
         $si_project = SI_Project::get_instance($si_project_id);
         $invoices = $si_project->get_invoices();
         $estimates = $si_project->get_estimates();
         $payments = $si_project->get_payments();
     }
     wp_enqueue_script('select2_4.0');
     wp_enqueue_style('select2_4.0_css');
     self::load_addon_view('admin/meta-boxes/panorama-si', array('si_project_id' => $si_project_id, 'invoices' => $invoices, 'estimates' => $estimates, 'payments' => $payments), false);
 }
 /**
  * Query sa_client posts with assigned user ID
  *
  * @param 	(int) $user_id 	wp_user ID
  * @return 	(array) 		sa_client post ID's
  **/
 public static function get_client_si_projects($user_id = 0)
 {
     $project_ids = array();
     if (!$user_id) {
         $user_id = get_current_user_id();
     }
     if (!$user_id) {
         return $project_ids;
     }
     $client_ids = SI_Client::get_clients_by_user($user_id);
     if (empty($client_ids)) {
         return $project_ids;
     }
     foreach ($client_ids as $client_id) {
         $project_ids[] = SI_Project::get_projects_by_client($client_id);
     }
     return $project_ids;
 }
 public static function maybe_disassociate_records($post_id = 0)
 {
     if (SI_Client::POST_TYPE === get_post_type($post_id)) {
         $client = SI_Client::get_instance($post_id);
         $invoices = $client->get_invoices();
         foreach ($invoices as $invoice_id) {
             $invoice = SI_Invoice::get_instance($invoice_id);
             $invoice->set_client_id(0);
         }
         $estimates = $client->get_estimates();
         foreach ($estimates as $estimate_id) {
             $estimate = SI_Estimate::get_instance($estimate_id);
             $estimate->set_client_id(0);
         }
         $projects = SI_Project::get_projects_by_client($post_id);
         foreach ($projects as $project_id) {
             $project = SI_Project::get_instance($project_id);
             $project->set_associated_clients(array());
         }
     }
 }
 /**
  * Display the content for the column
  *
  * @param string  $column_name
  * @param int     $id          post_id
  * @return string
  */
 public static function column_display($column_name, $id)
 {
     $project = SI_Project::get_instance($id);
     if (!is_a($project, 'SI_Project')) {
         return;
         // return for that temp post
     }
     switch ($column_name) {
         case 'psp':
             $psp_project_id = self::get_psp_project_id_from_si_project_id($id);
             printf('<a href="%s">%s</a>', get_edit_post_link($psp_project_id), get_the_title($psp_project_id));
             $completed = psp_compute_progress($psp_project_id);
             if ($completed > 10) {
                 echo '<p class="psp-progress"><span class="psp-' . $completed . '"><strong>%' . $completed . '</strong></span></p>';
             } else {
                 echo '<p class="psp-progress"><span class="psp-' . $completed . '"></span></p>';
             }
             break;
         default:
             // code...
             break;
     }
 }
 /**
  * Checks to see if the user is accessing a post they have access to as part of an sa_client
  * @param  boolean $result Current pass/fail of access
  * @param  integer $psp_id The project id of the current viewed psp project
  * @return boolean         Access or not.
  */
 public static function check_access_on_post($result = false, $psp_id = 0)
 {
     $current_user_id = get_current_user_id();
     $user_associated_clients = SI_Client::get_clients_by_user($current_user_id);
     // If the result is true, then nothing will override it below
     // Plus if there are not associated clients than tough luck.
     if ($result || empty($user_associated_clients)) {
         return $result;
     }
     $si_project_id = get_field(self::META_KEY, $psp_id);
     // what si_project is assigned to this project access
     if (!$si_project_id || '' === $si_project_id) {
         return false;
     }
     $si_project = SI_Project::get_instance($si_project_id);
     $project_associated_clients = $si_project->get_associated_clients();
     $matches = array_intersect($project_associated_clients, $user_associated_clients);
     // If there are no matches
     if (empty($matches)) {
         return false;
     }
     // there were matches
     return true;
 }
function process_ajax_on_project_change()
{
    $has_admin = array();
    //@TODO ADD NONCE CHECK
    $post_id = $_POST['post_id'];
    if ($post_id <= 0) {
        return;
    }
    $SI_Project = SI_Project::get_instance($post_id);
    $invoice_ids = $SI_Project->get_invoices();
    $estimate_ids = $SI_Project->get_estimates();
    $client_ids = $SI_Project->get_associated_clients();
    $clients = array();
    $estimates = array();
    $invoices = array();
    $asscoiativeTasks = array();
    foreach ($client_ids as $clients_id) {
        $SI_Client = SI_Client::get_instance($clients_id);
        $user_ids = $SI_Client->get_associated_users();
        foreach ($user_ids as $user_id) {
            if (user_can($user_id, 'update_core')) {
                $has_admin[] = $user_id;
            }
            $user = get_user_by('ID', $user_id);
            $display_name = $user->data->display_name;
            $clients[] = array('user_id' => (int) $user_id, 'display_name' => $display_name);
        }
    }
    if (empty($has_admin) && current_user_can('update_core')) {
        $args = array('role' => 'administrator');
        $users = get_users($args);
        foreach ($users as $user) {
            $clients[] = array('user_id' => (int) $user->ID, 'display_name' => $user->data->display_name);
        }
    }
    $blank_option = array('user_id' => '', 'display_name' => '');
    array_unshift($clients, $blank_option);
    foreach ($estimate_ids as $estimate_id) {
        $title = get_the_title($estimate_id);
        $estimates[] = array('est_id' => (int) $estimate_id, 'est_title' => $title);
    }
    foreach ($invoice_ids as $invoice_id) {
        $title = get_the_title($invoice_id);
        $invoices[] = array('inv_id' => (int) $invoice_id, 'inv_title' => $title);
    }
    $args = array('post_type' => 'mg_task', 'meta_key' => 'project', 'meta_value' => $post_id, 'post_status' => array('complete', 'in-progress', 'not-started', 'publish', 'published'));
    $the_query = new WP_Query($args);
    while ($the_query->have_posts()) {
        $the_query->the_post();
        $asscoiativeTasks[] = array('task_title' => get_the_title(), 'task_id' => get_the_ID());
    }
    $data = array('clients' => $clients, 'estimates' => $estimates, 'invoices' => $invoices, 'tasks' => $asscoiativeTasks);
    $output = json_encode($data);
    exit($output);
}
 function si_get_project_website($id = 0)
 {
     if (!$id) {
         global $post;
         $id = $post->ID;
     }
     $project = SI_Project::get_instance($id);
     return apply_filters('si_get_project_website', $project->get_website(), $project);
 }
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
require_once('includes/SI_Project.php');
require_once('includes/SI_Task.php');
require_once('includes/SI_TaskActivity.php');
require_once('includes/SI_PaymentSchedule.php');

checkLogin();

$project = new SI_Project();
$task = new SI_Task();
$ta = new SI_TaskActivity();
$activities = array();

if(!empty($_REQUEST['task_id'])){
	$task->get($_REQUEST['task_id']);
	$project->get($task->project_id);
	if(!$project->hasRights(PROJECT_RIGHT_VIEW)){
		fatal_error('Insufficent access rights for this project!');
	}
	$activities = $ta->retrieveSet("task_id = ".$task->id);
	if($activities === FALSE){
		$error_msg .= "Error getting list of task time!\n";
		debug_message($ta->getLastError());
	}
 public function get_project()
 {
     if (class_exists('SI_Project')) {
         $project_id = $this->get_project_id();
         $project = SI_Project::get_instance($project_id);
         return $project;
     }
 }
 public static function unbilled_time_tracking_dashboard()
 {
     $args = array('post_type' => SI_Project::POST_TYPE, 'post_status' => 'any', 'posts_per_page' => 3, 'fields' => 'ids', 'orderby' => 'modified');
     $projects = get_posts($args);
     if (empty($projects)) {
         _e('No new projects.', 'sprout-invoices');
         return;
     }
     $something_shown = false;
     foreach ($projects as $project_id) {
         $project = SI_Project::get_instance($project_id);
         $times = $project->get_associated_times();
         if (empty($times)) {
             continue;
         }
         self::load_addon_view('admin/dashboards/project-time-tracking-unbilled', array('project' => $project, 'times' => $times), true);
         $something_shown = true;
     }
     if (!$something_shown) {
         _e('No unbilled time from your most recent projects.', 'sprout-invoices');
     }
 }
Beispiel #13
0
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
require_once('includes/SI_Project.php');
require_once('includes/SI_Company.php');
require_once('includes/SI_Task.php');

checkLogin();

$project = new SI_Project();

if($loggedin_user->hasRight('admin') && isset($_REQUEST['user_id'])){
	$user_id = $_REQUEST['user_id'];
}else{
	$user_id = $loggedin_user->id;
}

if($_REQUEST['filter'] == "all"){
	$projects = $project->getMyProjects($user_id, FALSE);
}else{
	$_REQUEST['filter'] = "pending";
	$projects = $project->getMyProjects($user_id, TRUE);
}

if($projects === FALSE){
Beispiel #14
0
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
checkLogin();

require_once('includes/SI_Project.php');
require_once('includes/SI_Company.php');
require_once('includes/SI_ProjectStatus.php');
require_once('includes/SI_ProjectPriority.php');
require_once('includes/SI_SalesCommissionType.php');

$title = '';
$project = new SI_Project();

if($_REQUEST['mode'] == 'add'){
	$title = "Add Project";
	$project->owner_id = $loggedin_user->id;
	$project->due_ts = '';
	if(isset($_REQUEST['company_id'])) $project->company_id = $_REQUEST['company_id'];

	if($_POST['save']){
		$_POST['due_ts'] = getTSFromInput($_POST['due_ts']);
		$project->updateFromAssocArray($_POST);
		if($project->add() !== false){
			goBack();
		}else{
			$error_msg .= "Error adding Project!\n";
			debug_message($project->getLastError());
 public static function maybe_create_toggl_project(SI_Project $project, $args = array())
 {
     $data = array('project' => array('name' => $args['project_name']));
     $response = Toggl_API::api_request('projects', $data);
     if (!isset($response->data->id)) {
         return;
         // not created
     }
     self::set_projects_toggl_id($project->get_id(), $response->data->id);
     return $response->data->id;
 }
Beispiel #16
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;
 }
Beispiel #17
0
	function get($id = NULL){
		global $db_conn;

		if(!isset($id)){
			$id = $this->id;
		}

		if(!isset($id)){
			$this->error = "SI_Project::get() : Project id not set\n";
			return FALSE;
		}

		$Project = SI_Project::retrieveSet("WHERE p.id = $id", TRUE);
		if($Project === FALSE){
			return FALSE;
		}

		if(isset($Project[0])){
			$this->updateFromAssocArray($Project[0]);
			if($this->_populateAttachments() === FALSE)
				return FALSE;
			if($this->_populateCCUsers() === FALSE)
				return FALSE;
			$this->stripSlashes();
		}else{
			$this->error = "SI_Project::get() : No data retrieved from query\n";
			return FALSE;
		}
		return TRUE;
	}
Beispiel #18
0
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
require_once('includes/SI_Expense.php');
require_once('includes/SI_CompanyTransaction.php');
require_once('includes/SI_Project.php');
require_once('includes/SI_Task.php');
require_once('includes/SI_ItemCode.php');

checkLogin('accounting');

$title = '';
$expense = new SI_Expense();
$company = new SI_Company();
$project = new SI_Project();
$task = new SI_Task();
$item_code = new SI_ItemCode();

// Clean up cost
if(!empty($_POST['cost'])){
	$_POST['cost'] = preg_replace('/[^0-9\.]/','', $_POST['cost']);
}

// Clean up price
if(!empty($_POST['price'])){
	$_POST['price'] = preg_replace('/[^0-9\.]/','', $_POST['price']);
}

if($_REQUEST['mode'] == 'add'){
	$title = "Add Expense";
Beispiel #19
0
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
checkLogin();

require_once('includes/SI_Project.php');
require_once('includes/SI_Task.php');
require_once('includes/SI_TaskActivity.php');
require_once('includes/SI_Expense.php');
require_once('includes/SI_ItemCode.php');

$title = '';
$task_activity = new SI_TaskActivity();
$task = new SI_Task();
$project = new SI_Project();
$user = new SI_User();
$item_code = new SI_ItemCode();
$disabled = false;

if($_REQUEST['mode'] == 'add'){
	$title = "Add Time Entry";
	if(empty($_REQUEST['task_id'])){
		fatal_error("No Task ID specified!\n");
	}else{
		$task_activity->task_id = $_REQUEST['task_id'];
		$task_activity->completed_ts = time();
		$task_activity->user_id = $loggedin_user->id;
		if($task->get($task_activity->task_id) === FALSE){
			fatal_error("Could not retreive task!");
			debug_message($task->getLastError());
 function si_get_project_website($id = 0)
 {
     if (!$id) {
         $id = get_the_ID();
     }
     $project = SI_Project::get_instance($id);
     return apply_filters('si_get_project_website', $project->get_website(), $project);
 }
Beispiel #21
0
/**
 * Load the SI application
 * (function called at the bottom of this page)
 *
 * @package Sprout_Invoices
 * @return void
 */
function sprout_invoices_load()
{
    if (class_exists('Sprout_Invoices')) {
        error_log('** Sprout_Invoices Already Loaded **');
        return;
        // already loaded, or a name collision
    }
    do_action('sprout_invoices_preload');
    //////////
    // Load //
    //////////
    // Master class
    require_once SI_PATH . '/Sprout_Invoices.class.php';
    // base classes
    require_once SI_PATH . '/models/_Model.php';
    require_once SI_PATH . '/controllers/_Controller.php';
    do_action('si_require_base_classes');
    // models
    require_once SI_PATH . '/models/Client.php';
    require_once SI_PATH . '/models/Estimate.php';
    require_once SI_PATH . '/models/Invoice.php';
    require_once SI_PATH . '/models/Notification.php';
    require_once SI_PATH . '/models/Payment.php';
    require_once SI_PATH . '/models/Record.php';
    // Premium models
    require_once SI_PATH . '/models/Project.php';
    // i18n
    require_once SI_PATH . '/controllers/i18n/Countries_States.php';
    require_once SI_PATH . '/controllers/i18n/Locales.php';
    do_action('si_require_model_classes');
    /////////////////
    // Controllers //
    /////////////////
    // settings
    require_once SI_PATH . '/controllers/admin/Settings.php';
    if (!class_exists('SA_Settings_API')) {
        require_once SI_PATH . '/controllers/admin/Settings_API.php';
    }
    require_once SI_PATH . '/controllers/admin/Capabilities.php';
    require_once SI_PATH . '/controllers/admin/Help.php';
    // json api
    require_once SI_PATH . '/controllers/api/JSON_API.php';
    // checkouts
    require_once SI_PATH . '/controllers/checkout/Checkouts.php';
    // clients
    require_once SI_PATH . '/controllers/clients/Clients.php';
    // developer logs
    require_once SI_PATH . '/controllers/developer/Logs.php';
    // Estimates
    require_once SI_PATH . '/controllers/estimates/Estimate_Submission.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/estimates/Estimate_Submission_Premium.php')) {
        require_once SI_PATH . '/controllers/estimates/Estimate_Submission_Premium.php';
    }
    require_once SI_PATH . '/controllers/estimates/Estimates.php';
    require_once SI_PATH . '/controllers/estimates/Estimates_Admin.php';
    require_once SI_PATH . '/controllers/estimates/Estimates_Edit.php';
    require_once SI_PATH . '/controllers/estimates/Estimates_Records.php';
    require_once SI_PATH . '/controllers/estimates/Estimates_Template.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/estimates/Estimates_Premium.php')) {
        require_once SI_PATH . '/controllers/estimates/Estimates_Premium.php';
    }
    // invoices
    require_once SI_PATH . '/controllers/invoices/Invoices.php';
    require_once SI_PATH . '/controllers/invoices/Invoices_Admin.php';
    require_once SI_PATH . '/controllers/invoices/Invoices_Edit.php';
    require_once SI_PATH . '/controllers/invoices/Invoices_Records.php';
    require_once SI_PATH . '/controllers/invoices/Invoices_Template.php';
    require_once SI_PATH . '/controllers/invoices/Invoices_Deposit.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/invoices/Invoices_Premium.php')) {
        require_once SI_PATH . '/controllers/invoices/Invoices_Premium.php';
    }
    // Line Items
    require_once SI_PATH . '/controllers/line-items/Line_Items.php';
    // notifications
    require_once SI_PATH . '/controllers/notifications/Notifications_Control.php';
    require_once SI_PATH . '/controllers/notifications/Notifications.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/notifications/Notifications_Premium.php')) {
        require_once SI_PATH . '/controllers/notifications/Notifications_Premium.php';
    }
    require_once SI_PATH . '/controllers/notifications/Notifications_Admin_Table.php';
    // payment processing
    require_once SI_PATH . '/controllers/payment-processing/Payment_Processors.php';
    require_once SI_PATH . '/controllers/payment-processing/Credit_Card_Processors.php';
    require_once SI_PATH . '/controllers/payment-processing/Offsite_Processors.php';
    // payment processors
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/payment-processing/processors/SI_Paypal_EC.php')) {
        require_once SI_PATH . '/controllers/payment-processing/processors/SI_Paypal_EC.php';
    }
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/payment-processing/processors/SI_Paypal_Pro.php')) {
        require_once SI_PATH . '/controllers/payment-processing/processors/SI_Paypal_Pro.php';
    }
    require_once SI_PATH . '/controllers/payment-processing/processors/SI_Checks.php';
    require_once SI_PATH . '/controllers/payment-processing/processors/SI_Admin_Payment.php';
    do_action('si_payment_processors_loaded');
    // payments
    require_once SI_PATH . '/controllers/payments/Payments.php';
    require_once SI_PATH . '/controllers/payments/Payments_Admin_Table.php';
    // Projects
    require_once SI_PATH . '/controllers/projects/Projects.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/projects/Projects_Premium.php')) {
        require_once SI_PATH . '/controllers/projects/Projects_Premium.php';
    }
    // internal records
    require_once SI_PATH . '/controllers/records/Internal_Records.php';
    require_once SI_PATH . '/controllers/records/Records_Admin_Table.php';
    // reporting
    require_once SI_PATH . '/controllers/reporting/Dashboard.php';
    require_once SI_PATH . '/controllers/reporting/Reporting.php';
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/reporting/Reporting_Premium.php')) {
        require_once SI_PATH . '/controllers/reporting/Reporting_Premium.php';
    }
    require_once SI_PATH . '/controllers/templating/Templating.php';
    require_once SI_PATH . '/controllers/templating/Customizer.php';
    // updates
    if (!SI_FREE_TEST && file_exists(SI_PATH . '/controllers/updates/Updates.php')) {
        require_once SI_PATH . '/controllers/updates/Updates.php';
    }
    if (file_exists(SI_PATH . '/controllers/updates/Free_License.php')) {
        require_once SI_PATH . '/controllers/updates/Free_License.php';
    }
    // importers
    require_once SI_PATH . '/importers/Importer.php';
    require_once SI_PATH . '/importers/Freshbooks.php';
    require_once SI_PATH . '/importers/Harvest.php';
    require_once SI_PATH . '/importers/WP-Invoice.php';
    require_once SI_PATH . '/importers/CSV.php';
    do_action('si_importers_loaded');
    // Fix others problems
    require_once SI_PATH . '/controllers/compat/Compatibility.php';
    // all done
    do_action('si_require_controller_classes');
    // Template tags
    require_once SI_PATH . '/template-tags/estimates.php';
    require_once SI_PATH . '/template-tags/clients.php';
    require_once SI_PATH . '/template-tags/forms.php';
    require_once SI_PATH . '/template-tags/invoices.php';
    require_once SI_PATH . '/template-tags/line-items.php';
    require_once SI_PATH . '/template-tags/projects.php';
    require_once SI_PATH . '/template-tags/ui.php';
    require_once SI_PATH . '/template-tags/utility.php';
    require_once SI_PATH . '/template-tags/docs.php';
    // l18n
    require_once SI_PATH . '/languages/SI_l10n.php';
    require_once SI_PATH . '/languages/SI_Strings.php';
    // i18n & l10n
    SI_l10n::init();
    SI_Strings::load_additional_strings();
    SI_Locales::init();
    SI_Countries_States::init();
    ///////////////////
    // init() models //
    ///////////////////
    do_action('si_models_init');
    SI_Post_Type::init();
    // _Model
    SI_Record::init();
    SI_Notification::init();
    SI_Invoice::init();
    SI_Estimate::init();
    SI_Client::init();
    SI_Payment::init();
    SI_Project::init();
    /////////////////////////
    // init() controllers //
    /////////////////////////
    do_action('si_controllers_init');
    SI_Controller::init();
    SA_Settings_API::init();
    SI_Templating_API::init();
    SI_Customizer::init();
    SI_Admin_Capabilities::init();
    // updates
    if (!SI_FREE_TEST && class_exists('SI_Updates')) {
        SI_Updates::init();
    }
    if (class_exists('SI_Free_License')) {
        SI_Free_License::init();
    }
    // api
    SI_JSON_API::init();
    // reports
    SI_Dashboard::init();
    SI_Reporting::init();
    if (!SI_FREE_TEST && class_exists('SI_Reporting_Premium')) {
        SI_Reporting_Premium::init();
    }
    // records and logs
    SI_Internal_Records::init();
    SI_Dev_Logs::init();
    // settings
    SI_Admin_Settings::init();
    // payments and processing
    SI_Payment_Processors::init();
    SI_Payments::init();
    // notifications
    SI_Notifications::init();
    // Hooks come before parent class.
    if (!SI_FREE_TEST && class_exists('SI_Notifications_Premium')) {
        SI_Notifications_Premium::init();
    }
    SI_Notifications_Control::init();
    // clients
    SI_Clients::init();
    // estimates
    SI_Estimates::init();
    if (!SI_FREE_TEST && class_exists('SI_Estimates_Premium')) {
        SI_Estimates_Premium::init();
    }
    if (!SI_FREE_TEST && class_exists('SI_Estimates_Submission_Premium')) {
        SI_Estimates_Submission_Premium::init();
    }
    SI_Estimate_Submissions::init();
    SI_Estimates_Admin::init();
    SI_Estimates_Edit::init();
    SI_Estimates_Template::init();
    SI_Estimates_Records::init();
    // checkouts
    SI_Checkouts::init();
    // invoices
    SI_Invoices::init();
    SI_Invoices_Admin::init();
    SI_Invoices_Edit::init();
    SI_Invoices_Template::init();
    SI_Invoices_Records::init();
    SI_Invoices_Deposit::init();
    if (!SI_FREE_TEST && class_exists('SI_Invoices_Premium')) {
        SI_Invoices_Premium::init();
    }
    // Line items
    SI_Line_Items::init();
    // projects
    SI_Projects::init();
    if (!SI_FREE_TEST && class_exists('SI_Projects_Premium')) {
        SI_Projects_Premium::init();
    }
    // importer
    SI_Importer::init();
    // help
    SI_Help::init();
    // Compat
    SI_Compatibility::init();
    // addons
    require_once SI_PATH . '/add-ons/Addons.php';
    require_once SI_PATH . '/add-ons/updates/edd_plugin_updater.class.php';
    SA_Addons::init();
    do_action('sprout_invoices_loaded');
}
Beispiel #22
0
function soap_get_projects($username, $password)
{
    $user = auth_user($username, $password);
    if ($user === FALSE) {
        return new soap_fault('Client', '', 'Access Denied');
    }
    $project = new SI_Project();
    $projects = $project->getMyProjects($user->id);
    return object_to_data($projects, array('id', 'company_id', 'name', 'default_item_code_id'));
}
Beispiel #23
0
 *
 */
require_once('includes/common.php');
checkLogin();

require_once('includes/SI_Project.php');
require_once('includes/SI_Task.php');
require_once('includes/SI_TaskStatus.php');
require_once('includes/SI_TaskItem.php');
require_once('includes/SI_TaskPriority.php');
require_once('includes/SI_SalesCommissionType.php');


$title = '';
$task = new SI_Task();
$project = new SI_Project();

if($_REQUEST['mode'] == 'add'){
	$title = "Add Task";
	$task->due_ts = '';
	if(empty($_REQUEST['project_id'])){
		fatal_error("Error: No Project ID specified!\n");
	}else{
		$task->project_id = $_REQUEST['project_id'];
		if($project->get($task->project_id) === FALSE){
			fatal_error("Could not retreive project!");
			debug_message($project->getLastError());
		}
		if(!$project->hasRights(PROJECT_RIGHT_EDIT)){
			fatal_error('Insufficent access rights for this project!');
		}
 public static function save_meta_box_time_tracking_toggl($post_id, $post, $callback_args, $invoice_id = null)
 {
     $toggl_id = isset($_POST['sa_toggl_toggl_id']) ? $_POST['sa_toggl_toggl_id'] : 0;
     // Create new toggl project if selection permits
     if ($toggl_id == 'create_new') {
         // args
         $project = SI_Project::get_instance($post_id);
         $args = array('project_name' => $post->post_title);
         // create
         $toggl_id = self::maybe_create_toggl_project($project, $args);
         return;
     }
     // set the meta
     self::set_projects_toggl_id($post_id, (int) $toggl_id);
     self::set_to_sync_time($post_id);
     // Reset
     if (isset($_POST['sa_toggl_sync_time']) && $_POST['sa_toggl_sync_time']) {
         self::set_to_sync_time($post_id, true);
     }
     $default_activity = isset($_POST['sa_toggl_default_activity']) ? $_POST['sa_toggl_default_activity'] : 0;
     self::set_projects_default_time_import_activity($post_id, (int) $default_activity);
     if (isset($_POST['sa_toggl_pulldown_time']) && $_POST['sa_toggl_pulldown_time']) {
         self::download_toggl_time($post_id);
     }
 }
Beispiel #25
0
             $tasks = $task->findTasks($_GET['query']);
         } else {
             $output['error'] = 'Invalid parameters for findTasks action';
             break;
         }
     } else {
         $tasks = $task->findTasks($params[0]);
     }
     if ($tasks === false) {
         $output['error'] = $task->getLastError();
     } else {
         $output['tasks'] = $tasks;
     }
     break;
 case 'addTaskActivity':
     $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 = getTSFromInput($_POST['ta_popup_start_ts']['date'], $_POST['ta_popup_start_ts']['time']);
     $task_activity->end_ts = getTSFromInput($_POST['ta_popup_end_ts']['date'], $_POST['ta_popup_end_ts']['time']);
     $task_activity->task_id = intval($_POST['ta_popup_task_id']);
     $task_activity->user_id = $loggedin_user->id;
     $task_activity->text = $_POST['ta_popup_text'];
     $task_activity->item_code_id = $_POST['ta_popup_item_code_id'];
     $debug_info = "\n\t\t\tPOST = " . print_r($_POST, true) . "\n\n\t\t\tstart_ts = {$task_activity->start_ts}\n\n\t\t\tend_ts = {$task_activity->end_ts}\n\n\t\t\ttask_id = {$task_activity->task_id}\n\n\t\t\tuser_id = {$task_activity->user_id}\n\n\t\t\titem_code_id = {$task_activity->item_code_id}\n\n\t\t\ttext = {$task_activity->text}\n\n\t\t";
     $output['debug'] = $debug_info;
     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) {
             $output['error'] = "Skipping incomplete entry\n";
<p>
	<b><?php 
_e('Projects', 'sprout-invoices');
?>
</b>
	<?php 
if (!empty($projects)) {
    ?>
		<dl>
			<?php 
    foreach ($projects as $project_id) {
        ?>
				<?php 
        $project = SI_Project::get_instance($project_id);
        ?>
				<dt><?php 
        printf('<a href="%s">%s</a>', get_edit_post_link($project_id), get_the_title($project_id));
        ?>
</dt>
				<dd>
					<?php 
        if ($project->get_start_date() && $project->get_end_date()) {
            ?>
						<?php 
            printf('%s&mdash;%s', date_i18n(get_option('date_format'), $project->get_start_date()), date_i18n(get_option('date_format'), $project->get_end_date()));
            ?>
					<?php 
        } elseif ($project->get_start_date()) {
            ?>
						<?php 
            printf('<b>Start</b>&mdash;%s', date_i18n(get_option('date_format'), $project->get_start_date()));
 /**
  * Display the content for the column
  *
  * @param string  $column_name
  * @param int     $id          post_id
  * @return string
  */
 public static function column_display($column_name, $id)
 {
     $project = SI_Project::get_instance($id);
     if (!is_a($project, 'SI_Project')) {
         return;
     }
     // return for that temp post
     switch ($column_name) {
         case 'info':
             $associated_clients = $project->get_associated_clients();
             echo '<p>';
             printf('<b>%s</b>: ', si__('Client'));
             if (!empty($associated_clients)) {
                 $clients_print = array();
                 foreach ($associated_clients as $client_id) {
                     $clients_print[] = sprintf('<span class="associated_client"><a href="%s">%s</a></span>', get_edit_post_link($client_id), get_the_title($client_id));
                 }
             }
             if (!empty($clients_print)) {
                 echo implode(', ', $clients_print);
             } else {
                 echo si__('No associated clients');
             }
             echo '</p>';
             echo '<p>';
             printf('<b>%s</b>: ', si__('Site'));
             echo make_clickable(esc_url($project->get_website()));
             echo '</p>';
             break;
         case 'invoices':
             $invoices = $project->get_invoices();
             $split = 2;
             $split_invoices = array_slice($invoices, 0, $split);
             if (!empty($split_invoices)) {
                 echo "<dl>";
                 foreach ($split_invoices as $invoice_id) {
                     printf('<dt>%s</dt><dd><a href="%s">%s</a></dd>', get_post_time(get_option('date_format'), false, $invoice_id), get_edit_post_link($invoice_id), get_the_title($invoice_id));
                 }
                 echo "</dl>";
                 if (count($invoices) > $split) {
                     printf('<span class="description">' . si__('...%s of <a href="%s">%s</a> most recent shown') . '</span>', $split, get_edit_post_link($id), count($invoices));
                 }
             } else {
                 printf('<em>%s</em>', si__('No invoices'));
             }
             break;
         case 'estimates':
             $estimates = $project->get_estimates();
             $split = 2;
             $split_estimates = array_slice($estimates, 0, $split);
             if (!empty($split_estimates)) {
                 echo "<dl>";
                 foreach ($split_estimates as $estimate_id) {
                     printf('<dt>%s</dt><dd><a href="%s">%s</a></dd>', get_post_time(get_option('date_format'), false, $estimate_id), get_edit_post_link($estimate_id), get_the_title($estimate_id));
                 }
                 echo "</dl>";
                 if (count($estimates) > $split) {
                     printf('<span class="description">' . si__('...%s of <a href="%s">%s</a> most recent shown') . '</span>', $split, get_edit_post_link($id), count($estimates));
                 }
             } else {
                 printf('<em>%s</em>', si__('No estimates'));
             }
             break;
         default:
             // code...
             break;
     }
 }
Beispiel #28
0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once 'includes/common.php';
require_once 'includes/SI_Project.php';
require_once 'includes/SI_Company.php';
require_once 'includes/SI_Task.php';
checkLogin();
$company = new SI_Company();
$project = new SI_Project();
$title = "Create Project";
if ($_POST['save']) {
    $project->owner_id = $loggedin_user->id;
    $_POST['due_ts'] = getTSFromInput($_POST['due_ts']);
    $project->updateFromAssocArray($_POST);
    if ($project->add()) {
        foreach ($_POST['tasks'] as $task_data) {
            if (!empty($task_data['name'])) {
                $task = new SI_Task();
                $task->name = $task_data['name'];
                $task->billable = 'D';
                $task->task_status_id = $task_data['status'];
                $task->task_priority_id = $task_data['priority'];
                $task->project_id = $project->id;
                if (!$task->add()) {
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 */
require_once('includes/common.php');
require_once('includes/SI_PaymentSchedule.php');
require_once('includes/SI_CompanyTransaction.php');
require_once('includes/SI_Project.php');
require_once('includes/SI_Task.php');
require_once('includes/SI_ItemCode.php');

checkLogin('accounting');

$title = '';
$ps = new SI_PaymentSchedule();
$project = new SI_Project();
$task = new SI_Task();
$item_code = new SI_ItemCode();

// Clean up amount
if(!empty($_POST['amount'])){
	$_POST['amount'] = preg_replace('/[^0-9\.]/','', $_POST['amount']);
}

if($_REQUEST['mode'] == 'add'){
	$title = "Add Scheduled Billing";

	$project_id = intval($_REQUEST['project_id']);
	$task_id = intval($_REQUEST['task_id']);
	if($project_id == 0 && $task_id == 0){
		fatal_error("You must provide a task_id or project_id for this scheduled payment!\n");
}

$transactions = $company->getTransactions(NULL, 5);
if($transactions === FALSE){
	$error_msg .= "Error getting transactions for company!\n";
	debug_message($company->getLastError());
}

$invoice = new SI_Invoice();
$invoices = $invoice->getOutstanding($company->id);
if($invoices === FALSE){
	$error_msg .= "Could not retrieve Outstanding Invoice list!\n";
	debug_message($invoice->getLastError());
}

$project = new SI_Project();
$active_projects = TRUE;
if(isset($_REQUEST['show_all']) && $_REQUEST['show_all'] == 'Y'){
	$active_projects = FALSE;
}
$projects = $project->getCompanyProjects($company->id, $active_projects);
if($projects === FALSE){
	$error_msg .= "Could not retrieve active project list!\n";
	debug_message($project->getLastError());
}

if(isset($_POST['save'])){
	if(is_array($_POST['expense']) && !empty($_POST['expense']['description'])){
		$_POST['expense']['cost'] = preg_replace('/[^0-9\.]/','', $_POST['expense']['cost']);
		$_POST['expense']['price'] = preg_replace('/[^0-9\.]/','', $_POST['expense']['price']);
		if($company->addExpense($_POST['expense']['item_code_id'], $_POST['expense']['description'], $_POST['expense']['cost'], $_POST['expense']['price']) === FALSE){