public static function get_zap_target_url($zap_id = 0) { $zap = SI_Record::get_instance($zap_id); if (!is_a($zap, 'SI_Record')) { return; } return $zap->get_excerpt(); }
?> </span><br/> <span class="history_date"><?php echo date_i18n(get_option('date_format') . ' @ ' . get_option('time_format'), strtotime($post->post_date)); ?> </span> </dt> <dd><p> </p></dd> <?php foreach ($historical_records as $record_id) { ?> <?php $record = SI_Record::get_instance($record_id); // If no type is set than just keep on moving. if ($record->get_type() == SI_Record::DEFAULT_TYPE) { continue; } $r_post = $record->get_post(); switch ($record->get_type()) { case SI_Controller::PRIVATE_NOTES_TYPE: $type = si__('Private Note'); break; case SI_Notifications::RECORD: $type = si__('Notification'); break; case SI_Projects::HISTORY_STATUS_UPDATE: default: $type = si__('Status Update');
public function get_history($type = '') { return SI_Record::get_records_by_association($this->ID); }
public static function projects_time() { $nonce = $_REQUEST['nonce']; if (!wp_verify_nonce($nonce, self::SUBMISSION_NONCE)) { self::ajax_fail('Not going to fall for it!'); } if (isset($_REQUEST['project_id'])) { $project_id = $_REQUEST['project_id']; } if (!$project_id) { self::ajax_fail('No project id'); } $project = SI_Project::get_instance($project_id); if (!is_a($project, 'SI_Project')) { self::ajax_fail('Project not found'); } $times = $project->get_associated_times(); $time_data = array(); if (!empty($times)) { foreach ($times as $time_id) { $time = SI_Record::get_instance($time_id); if (!is_a($time, 'SI_Record')) { continue; } $activity = SI_Time::get_instance($time->get_associate_id()); $data = $time->get_data(); // If time is unbillable don't import // This includes not returning time that has already been invoiced. if (isset($_REQUEST['billable'])) { if (is_a($activity, 'SI_Time') && !$activity->is_billable()) { continue; } // Don't return the time that has already been invoiced if (isset($data['invoice_id'])) { continue; } } $description = is_a($activity, 'SI_Time') ? '<b>' . get_the_title($activity->get_id()) . "</b>\n" . $time->get_title() . "\n<small>" . date_i18n(get_option('date_format'), $data['date']) . '</small>' : $time->get_title() . "\n<small>" . date_i18n(get_option('date_format'), $data['date']) . '</small>'; $description = apply_filters('the_content', $description); $time_data[] = array('id' => $time_id, 'date' => date_i18n(get_option('date_format'), $data['date']), 'note' => apply_filters('the_content', $time->get_title()), 'qty' => si_get_number_format((double) $data['time_val']), 'description' => apply_filters('si_project_time_imported_description', $description), 'activity_id' => is_a($activity, 'SI_Time') ? $activity->get_id() : false, 'activity' => is_a($activity, 'SI_Time') ? $activity->get_title() : '', 'activity_rate' => is_a($activity, 'SI_Time') ? $activity->get_default_rate() : 0, 'activity_tax' => is_a($activity, 'SI_Time') ? $activity->get_default_percentage() : 0); } } if (empty($time_data)) { self::ajax_fail('Nothing to import'); } header('Content-type: application/json'); if (self::DEBUG) { header('Access-Control-Allow-Origin: *'); } echo wp_json_encode($time_data); exit; }
/** * 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'); }
public function get_history($type = '') { // FUTURE v1.1 query for estimates and invoices too return SI_Record::get_records_by_association($this->ID); }
function si_doc_history_records($doc_id = 0, $filtered = true) { if (!$doc_id) { $doc_id = get_the_ID(); } $returned_history = array(); switch (get_post_type($doc_id)) { case SI_Estimate::POST_TYPE: $estimate = SI_Estimate::get_instance($doc_id); $history = $estimate->get_history(); break; case SI_Invoice::POST_TYPE: $invoice = SI_Invoice::get_instance($doc_id); $history = array_merge($invoice->get_history(), $invoice->get_payments()); break; default: # code... break; } $history = apply_filters('si_doc_history_records_pre_sort', $history, $doc_id, $filtered); // Sort in ascending order asort($history, SORT_NUMERIC); foreach ($history as $item_id) { if (get_post_type($item_id) == SI_Record::POST_TYPE) { $record = SI_Record::get_instance($item_id); // If no type is set than just keep on moving. if ($record->get_type() == SI_Record::DEFAULT_TYPE) { continue; } // filter these types of records out. if ($filtered) { if (in_array($record->get_type(), array(SI_Controller::PRIVATE_NOTES_TYPE, SI_Estimates::VIEWED_STATUS_UPDATE, SI_Notifications::RECORD))) { continue; } } $r_post = $record->get_post(); switch ($record->get_type()) { case SI_Controller::PRIVATE_NOTES_TYPE: $returned_history[$item_id]['type'] = __('Private Note', 'sprout-invoices'); break; case SI_Estimates::HISTORY_UPDATE: $returned_history[$item_id]['type'] = __('Updated', 'sprout-invoices'); break; case SI_Estimates::VIEWED_STATUS_UPDATE: $returned_history[$item_id]['type'] = __('Viewed', 'sprout-invoices'); break; case SI_Notifications::RECORD: $returned_history[$item_id]['type'] = __('Notification', 'sprout-invoices'); break; case SI_Estimates::HISTORY_INVOICE_CREATED: $returned_history[$item_id]['type'] = __('Invoice Created', 'sprout-invoices'); break; case SI_Estimate_Submissions::SUBMISSION_UPDATE: $returned_history[$item_id]['type'] = __('Submitted', 'sprout-invoices'); break; case SI_Importer::RECORD: $returned_history[$item_id]['type'] = __('Imported', 'sprout-invoices'); break; case SI_Estimates::HISTORY_STATUS_UPDATE: default: $returned_history[$item_id]['type'] = __('Status Update', 'sprout-invoices'); break; } $returned_history[$item_id]['status_type'] = $record->get_type(); $returned_history[$item_id]['post_date'] = $r_post->post_date; $returned_history[$item_id]['update_title'] = $r_post->post_title; $returned_history[$item_id]['content'] = $r_post->post_content; } elseif (get_post_type($item_id) == SI_Payment::POST_TYPE) { $payment = SI_Payment::get_instance($item_id); $p_post = $payment->get_post(); $returned_history[$item_id]['type'] = __('Payment', 'sprout-invoices'); $returned_history[$item_id]['status_type'] = 'payment'; $returned_history[$item_id]['post_date'] = $p_post->post_date; $returned_history[$item_id]['update_title'] = $p_post->post_title; $returned_history[$item_id]['content'] = ''; $returned_history[$item_id]['content'] .= '<span>' . $payment->get_payment_method() . '</span><br/>'; $returned_history[$item_id]['content'] .= '<b>' . __('Payment Total', 'sprout-invoices') . ':</b> ' . sa_get_formatted_money($payment->get_amount(), $item_id); } else { if ($filtered) { $comment = get_comment($item_id); if (!is_wp_error($comment)) { $returned_history[$item_id]['type'] = $comment->comment_author; $returned_history[$item_id]['status_type'] = 'comment'; $returned_history[$item_id]['post_date'] = $comment->comment_date; $returned_history[$item_id]['content'] = get_comment_text($comment->comment_ID); $returned_history[$item_id]['comment_id'] = intval($comment->comment_ID); } } } } return $returned_history; }
function column_data($item) { $record = SI_Record::get_instance($item->ID); $data = $record->get_data(); if ($data != '') { ?> <a href="#TB_inline?width=900&height=600&inlineId=data_id_<?php echo esc_attr($item->ID); ?> " class="thickbox button" title="<?php echo esc_attr($item->post_title); ?> <?php _e('Data', 'sprout-invoices'); ?> "><?php _e('View Data', 'sprout-invoices'); ?> </a> <?php if (is_array($data)) { ?> <div id="data_id_<?php echo esc_attr($item->ID); ?> " style="display:none;"><pre style="white-space:pre-wrap; text-align: left; font: normal normal 11px/1.4 menlo, monaco, monospaced; padding: 5px;"><?php print_r($data); ?> </pre></div> <?php } else { ?> <div id="data_id_<?php echo esc_attr($item->ID); ?> " style="display:none;"><?php echo apply_filters('the_content', $data); ?> </div> <?php } ?> <?php } }
public static function maybe_update_private_note() { if (!isset($_REQUEST['nonce'])) { wp_die('Forget something?'); } $nonce = $_REQUEST['nonce']; if (!wp_verify_nonce($nonce, SI_Controller::NONCE)) { wp_die('Not going to fall for it!'); } if (!isset($_REQUEST['record_id'])) { self::ajax_fail('No id given!'); } $record_id = $_REQUEST['record_id']; $private_note = $_REQUEST['private_note']; $record = SI_Record::get_instance($record_id); $record->set_data($private_note, false); exit; }
public static function download_toggl_time($project_id = 0) { $toggl_id = self::get_projects_toggl_id($project_id); if (!$toggl_id) { return; } $entries = Toggl_API::get_workspace_time($toggl_id); if (!isset($entries->data)) { return; } $project = SI_Project::get_instance($project_id); if (!is_a($project, 'SI_Project')) { return; } // Don't import times already imported, duh. $time_records = $project->get_associated_times(); $already_imported = array(); foreach ($time_records as $time_id) { $time = SI_Record::get_instance($time_id); if (!is_a($time, 'SI_Record')) { continue; } $data = $time->get_data(); if (isset($data['toggl_id'])) { $already_imported[] = $data['toggl_id']; } } $entries = apply_filters('si_toggl_import_entries', $entries->data); foreach ($entries as $key => $time_entry) { if (in_array($time_entry->id, $already_imported)) { continue; // already imported } $data = array('project_id' => (int) $project_id, 'activity_id' => (int) self::get_projects_default_time_import_activity($project_id), 'time_val' => $time_entry->dur / 3600000, 'note' => $time_entry->description, 'date' => strtotime($time_entry->start), 'toggl_id' => $time_entry->id); $project->create_associated_time($data); } }
public static function maybe_log_invoice_view() { global $post; if (!is_single()) { return; } // Make sure this is an estimate we're viewing if ($post->post_type != SI_Invoice::POST_TYPE) { return; } // Don't log the authors views if ($post->post_author == get_current_user_id()) { return; } if (is_user_logged_in()) { $user = get_userdata(get_current_user_id()); $name = $user->first_name . ' ' . $user->last_name; $whom = $name . ' (' . $user->user_login . ')'; } else { $whom = self::get_user_ip(); } if (in_array($whom, array('127.0.0.1', '::1'))) { return; } $invoice = SI_Invoice::get_instance($post->ID); $title = sprintf(__('Invoice viewed by %s for the first time.', 'sprout-invoices'), esc_html($whom)); $found = false; $view_logs = SI_Record::get_records_by_type_and_association($invoice->get_id(), self::VIEWED_STATUS_UPDATE); foreach ($view_logs as $record_id) { if (!$found && $title == get_the_title($record_id)) { $found = true; } } // Record exists if ($found) { return; } do_action('si_new_record', $_SERVER, self::VIEWED_STATUS_UPDATE, $invoice->get_id(), $title); }
public static function add_invoice_id($time_id = 0, $invoice_id = 0) { $record = SI_Record::get_instance($time_id); if (!is_a($record, 'SI_Record')) { return 0; } $data = $record->get_data(); $data['invoice_id'] = $invoice_id; $record->set_data($data); return $record; }